diff options
1111 files changed, 42112 insertions, 28114 deletions
diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 7dfc3bccc3..031582bc63 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -118,13 +118,12 @@ doc_classes/* @godotengine/documentation ## Text /modules/freetype/ @godotengine/buildsystem -/modules/gdnative/text/ @godotengine/gui-nodes /modules/text_server_adv/ @godotengine/gui-nodes /modules/text_server_fb/ @godotengine/gui-nodes ## XR /modules/camera/ @godotengine/xr -/modules/gdnative/xr/ @godotengine/xr +/modules/gdextension/xr/ @godotengine/xr /modules/mobile_vr/ @godotengine/xr /modules/webxr/ @godotengine/xr diff --git a/.github/workflows/linux_builds.yml b/.github/workflows/linux_builds.yml index 95d216deb3..84fdb2180b 100644 --- a/.github/workflows/linux_builds.yml +++ b/.github/workflows/linux_builds.yml @@ -32,11 +32,11 @@ jobs: proj-conv: true artifact: true - - name: Editor with doubles and GCC sanitizers (target=editor, tests=yes, dev_build=yes, float=64, use_asan=yes, use_ubsan=yes, linker=gold) + - name: Editor with doubles and GCC sanitizers (target=editor, tests=yes, dev_build=yes, precision=double, use_asan=yes, use_ubsan=yes, linker=gold) cache-name: linux-editor-double-sanitizers target: editor tests: true - sconsflags: dev_build=yes float=64 use_asan=yes use_ubsan=yes linker=gold + sconsflags: dev_build=yes precision=double use_asan=yes use_ubsan=yes linker=gold proj-test: true # Can be turned off for PRs that intentionally break compat with godot-cpp, # until both the upstream PR and the matching godot-cpp changes are merged. @@ -198,20 +198,13 @@ jobs: submodules: 'recursive' path: 'godot-cpp' - # Check extension API - - name: Check for extension api updates + # Dump GDExtension interface and API + - name: Dump GDExtension interface and API for godot-cpp build if: ${{ matrix.godot-cpp-test }} run: | - echo "Running --dump-extension-api to create extensions api." - VK_ICD_FILENAMES=$(pwd)/vk_swiftshader_icd.json DRI_PRIME=0 xvfb-run ${{ matrix.bin }} --audio-driver Dummy --dump-extension-api 2>&1 > /dev/null || true - misc/scripts/compare_extension_api.py godot-cpp/godot-headers/extension_api.json extension_api.json - - # Copy new extension API files into place - - name: Copy new extension API files into place - if: ${{ matrix.godot-cpp-test }} - run: | - cp -f extension_api.json godot-cpp/godot-headers/ - cp -f core/extension/gdnative_interface.h godot-cpp/godot-headers/godot/ + ${{ matrix.bin }} --headless --dump-gdextension-interface --dump-extension-api + cp -f gdextension_interface.h godot-cpp/gdextension/ + cp -f extension_api.json godot-cpp/gdextension/ # Build godot-cpp test extension - name: Build godot-cpp test extension diff --git a/.gitignore b/.gitignore index 15c1e50277..ca96220570 100644 --- a/.gitignore +++ b/.gitignore @@ -37,7 +37,7 @@ platform/windows/godot_res.res # Generated by Godot binary .import/ -/gdnative_interface.h +/gdextension_interface.h extension_api.json logs/ @@ -242,6 +242,10 @@ xcuserdata/ [Rr]eleases/ x64/ x86/ + +# Do not ignore x86 folders anywhere under thirdparty libraries +!thirdparty/**/x86/ + [Ww][Ii][Nn]32/ [Aa][Rr][Mm]/ [Aa][Rr][Mm]64/ @@ -2,6 +2,7 @@ Aaron Record <aaronjrecord@gmail.com> Alexander Holland <alexander.holland@live.de> Alexander Holland <alexander.holland@live.de> <alexander.holland@haw-hamburg.de> Alexander Holland <alexander.holland@live.de> <AlexHolly> +Alfred Reinold Baudisch <alfred@alfredbaudisch.com> Andrea Catania <info@andreacatania.com> Anish Bhobe <anishbhobe@hotmail.com> Anutrix <numaanzaheerahmed@yahoo.com> @@ -26,6 +27,7 @@ dankan1890 <mewuidev2@gmail.com> Daniel J. Ramirez <djrmuv@gmail.com> David Cambré <david.cambre@gmail.com> <David.Cambre@gmail.com> Dominik 'dreamsComeTrue' JasiÅ„ski <dominikjasinski@o2.pl> +DeeJayLSP <djlsplays@gmail.com> <60024671+DeeJayLSP@users.noreply.github.com> Emmanuel Barroga <emmanuelbarroga@gmail.com> Eric M <itsjusteza@gmail.com> Eric Rybicki <info@ericrybicki.com> <stratos695@googlemail.com> @@ -41,6 +43,7 @@ foxydevloper <12120644+foxydevloper@users.noreply.github.com> Fredia Huya-Kouadio <fhuyakou@gmail.com> Fredia Huya-Kouadio <fhuyakou@gmail.com> <fhuya@google.com> Fredia Huya-Kouadio <fhuyakou@gmail.com> <fhuya@fb.com> +Fredia Huya-Kouadio <fhuyakou@gmail.com> <fhuya@meta.com> Geequlim <geequlim@gmail.com> Gilles Roudiere <gilles.roudiere@gmail.com> Gilles Roudiere <gilles.roudiere@gmail.com> <gilles.roudiere@laas.fr> @@ -112,6 +115,7 @@ Nils ANDRÉ-CHANG <nils@nilsand.re> <nils.andre.chang@gmail.com> Nuno Donato <nunodonato@gmail.com> <n.donato@estrelasustentavel.pt> Pawel Kowal <pkowal1982@gmail.com> Pedro J. Estébanez <pedrojrulez@gmail.com> <RandomShaper@users.noreply.github.com> +Patrick <firefly2442@gmail.com> Paul Batty <p_batty@hotmail.co.uk> Paul Batty <p_batty@hotmail.co.uk> <Paulb23@users.noreply.github.com> Pawel Kowal <pkowal1982@gmail.com> <pawel.kowal@javart.eu> @@ -131,14 +135,18 @@ Rémi Verschelde <rverschelde@gmail.com> <remi@verschelde.fr> Rhody Lugo <rhodylugo@gmail.com> <rhodylugo@me.com> Ricardo Subtil <ricasubtil@gmail.com> Rindbee <idleman@yeah.net> +Riteo Siuga <riteo@posteo.net> Robin Hübner <profan@prfn.se> <robinhubner@gmail.com> romulox_x <romulox_x@yahoo.com> +rune-scape <allie.smith.epic@gmail.com> +rune-scape <allie.smith.epic@gmail.com> <spartacrafter@gmail.com> Ruslan Mustakov <r.mustakov@gmail.com> <ruslan.mustakov@xored.com> Saracen <SaracenOne@gmail.com> sheepandshepherd <sheepandshepherd@hotmail.com> <sheepandshepherd@users.noreply.github.com> Silc 'Tokage' Renew <tokage.it.lab@gmail.com> Silc 'Tokage' Renew <tokage.it.lab@gmail.com> <61938263+TokageItLab@users.noreply.github.com> Swarnim Arun <swarnimarun11@gmail.com> +TechnoPorg <jonah.janzen@gmail.com> <69441745+TechnoPorg@users.noreply.github.com> Theo Hallenius <redsymbzone@hotmail.com> Tomasz Chabora <kobewi4e@gmail.com> Twarit <wtwarit@gmail.com> diff --git a/AUTHORS.md b/AUTHORS.md index 6f6ac48db2..7079180274 100644 --- a/AUTHORS.md +++ b/AUTHORS.md @@ -29,8 +29,10 @@ name is available. Aaron Franke (aaronfranke) Aaron Record (LightningAA) + Adam Scott (adamscott) Alexander Holland (AlexHolly) Alexey Khoroshavin (allkhor) + Alfred Reinold Baudisch (alfredbaudisch) Alket Rexhepi (alketii) Andrea Catania (AndreaCatania) Andrii Doroshenko (Xrayez) @@ -64,6 +66,7 @@ name is available. Dana Olson (adolson) Daniel J. Ramirez (djrm) Daniel Rakos (aqnuep) + Daniel Zilberleyb (dzil123) Danil Alexeev (dalexeev) dankan1890 David Cambré (Gallilus) @@ -72,6 +75,7 @@ name is available. Dharkael (lupoDharkael) Dmitry Koteroff (Krakean) Dominik JasiÅ„ski (dreamsComeTrue) + Douglas Leão (DeeJayLSP) DualMatrix Ellen Poe (ellenhp) Emmanuel Barroga (codecustard) @@ -118,13 +122,16 @@ name is available. Jake Young (Duroxxigar) Jakub Grzesik (kubecz3k) James Buck (jbuck3) + Jason Knight (jasonwinterpixel) Jean-Michel Bernard (jmb462) Jérôme Gully (Nutriz) Jia Jun Chai (SkyLucilfer) Joan Fons Sanchez (JFonS) Johan Manuel (29jm) Johannes Witt (HaSa1002) + Jonathan Nicholl (jtnicholl) Jordan Schidlowsky (winterpixelgames) + Josh Jones (DarkKilauea) Joshua Grams (JoshuaGrams) Juan Linietsky (reduz) Julian Murgia (StraToN) @@ -180,6 +187,7 @@ name is available. Nathan Lovato (NathanLovato) Nathan Warden (NathanWarden) Nicholas Huelin (SirQuartz) + Nikita Lita (nikitalita) Nils André-Chang (NilsIrl) Noah Beard (TwistedTwigleg) Nuno Donato (nunodonato) @@ -210,9 +218,11 @@ name is available. Rhody Lugo (rraallvv) Ricardo Buring (rburing) Ricardo Subtil (Ev1lbl0w) + Riteo Siuga (Riteo) Roberto F. Arroyo (robfram) Robin Hübner (profan) romulox-x + Rune Smith (rune-scape) Ruslan Mustakov (endragor) Ryan Roden-Corrent (rrcore) Saniko (sanikoyes) @@ -227,6 +237,7 @@ name is available. Stijn Hinlopen (hinlopen) Swarnim Arun (minraws) TC (floppyhammer) + TechnoPorg Thakee Nathees (ThakeeNathees) thebestnom Theo Hallenius (TheoXD) diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt index 02cd733c92..d41f40a78b 100644 --- a/COPYRIGHT.txt +++ b/COPYRIGHT.txt @@ -218,7 +218,7 @@ License: glslang Files: ./thirdparty/graphite/ Comment: Graphite engine Copyright: 2010, SIL International -License: MPL-2.0 +License: Expat Files: ./thirdparty/harfbuzz/ Comment: HarfBuzz text shaping library @@ -13,6 +13,7 @@ generous deed immortalized in the next stable release of Godot Engine. ## Platinum sponsors Gamblify <https://www.gamblify.com> + Heroic Labs <https://heroiclabs.com> Spiffcode <http://spiffcode.com> ## Gold sponsors @@ -25,20 +26,24 @@ generous deed immortalized in the next stable release of Godot Engine. ASIFA-Hollywood <https://www.asifa-hollywood.org> Playful Studios <https://playfulstudios.com> Robot Gentleman <http://robotgentleman.com> + Striked <https://developers.join-striked.com> ## Bronze sponsors Basically Games + Bippinbits <https://bippinbits.com> Brandon Lamb Bri Garry Newman Gordon MacPherson Hunter Dickson Isaiah smith + Jb Evain Keepsake Games <https://keepsake.games> Kenney <https://kenney.nl> Kitcat490 Kyle Szklenski + Matthew Campbell Maxim Karsten Moonwards <https://www.moonwards.com> Nik Rudenko @@ -49,12 +54,12 @@ generous deed immortalized in the next stable release of Godot Engine. AD Ford Albin Lundahl Andres Hernandez - Andrew Bowen Andrew Dunai anti666 Christian Baune Christopher Montesano Christopher Shifflett + Christoph Woinke Daniel Edwards Darrin Massena David Mydlarz @@ -68,6 +73,7 @@ generous deed immortalized in the next stable release of Godot Engine. Justin Arnold Justo Delgado Baudà Kossi Selom Banybah + Lloyd Bond Marcel Kräml Marek Belski Markus Ort @@ -75,13 +81,13 @@ generous deed immortalized in the next stable release of Godot Engine. Michael Mike King Nassor Paulino da Silva + nate-wilkins Nathan Warden Neal Gompa (Conan Kudo) Ninja_5tyl3 Patrick Horn Patrick Schmidt Rami - René Habermann Ronnie Cheng Ryan Heath Samantha @@ -106,13 +112,14 @@ generous deed immortalized in the next stable release of Godot Engine. Benito Carlo Cabanilla Daniel James + David Fedorchak David Gehrig David Hubber David Snopek Ed Morley First Last Frank Kurka - Hunter Jones + Guy Kay Jay Jacobus Dens Javier Roman Joan Fons @@ -124,19 +131,17 @@ generous deed immortalized in the next stable release of Godot Engine. Manuele Finocchiaro Markus Wiesner Mateo Navarrete - Mathieu Matthew Hillier - Mert Kasar Officine Pixel S.n.c. Pedro Silva Retro Village Rob Messick Roland Fredenhagen Ronan Zeegers + Rudi Sarksus Sean Sergey - Sergio Airaldi Sofox Stephan Kessler Stephen Molyneaux @@ -148,11 +153,9 @@ generous deed immortalized in the next stable release of Godot Engine. Victor Xeno Coliseum + ⣠23BLUENINJA - Adam Mill - Adam Nakonieczny - Adam Nelson - Adam Stankiewicz + AdamRatai Alexander Erlemann Alexandre VALIN Alexej Kowalew @@ -164,6 +167,7 @@ generous deed immortalized in the next stable release of Godot Engine. Andriy Antanas Paskauskas Antoni Batchelli + Ari Arthur S. Muszynski BasicIncomePlz Brandon Hawkinson @@ -178,14 +182,14 @@ generous deed immortalized in the next stable release of Godot Engine. Craig Smith Cristopher CT - CzechBlueBear + CzechBlueBea + CzÅ‚owiekImadÅ‚o Daniel Reed Daniel Tebbutt Darrian Little - David Thomason + DATSAGE Daylon J Williams Dennis Belfrage - Dimitri Nüscheler Donn Eddy Duncan Eric Brand @@ -194,9 +198,7 @@ generous deed immortalized in the next stable release of Godot Engine. flesk foxydevloper Fransiska - FroggEater Gabrielius VaiÅ¡kÅ«nas - Garpur Gary Hulst Geoffroy Warin George Venizelos @@ -209,8 +211,6 @@ generous deed immortalized in the next stable release of Godot Engine. Heath Hayes Horváth-Lázár Péter Hu Hund - Hunter Barabas - ihereou illuxxium Jaap Marsman Jamal Bencharki @@ -225,22 +225,17 @@ generous deed immortalized in the next stable release of Godot Engine. Johnathan Kupferer John Stinson Josef Stumpfegger - Jose Manuel Muñoz Perez Joshie Sparks Joshua Flores Joshua Lesperance Juan Velandia Judd Julian Todd - Juraj Móza JUSTIN CARROLL - Justin Palmer Kelteseth - Kevan Khora kickmaniac kinfox - Lakshaya Goel Laszlo Kiss leetNightshade Leo Fidel R Liban @@ -264,26 +259,24 @@ generous deed immortalized in the next stable release of Godot Engine. Michael Policastro MikadoSC nate etan + Nicola Cocchiaro Nikita Blizniuk Oliver Dick - Oscar Campos Otis Clark + Patrick Wuttke Paul Hocker Paul Von Zimmerman - Pedro Pete Goodwin Petr Malac Petrus Prinsloo Philip Woods - R - RaiRu RAMupgrade + red1939 Reilt Rene Tailleur Rhodochrone Rickard Hermanson Rob - Robert McDermott Rob McInroy RodZilla Romeo Disca @@ -297,11 +290,8 @@ generous deed immortalized in the next stable release of Godot Engine. Samuel Hummerstone Samuel Judd schroedinger's possum - Serban Serafimescu - Sergey Fonaryov Shishir Tandale Sing Chun Lee - Skides SKison Song Junwoo spacechase0 @@ -309,6 +299,7 @@ generous deed immortalized in the next stable release of Godot Engine. Steven Landow Stoned Xander Sven Carstensen + Talii Teslatech Thomas Bjarnelöf Thomas Kurz @@ -321,17 +312,17 @@ generous deed immortalized in the next stable release of Godot Engine. Turntsnaco UltyX Valryia - Vincent Cloutier VoidPointer + whatever Winston - Wojciech Chojnacki Yifan Lai Yuancheng Zhang + zkip lan ## Silver donors + Aaron Mayfield Aaron Oldenburg - A. B. Adam Brunnmeier Adam Carr Adam Long @@ -353,18 +344,17 @@ generous deed immortalized in the next stable release of Godot Engine. Alejandro Saucedo AleMax Alessandro Senese - Alex Chan Alex Clavelle + Alex de la Mare alex raeside Allan Davis - Allen Schade Amar Å ahinović Andre Altmueller Andrei Pufu Andre Stackhouse + Andrew Andrew Groot andrew james morris - Andrew Thomas angrykoala Ano Nim Anthony Avina @@ -373,28 +363,23 @@ generous deed immortalized in the next stable release of Godot Engine. Arda Erol Arthur Brainville Arturo Rosales - Ashley Claymore Aubrey Falconer Auré Franky aurelien condomines - Austin Finlinson Austin Miller Azar Gurbanov AzulCrescent Balázs Batári Beau Seymour - Behzad Ghaffari Benedikt Ben Vercammen Ben Visness - Bernd Jänichen Bernhard Werner Bill Thibault bitbrain Bjarne Voigtländer Black Block Blunderjack - BoiLudens Bram Brian Brian Ford @@ -402,15 +387,16 @@ generous deed immortalized in the next stable release of Godot Engine. Bronson Zgeb bugcaptor Burney Waring - Caleb Gartner Caleb Makela Caliburn Cameron Meyer Carlos Rios Carl van der Geest Casey + Cesar Ruiz Chad Steadman Checkpoint Charlie + Chris Cavalluzzi Chris Jagusch Chris Langford Chris Ridenour @@ -420,8 +406,6 @@ generous deed immortalized in the next stable release of Godot Engine. Christian Winter Christoffer Dahlblom Christophe Gagnier - Christoph Woinke - codedius Codex404 Cody Parker Conall O @@ -429,26 +413,23 @@ generous deed immortalized in the next stable release of Godot Engine. Corchari Corey W Craig Post + CrimsonZA CrispyPin - Cullen Canejo cynwav Dakota Watkins Daniel H. Bahr - Danielle Cheney + Danielle Dare Looks Daren Scot Wilson - Dave Walker + Davesnothere David Baker David Bôle David May David Maziarka - David Rapisarda Devin Carraway Devin R Dimitri Roche - Dmytro Korchynskyi Dominik Wetzel - Don B Donovan Hutcheon Douglas Plumley Dragontrapper @@ -460,7 +441,6 @@ generous deed immortalized in the next stable release of Godot Engine. Edward Herbert Edward Swartz Egon Elbre - Elgenzay Elias Nykrem Elijah Anderson Emerson MX @@ -469,20 +449,15 @@ generous deed immortalized in the next stable release of Godot Engine. Eric Stokes Eric Walkingshaw Eric Williams - Erika Sanders Erkki Seppälä Ewan Holmes - EZL games Faisal Alkubaisi Fault Boy fby - Fekinox Felix Adam - Felix Bohmann Fer DC Filip Lundby Frank - FrostMarble fumangy Game Endeavor Gary Thomas @@ -497,18 +472,14 @@ generous deed immortalized in the next stable release of Godot Engine. Guo Hongci Hans Jorgensen Haplo - Hayden Foley Heribert Hirth Hylian Ensemble Ian Richard Kunert Ian Williams - IndustrialRobot - Inki Crow Interstice iveks Jacob D Jaguar - JAJAJA JA Jake D Jako Danar James @@ -518,40 +489,33 @@ generous deed immortalized in the next stable release of Godot Engine. James Thomas Jamie Massey Janis Skuja - JanPaul Bergeson Jan Vetulani JARKKO PARVIAINEN - Jason Bolton Jason Evans Jason Uechi Jeff Hungerford Jeffrey Berube Jennifer Graves - Jeramie Jesse Dubay João Pedro Braz Joe Hurdle Joe Klemmer - John Anders Stav John Barlex John Bruce + John Palgut Jonas Jonas Arndt Jonas Bernemann + Jonas LHOSTE Jonas Rudlang Jonas Yamazaki - Jonatan R Jonathan Bieber Jonathan Ellis Jonathan G - Jon Oakes Jon Sully - Jordan West Jordy Goodridge - Jorge Antunes Jose Francisco 'Yiro' Vera Girona Joseph Catrambone - Josh P Josh Segall Josh Taylor Joshua Heidrich @@ -563,12 +527,11 @@ generous deed immortalized in the next stable release of Godot Engine. Julian Murgia Justin Hamilton Justin Spedding - KaDokta + Justin Zander Kalydi Balázs Katsuomi Kobayashi Keedong Park Keegan Scott - Keinan Powers Keith Bradner Kenji Kawabata Ken Minardo @@ -576,22 +539,19 @@ generous deed immortalized in the next stable release of Godot Engine. Kerotasma Ketafuki killaQueen + kimbring2 Kodera Software Kolandrious - Kristian Nygaard Jensen KsyTek Games kycho Kyle Burnett Kyle Jacobs - Kyle Szklenski Lasse le Dous Laurent CHEA Laurent Dethoor Laxman Pradhan Lech Rozanski Leland Vakarian - Lemin - LEMMiNO Leonardo Baumle Levi Lindsey LF @@ -605,7 +565,7 @@ generous deed immortalized in the next stable release of Godot Engine. Luke Kasz Major Haul Malcolm - Marco Lardelli + Mara Huldra Marcos Heitor Carvalho Markie Music Mark Jad @@ -614,7 +574,6 @@ generous deed immortalized in the next stable release of Godot Engine. Markus Michael Egger Markus Strompen Martin Holas - Martin Linklater Martin LiÅ¡ka Martin Trbola Martin Zabinski @@ -623,14 +582,11 @@ generous deed immortalized in the next stable release of Godot Engine. Matthew Booe Maverick Maxime Blade - Maxime Santerre Maxwell McStuffings - Melchor Morales + Melchor Melissa Mears - Merlyn Morgan-Graham Metal Demon 2000 - mhilbrunner Michael Michael Haney Michael Morrison @@ -640,6 +596,7 @@ generous deed immortalized in the next stable release of Godot Engine. Mikayla Mike Birkhead Mike Copley + Mike McRoberts Miss Mitchell J. Wagner MJacred @@ -652,23 +609,17 @@ generous deed immortalized in the next stable release of Godot Engine. MrAZIE Mrjemandem Nathaniel - neighty + neguse Neil Blakey-Milner Neil Wang Nerdforge Nerdyninja Nicholas La Roux - Nicholas Orlowski Nick Eldrenkamp Nick Macholl Nico Greve - Nicolas Goll-Perrier Nicolas Rosset - Nicolò Brigadoi Calamari Nils Nordmark - Nima Farid - Noah Shomette - Noel Billig Noesis obscuresteel Okatima @@ -676,13 +627,10 @@ generous deed immortalized in the next stable release of Godot Engine. Oliver Ambrose oscar1000108 Oscar Domingo - Panagiotis Xynos Parth Patel - Pascal Patrick Indermühle Patrickm Patrick Nafarrete - Patrick Wuttke Paul Gieske Paul Mozet PaweÅ‚ Kowal @@ -690,6 +638,7 @@ generous deed immortalized in the next stable release of Godot Engine. Pedro Henrique Martins Garcia Peter Höglund Philip Ludington (MrPhil) + Phoenix Jauregui Pierre Caye Pille Pixel Archipel @@ -697,23 +646,20 @@ generous deed immortalized in the next stable release of Godot Engine. Point08 Portponky Preethi Vaidyanathan + Price Comstock PsycHead Puntigames pwab Quincy Quincy Quinn Morrison - RackBar Dingum Rafa Laguna + RagingRoosevelt Ragnar Pettersson Rainer Amler Rammeow - red1939 Relintai Remi Rampin - Remtaine Reneator - Riccardo Marini - Richard Hayes Richard Ivánek Riley Robin Ward @@ -725,7 +671,6 @@ generous deed immortalized in the next stable release of Godot Engine. Roka Roland RzÄ…sa Roman Papush - Ronald Ho Hip (CrimsonZA) Roy Scayged Russ Ryan Groom @@ -733,6 +678,7 @@ generous deed immortalized in the next stable release of Godot Engine. Rykk Sammy Fischer Sangeeth Pavithran + Sasha Schwartz Sean Dee Sebastian Michailidis SeongWan Kim @@ -742,7 +688,6 @@ generous deed immortalized in the next stable release of Godot Engine. Shane Shane Lillie Shane Spoor - Silver1063 simdee Simon Jonas Larsen Simon Schoenenberger @@ -757,22 +702,19 @@ generous deed immortalized in the next stable release of Godot Engine. Soheib El-Harrache Solene Waked Sophie Winter - Sparky Squidgy Squirrel - Stéphane Roussel + SSebigo Stephen Rice Stephen Schlie Steven Drovie summerblind Sung soo Choi - Svenne Krap SxP tadashi endo Tarch Techwizz Terry - Theodore Lindsey TheVoiceInMyHead TheWint Thibaut DECROMBECQUE @@ -789,10 +731,8 @@ generous deed immortalized in the next stable release of Godot Engine. Timothy B. MacDonald Tim Riley Toadile - Tobias Bradtke Tom Coxon Tom Webster - Torgeir Lilleskog Torsten Crass travis f w Travis O'Brien @@ -808,13 +748,15 @@ generous deed immortalized in the next stable release of Godot Engine. v01tech Vaida Vaughan Ling + Vavin.X VikFro Vincent Barkmann + Vincent Cloutier Vincent Foulon Vitaliy Sapronenko - Vi Watch Vladimir Savin - Vuli Nux + volklobo@live.com + Vulinux Wapiti . Wiley Thompson William Bodin @@ -826,6 +768,7 @@ generous deed immortalized in the next stable release of Godot Engine. Yan Shi Zekim Zher Huei Lee + Zoee Silcock ケルベãƒã‚¹ è²´å® å°æ¾ éƒæ™¨ç…œ diff --git a/SConstruct b/SConstruct index 03043ee110..1eb6c0adc8 100644 --- a/SConstruct +++ b/SConstruct @@ -179,7 +179,7 @@ opts.Add(BoolVariable("production", "Set defaults to build Godot for use in prod # Components opts.Add(BoolVariable("deprecated", "Enable compatibility code for deprecated and removed features", True)) -opts.Add(EnumVariable("float", "Floating-point precision", "32", ("32", "64"))) +opts.Add(EnumVariable("precision", "Set the floating-point precision level", "single", ("single", "double"))) opts.Add(BoolVariable("minizip", "Enable ZIP archive support using minizip", True)) opts.Add(BoolVariable("xaudio2", "Enable the XAudio2 audio driver", False)) opts.Add(BoolVariable("vulkan", "Enable the vulkan rendering driver", True)) @@ -442,7 +442,7 @@ if env_base["no_editor_splash"]: if not env_base["deprecated"]: env_base.Append(CPPDEFINES=["DISABLE_DEPRECATED"]) -if env_base["float"] == "64": +if env_base["precision"] == "double": env_base.Append(CPPDEFINES=["REAL_T_IS_DOUBLE"]) if selected_platform in platform_list: @@ -747,7 +747,7 @@ if selected_platform in platform_list: if env.dev_build: suffix += ".dev" - if env_base["float"] == "64": + if env_base["precision"] == "double": suffix += ".double" suffix += "." + env["arch"] diff --git a/core/config/project_settings.cpp b/core/config/project_settings.cpp index d0de39a79d..310df46085 100644 --- a/core/config/project_settings.cpp +++ b/core/config/project_settings.cpp @@ -1277,7 +1277,6 @@ ProjectSettings::ProjectSettings() { GLOBAL_DEF("physics/2d/run_on_separate_thread", false); GLOBAL_DEF("physics/3d/run_on_separate_thread", false); - GLOBAL_DEF("debug/disable_touch", false); GLOBAL_DEF("debug/settings/profiler/max_functions", 16384); custom_prop_info["debug/settings/profiler/max_functions"] = PropertyInfo(Variant::INT, "debug/settings/profiler/max_functions", PROPERTY_HINT_RANGE, "128,65535,1"); diff --git a/core/core_constants.cpp b/core/core_constants.cpp index e0772cd43d..c72b6212d7 100644 --- a/core/core_constants.cpp +++ b/core/core_constants.cpp @@ -153,6 +153,7 @@ void register_global_constants() { BIND_CORE_ENUM_CONSTANT(INLINE_ALIGNMENT_TOP_TO); BIND_CORE_ENUM_CONSTANT(INLINE_ALIGNMENT_CENTER_TO); + BIND_CORE_ENUM_CONSTANT(INLINE_ALIGNMENT_BASELINE_TO); BIND_CORE_ENUM_CONSTANT(INLINE_ALIGNMENT_BOTTOM_TO); BIND_CORE_ENUM_CONSTANT(INLINE_ALIGNMENT_TO_TOP); diff --git a/core/extension/SCsub b/core/extension/SCsub index a8f68a1533..361ce43a2c 100644 --- a/core/extension/SCsub +++ b/core/extension/SCsub @@ -8,8 +8,8 @@ from platform_methods import run_in_subprocess env.CommandNoCache(["ext_wrappers.gen.inc"], "make_wrappers.py", run_in_subprocess(make_wrappers.run)) env.CommandNoCache( - "gdnative_interface_dump.gen.h", - ["gdnative_interface.h", "make_interface_dumper.py"], + "gdextension_interface_dump.gen.h", + ["gdextension_interface.h", "make_interface_dumper.py"], run_in_subprocess(make_interface_dumper.run), ) diff --git a/core/extension/extension_api_dump.cpp b/core/extension/extension_api_dump.cpp index 196bb68b2b..a0e3778dcc 100644 --- a/core/extension/extension_api_dump.cpp +++ b/core/extension/extension_api_dump.cpp @@ -82,7 +82,7 @@ static String get_property_info_type_name(const PropertyInfo &p_info) { return get_builtin_or_variant_type_name(p_info.type); } -Dictionary NativeExtensionAPIDump::generate_extension_api() { +Dictionary GDExtensionAPIDump::generate_extension_api() { Dictionary api_dump; { @@ -177,8 +177,8 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() { }; // Validate sizes at compile time for the current build configuration. - static_assert(type_size_array[Variant::BOOL][sizeof(void *)] == sizeof(GDNativeBool), "Size of bool mismatch"); - static_assert(type_size_array[Variant::INT][sizeof(void *)] == sizeof(GDNativeInt), "Size of int mismatch"); + static_assert(type_size_array[Variant::BOOL][sizeof(void *)] == sizeof(GDExtensionBool), "Size of bool mismatch"); + static_assert(type_size_array[Variant::INT][sizeof(void *)] == sizeof(GDExtensionInt), "Size of int mismatch"); static_assert(type_size_array[Variant::FLOAT][sizeof(void *)] == sizeof(double), "Size of float mismatch"); static_assert(type_size_array[Variant::STRING][sizeof(void *)] == sizeof(String), "Size of String mismatch"); static_assert(type_size_array[Variant::VECTOR2][sizeof(void *)] == sizeof(Vector2), "Size of Vector2 mismatch"); @@ -252,63 +252,140 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() { } { - // Member offsets sizes. + // Member offsets, meta types and sizes. + +#define REAL_MEMBER_OFFSET(type, member) \ + { \ + type, \ + member, \ + "float", \ + sizeof(float), \ + "float", \ + sizeof(float), \ + "double", \ + sizeof(double), \ + "double", \ + sizeof(double), \ + } + +#define INT32_MEMBER_OFFSET(type, member) \ + { \ + type, \ + member, \ + "int32", \ + sizeof(int32_t), \ + "int32", \ + sizeof(int32_t), \ + "int32", \ + sizeof(int32_t), \ + "int32", \ + sizeof(int32_t), \ + } + +#define INT32_BASED_BUILTIN_MEMBER_OFFSET(type, member, member_type, member_elems) \ + { \ + type, \ + member, \ + member_type, \ + sizeof(int32_t) * member_elems, \ + member_type, \ + sizeof(int32_t) * member_elems, \ + member_type, \ + sizeof(int32_t) * member_elems, \ + member_type, \ + sizeof(int32_t) * member_elems, \ + } + +#define REAL_BASED_BUILTIN_MEMBER_OFFSET(type, member, member_type, member_elems) \ + { \ + type, \ + member, \ + member_type, \ + sizeof(float) * member_elems, \ + member_type, \ + sizeof(float) * member_elems, \ + member_type, \ + sizeof(double) * member_elems, \ + member_type, \ + sizeof(double) * member_elems, \ + } + struct { Variant::Type type; const char *member; - uint32_t offset_32_bits_real_float; - uint32_t offset_64_bits_real_float; - uint32_t offset_32_bits_real_double; - uint32_t offset_64_bits_real_double; + const char *member_meta_32_bits_real_float; + const uint32_t member_size_32_bits_real_float; + const char *member_meta_64_bits_real_float; + const uint32_t member_size_64_bits_real_float; + const char *member_meta_32_bits_real_double; + const uint32_t member_size_32_bits_real_double; + const char *member_meta_64_bits_real_double; + const uint32_t member_size_64_bits_real_double; } member_offset_array[] = { - { Variant::VECTOR2, "x", 0, 0, 0, 0 }, - { Variant::VECTOR2, "y", sizeof(float), sizeof(float), sizeof(double), sizeof(double) }, - { Variant::VECTOR2I, "x", 0, 0, 0, 0 }, - { Variant::VECTOR2I, "y", sizeof(int32_t), sizeof(int32_t), sizeof(int32_t), sizeof(int32_t) }, - { Variant::RECT2, "position", 0, 0, 0, 0 }, - { Variant::RECT2, "size", 2 * sizeof(float), 2 * sizeof(float), 2 * sizeof(double), 2 * sizeof(double) }, - { Variant::RECT2I, "position", 0, 0, 0, 0 }, - { Variant::RECT2I, "size", 2 * sizeof(int32_t), 2 * sizeof(int32_t), 2 * sizeof(int32_t), 2 * sizeof(int32_t) }, - { Variant::VECTOR3, "x", 0, 0, 0, 0 }, - { Variant::VECTOR3, "y", sizeof(float), sizeof(float), sizeof(double), sizeof(double) }, - { Variant::VECTOR3, "z", 2 * sizeof(float), 2 * sizeof(float), 2 * sizeof(double), 2 * sizeof(double) }, - { Variant::VECTOR3I, "x", 0, 0, 0, 0 }, - { Variant::VECTOR3I, "y", sizeof(int32_t), sizeof(int32_t), sizeof(int32_t), sizeof(int32_t) }, - { Variant::VECTOR3I, "z", 2 * sizeof(int32_t), 2 * sizeof(int32_t), 2 * sizeof(int32_t), 2 * sizeof(int32_t) }, - { Variant::TRANSFORM2D, "x", 0, 0, 0, 0 }, - { Variant::TRANSFORM2D, "y", 2 * sizeof(float), 2 * sizeof(float), 2 * sizeof(double), 2 * sizeof(double) }, - { Variant::TRANSFORM2D, "origin", 4 * sizeof(float), 4 * sizeof(float), 4 * sizeof(double), 4 * sizeof(double) }, - { Variant::VECTOR4, "x", 0, 0, 0, 0 }, - { Variant::VECTOR4, "y", sizeof(float), sizeof(float), sizeof(double), sizeof(double) }, - { Variant::VECTOR4, "z", 2 * sizeof(float), 2 * sizeof(float), 2 * sizeof(double), 2 * sizeof(double) }, - { Variant::VECTOR4, "w", 3 * sizeof(float), 3 * sizeof(float), 3 * sizeof(double), 3 * sizeof(double) }, - { Variant::VECTOR4I, "x", 0, 0, 0, 0 }, - { Variant::VECTOR4I, "y", sizeof(int32_t), sizeof(int32_t), sizeof(int32_t), sizeof(int32_t) }, - { Variant::VECTOR4I, "z", 2 * sizeof(int32_t), 2 * sizeof(int32_t), 2 * sizeof(int32_t), 2 * sizeof(int32_t) }, - { Variant::VECTOR4I, "w", 3 * sizeof(int32_t), 3 * sizeof(int32_t), 3 * sizeof(int32_t), 3 * sizeof(int32_t) }, - { Variant::PLANE, "normal", 0, 0, 0, 0 }, - { Variant::PLANE, "d", vec3_elems * sizeof(float), vec3_elems * sizeof(float), vec3_elems * sizeof(double), vec3_elems * sizeof(double) }, - { Variant::QUATERNION, "x", 0, 0, 0, 0 }, - { Variant::QUATERNION, "y", sizeof(float), sizeof(float), sizeof(double), sizeof(double) }, - { Variant::QUATERNION, "z", 2 * sizeof(float), 2 * sizeof(float), 2 * sizeof(double), 2 * sizeof(double) }, - { Variant::QUATERNION, "w", 3 * sizeof(float), 3 * sizeof(float), 3 * sizeof(double), 3 * sizeof(double) }, - { Variant::AABB, "position", 0, 0, 0, 0 }, - { Variant::AABB, "size", vec3_elems * sizeof(float), vec3_elems * sizeof(float), vec3_elems * sizeof(double), vec3_elems * sizeof(double) }, - // Remember that basis vectors are flipped! - { Variant::BASIS, "x", 0, 0, 0, 0 }, - { Variant::BASIS, "y", vec3_elems * sizeof(float), vec3_elems * sizeof(float), vec3_elems * sizeof(double), vec3_elems * sizeof(double) }, - { Variant::BASIS, "z", vec3_elems * 2 * sizeof(float), vec3_elems * 2 * sizeof(float), vec3_elems * 2 * sizeof(double), vec3_elems * 2 * sizeof(double) }, - { Variant::TRANSFORM3D, "basis", 0, 0, 0, 0 }, - { Variant::TRANSFORM3D, "origin", (vec3_elems * 3) * sizeof(float), (vec3_elems * 3) * sizeof(float), (vec3_elems * 3) * sizeof(double), (vec3_elems * 3) * sizeof(double) }, - { Variant::PROJECTION, "x", 0, 0, 0, 0 }, - { Variant::PROJECTION, "y", vec4_elems * sizeof(float), vec4_elems * sizeof(float), vec4_elems * sizeof(double), vec4_elems * sizeof(double) }, - { Variant::PROJECTION, "z", vec4_elems * 2 * sizeof(float), vec4_elems * 2 * sizeof(float), vec4_elems * 2 * sizeof(double), vec4_elems * 2 * sizeof(double) }, - { Variant::PROJECTION, "w", vec4_elems * 3 * sizeof(float), vec4_elems * 3 * sizeof(float), vec4_elems * 3 * sizeof(double), vec4_elems * 3 * sizeof(double) }, - { Variant::COLOR, "r", 0, 0, 0, 0 }, - { Variant::COLOR, "g", sizeof(float), sizeof(float), sizeof(float), sizeof(float) }, - { Variant::COLOR, "b", 2 * sizeof(float), 2 * sizeof(float), 2 * sizeof(float), 2 * sizeof(float) }, - { Variant::COLOR, "a", 3 * sizeof(float), 3 * sizeof(float), 3 * sizeof(float), 3 * sizeof(float) }, - { Variant::NIL, nullptr, 0, 0, 0, 0 }, + // Vector2 + REAL_MEMBER_OFFSET(Variant::VECTOR2, "x"), + REAL_MEMBER_OFFSET(Variant::VECTOR2, "y"), + // Vector2i + INT32_MEMBER_OFFSET(Variant::VECTOR2I, "x"), + INT32_MEMBER_OFFSET(Variant::VECTOR2I, "y"), + // Rect2 + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::RECT2, "position", "Vector2", 2), + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::RECT2, "size", "Vector2", 2), + // Rect2i + INT32_BASED_BUILTIN_MEMBER_OFFSET(Variant::RECT2I, "position", "Vector2i", 2), + INT32_BASED_BUILTIN_MEMBER_OFFSET(Variant::RECT2I, "size", "Vector2i", 2), + // Vector3 + REAL_MEMBER_OFFSET(Variant::VECTOR3, "x"), + REAL_MEMBER_OFFSET(Variant::VECTOR3, "y"), + REAL_MEMBER_OFFSET(Variant::VECTOR3, "z"), + // Vector3i + INT32_MEMBER_OFFSET(Variant::VECTOR3I, "x"), + INT32_MEMBER_OFFSET(Variant::VECTOR3I, "y"), + INT32_MEMBER_OFFSET(Variant::VECTOR3I, "z"), + // Transform2D + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::TRANSFORM2D, "x", "Vector2", 2), + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::TRANSFORM2D, "y", "Vector2", 2), + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::TRANSFORM2D, "origin", "Vector2", 2), + // Vector4 + REAL_MEMBER_OFFSET(Variant::VECTOR4, "x"), + REAL_MEMBER_OFFSET(Variant::VECTOR4, "y"), + REAL_MEMBER_OFFSET(Variant::VECTOR4, "z"), + REAL_MEMBER_OFFSET(Variant::VECTOR4, "w"), + // Vector4i + INT32_MEMBER_OFFSET(Variant::VECTOR4I, "x"), + INT32_MEMBER_OFFSET(Variant::VECTOR4I, "y"), + INT32_MEMBER_OFFSET(Variant::VECTOR4I, "z"), + INT32_MEMBER_OFFSET(Variant::VECTOR4I, "w"), + // Plane + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::PLANE, "normal", "Vector3", vec3_elems), + REAL_MEMBER_OFFSET(Variant::PLANE, "d"), + // Quaternion + REAL_MEMBER_OFFSET(Variant::QUATERNION, "x"), + REAL_MEMBER_OFFSET(Variant::QUATERNION, "y"), + REAL_MEMBER_OFFSET(Variant::QUATERNION, "z"), + REAL_MEMBER_OFFSET(Variant::QUATERNION, "w"), + // AABB + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::AABB, "position", "Vector3", vec3_elems), + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::AABB, "size", "Vector3", vec3_elems), + // Basis (remember that basis vectors are flipped!) + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::BASIS, "x", "Vector3", vec3_elems), + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::BASIS, "y", "Vector3", vec3_elems), + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::BASIS, "z", "Vector3", vec3_elems), + // Transform3D + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::TRANSFORM3D, "basis", "Basis", vec3_elems * 3), + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::TRANSFORM3D, "origin", "Vector3", vec3_elems), + // Projection + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::PROJECTION, "x", "Vector4", vec4_elems), + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::PROJECTION, "y", "Vector4", vec4_elems), + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::PROJECTION, "z", "Vector4", vec4_elems), + REAL_BASED_BUILTIN_MEMBER_OFFSET(Variant::PROJECTION, "w", "Vector4", vec4_elems), + // Color (always composed of 4bytes floats) + { Variant::COLOR, "r", "float", sizeof(float), "float", sizeof(float), "float", sizeof(float), "float", sizeof(float) }, + { Variant::COLOR, "g", "float", sizeof(float), "float", sizeof(float), "float", sizeof(float), "float", sizeof(float) }, + { Variant::COLOR, "b", "float", sizeof(float), "float", sizeof(float), "float", sizeof(float), "float", sizeof(float) }, + { Variant::COLOR, "a", "float", sizeof(float), "float", sizeof(float), "float", sizeof(float), "float", sizeof(float) }, + // End marker, must stay last + { Variant::NIL, nullptr, nullptr, 0, nullptr, 0, nullptr, 0, nullptr, 0 }, }; Array core_type_member_offsets; @@ -319,15 +396,16 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() { Array type_offsets; uint32_t idx = 0; - Variant::Type last_type = Variant::NIL; + Variant::Type previous_type = Variant::NIL; Dictionary d2; Array members; + uint32_t offset = 0; while (true) { Variant::Type t = member_offset_array[idx].type; - if (t != last_type) { - if (last_type != Variant::NIL) { + if (t != previous_type) { + if (previous_type != Variant::NIL) { d2["members"] = members; type_offsets.push_back(d2); } @@ -338,27 +416,35 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() { String name = t == Variant::VARIANT_MAX ? String("Variant") : Variant::get_type_name(t); d2 = Dictionary(); members = Array(); + offset = 0; d2["name"] = name; - last_type = t; + previous_type = t; } Dictionary d3; - uint32_t offset = 0; + const char *member_meta = nullptr; + uint32_t member_size = 0; switch (i) { case 0: - offset = member_offset_array[idx].offset_32_bits_real_float; + member_meta = member_offset_array[idx].member_meta_32_bits_real_float; + member_size = member_offset_array[idx].member_size_32_bits_real_float; break; case 1: - offset = member_offset_array[idx].offset_64_bits_real_float; + member_meta = member_offset_array[idx].member_meta_64_bits_real_float; + member_size = member_offset_array[idx].member_size_64_bits_real_float; break; case 2: - offset = member_offset_array[idx].offset_32_bits_real_double; + member_meta = member_offset_array[idx].member_meta_32_bits_real_double; + member_size = member_offset_array[idx].member_size_32_bits_real_double; break; case 3: - offset = member_offset_array[idx].offset_64_bits_real_double; + member_meta = member_offset_array[idx].member_meta_64_bits_real_double; + member_size = member_offset_array[idx].member_size_64_bits_real_double; break; } d3["member"] = member_offset_array[idx].member; d3["offset"] = offset; + d3["meta"] = member_meta; + offset += member_size; members.push_back(d3); idx++; } @@ -943,7 +1029,7 @@ Dictionary NativeExtensionAPIDump::generate_extension_api() { return api_dump; } -void NativeExtensionAPIDump::generate_extension_json_file(const String &p_path) { +void GDExtensionAPIDump::generate_extension_json_file(const String &p_path) { Dictionary api = generate_extension_api(); Ref<JSON> json; json.instantiate(); diff --git a/core/extension/extension_api_dump.h b/core/extension/extension_api_dump.h index 1bc455ea67..e488d8a086 100644 --- a/core/extension/extension_api_dump.h +++ b/core/extension/extension_api_dump.h @@ -31,11 +31,11 @@ #ifndef EXTENSION_API_DUMP_H #define EXTENSION_API_DUMP_H -#include "core/extension/native_extension.h" +#include "core/extension/gdextension.h" #ifdef TOOLS_ENABLED -class NativeExtensionAPIDump { +class GDExtensionAPIDump { public: static Dictionary generate_extension_api(); static void generate_extension_json_file(const String &p_path); diff --git a/core/extension/native_extension.cpp b/core/extension/gdextension.cpp index e7e350687b..0c5c736efe 100644 --- a/core/extension/native_extension.cpp +++ b/core/extension/gdextension.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* native_extension.cpp */ +/* gdextension.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,18 +28,18 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "native_extension.h" +#include "gdextension.h" #include "core/config/project_settings.h" #include "core/io/dir_access.h" #include "core/object/class_db.h" #include "core/object/method_bind.h" #include "core/os/os.h" -String NativeExtension::get_extension_list_config_file() { +String GDExtension::get_extension_list_config_file() { return ProjectSettings::get_singleton()->get_project_data_path().path_join("extension_list.cfg"); } -String NativeExtension::find_extension_library(const String &p_path, Ref<ConfigFile> p_config, std::function<bool(String)> p_has_feature, PackedStringArray *r_tags) { +String GDExtension::find_extension_library(const String &p_path, Ref<ConfigFile> p_config, std::function<bool(String)> p_has_feature, PackedStringArray *r_tags) { // First, check the explicit libraries. if (p_config->has_section("libraries")) { List<String> libraries; @@ -144,9 +144,9 @@ String NativeExtension::find_extension_library(const String &p_path, Ref<ConfigF return String(); } -class NativeExtensionMethodBind : public MethodBind { - GDNativeExtensionClassMethodCall call_func; - GDNativeExtensionClassMethodPtrCall ptrcall_func; +class GDExtensionMethodBind : public MethodBind { + GDExtensionClassMethodCall call_func; + GDExtensionClassMethodPtrCall ptrcall_func; void *method_userdata; bool vararg; PropertyInfo return_value_info; @@ -184,8 +184,8 @@ public: virtual Variant call(Object *p_object, const Variant **p_args, int p_arg_count, Callable::CallError &r_error) const override { Variant ret; GDExtensionClassInstancePtr extension_instance = is_static() ? nullptr : p_object->_get_extension_instance(); - GDNativeCallError ce{ GDNATIVE_CALL_OK, 0, 0 }; - call_func(method_userdata, extension_instance, reinterpret_cast<GDNativeConstVariantPtr *>(p_args), p_arg_count, (GDNativeVariantPtr)&ret, &ce); + GDExtensionCallError ce{ GDEXTENSION_CALL_OK, 0, 0 }; + call_func(method_userdata, extension_instance, reinterpret_cast<GDExtensionConstVariantPtr *>(p_args), p_arg_count, (GDExtensionVariantPtr)&ret, &ce); r_error.error = Callable::CallError::Error(ce.error); r_error.argument = ce.argument; r_error.expected = ce.expected; @@ -194,14 +194,14 @@ public: virtual void ptrcall(Object *p_object, const void **p_args, void *r_ret) const override { ERR_FAIL_COND_MSG(vararg, "Vararg methods don't have ptrcall support. This is most likely an engine bug."); GDExtensionClassInstancePtr extension_instance = p_object->_get_extension_instance(); - ptrcall_func(method_userdata, extension_instance, reinterpret_cast<GDNativeConstTypePtr *>(p_args), (GDNativeTypePtr)r_ret); + ptrcall_func(method_userdata, extension_instance, reinterpret_cast<GDExtensionConstTypePtr *>(p_args), (GDExtensionTypePtr)r_ret); } virtual bool is_vararg() const override { return false; } - explicit NativeExtensionMethodBind(const GDNativeExtensionClassMethodInfo *p_method_info) { + explicit GDExtensionMethodBind(const GDExtensionClassMethodInfo *p_method_info) { method_userdata = p_method_info->method_userdata; call_func = p_method_info->call_func; ptrcall_func = p_method_info->ptrcall_func; @@ -219,10 +219,10 @@ public: set_hint_flags(p_method_info->method_flags); - vararg = p_method_info->method_flags & GDNATIVE_EXTENSION_METHOD_FLAG_VARARG; + vararg = p_method_info->method_flags & GDEXTENSION_METHOD_FLAG_VARARG; _set_returns(p_method_info->has_return_value); - _set_const(p_method_info->method_flags & GDNATIVE_EXTENSION_METHOD_FLAG_CONST); - _set_static(p_method_info->method_flags & GDNATIVE_EXTENSION_METHOD_FLAG_STATIC); + _set_const(p_method_info->method_flags & GDEXTENSION_METHOD_FLAG_CONST); + _set_static(p_method_info->method_flags & GDEXTENSION_METHOD_FLAG_STATIC); #ifdef DEBUG_METHODS_ENABLED _generate_argument_types(p_method_info->argument_count); #endif @@ -238,10 +238,10 @@ public: } }; -static GDNativeInterface gdnative_interface; +static GDExtensionInterface gdextension_interface; -void NativeExtension::_register_extension_class(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_parent_class_name, const GDNativeExtensionClassCreationInfo *p_extension_funcs) { - NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library); +void GDExtension::_register_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo *p_extension_funcs) { + GDExtension *self = reinterpret_cast<GDExtension *>(p_library); StringName class_name = *reinterpret_cast<const StringName *>(p_class_name); StringName parent_class_name = *reinterpret_cast<const StringName *>(p_parent_class_name); @@ -268,35 +268,35 @@ void NativeExtension::_register_extension_class(GDNativeExtensionClassLibraryPtr Extension *extension = &self->extension_classes[class_name]; if (parent_extension) { - extension->native_extension.parent = &parent_extension->native_extension; - parent_extension->native_extension.children.push_back(&extension->native_extension); + extension->gdextension.parent = &parent_extension->gdextension; + parent_extension->gdextension.children.push_back(&extension->gdextension); } - extension->native_extension.parent_class_name = parent_class_name; - extension->native_extension.class_name = class_name; - extension->native_extension.editor_class = self->level_initialized == INITIALIZATION_LEVEL_EDITOR; - extension->native_extension.is_virtual = p_extension_funcs->is_virtual; - extension->native_extension.is_abstract = p_extension_funcs->is_abstract; - extension->native_extension.set = p_extension_funcs->set_func; - extension->native_extension.get = p_extension_funcs->get_func; - extension->native_extension.get_property_list = p_extension_funcs->get_property_list_func; - extension->native_extension.free_property_list = p_extension_funcs->free_property_list_func; - extension->native_extension.property_can_revert = p_extension_funcs->property_can_revert_func; - extension->native_extension.property_get_revert = p_extension_funcs->property_get_revert_func; - extension->native_extension.notification = p_extension_funcs->notification_func; - extension->native_extension.to_string = p_extension_funcs->to_string_func; - extension->native_extension.reference = p_extension_funcs->reference_func; - extension->native_extension.unreference = p_extension_funcs->unreference_func; - extension->native_extension.class_userdata = p_extension_funcs->class_userdata; - extension->native_extension.create_instance = p_extension_funcs->create_instance_func; - extension->native_extension.free_instance = p_extension_funcs->free_instance_func; - extension->native_extension.get_virtual = p_extension_funcs->get_virtual_func; - extension->native_extension.get_rid = p_extension_funcs->get_rid_func; - - ClassDB::register_extension_class(&extension->native_extension); + extension->gdextension.parent_class_name = parent_class_name; + extension->gdextension.class_name = class_name; + extension->gdextension.editor_class = self->level_initialized == INITIALIZATION_LEVEL_EDITOR; + extension->gdextension.is_virtual = p_extension_funcs->is_virtual; + extension->gdextension.is_abstract = p_extension_funcs->is_abstract; + extension->gdextension.set = p_extension_funcs->set_func; + extension->gdextension.get = p_extension_funcs->get_func; + extension->gdextension.get_property_list = p_extension_funcs->get_property_list_func; + extension->gdextension.free_property_list = p_extension_funcs->free_property_list_func; + extension->gdextension.property_can_revert = p_extension_funcs->property_can_revert_func; + extension->gdextension.property_get_revert = p_extension_funcs->property_get_revert_func; + extension->gdextension.notification = p_extension_funcs->notification_func; + extension->gdextension.to_string = p_extension_funcs->to_string_func; + extension->gdextension.reference = p_extension_funcs->reference_func; + extension->gdextension.unreference = p_extension_funcs->unreference_func; + extension->gdextension.class_userdata = p_extension_funcs->class_userdata; + extension->gdextension.create_instance = p_extension_funcs->create_instance_func; + extension->gdextension.free_instance = p_extension_funcs->free_instance_func; + extension->gdextension.get_virtual = p_extension_funcs->get_virtual_func; + extension->gdextension.get_rid = p_extension_funcs->get_rid_func; + + ClassDB::register_extension_class(&extension->gdextension); } -void NativeExtension::_register_extension_class_method(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info) { - NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library); +void GDExtension::_register_extension_class_method(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionClassMethodInfo *p_method_info) { + GDExtension *self = reinterpret_cast<GDExtension *>(p_library); StringName class_name = *reinterpret_cast<const StringName *>(p_class_name); StringName method_name = *reinterpret_cast<const StringName *>(p_method_info->name); @@ -304,13 +304,13 @@ void NativeExtension::_register_extension_class_method(GDNativeExtensionClassLib //Extension *extension = &self->extension_classes[class_name]; - NativeExtensionMethodBind *method = memnew(NativeExtensionMethodBind(p_method_info)); + GDExtensionMethodBind *method = memnew(GDExtensionMethodBind(p_method_info)); method->set_instance_class(class_name); ClassDB::bind_method_custom(class_name, method); } -void NativeExtension::_register_extension_class_integer_constant(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_enum_name, GDNativeConstStringNamePtr p_constant_name, GDNativeInt p_constant_value, GDNativeBool p_is_bitfield) { - NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library); +void GDExtension::_register_extension_class_integer_constant(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_enum_name, GDExtensionConstStringNamePtr p_constant_name, GDExtensionInt p_constant_value, GDExtensionBool p_is_bitfield) { + GDExtension *self = reinterpret_cast<GDExtension *>(p_library); StringName class_name = *reinterpret_cast<const StringName *>(p_class_name); StringName enum_name = *reinterpret_cast<const StringName *>(p_enum_name); @@ -320,8 +320,8 @@ void NativeExtension::_register_extension_class_integer_constant(GDNativeExtensi ClassDB::bind_integer_constant(class_name, enum_name, constant_name, p_constant_value, p_is_bitfield); } -void NativeExtension::_register_extension_class_property(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativePropertyInfo *p_info, GDNativeConstStringNamePtr p_setter, GDNativeConstStringNamePtr p_getter) { - NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library); +void GDExtension::_register_extension_class_property(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionPropertyInfo *p_info, GDExtensionConstStringNamePtr p_setter, GDExtensionConstStringNamePtr p_getter) { + GDExtension *self = reinterpret_cast<GDExtension *>(p_library); StringName class_name = *reinterpret_cast<const StringName *>(p_class_name); StringName setter = *reinterpret_cast<const StringName *>(p_setter); @@ -335,8 +335,8 @@ void NativeExtension::_register_extension_class_property(GDNativeExtensionClassL ClassDB::add_property(class_name, pinfo, setter, getter); } -void NativeExtension::_register_extension_class_property_group(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringPtr p_group_name, GDNativeConstStringPtr p_prefix) { - NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library); +void GDExtension::_register_extension_class_property_group(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_group_name, GDExtensionConstStringPtr p_prefix) { + GDExtension *self = reinterpret_cast<GDExtension *>(p_library); StringName class_name = *reinterpret_cast<const StringName *>(p_class_name); String group_name = *reinterpret_cast<const String *>(p_group_name); @@ -346,8 +346,8 @@ void NativeExtension::_register_extension_class_property_group(GDNativeExtension ClassDB::add_property_group(class_name, group_name, prefix); } -void NativeExtension::_register_extension_class_property_subgroup(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringPtr p_subgroup_name, GDNativeConstStringPtr p_prefix) { - NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library); +void GDExtension::_register_extension_class_property_subgroup(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_subgroup_name, GDExtensionConstStringPtr p_prefix) { + GDExtension *self = reinterpret_cast<GDExtension *>(p_library); StringName class_name = *reinterpret_cast<const StringName *>(p_class_name); String subgroup_name = *reinterpret_cast<const String *>(p_subgroup_name); @@ -357,8 +357,8 @@ void NativeExtension::_register_extension_class_property_subgroup(GDNativeExtens ClassDB::add_property_subgroup(class_name, subgroup_name, prefix); } -void NativeExtension::_register_extension_class_signal(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_signal_name, const GDNativePropertyInfo *p_argument_info, GDNativeInt p_argument_count) { - NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library); +void GDExtension::_register_extension_class_signal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_signal_name, const GDExtensionPropertyInfo *p_argument_info, GDExtensionInt p_argument_count) { + GDExtension *self = reinterpret_cast<GDExtension *>(p_library); StringName class_name = *reinterpret_cast<const StringName *>(p_class_name); StringName signal_name = *reinterpret_cast<const StringName *>(p_signal_name); @@ -373,28 +373,28 @@ void NativeExtension::_register_extension_class_signal(GDNativeExtensionClassLib ClassDB::add_signal(class_name, s); } -void NativeExtension::_unregister_extension_class(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name) { - NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library); +void GDExtension::_unregister_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name) { + GDExtension *self = reinterpret_cast<GDExtension *>(p_library); StringName class_name = *reinterpret_cast<const StringName *>(p_class_name); ERR_FAIL_COND_MSG(!self->extension_classes.has(class_name), "Attempt to unregister unexisting extension class '" + class_name + "'."); Extension *ext = &self->extension_classes[class_name]; - ERR_FAIL_COND_MSG(ext->native_extension.children.size(), "Attempt to unregister class '" + class_name + "' while other extension classes inherit from it."); + ERR_FAIL_COND_MSG(ext->gdextension.children.size(), "Attempt to unregister class '" + class_name + "' while other extension classes inherit from it."); ClassDB::unregister_extension_class(class_name); - if (ext->native_extension.parent != nullptr) { - ext->native_extension.parent->children.erase(&ext->native_extension); + if (ext->gdextension.parent != nullptr) { + ext->gdextension.parent->children.erase(&ext->gdextension); } self->extension_classes.erase(class_name); } -void NativeExtension::_get_library_path(GDNativeExtensionClassLibraryPtr p_library, GDNativeStringPtr r_path) { - NativeExtension *self = reinterpret_cast<NativeExtension *>(p_library); +void GDExtension::_get_library_path(GDExtensionClassLibraryPtr p_library, GDExtensionStringPtr r_path) { + GDExtension *self = reinterpret_cast<GDExtension *>(p_library); *(String *)r_path = self->library_path; } -Error NativeExtension::open_library(const String &p_path, const String &p_entry_symbol) { +Error GDExtension::open_library(const String &p_path, const String &p_entry_symbol) { Error err = OS::get_singleton()->open_dynamic_library(p_path, library, true, &library_path); if (err != OK) { ERR_PRINT("GDExtension dynamic library not found: " + p_path); @@ -411,9 +411,9 @@ Error NativeExtension::open_library(const String &p_path, const String &p_entry_ return err; } - GDNativeInitializationFunction initialization_function = (GDNativeInitializationFunction)entry_funcptr; + GDExtensionInitializationFunction initialization_function = (GDExtensionInitializationFunction)entry_funcptr; - if (initialization_function(&gdnative_interface, this, &initialization)) { + if (initialization_function(&gdextension_interface, this, &initialization)) { level_initialized = -1; return OK; } else { @@ -422,23 +422,23 @@ Error NativeExtension::open_library(const String &p_path, const String &p_entry_ } } -void NativeExtension::close_library() { +void GDExtension::close_library() { ERR_FAIL_COND(library == nullptr); OS::get_singleton()->close_dynamic_library(library); library = nullptr; } -bool NativeExtension::is_library_open() const { +bool GDExtension::is_library_open() const { return library != nullptr; } -NativeExtension::InitializationLevel NativeExtension::get_minimum_library_initialization_level() const { +GDExtension::InitializationLevel GDExtension::get_minimum_library_initialization_level() const { ERR_FAIL_COND_V(library == nullptr, INITIALIZATION_LEVEL_CORE); return InitializationLevel(initialization.minimum_initialization_level); } -void NativeExtension::initialize_library(InitializationLevel p_level) { +void GDExtension::initialize_library(InitializationLevel p_level) { ERR_FAIL_COND(library == nullptr); ERR_FAIL_COND_MSG(p_level <= int32_t(level_initialized), vformat("Level '%d' must be higher than the current level '%d'", p_level, level_initialized)); @@ -446,23 +446,23 @@ void NativeExtension::initialize_library(InitializationLevel p_level) { ERR_FAIL_COND(initialization.initialize == nullptr); - initialization.initialize(initialization.userdata, GDNativeInitializationLevel(p_level)); + initialization.initialize(initialization.userdata, GDExtensionInitializationLevel(p_level)); } -void NativeExtension::deinitialize_library(InitializationLevel p_level) { +void GDExtension::deinitialize_library(InitializationLevel p_level) { ERR_FAIL_COND(library == nullptr); ERR_FAIL_COND(p_level > int32_t(level_initialized)); level_initialized = int32_t(p_level) - 1; - initialization.deinitialize(initialization.userdata, GDNativeInitializationLevel(p_level)); + initialization.deinitialize(initialization.userdata, GDExtensionInitializationLevel(p_level)); } -void NativeExtension::_bind_methods() { - ClassDB::bind_method(D_METHOD("open_library", "path", "entry_symbol"), &NativeExtension::open_library); - ClassDB::bind_method(D_METHOD("close_library"), &NativeExtension::close_library); - ClassDB::bind_method(D_METHOD("is_library_open"), &NativeExtension::is_library_open); +void GDExtension::_bind_methods() { + ClassDB::bind_method(D_METHOD("open_library", "path", "entry_symbol"), &GDExtension::open_library); + ClassDB::bind_method(D_METHOD("close_library"), &GDExtension::close_library); + ClassDB::bind_method(D_METHOD("is_library_open"), &GDExtension::is_library_open); - ClassDB::bind_method(D_METHOD("get_minimum_library_initialization_level"), &NativeExtension::get_minimum_library_initialization_level); - ClassDB::bind_method(D_METHOD("initialize_library", "level"), &NativeExtension::initialize_library); + ClassDB::bind_method(D_METHOD("get_minimum_library_initialization_level"), &GDExtension::get_minimum_library_initialization_level); + ClassDB::bind_method(D_METHOD("initialize_library", "level"), &GDExtension::initialize_library); BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_CORE); BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_SERVERS); @@ -470,32 +470,32 @@ void NativeExtension::_bind_methods() { BIND_ENUM_CONSTANT(INITIALIZATION_LEVEL_EDITOR); } -NativeExtension::NativeExtension() { +GDExtension::GDExtension() { } -NativeExtension::~NativeExtension() { +GDExtension::~GDExtension() { if (library != nullptr) { close_library(); } } -extern void gdnative_setup_interface(GDNativeInterface *p_interface); +extern void gdextension_setup_interface(GDExtensionInterface *p_interface); -void NativeExtension::initialize_native_extensions() { - gdnative_setup_interface(&gdnative_interface); +void GDExtension::initialize_gdextensions() { + gdextension_setup_interface(&gdextension_interface); - gdnative_interface.classdb_register_extension_class = _register_extension_class; - gdnative_interface.classdb_register_extension_class_method = _register_extension_class_method; - gdnative_interface.classdb_register_extension_class_integer_constant = _register_extension_class_integer_constant; - gdnative_interface.classdb_register_extension_class_property = _register_extension_class_property; - gdnative_interface.classdb_register_extension_class_property_group = _register_extension_class_property_group; - gdnative_interface.classdb_register_extension_class_property_subgroup = _register_extension_class_property_subgroup; - gdnative_interface.classdb_register_extension_class_signal = _register_extension_class_signal; - gdnative_interface.classdb_unregister_extension_class = _unregister_extension_class; - gdnative_interface.get_library_path = _get_library_path; + gdextension_interface.classdb_register_extension_class = _register_extension_class; + gdextension_interface.classdb_register_extension_class_method = _register_extension_class_method; + gdextension_interface.classdb_register_extension_class_integer_constant = _register_extension_class_integer_constant; + gdextension_interface.classdb_register_extension_class_property = _register_extension_class_property; + gdextension_interface.classdb_register_extension_class_property_group = _register_extension_class_property_group; + gdextension_interface.classdb_register_extension_class_property_subgroup = _register_extension_class_property_subgroup; + gdextension_interface.classdb_register_extension_class_signal = _register_extension_class_signal; + gdextension_interface.classdb_unregister_extension_class = _unregister_extension_class; + gdextension_interface.get_library_path = _get_library_path; } -Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode) { +Ref<Resource> GDExtensionResourceLoader::load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads, float *r_progress, CacheMode p_cache_mode) { Ref<ConfigFile> config; config.instantiate(); @@ -520,7 +520,7 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St String entry_symbol = config->get_value("configuration", "entry_symbol"); - String library_path = NativeExtension::find_extension_library(p_path, config, [](String p_feature) { return OS::get_singleton()->has_feature(p_feature); }); + String library_path = GDExtension::find_extension_library(p_path, config, [](String p_feature) { return OS::get_singleton()->has_feature(p_feature); }); if (library_path.is_empty()) { if (r_error) { @@ -535,7 +535,7 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St library_path = p_path.get_base_dir().path_join(library_path); } - Ref<NativeExtension> lib; + Ref<GDExtension> lib; lib.instantiate(); String abs_path = ProjectSettings::get_singleton()->globalize_path(library_path); err = lib->open_library(abs_path, entry_symbol); @@ -552,18 +552,18 @@ Ref<Resource> NativeExtensionResourceLoader::load(const String &p_path, const St return lib; } -void NativeExtensionResourceLoader::get_recognized_extensions(List<String> *p_extensions) const { +void GDExtensionResourceLoader::get_recognized_extensions(List<String> *p_extensions) const { p_extensions->push_back("gdextension"); } -bool NativeExtensionResourceLoader::handles_type(const String &p_type) const { - return p_type == "NativeExtension"; +bool GDExtensionResourceLoader::handles_type(const String &p_type) const { + return p_type == "GDExtension"; } -String NativeExtensionResourceLoader::get_resource_type(const String &p_path) const { +String GDExtensionResourceLoader::get_resource_type(const String &p_path) const { String el = p_path.get_extension().to_lower(); if (el == "gdextension") { - return "NativeExtension"; + return "GDExtension"; } return ""; } diff --git a/core/extension/native_extension.h b/core/extension/gdextension.h index 77654cf0a8..26ebdc9a08 100644 --- a/core/extension/native_extension.h +++ b/core/extension/gdextension.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* native_extension.h */ +/* gdextension.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,39 +28,39 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef NATIVE_EXTENSION_H -#define NATIVE_EXTENSION_H +#ifndef GDEXTENSION_H +#define GDEXTENSION_H #include <functional> -#include "core/extension/gdnative_interface.h" +#include "core/extension/gdextension_interface.h" #include "core/io/config_file.h" #include "core/io/resource_loader.h" #include "core/object/ref_counted.h" -class NativeExtension : public Resource { - GDCLASS(NativeExtension, Resource) +class GDExtension : public Resource { + GDCLASS(GDExtension, Resource) void *library = nullptr; // pointer if valid, String library_path; struct Extension { - ObjectNativeExtension native_extension; + ObjectGDExtension gdextension; }; HashMap<StringName, Extension> extension_classes; - static void _register_extension_class(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_parent_class_name, const GDNativeExtensionClassCreationInfo *p_extension_funcs); - static void _register_extension_class_method(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info); - static void _register_extension_class_integer_constant(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_enum_name, GDNativeConstStringNamePtr p_constant_name, GDNativeInt p_constant_value, GDNativeBool p_is_bitfield); - static void _register_extension_class_property(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativePropertyInfo *p_info, GDNativeConstStringNamePtr p_setter, GDNativeConstStringNamePtr p_getter); - static void _register_extension_class_property_group(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_group_name, GDNativeConstStringNamePtr p_prefix); - static void _register_extension_class_property_subgroup(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_subgroup_name, GDNativeConstStringNamePtr p_prefix); - static void _register_extension_class_signal(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_signal_name, const GDNativePropertyInfo *p_argument_info, GDNativeInt p_argument_count); - static void _unregister_extension_class(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name); - static void _get_library_path(GDNativeExtensionClassLibraryPtr p_library, GDNativeStringPtr r_path); - - GDNativeInitialization initialization; + static void _register_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo *p_extension_funcs); + static void _register_extension_class_method(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionClassMethodInfo *p_method_info); + static void _register_extension_class_integer_constant(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_enum_name, GDExtensionConstStringNamePtr p_constant_name, GDExtensionInt p_constant_value, GDExtensionBool p_is_bitfield); + static void _register_extension_class_property(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionPropertyInfo *p_info, GDExtensionConstStringNamePtr p_setter, GDExtensionConstStringNamePtr p_getter); + static void _register_extension_class_property_group(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_group_name, GDExtensionConstStringNamePtr p_prefix); + static void _register_extension_class_property_subgroup(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_subgroup_name, GDExtensionConstStringNamePtr p_prefix); + static void _register_extension_class_signal(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_signal_name, const GDExtensionPropertyInfo *p_argument_info, GDExtensionInt p_argument_count); + static void _unregister_extension_class(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name); + static void _get_library_path(GDExtensionClassLibraryPtr p_library, GDExtensionStringPtr r_path); + + GDExtensionInitialization initialization; int32_t level_initialized = -1; protected: @@ -74,10 +74,10 @@ public: void close_library(); enum InitializationLevel { - INITIALIZATION_LEVEL_CORE = GDNATIVE_INITIALIZATION_CORE, - INITIALIZATION_LEVEL_SERVERS = GDNATIVE_INITIALIZATION_SERVERS, - INITIALIZATION_LEVEL_SCENE = GDNATIVE_INITIALIZATION_SCENE, - INITIALIZATION_LEVEL_EDITOR = GDNATIVE_INITIALIZATION_EDITOR + INITIALIZATION_LEVEL_CORE = GDEXTENSION_INITIALIZATION_CORE, + INITIALIZATION_LEVEL_SERVERS = GDEXTENSION_INITIALIZATION_SERVERS, + INITIALIZATION_LEVEL_SCENE = GDEXTENSION_INITIALIZATION_SCENE, + INITIALIZATION_LEVEL_EDITOR = GDEXTENSION_INITIALIZATION_EDITOR }; bool is_library_open() const; @@ -86,14 +86,14 @@ public: void initialize_library(InitializationLevel p_level); void deinitialize_library(InitializationLevel p_level); - static void initialize_native_extensions(); - NativeExtension(); - ~NativeExtension(); + static void initialize_gdextensions(); + GDExtension(); + ~GDExtension(); }; -VARIANT_ENUM_CAST(NativeExtension::InitializationLevel) +VARIANT_ENUM_CAST(GDExtension::InitializationLevel) -class NativeExtensionResourceLoader : public ResourceFormatLoader { +class GDExtensionResourceLoader : public ResourceFormatLoader { public: virtual Ref<Resource> load(const String &p_path, const String &p_original_path, Error *r_error, bool p_use_sub_threads = false, float *r_progress = nullptr, CacheMode p_cache_mode = CACHE_MODE_REUSE); virtual void get_recognized_extensions(List<String> *p_extensions) const; @@ -101,4 +101,4 @@ public: virtual String get_resource_type(const String &p_path) const; }; -#endif // NATIVE_EXTENSION_H +#endif // GDEXTENSION_H diff --git a/core/extension/gdextension_interface.cpp b/core/extension/gdextension_interface.cpp new file mode 100644 index 0000000000..2074495aa9 --- /dev/null +++ b/core/extension/gdextension_interface.cpp @@ -0,0 +1,1105 @@ +/*************************************************************************/ +/* gdextension_interface.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "gdextension_interface.h" + +#include "core/config/engine.h" +#include "core/object/class_db.h" +#include "core/object/script_language_extension.h" +#include "core/os/memory.h" +#include "core/variant/variant.h" +#include "core/version.h" + +// Memory Functions +static void *gdextension_alloc(size_t p_size) { + return memalloc(p_size); +} + +static void *gdextension_realloc(void *p_mem, size_t p_size) { + return memrealloc(p_mem, p_size); +} + +static void gdextension_free(void *p_mem) { + memfree(p_mem); +} + +// Helper print functions. +static void gdextension_print_error(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) { + _err_print_error(p_function, p_file, p_line, p_description, false, ERR_HANDLER_ERROR); +} +static void gdextension_print_warning(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) { + _err_print_error(p_function, p_file, p_line, p_description, false, ERR_HANDLER_WARNING); +} +static void gdextension_print_script_error(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) { + _err_print_error(p_function, p_file, p_line, p_description, false, ERR_HANDLER_SCRIPT); +} + +uint64_t gdextension_get_native_struct_size(GDExtensionConstStringNamePtr p_name) { + const StringName name = *reinterpret_cast<const StringName *>(p_name); + return ClassDB::get_native_struct_size(name); +} + +// Variant functions + +static void gdextension_variant_new_copy(GDExtensionVariantPtr r_dest, GDExtensionConstVariantPtr p_src) { + memnew_placement(reinterpret_cast<Variant *>(r_dest), Variant(*reinterpret_cast<const Variant *>(p_src))); +} +static void gdextension_variant_new_nil(GDExtensionVariantPtr r_dest) { + memnew_placement(reinterpret_cast<Variant *>(r_dest), Variant); +} +static void gdextension_variant_destroy(GDExtensionVariantPtr p_self) { + reinterpret_cast<Variant *>(p_self)->~Variant(); +} + +// variant type + +static void gdextension_variant_call(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argcount, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error) { + Variant *self = (Variant *)p_self; + const StringName method = *reinterpret_cast<const StringName *>(p_method); + const Variant **args = (const Variant **)p_args; + Variant ret; + Callable::CallError error; + self->callp(method, args, p_argcount, ret, error); + memnew_placement(r_return, Variant(ret)); + + if (r_error) { + r_error->error = (GDExtensionCallErrorType)(error.error); + r_error->argument = error.argument; + r_error->expected = error.expected; + } +} + +static void gdextension_variant_call_static(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argcount, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error) { + Variant::Type type = (Variant::Type)p_type; + const StringName method = *reinterpret_cast<const StringName *>(p_method); + const Variant **args = (const Variant **)p_args; + Variant ret; + Callable::CallError error; + Variant::call_static(type, method, args, p_argcount, ret, error); + memnew_placement(r_return, Variant(ret)); + + if (r_error) { + r_error->error = (GDExtensionCallErrorType)error.error; + r_error->argument = error.argument; + r_error->expected = error.expected; + } +} + +static void gdextension_variant_evaluate(GDExtensionVariantOperator p_op, GDExtensionConstVariantPtr p_a, GDExtensionConstVariantPtr p_b, GDExtensionVariantPtr r_return, GDExtensionBool *r_valid) { + Variant::Operator op = (Variant::Operator)p_op; + const Variant *a = (const Variant *)p_a; + const Variant *b = (const Variant *)p_b; + Variant *ret = (Variant *)r_return; + bool valid; + Variant::evaluate(op, *a, *b, *ret, valid); + *r_valid = valid; +} + +static void gdextension_variant_set(GDExtensionVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid) { + Variant *self = (Variant *)p_self; + const Variant *key = (const Variant *)p_key; + const Variant *value = (const Variant *)p_value; + + bool valid; + self->set(*key, *value, &valid); + *r_valid = valid; +} + +static void gdextension_variant_set_named(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid) { + Variant *self = (Variant *)p_self; + const StringName *key = (const StringName *)p_key; + const Variant *value = (const Variant *)p_value; + + bool valid; + self->set_named(*key, *value, valid); + *r_valid = valid; +} + +static void gdextension_variant_set_keyed(GDExtensionVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid) { + Variant *self = (Variant *)p_self; + const Variant *key = (const Variant *)p_key; + const Variant *value = (const Variant *)p_value; + + bool valid; + self->set_keyed(*key, *value, valid); + *r_valid = valid; +} + +static void gdextension_variant_set_indexed(GDExtensionVariantPtr p_self, GDExtensionInt p_index, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid, GDExtensionBool *r_oob) { + Variant *self = (Variant *)p_self; + const Variant *value = (const Variant *)p_value; + + bool valid; + bool oob; + self->set_indexed(p_index, *value, valid, oob); + *r_valid = valid; + *r_oob = oob; +} + +static void gdextension_variant_get(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid) { + const Variant *self = (const Variant *)p_self; + const Variant *key = (const Variant *)p_key; + + bool valid; + memnew_placement(r_ret, Variant(self->get(*key, &valid))); + *r_valid = valid; +} + +static void gdextension_variant_get_named(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid) { + const Variant *self = (const Variant *)p_self; + const StringName *key = (const StringName *)p_key; + + bool valid; + memnew_placement(r_ret, Variant(self->get_named(*key, valid))); + *r_valid = valid; +} + +static void gdextension_variant_get_keyed(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid) { + const Variant *self = (const Variant *)p_self; + const Variant *key = (const Variant *)p_key; + + bool valid; + memnew_placement(r_ret, Variant(self->get_keyed(*key, valid))); + *r_valid = valid; +} + +static void gdextension_variant_get_indexed(GDExtensionConstVariantPtr p_self, GDExtensionInt p_index, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid, GDExtensionBool *r_oob) { + const Variant *self = (const Variant *)p_self; + + bool valid; + bool oob; + memnew_placement(r_ret, Variant(self->get_indexed(p_index, valid, oob))); + *r_valid = valid; + *r_oob = oob; +} + +/// Iteration. +static GDExtensionBool gdextension_variant_iter_init(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionBool *r_valid) { + const Variant *self = (const Variant *)p_self; + Variant *iter = (Variant *)r_iter; + + bool valid; + bool ret = self->iter_init(*iter, valid); + *r_valid = valid; + return ret; +} + +static GDExtensionBool gdextension_variant_iter_next(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionBool *r_valid) { + const Variant *self = (const Variant *)p_self; + Variant *iter = (Variant *)r_iter; + + bool valid; + bool ret = self->iter_next(*iter, valid); + *r_valid = valid; + return ret; +} + +static void gdextension_variant_iter_get(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid) { + const Variant *self = (const Variant *)p_self; + Variant *iter = (Variant *)r_iter; + + bool valid; + memnew_placement(r_ret, Variant(self->iter_next(*iter, valid))); + *r_valid = valid; +} + +/// Variant functions. +static GDExtensionInt gdextension_variant_hash(GDExtensionConstVariantPtr p_self) { + const Variant *self = (const Variant *)p_self; + return self->hash(); +} + +static GDExtensionInt gdextension_variant_recursive_hash(GDExtensionConstVariantPtr p_self, GDExtensionInt p_recursion_count) { + const Variant *self = (const Variant *)p_self; + return self->recursive_hash(p_recursion_count); +} + +static GDExtensionBool gdextension_variant_hash_compare(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_other) { + const Variant *self = (const Variant *)p_self; + const Variant *other = (const Variant *)p_other; + return self->hash_compare(*other); +} + +static GDExtensionBool gdextension_variant_booleanize(GDExtensionConstVariantPtr p_self) { + const Variant *self = (const Variant *)p_self; + return self->booleanize(); +} + +static void gdextension_variant_duplicate(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_ret, GDExtensionBool p_deep) { + const Variant *self = (const Variant *)p_self; + memnew_placement(r_ret, Variant(self->duplicate(p_deep))); +} + +static void gdextension_variant_stringify(GDExtensionConstVariantPtr p_self, GDExtensionStringPtr r_ret) { + const Variant *self = (const Variant *)p_self; + memnew_placement(r_ret, String(*self)); +} + +static GDExtensionVariantType gdextension_variant_get_type(GDExtensionConstVariantPtr p_self) { + const Variant *self = (const Variant *)p_self; + return (GDExtensionVariantType)self->get_type(); +} + +static GDExtensionBool gdextension_variant_has_method(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_method) { + const Variant *self = (const Variant *)p_self; + const StringName *method = (const StringName *)p_method; + return self->has_method(*method); +} + +static GDExtensionBool gdextension_variant_has_member(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member) { + return Variant::has_member((Variant::Type)p_type, *((const StringName *)p_member)); +} + +static GDExtensionBool gdextension_variant_has_key(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionBool *r_valid) { + const Variant *self = (const Variant *)p_self; + const Variant *key = (const Variant *)p_key; + bool valid; + bool ret = self->has_key(*key, valid); + *r_valid = valid; + return ret; +} + +static void gdextension_variant_get_type_name(GDExtensionVariantType p_type, GDExtensionStringPtr r_ret) { + String name = Variant::get_type_name((Variant::Type)p_type); + memnew_placement(r_ret, String(name)); +} + +static GDExtensionBool gdextension_variant_can_convert(GDExtensionVariantType p_from, GDExtensionVariantType p_to) { + return Variant::can_convert((Variant::Type)p_from, (Variant::Type)p_to); +} + +static GDExtensionBool gdextension_variant_can_convert_strict(GDExtensionVariantType p_from, GDExtensionVariantType p_to) { + return Variant::can_convert_strict((Variant::Type)p_from, (Variant::Type)p_to); +} + +// Variant interaction. +static GDExtensionVariantFromTypeConstructorFunc gdextension_get_variant_from_type_constructor(GDExtensionVariantType p_type) { + switch (p_type) { + case GDEXTENSION_VARIANT_TYPE_BOOL: + return VariantTypeConstructor<bool>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_INT: + return VariantTypeConstructor<int64_t>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_FLOAT: + return VariantTypeConstructor<double>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_STRING: + return VariantTypeConstructor<String>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_VECTOR2: + return VariantTypeConstructor<Vector2>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_VECTOR2I: + return VariantTypeConstructor<Vector2i>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_RECT2: + return VariantTypeConstructor<Rect2>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_RECT2I: + return VariantTypeConstructor<Rect2i>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_VECTOR3: + return VariantTypeConstructor<Vector3>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_VECTOR3I: + return VariantTypeConstructor<Vector3i>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_TRANSFORM2D: + return VariantTypeConstructor<Transform2D>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_VECTOR4: + return VariantTypeConstructor<Vector4>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_VECTOR4I: + return VariantTypeConstructor<Vector4i>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_PLANE: + return VariantTypeConstructor<Plane>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_QUATERNION: + return VariantTypeConstructor<Quaternion>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_AABB: + return VariantTypeConstructor<AABB>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_BASIS: + return VariantTypeConstructor<Basis>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_TRANSFORM3D: + return VariantTypeConstructor<Transform3D>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_PROJECTION: + return VariantTypeConstructor<Projection>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_COLOR: + return VariantTypeConstructor<Color>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_STRING_NAME: + return VariantTypeConstructor<StringName>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_NODE_PATH: + return VariantTypeConstructor<NodePath>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_RID: + return VariantTypeConstructor<RID>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_OBJECT: + return VariantTypeConstructor<Object *>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_CALLABLE: + return VariantTypeConstructor<Callable>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_SIGNAL: + return VariantTypeConstructor<Signal>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_DICTIONARY: + return VariantTypeConstructor<Dictionary>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_ARRAY: + return VariantTypeConstructor<Array>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_PACKED_BYTE_ARRAY: + return VariantTypeConstructor<PackedByteArray>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_PACKED_INT32_ARRAY: + return VariantTypeConstructor<PackedInt32Array>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_PACKED_INT64_ARRAY: + return VariantTypeConstructor<PackedInt64Array>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT32_ARRAY: + return VariantTypeConstructor<PackedFloat32Array>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT64_ARRAY: + return VariantTypeConstructor<PackedFloat64Array>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_PACKED_STRING_ARRAY: + return VariantTypeConstructor<PackedStringArray>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR2_ARRAY: + return VariantTypeConstructor<PackedVector2Array>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY: + return VariantTypeConstructor<PackedVector3Array>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY: + return VariantTypeConstructor<PackedColorArray>::variant_from_type; + case GDEXTENSION_VARIANT_TYPE_NIL: + case GDEXTENSION_VARIANT_TYPE_VARIANT_MAX: + ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type"); + } + ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type"); +} + +static GDExtensionTypeFromVariantConstructorFunc gdextension_get_type_from_variant_constructor(GDExtensionVariantType p_type) { + switch (p_type) { + case GDEXTENSION_VARIANT_TYPE_BOOL: + return VariantTypeConstructor<bool>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_INT: + return VariantTypeConstructor<int64_t>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_FLOAT: + return VariantTypeConstructor<double>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_STRING: + return VariantTypeConstructor<String>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_VECTOR2: + return VariantTypeConstructor<Vector2>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_VECTOR2I: + return VariantTypeConstructor<Vector2i>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_RECT2: + return VariantTypeConstructor<Rect2>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_RECT2I: + return VariantTypeConstructor<Rect2i>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_VECTOR3: + return VariantTypeConstructor<Vector3>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_VECTOR3I: + return VariantTypeConstructor<Vector3i>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_TRANSFORM2D: + return VariantTypeConstructor<Transform2D>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_VECTOR4: + return VariantTypeConstructor<Vector4>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_VECTOR4I: + return VariantTypeConstructor<Vector4i>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_PLANE: + return VariantTypeConstructor<Plane>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_QUATERNION: + return VariantTypeConstructor<Quaternion>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_AABB: + return VariantTypeConstructor<AABB>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_BASIS: + return VariantTypeConstructor<Basis>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_TRANSFORM3D: + return VariantTypeConstructor<Transform3D>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_PROJECTION: + return VariantTypeConstructor<Projection>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_COLOR: + return VariantTypeConstructor<Color>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_STRING_NAME: + return VariantTypeConstructor<StringName>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_NODE_PATH: + return VariantTypeConstructor<NodePath>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_RID: + return VariantTypeConstructor<RID>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_OBJECT: + return VariantTypeConstructor<Object *>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_CALLABLE: + return VariantTypeConstructor<Callable>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_SIGNAL: + return VariantTypeConstructor<Signal>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_DICTIONARY: + return VariantTypeConstructor<Dictionary>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_ARRAY: + return VariantTypeConstructor<Array>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_PACKED_BYTE_ARRAY: + return VariantTypeConstructor<PackedByteArray>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_PACKED_INT32_ARRAY: + return VariantTypeConstructor<PackedInt32Array>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_PACKED_INT64_ARRAY: + return VariantTypeConstructor<PackedInt64Array>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT32_ARRAY: + return VariantTypeConstructor<PackedFloat32Array>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT64_ARRAY: + return VariantTypeConstructor<PackedFloat64Array>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_PACKED_STRING_ARRAY: + return VariantTypeConstructor<PackedStringArray>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR2_ARRAY: + return VariantTypeConstructor<PackedVector2Array>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY: + return VariantTypeConstructor<PackedVector3Array>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY: + return VariantTypeConstructor<PackedColorArray>::type_from_variant; + case GDEXTENSION_VARIANT_TYPE_NIL: + case GDEXTENSION_VARIANT_TYPE_VARIANT_MAX: + ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type"); + } + ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type"); +} + +// ptrcalls +static GDExtensionPtrOperatorEvaluator gdextension_variant_get_ptr_operator_evaluator(GDExtensionVariantOperator p_operator, GDExtensionVariantType p_type_a, GDExtensionVariantType p_type_b) { + return (GDExtensionPtrOperatorEvaluator)Variant::get_ptr_operator_evaluator(Variant::Operator(p_operator), Variant::Type(p_type_a), Variant::Type(p_type_b)); +} +static GDExtensionPtrBuiltInMethod gdextension_variant_get_ptr_builtin_method(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, GDExtensionInt p_hash) { + const StringName method = *reinterpret_cast<const StringName *>(p_method); + uint32_t hash = Variant::get_builtin_method_hash(Variant::Type(p_type), method); + if (hash != p_hash) { + ERR_PRINT_ONCE("Error getting method " + method + ", hash mismatch."); + return nullptr; + } + + return (GDExtensionPtrBuiltInMethod)Variant::get_ptr_builtin_method(Variant::Type(p_type), method); +} +static GDExtensionPtrConstructor gdextension_variant_get_ptr_constructor(GDExtensionVariantType p_type, int32_t p_constructor) { + return (GDExtensionPtrConstructor)Variant::get_ptr_constructor(Variant::Type(p_type), p_constructor); +} +static GDExtensionPtrDestructor gdextension_variant_get_ptr_destructor(GDExtensionVariantType p_type) { + return (GDExtensionPtrDestructor)Variant::get_ptr_destructor(Variant::Type(p_type)); +} +static void gdextension_variant_construct(GDExtensionVariantType p_type, GDExtensionVariantPtr p_base, const GDExtensionConstVariantPtr *p_args, int32_t p_argument_count, GDExtensionCallError *r_error) { + memnew_placement(p_base, Variant); + + Callable::CallError error; + Variant::construct(Variant::Type(p_type), *(Variant *)p_base, (const Variant **)p_args, p_argument_count, error); + + if (r_error) { + r_error->error = (GDExtensionCallErrorType)(error.error); + r_error->argument = error.argument; + r_error->expected = error.expected; + } +} +static GDExtensionPtrSetter gdextension_variant_get_ptr_setter(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member) { + const StringName member = *reinterpret_cast<const StringName *>(p_member); + return (GDExtensionPtrSetter)Variant::get_member_ptr_setter(Variant::Type(p_type), member); +} +static GDExtensionPtrGetter gdextension_variant_get_ptr_getter(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member) { + const StringName member = *reinterpret_cast<const StringName *>(p_member); + return (GDExtensionPtrGetter)Variant::get_member_ptr_getter(Variant::Type(p_type), member); +} +static GDExtensionPtrIndexedSetter gdextension_variant_get_ptr_indexed_setter(GDExtensionVariantType p_type) { + return (GDExtensionPtrIndexedSetter)Variant::get_member_ptr_indexed_setter(Variant::Type(p_type)); +} +static GDExtensionPtrIndexedGetter gdextension_variant_get_ptr_indexed_getter(GDExtensionVariantType p_type) { + return (GDExtensionPtrIndexedGetter)Variant::get_member_ptr_indexed_getter(Variant::Type(p_type)); +} +static GDExtensionPtrKeyedSetter gdextension_variant_get_ptr_keyed_setter(GDExtensionVariantType p_type) { + return (GDExtensionPtrKeyedSetter)Variant::get_member_ptr_keyed_setter(Variant::Type(p_type)); +} +static GDExtensionPtrKeyedGetter gdextension_variant_get_ptr_keyed_getter(GDExtensionVariantType p_type) { + return (GDExtensionPtrKeyedGetter)Variant::get_member_ptr_keyed_getter(Variant::Type(p_type)); +} +static GDExtensionPtrKeyedChecker gdextension_variant_get_ptr_keyed_checker(GDExtensionVariantType p_type) { + return (GDExtensionPtrKeyedChecker)Variant::get_member_ptr_keyed_checker(Variant::Type(p_type)); +} +static void gdextension_variant_get_constant_value(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_constant, GDExtensionVariantPtr r_ret) { + StringName constant = *reinterpret_cast<const StringName *>(p_constant); + memnew_placement(r_ret, Variant(Variant::get_constant_value(Variant::Type(p_type), constant))); +} +static GDExtensionPtrUtilityFunction gdextension_variant_get_ptr_utility_function(GDExtensionConstStringNamePtr p_function, GDExtensionInt p_hash) { + StringName function = *reinterpret_cast<const StringName *>(p_function); + uint32_t hash = Variant::get_utility_function_hash(function); + if (hash != p_hash) { + ERR_PRINT_ONCE("Error getting utility function " + function + ", hash mismatch."); + return nullptr; + } + return (GDExtensionPtrUtilityFunction)Variant::get_ptr_utility_function(function); +} + +//string helpers + +static void gdextension_string_new_with_latin1_chars(GDExtensionStringPtr r_dest, const char *p_contents) { + String *dest = (String *)r_dest; + memnew_placement(dest, String); + *dest = String(p_contents); +} + +static void gdextension_string_new_with_utf8_chars(GDExtensionStringPtr r_dest, const char *p_contents) { + String *dest = (String *)r_dest; + memnew_placement(dest, String); + dest->parse_utf8(p_contents); +} + +static void gdextension_string_new_with_utf16_chars(GDExtensionStringPtr r_dest, const char16_t *p_contents) { + String *dest = (String *)r_dest; + memnew_placement(dest, String); + dest->parse_utf16(p_contents); +} + +static void gdextension_string_new_with_utf32_chars(GDExtensionStringPtr r_dest, const char32_t *p_contents) { + String *dest = (String *)r_dest; + memnew_placement(dest, String); + *dest = String((const char32_t *)p_contents); +} + +static void gdextension_string_new_with_wide_chars(GDExtensionStringPtr r_dest, const wchar_t *p_contents) { + String *dest = (String *)r_dest; + if constexpr (sizeof(wchar_t) == 2) { + // wchar_t is 16 bit, parse. + memnew_placement(dest, String); + dest->parse_utf16((const char16_t *)p_contents); + } else { + // wchar_t is 32 bit, copy. + memnew_placement(dest, String); + *dest = String((const char32_t *)p_contents); + } +} + +static void gdextension_string_new_with_latin1_chars_and_len(GDExtensionStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) { + String *dest = (String *)r_dest; + memnew_placement(dest, String); + *dest = String(p_contents, p_size); +} + +static void gdextension_string_new_with_utf8_chars_and_len(GDExtensionStringPtr r_dest, const char *p_contents, GDExtensionInt p_size) { + String *dest = (String *)r_dest; + memnew_placement(dest, String); + dest->parse_utf8(p_contents, p_size); +} + +static void gdextension_string_new_with_utf16_chars_and_len(GDExtensionStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_size) { + String *dest = (String *)r_dest; + memnew_placement(dest, String); + dest->parse_utf16(p_contents, p_size); +} + +static void gdextension_string_new_with_utf32_chars_and_len(GDExtensionStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_size) { + String *dest = (String *)r_dest; + memnew_placement(dest, String); + *dest = String((const char32_t *)p_contents, p_size); +} + +static void gdextension_string_new_with_wide_chars_and_len(GDExtensionStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_size) { + String *dest = (String *)r_dest; + if constexpr (sizeof(wchar_t) == 2) { + // wchar_t is 16 bit, parse. + memnew_placement(dest, String); + dest->parse_utf16((const char16_t *)p_contents, p_size); + } else { + // wchar_t is 32 bit, copy. + memnew_placement(dest, String); + *dest = String((const char32_t *)p_contents, p_size); + } +} + +static GDExtensionInt gdextension_string_to_latin1_chars(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length) { + String *self = (String *)p_self; + CharString cs = self->ascii(true); + GDExtensionInt len = cs.length(); + if (r_text) { + const char *s_text = cs.ptr(); + for (GDExtensionInt i = 0; i < MIN(len, p_max_write_length); i++) { + r_text[i] = s_text[i]; + } + } + return len; +} +static GDExtensionInt gdextension_string_to_utf8_chars(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length) { + String *self = (String *)p_self; + CharString cs = self->utf8(); + GDExtensionInt len = cs.length(); + if (r_text) { + const char *s_text = cs.ptr(); + for (GDExtensionInt i = 0; i < MIN(len, p_max_write_length); i++) { + r_text[i] = s_text[i]; + } + } + return len; +} +static GDExtensionInt gdextension_string_to_utf16_chars(GDExtensionConstStringPtr p_self, char16_t *r_text, GDExtensionInt p_max_write_length) { + String *self = (String *)p_self; + Char16String cs = self->utf16(); + GDExtensionInt len = cs.length(); + if (r_text) { + const char16_t *s_text = cs.ptr(); + for (GDExtensionInt i = 0; i < MIN(len, p_max_write_length); i++) { + r_text[i] = s_text[i]; + } + } + return len; +} +static GDExtensionInt gdextension_string_to_utf32_chars(GDExtensionConstStringPtr p_self, char32_t *r_text, GDExtensionInt p_max_write_length) { + String *self = (String *)p_self; + GDExtensionInt len = self->length(); + if (r_text) { + const char32_t *s_text = self->ptr(); + for (GDExtensionInt i = 0; i < MIN(len, p_max_write_length); i++) { + r_text[i] = s_text[i]; + } + } + return len; +} +static GDExtensionInt gdextension_string_to_wide_chars(GDExtensionConstStringPtr p_self, wchar_t *r_text, GDExtensionInt p_max_write_length) { + if constexpr (sizeof(wchar_t) == 4) { + return gdextension_string_to_utf32_chars(p_self, (char32_t *)r_text, p_max_write_length); + } else { + return gdextension_string_to_utf16_chars(p_self, (char16_t *)r_text, p_max_write_length); + } +} + +static char32_t *gdextension_string_operator_index(GDExtensionStringPtr p_self, GDExtensionInt p_index) { + String *self = (String *)p_self; + ERR_FAIL_INDEX_V(p_index, self->length() + 1, nullptr); + return &self->ptrw()[p_index]; +} + +static const char32_t *gdextension_string_operator_index_const(GDExtensionConstStringPtr p_self, GDExtensionInt p_index) { + const String *self = (const String *)p_self; + ERR_FAIL_INDEX_V(p_index, self->length() + 1, nullptr); + return &self->ptr()[p_index]; +} + +/* Packed array functions */ + +static uint8_t *gdextension_packed_byte_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) { + PackedByteArray *self = (PackedByteArray *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return &self->ptrw()[p_index]; +} + +static const uint8_t *gdextension_packed_byte_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) { + const PackedByteArray *self = (const PackedByteArray *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return &self->ptr()[p_index]; +} + +static GDExtensionTypePtr gdextension_packed_color_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) { + PackedColorArray *self = (PackedColorArray *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return (GDExtensionTypePtr)&self->ptrw()[p_index]; +} + +static GDExtensionTypePtr gdextension_packed_color_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) { + const PackedColorArray *self = (const PackedColorArray *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return (GDExtensionTypePtr)&self->ptr()[p_index]; +} + +static float *gdextension_packed_float32_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) { + PackedFloat32Array *self = (PackedFloat32Array *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return &self->ptrw()[p_index]; +} + +static const float *gdextension_packed_float32_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) { + const PackedFloat32Array *self = (const PackedFloat32Array *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return &self->ptr()[p_index]; +} + +static double *gdextension_packed_float64_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) { + PackedFloat64Array *self = (PackedFloat64Array *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return &self->ptrw()[p_index]; +} + +static const double *gdextension_packed_float64_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) { + const PackedFloat64Array *self = (const PackedFloat64Array *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return &self->ptr()[p_index]; +} + +static int32_t *gdextension_packed_int32_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) { + PackedInt32Array *self = (PackedInt32Array *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return &self->ptrw()[p_index]; +} + +static const int32_t *gdextension_packed_int32_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) { + const PackedInt32Array *self = (const PackedInt32Array *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return &self->ptr()[p_index]; +} + +static int64_t *gdextension_packed_int64_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) { + PackedInt64Array *self = (PackedInt64Array *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return &self->ptrw()[p_index]; +} + +static const int64_t *gdextension_packed_int64_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) { + const PackedInt64Array *self = (const PackedInt64Array *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return &self->ptr()[p_index]; +} + +static GDExtensionStringPtr gdextension_packed_string_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) { + PackedStringArray *self = (PackedStringArray *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return (GDExtensionStringPtr)&self->ptrw()[p_index]; +} + +static GDExtensionStringPtr gdextension_packed_string_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) { + const PackedStringArray *self = (const PackedStringArray *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return (GDExtensionStringPtr)&self->ptr()[p_index]; +} + +static GDExtensionTypePtr gdextension_packed_vector2_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) { + PackedVector2Array *self = (PackedVector2Array *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return (GDExtensionTypePtr)&self->ptrw()[p_index]; +} + +static GDExtensionTypePtr gdextension_packed_vector2_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) { + const PackedVector2Array *self = (const PackedVector2Array *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return (GDExtensionTypePtr)&self->ptr()[p_index]; +} + +static GDExtensionTypePtr gdextension_packed_vector3_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) { + PackedVector3Array *self = (PackedVector3Array *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return (GDExtensionTypePtr)&self->ptrw()[p_index]; +} + +static GDExtensionTypePtr gdextension_packed_vector3_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) { + const PackedVector3Array *self = (const PackedVector3Array *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return (GDExtensionTypePtr)&self->ptr()[p_index]; +} + +static GDExtensionVariantPtr gdextension_array_operator_index(GDExtensionTypePtr p_self, GDExtensionInt p_index) { + Array *self = (Array *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return (GDExtensionVariantPtr)&self->operator[](p_index); +} + +static GDExtensionVariantPtr gdextension_array_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionInt p_index) { + const Array *self = (const Array *)p_self; + ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); + return (GDExtensionVariantPtr)&self->operator[](p_index); +} + +/* Dictionary functions */ + +static GDExtensionVariantPtr gdextension_dictionary_operator_index(GDExtensionTypePtr p_self, GDExtensionConstVariantPtr p_key) { + Dictionary *self = (Dictionary *)p_self; + return (GDExtensionVariantPtr)&self->operator[](*(const Variant *)p_key); +} + +static GDExtensionVariantPtr gdextension_dictionary_operator_index_const(GDExtensionConstTypePtr p_self, GDExtensionConstVariantPtr p_key) { + const Dictionary *self = (const Dictionary *)p_self; + return (GDExtensionVariantPtr)&self->operator[](*(const Variant *)p_key); +} + +/* OBJECT API */ + +static void gdextension_object_method_bind_call(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_arg_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error) { + const MethodBind *mb = reinterpret_cast<const MethodBind *>(p_method_bind); + Object *o = (Object *)p_instance; + const Variant **args = (const Variant **)p_args; + Callable::CallError error; + + Variant ret = mb->call(o, args, p_arg_count, error); + memnew_placement(r_return, Variant(ret)); + + if (r_error) { + r_error->error = (GDExtensionCallErrorType)(error.error); + r_error->argument = error.argument; + r_error->expected = error.expected; + } +} + +static void gdextension_object_method_bind_ptrcall(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, const GDExtensionConstTypePtr *p_args, GDExtensionTypePtr p_ret) { + const MethodBind *mb = reinterpret_cast<const MethodBind *>(p_method_bind); + Object *o = (Object *)p_instance; + mb->ptrcall(o, (const void **)p_args, p_ret); +} + +static void gdextension_object_destroy(GDExtensionObjectPtr p_o) { + memdelete((Object *)p_o); +} + +static GDExtensionObjectPtr gdextension_global_get_singleton(GDExtensionConstStringNamePtr p_name) { + const StringName name = *reinterpret_cast<const StringName *>(p_name); + return (GDExtensionObjectPtr)Engine::get_singleton()->get_singleton_object(name); +} + +static void *gdextension_object_get_instance_binding(GDExtensionObjectPtr p_object, void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks) { + Object *o = (Object *)p_object; + return o->get_instance_binding(p_token, p_callbacks); +} + +static void gdextension_object_set_instance_binding(GDExtensionObjectPtr p_object, void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks) { + Object *o = (Object *)p_object; + o->set_instance_binding(p_token, p_binding, p_callbacks); +} + +static void gdextension_object_set_instance(GDExtensionObjectPtr p_object, GDExtensionConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance) { + const StringName classname = *reinterpret_cast<const StringName *>(p_classname); + Object *o = (Object *)p_object; + ClassDB::set_object_extension_instance(o, classname, p_instance); +} + +static GDExtensionObjectPtr gdextension_object_get_instance_from_id(GDObjectInstanceID p_instance_id) { + return (GDExtensionObjectPtr)ObjectDB::get_instance(ObjectID(p_instance_id)); +} + +static GDExtensionObjectPtr gdextension_object_cast_to(GDExtensionConstObjectPtr p_object, void *p_class_tag) { + if (!p_object) { + return nullptr; + } + Object *o = (Object *)p_object; + + return o->is_class_ptr(p_class_tag) ? (GDExtensionObjectPtr)o : (GDExtensionObjectPtr) nullptr; +} + +static GDObjectInstanceID gdextension_object_get_instance_id(GDExtensionConstObjectPtr p_object) { + const Object *o = (const Object *)p_object; + return (GDObjectInstanceID)o->get_instance_id(); +} + +static GDExtensionObjectPtr gdextension_ref_get_object(GDExtensionConstRefPtr p_ref) { + const Ref<RefCounted> *ref = (const Ref<RefCounted> *)p_ref; + if (ref == nullptr || ref->is_null()) { + return (GDExtensionObjectPtr) nullptr; + } else { + return (GDExtensionObjectPtr)ref->ptr(); + } +} + +static void gdextension_ref_set_object(GDExtensionRefPtr p_ref, GDExtensionObjectPtr p_object) { + Ref<RefCounted> *ref = (Ref<RefCounted> *)p_ref; + ERR_FAIL_NULL(ref); + + Object *o = (RefCounted *)p_object; + ref->reference_ptr(o); +} + +static GDExtensionScriptInstancePtr gdextension_script_instance_create(const GDExtensionScriptInstanceInfo *p_info, GDExtensionScriptInstanceDataPtr p_instance_data) { + ScriptInstanceExtension *script_instance_extension = memnew(ScriptInstanceExtension); + script_instance_extension->instance = p_instance_data; + script_instance_extension->native_info = p_info; + return reinterpret_cast<GDExtensionScriptInstancePtr>(script_instance_extension); +} + +static GDExtensionMethodBindPtr gdextension_classdb_get_method_bind(GDExtensionConstStringNamePtr p_classname, GDExtensionConstStringNamePtr p_methodname, GDExtensionInt p_hash) { + const StringName classname = *reinterpret_cast<const StringName *>(p_classname); + const StringName methodname = *reinterpret_cast<const StringName *>(p_methodname); + MethodBind *mb = ClassDB::get_method(classname, methodname); + ERR_FAIL_COND_V(!mb, nullptr); + if (mb->get_hash() != p_hash) { + ERR_PRINT("Hash mismatch for method '" + classname + "." + methodname + "'."); + return nullptr; + } + return (GDExtensionMethodBindPtr)mb; +} + +static GDExtensionObjectPtr gdextension_classdb_construct_object(GDExtensionConstStringNamePtr p_classname) { + const StringName classname = *reinterpret_cast<const StringName *>(p_classname); + return (GDExtensionObjectPtr)ClassDB::instantiate(classname); +} + +static void *gdextension_classdb_get_class_tag(GDExtensionConstStringNamePtr p_classname) { + const StringName classname = *reinterpret_cast<const StringName *>(p_classname); + ClassDB::ClassInfo *class_info = ClassDB::classes.getptr(classname); + return class_info ? class_info->class_ptr : nullptr; +} + +void gdextension_setup_interface(GDExtensionInterface *p_interface) { + GDExtensionInterface &gde_interface = *p_interface; + + gde_interface.version_major = VERSION_MAJOR; + gde_interface.version_minor = VERSION_MINOR; +#if VERSION_PATCH + gde_interface.version_patch = VERSION_PATCH; +#else + gde_interface.version_patch = 0; +#endif + gde_interface.version_string = VERSION_FULL_NAME; + + /* GODOT CORE */ + + gde_interface.mem_alloc = gdextension_alloc; + gde_interface.mem_realloc = gdextension_realloc; + gde_interface.mem_free = gdextension_free; + + gde_interface.print_error = gdextension_print_error; + gde_interface.print_warning = gdextension_print_warning; + gde_interface.print_script_error = gdextension_print_script_error; + + gde_interface.get_native_struct_size = gdextension_get_native_struct_size; + + /* GODOT VARIANT */ + + // variant general + gde_interface.variant_new_copy = gdextension_variant_new_copy; + gde_interface.variant_new_nil = gdextension_variant_new_nil; + gde_interface.variant_destroy = gdextension_variant_destroy; + + gde_interface.variant_call = gdextension_variant_call; + gde_interface.variant_call_static = gdextension_variant_call_static; + gde_interface.variant_evaluate = gdextension_variant_evaluate; + gde_interface.variant_set = gdextension_variant_set; + gde_interface.variant_set_named = gdextension_variant_set_named; + gde_interface.variant_set_keyed = gdextension_variant_set_keyed; + gde_interface.variant_set_indexed = gdextension_variant_set_indexed; + gde_interface.variant_get = gdextension_variant_get; + gde_interface.variant_get_named = gdextension_variant_get_named; + gde_interface.variant_get_keyed = gdextension_variant_get_keyed; + gde_interface.variant_get_indexed = gdextension_variant_get_indexed; + gde_interface.variant_iter_init = gdextension_variant_iter_init; + gde_interface.variant_iter_next = gdextension_variant_iter_next; + gde_interface.variant_iter_get = gdextension_variant_iter_get; + gde_interface.variant_hash = gdextension_variant_hash; + gde_interface.variant_recursive_hash = gdextension_variant_recursive_hash; + gde_interface.variant_hash_compare = gdextension_variant_hash_compare; + gde_interface.variant_booleanize = gdextension_variant_booleanize; + gde_interface.variant_duplicate = gdextension_variant_duplicate; + gde_interface.variant_stringify = gdextension_variant_stringify; + + gde_interface.variant_get_type = gdextension_variant_get_type; + gde_interface.variant_has_method = gdextension_variant_has_method; + gde_interface.variant_has_member = gdextension_variant_has_member; + gde_interface.variant_has_key = gdextension_variant_has_key; + gde_interface.variant_get_type_name = gdextension_variant_get_type_name; + gde_interface.variant_can_convert = gdextension_variant_can_convert; + gde_interface.variant_can_convert_strict = gdextension_variant_can_convert_strict; + + gde_interface.get_variant_from_type_constructor = gdextension_get_variant_from_type_constructor; + gde_interface.get_variant_to_type_constructor = gdextension_get_type_from_variant_constructor; + + // ptrcalls. + + gde_interface.variant_get_ptr_operator_evaluator = gdextension_variant_get_ptr_operator_evaluator; + gde_interface.variant_get_ptr_builtin_method = gdextension_variant_get_ptr_builtin_method; + gde_interface.variant_get_ptr_constructor = gdextension_variant_get_ptr_constructor; + gde_interface.variant_get_ptr_destructor = gdextension_variant_get_ptr_destructor; + gde_interface.variant_construct = gdextension_variant_construct; + gde_interface.variant_get_ptr_setter = gdextension_variant_get_ptr_setter; + gde_interface.variant_get_ptr_getter = gdextension_variant_get_ptr_getter; + gde_interface.variant_get_ptr_indexed_setter = gdextension_variant_get_ptr_indexed_setter; + gde_interface.variant_get_ptr_indexed_getter = gdextension_variant_get_ptr_indexed_getter; + gde_interface.variant_get_ptr_keyed_setter = gdextension_variant_get_ptr_keyed_setter; + gde_interface.variant_get_ptr_keyed_getter = gdextension_variant_get_ptr_keyed_getter; + gde_interface.variant_get_ptr_keyed_checker = gdextension_variant_get_ptr_keyed_checker; + gde_interface.variant_get_constant_value = gdextension_variant_get_constant_value; + gde_interface.variant_get_ptr_utility_function = gdextension_variant_get_ptr_utility_function; + + // extra utilities + + gde_interface.string_new_with_latin1_chars = gdextension_string_new_with_latin1_chars; + gde_interface.string_new_with_utf8_chars = gdextension_string_new_with_utf8_chars; + gde_interface.string_new_with_utf16_chars = gdextension_string_new_with_utf16_chars; + gde_interface.string_new_with_utf32_chars = gdextension_string_new_with_utf32_chars; + gde_interface.string_new_with_wide_chars = gdextension_string_new_with_wide_chars; + gde_interface.string_new_with_latin1_chars_and_len = gdextension_string_new_with_latin1_chars_and_len; + gde_interface.string_new_with_utf8_chars_and_len = gdextension_string_new_with_utf8_chars_and_len; + gde_interface.string_new_with_utf16_chars_and_len = gdextension_string_new_with_utf16_chars_and_len; + gde_interface.string_new_with_utf32_chars_and_len = gdextension_string_new_with_utf32_chars_and_len; + gde_interface.string_new_with_wide_chars_and_len = gdextension_string_new_with_wide_chars_and_len; + gde_interface.string_to_latin1_chars = gdextension_string_to_latin1_chars; + gde_interface.string_to_utf8_chars = gdextension_string_to_utf8_chars; + gde_interface.string_to_utf16_chars = gdextension_string_to_utf16_chars; + gde_interface.string_to_utf32_chars = gdextension_string_to_utf32_chars; + gde_interface.string_to_wide_chars = gdextension_string_to_wide_chars; + gde_interface.string_operator_index = gdextension_string_operator_index; + gde_interface.string_operator_index_const = gdextension_string_operator_index_const; + + /* Packed array functions */ + + gde_interface.packed_byte_array_operator_index = gdextension_packed_byte_array_operator_index; + gde_interface.packed_byte_array_operator_index_const = gdextension_packed_byte_array_operator_index_const; + + gde_interface.packed_color_array_operator_index = gdextension_packed_color_array_operator_index; + gde_interface.packed_color_array_operator_index_const = gdextension_packed_color_array_operator_index_const; + + gde_interface.packed_float32_array_operator_index = gdextension_packed_float32_array_operator_index; + gde_interface.packed_float32_array_operator_index_const = gdextension_packed_float32_array_operator_index_const; + gde_interface.packed_float64_array_operator_index = gdextension_packed_float64_array_operator_index; + gde_interface.packed_float64_array_operator_index_const = gdextension_packed_float64_array_operator_index_const; + + gde_interface.packed_int32_array_operator_index = gdextension_packed_int32_array_operator_index; + gde_interface.packed_int32_array_operator_index_const = gdextension_packed_int32_array_operator_index_const; + gde_interface.packed_int64_array_operator_index = gdextension_packed_int64_array_operator_index; + gde_interface.packed_int64_array_operator_index_const = gdextension_packed_int64_array_operator_index_const; + + gde_interface.packed_string_array_operator_index = gdextension_packed_string_array_operator_index; + gde_interface.packed_string_array_operator_index_const = gdextension_packed_string_array_operator_index_const; + + gde_interface.packed_vector2_array_operator_index = gdextension_packed_vector2_array_operator_index; + gde_interface.packed_vector2_array_operator_index_const = gdextension_packed_vector2_array_operator_index_const; + gde_interface.packed_vector3_array_operator_index = gdextension_packed_vector3_array_operator_index; + gde_interface.packed_vector3_array_operator_index_const = gdextension_packed_vector3_array_operator_index_const; + + gde_interface.array_operator_index = gdextension_array_operator_index; + gde_interface.array_operator_index_const = gdextension_array_operator_index_const; + + /* Dictionary functions */ + + gde_interface.dictionary_operator_index = gdextension_dictionary_operator_index; + gde_interface.dictionary_operator_index_const = gdextension_dictionary_operator_index_const; + + /* OBJECT */ + + gde_interface.object_method_bind_call = gdextension_object_method_bind_call; + gde_interface.object_method_bind_ptrcall = gdextension_object_method_bind_ptrcall; + gde_interface.object_destroy = gdextension_object_destroy; + gde_interface.global_get_singleton = gdextension_global_get_singleton; + gde_interface.object_get_instance_binding = gdextension_object_get_instance_binding; + gde_interface.object_set_instance_binding = gdextension_object_set_instance_binding; + gde_interface.object_set_instance = gdextension_object_set_instance; + + gde_interface.object_cast_to = gdextension_object_cast_to; + gde_interface.object_get_instance_from_id = gdextension_object_get_instance_from_id; + gde_interface.object_get_instance_id = gdextension_object_get_instance_id; + + /* REFERENCE */ + + gde_interface.ref_get_object = gdextension_ref_get_object; + gde_interface.ref_set_object = gdextension_ref_set_object; + + /* SCRIPT INSTANCE */ + + gde_interface.script_instance_create = gdextension_script_instance_create; + + /* CLASSDB */ + + gde_interface.classdb_construct_object = gdextension_classdb_construct_object; + gde_interface.classdb_get_method_bind = gdextension_classdb_get_method_bind; + gde_interface.classdb_get_class_tag = gdextension_classdb_get_class_tag; + + /* CLASSDB EXTENSION */ + + //these are filled by implementation, since it will want to keep track of registered classes + gde_interface.classdb_register_extension_class = nullptr; + gde_interface.classdb_register_extension_class_method = nullptr; + gde_interface.classdb_register_extension_class_integer_constant = nullptr; + gde_interface.classdb_register_extension_class_property = nullptr; + gde_interface.classdb_register_extension_class_property_group = nullptr; + gde_interface.classdb_register_extension_class_property_subgroup = nullptr; + gde_interface.classdb_register_extension_class_signal = nullptr; + gde_interface.classdb_unregister_extension_class = nullptr; + + gde_interface.get_library_path = nullptr; +} diff --git a/core/extension/gdextension_interface.h b/core/extension/gdextension_interface.h new file mode 100644 index 0000000000..0b7615ffdd --- /dev/null +++ b/core/extension/gdextension_interface.h @@ -0,0 +1,619 @@ +/*************************************************************************/ +/* gdextension_interface.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef GDEXTENSION_INTERFACE_H +#define GDEXTENSION_INTERFACE_H + +/* This is a C class header, you can copy it and use it directly in your own binders. + * Together with the JSON file, you should be able to generate any binder. + */ + +#include <stddef.h> +#include <stdint.h> +#include <stdio.h> + +#ifndef __cplusplus +typedef uint32_t char32_t; +typedef uint16_t char16_t; +#endif + +#ifdef __cplusplus +extern "C" { +#endif + +/* VARIANT TYPES */ + +typedef enum { + GDEXTENSION_VARIANT_TYPE_NIL, + + /* atomic types */ + GDEXTENSION_VARIANT_TYPE_BOOL, + GDEXTENSION_VARIANT_TYPE_INT, + GDEXTENSION_VARIANT_TYPE_FLOAT, + GDEXTENSION_VARIANT_TYPE_STRING, + + /* math types */ + GDEXTENSION_VARIANT_TYPE_VECTOR2, + GDEXTENSION_VARIANT_TYPE_VECTOR2I, + GDEXTENSION_VARIANT_TYPE_RECT2, + GDEXTENSION_VARIANT_TYPE_RECT2I, + GDEXTENSION_VARIANT_TYPE_VECTOR3, + GDEXTENSION_VARIANT_TYPE_VECTOR3I, + GDEXTENSION_VARIANT_TYPE_TRANSFORM2D, + GDEXTENSION_VARIANT_TYPE_VECTOR4, + GDEXTENSION_VARIANT_TYPE_VECTOR4I, + GDEXTENSION_VARIANT_TYPE_PLANE, + GDEXTENSION_VARIANT_TYPE_QUATERNION, + GDEXTENSION_VARIANT_TYPE_AABB, + GDEXTENSION_VARIANT_TYPE_BASIS, + GDEXTENSION_VARIANT_TYPE_TRANSFORM3D, + GDEXTENSION_VARIANT_TYPE_PROJECTION, + + /* misc types */ + GDEXTENSION_VARIANT_TYPE_COLOR, + GDEXTENSION_VARIANT_TYPE_STRING_NAME, + GDEXTENSION_VARIANT_TYPE_NODE_PATH, + GDEXTENSION_VARIANT_TYPE_RID, + GDEXTENSION_VARIANT_TYPE_OBJECT, + GDEXTENSION_VARIANT_TYPE_CALLABLE, + GDEXTENSION_VARIANT_TYPE_SIGNAL, + GDEXTENSION_VARIANT_TYPE_DICTIONARY, + GDEXTENSION_VARIANT_TYPE_ARRAY, + + /* typed arrays */ + GDEXTENSION_VARIANT_TYPE_PACKED_BYTE_ARRAY, + GDEXTENSION_VARIANT_TYPE_PACKED_INT32_ARRAY, + GDEXTENSION_VARIANT_TYPE_PACKED_INT64_ARRAY, + GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT32_ARRAY, + GDEXTENSION_VARIANT_TYPE_PACKED_FLOAT64_ARRAY, + GDEXTENSION_VARIANT_TYPE_PACKED_STRING_ARRAY, + GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR2_ARRAY, + GDEXTENSION_VARIANT_TYPE_PACKED_VECTOR3_ARRAY, + GDEXTENSION_VARIANT_TYPE_PACKED_COLOR_ARRAY, + + GDEXTENSION_VARIANT_TYPE_VARIANT_MAX +} GDExtensionVariantType; + +typedef enum { + /* comparison */ + GDEXTENSION_VARIANT_OP_EQUAL, + GDEXTENSION_VARIANT_OP_NOT_EQUAL, + GDEXTENSION_VARIANT_OP_LESS, + GDEXTENSION_VARIANT_OP_LESS_EQUAL, + GDEXTENSION_VARIANT_OP_GREATER, + GDEXTENSION_VARIANT_OP_GREATER_EQUAL, + + /* mathematic */ + GDEXTENSION_VARIANT_OP_ADD, + GDEXTENSION_VARIANT_OP_SUBTRACT, + GDEXTENSION_VARIANT_OP_MULTIPLY, + GDEXTENSION_VARIANT_OP_DIVIDE, + GDEXTENSION_VARIANT_OP_NEGATE, + GDEXTENSION_VARIANT_OP_POSITIVE, + GDEXTENSION_VARIANT_OP_MODULE, + GDEXTENSION_VARIANT_OP_POWER, + + /* bitwise */ + GDEXTENSION_VARIANT_OP_SHIFT_LEFT, + GDEXTENSION_VARIANT_OP_SHIFT_RIGHT, + GDEXTENSION_VARIANT_OP_BIT_AND, + GDEXTENSION_VARIANT_OP_BIT_OR, + GDEXTENSION_VARIANT_OP_BIT_XOR, + GDEXTENSION_VARIANT_OP_BIT_NEGATE, + + /* logic */ + GDEXTENSION_VARIANT_OP_AND, + GDEXTENSION_VARIANT_OP_OR, + GDEXTENSION_VARIANT_OP_XOR, + GDEXTENSION_VARIANT_OP_NOT, + + /* containment */ + GDEXTENSION_VARIANT_OP_IN, + GDEXTENSION_VARIANT_OP_MAX + +} GDExtensionVariantOperator; + +typedef void *GDExtensionVariantPtr; +typedef const void *GDExtensionConstVariantPtr; +typedef void *GDExtensionStringNamePtr; +typedef const void *GDExtensionConstStringNamePtr; +typedef void *GDExtensionStringPtr; +typedef const void *GDExtensionConstStringPtr; +typedef void *GDExtensionObjectPtr; +typedef const void *GDExtensionConstObjectPtr; +typedef void *GDExtensionTypePtr; +typedef const void *GDExtensionConstTypePtr; +typedef const void *GDExtensionMethodBindPtr; +typedef int64_t GDExtensionInt; +typedef uint8_t GDExtensionBool; +typedef uint64_t GDObjectInstanceID; +typedef void *GDExtensionRefPtr; +typedef const void *GDExtensionConstRefPtr; + +/* VARIANT DATA I/O */ + +typedef enum { + GDEXTENSION_CALL_OK, + GDEXTENSION_CALL_ERROR_INVALID_METHOD, + GDEXTENSION_CALL_ERROR_INVALID_ARGUMENT, // Expected a different variant type. + GDEXTENSION_CALL_ERROR_TOO_MANY_ARGUMENTS, // Expected lower number of arguments. + GDEXTENSION_CALL_ERROR_TOO_FEW_ARGUMENTS, // Expected higher number of arguments. + GDEXTENSION_CALL_ERROR_INSTANCE_IS_NULL, + GDEXTENSION_CALL_ERROR_METHOD_NOT_CONST, // Used for const call. +} GDExtensionCallErrorType; + +typedef struct { + GDExtensionCallErrorType error; + int32_t argument; + int32_t expected; +} GDExtensionCallError; + +typedef void (*GDExtensionVariantFromTypeConstructorFunc)(GDExtensionVariantPtr, GDExtensionTypePtr); +typedef void (*GDExtensionTypeFromVariantConstructorFunc)(GDExtensionTypePtr, GDExtensionVariantPtr); +typedef void (*GDExtensionPtrOperatorEvaluator)(GDExtensionConstTypePtr p_left, GDExtensionConstTypePtr p_right, GDExtensionTypePtr r_result); +typedef void (*GDExtensionPtrBuiltInMethod)(GDExtensionTypePtr p_base, const GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_return, int p_argument_count); +typedef void (*GDExtensionPtrConstructor)(GDExtensionTypePtr p_base, const GDExtensionConstTypePtr *p_args); +typedef void (*GDExtensionPtrDestructor)(GDExtensionTypePtr p_base); +typedef void (*GDExtensionPtrSetter)(GDExtensionTypePtr p_base, GDExtensionConstTypePtr p_value); +typedef void (*GDExtensionPtrGetter)(GDExtensionConstTypePtr p_base, GDExtensionTypePtr r_value); +typedef void (*GDExtensionPtrIndexedSetter)(GDExtensionTypePtr p_base, GDExtensionInt p_index, GDExtensionConstTypePtr p_value); +typedef void (*GDExtensionPtrIndexedGetter)(GDExtensionConstTypePtr p_base, GDExtensionInt p_index, GDExtensionTypePtr r_value); +typedef void (*GDExtensionPtrKeyedSetter)(GDExtensionTypePtr p_base, GDExtensionConstTypePtr p_key, GDExtensionConstTypePtr p_value); +typedef void (*GDExtensionPtrKeyedGetter)(GDExtensionConstTypePtr p_base, GDExtensionConstTypePtr p_key, GDExtensionTypePtr r_value); +typedef uint32_t (*GDExtensionPtrKeyedChecker)(GDExtensionConstVariantPtr p_base, GDExtensionConstVariantPtr p_key); +typedef void (*GDExtensionPtrUtilityFunction)(GDExtensionTypePtr r_return, const GDExtensionConstTypePtr *p_args, int p_argument_count); + +typedef GDExtensionObjectPtr (*GDExtensionClassConstructor)(); + +typedef void *(*GDExtensionInstanceBindingCreateCallback)(void *p_token, void *p_instance); +typedef void (*GDExtensionInstanceBindingFreeCallback)(void *p_token, void *p_instance, void *p_binding); +typedef GDExtensionBool (*GDExtensionInstanceBindingReferenceCallback)(void *p_token, void *p_binding, GDExtensionBool p_reference); + +typedef struct { + GDExtensionInstanceBindingCreateCallback create_callback; + GDExtensionInstanceBindingFreeCallback free_callback; + GDExtensionInstanceBindingReferenceCallback reference_callback; +} GDExtensionInstanceBindingCallbacks; + +/* EXTENSION CLASSES */ + +typedef void *GDExtensionClassInstancePtr; + +typedef GDExtensionBool (*GDExtensionClassSet)(GDExtensionClassInstancePtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionConstVariantPtr p_value); +typedef GDExtensionBool (*GDExtensionClassGet)(GDExtensionClassInstancePtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret); +typedef uint64_t (*GDExtensionClassGetRID)(GDExtensionClassInstancePtr p_instance); + +typedef struct { + GDExtensionVariantType type; + GDExtensionStringNamePtr name; + GDExtensionStringNamePtr class_name; + uint32_t hint; // Bitfield of `PropertyHint` (defined in `extension_api.json`). + GDExtensionStringPtr hint_string; + uint32_t usage; // Bitfield of `PropertyUsageFlags` (defined in `extension_api.json`). +} GDExtensionPropertyInfo; + +typedef struct { + GDExtensionStringNamePtr name; + GDExtensionPropertyInfo return_value; + uint32_t flags; // Bitfield of `GDExtensionClassMethodFlags`. + int32_t id; + + /* Arguments: `default_arguments` is an array of size `argument_count`. */ + uint32_t argument_count; + GDExtensionPropertyInfo *arguments; + + /* Default arguments: `default_arguments` is an array of size `default_argument_count`. */ + uint32_t default_argument_count; + GDExtensionVariantPtr *default_arguments; +} GDExtensionMethodInfo; + +typedef const GDExtensionPropertyInfo *(*GDExtensionClassGetPropertyList)(GDExtensionClassInstancePtr p_instance, uint32_t *r_count); +typedef void (*GDExtensionClassFreePropertyList)(GDExtensionClassInstancePtr p_instance, const GDExtensionPropertyInfo *p_list); +typedef GDExtensionBool (*GDExtensionClassPropertyCanRevert)(GDExtensionClassInstancePtr p_instance, GDExtensionConstStringNamePtr p_name); +typedef GDExtensionBool (*GDExtensionClassPropertyGetRevert)(GDExtensionClassInstancePtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret); +typedef void (*GDExtensionClassNotification)(GDExtensionClassInstancePtr p_instance, int32_t p_what); +typedef void (*GDExtensionClassToString)(GDExtensionClassInstancePtr p_instance, GDExtensionBool *r_is_valid, GDExtensionStringPtr p_out); +typedef void (*GDExtensionClassReference)(GDExtensionClassInstancePtr p_instance); +typedef void (*GDExtensionClassUnreference)(GDExtensionClassInstancePtr p_instance); +typedef void (*GDExtensionClassCallVirtual)(GDExtensionClassInstancePtr p_instance, const GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret); +typedef GDExtensionObjectPtr (*GDExtensionClassCreateInstance)(void *p_userdata); +typedef void (*GDExtensionClassFreeInstance)(void *p_userdata, GDExtensionClassInstancePtr p_instance); +typedef GDExtensionClassCallVirtual (*GDExtensionClassGetVirtual)(void *p_userdata, GDExtensionConstStringNamePtr p_name); + +typedef struct { + GDExtensionBool is_virtual; + GDExtensionBool is_abstract; + GDExtensionClassSet set_func; + GDExtensionClassGet get_func; + GDExtensionClassGetPropertyList get_property_list_func; + GDExtensionClassFreePropertyList free_property_list_func; + GDExtensionClassPropertyCanRevert property_can_revert_func; + GDExtensionClassPropertyGetRevert property_get_revert_func; + GDExtensionClassNotification notification_func; + GDExtensionClassToString to_string_func; + GDExtensionClassReference reference_func; + GDExtensionClassUnreference unreference_func; + GDExtensionClassCreateInstance create_instance_func; // (Default) constructor; mandatory. If the class is not instantiable, consider making it virtual or abstract. + GDExtensionClassFreeInstance free_instance_func; // Destructor; mandatory. + GDExtensionClassGetVirtual get_virtual_func; // Queries a virtual function by name and returns a callback to invoke the requested virtual function. + GDExtensionClassGetRID get_rid_func; + void *class_userdata; // Per-class user data, later accessible in instance bindings. +} GDExtensionClassCreationInfo; + +typedef void *GDExtensionClassLibraryPtr; + +/* Method */ + +typedef enum { + GDEXTENSION_METHOD_FLAG_NORMAL = 1, + GDEXTENSION_METHOD_FLAG_EDITOR = 2, + GDEXTENSION_METHOD_FLAG_CONST = 4, + GDEXTENSION_METHOD_FLAG_VIRTUAL = 8, + GDEXTENSION_METHOD_FLAG_VARARG = 16, + GDEXTENSION_METHOD_FLAG_STATIC = 32, + GDEXTENSION_METHOD_FLAGS_DEFAULT = GDEXTENSION_METHOD_FLAG_NORMAL, +} GDExtensionClassMethodFlags; + +typedef enum { + GDEXTENSION_METHOD_ARGUMENT_METADATA_NONE, + GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT8, + GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT16, + GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT32, + GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT64, + GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT8, + GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT16, + GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT32, + GDEXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT64, + GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_FLOAT, + GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE +} GDExtensionClassMethodArgumentMetadata; + +typedef void (*GDExtensionClassMethodCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error); +typedef void (*GDExtensionClassMethodPtrCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, const GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret); + +typedef struct { + GDExtensionStringNamePtr name; + void *method_userdata; + GDExtensionClassMethodCall call_func; + GDExtensionClassMethodPtrCall ptrcall_func; + uint32_t method_flags; // Bitfield of `GDExtensionClassMethodFlags`. + + /* If `has_return_value` is false, `return_value_info` and `return_value_metadata` are ignored. */ + GDExtensionBool has_return_value; + GDExtensionPropertyInfo *return_value_info; + GDExtensionClassMethodArgumentMetadata return_value_metadata; + + /* Arguments: `arguments_info` and `arguments_metadata` are array of size `argument_count`. + * Name and hint information for the argument can be omitted in release builds. Class name should always be present if it applies. + */ + uint32_t argument_count; + GDExtensionPropertyInfo *arguments_info; + GDExtensionClassMethodArgumentMetadata *arguments_metadata; + + /* Default arguments: `default_arguments` is an array of size `default_argument_count`. */ + uint32_t default_argument_count; + GDExtensionVariantPtr *default_arguments; +} GDExtensionClassMethodInfo; + +/* SCRIPT INSTANCE EXTENSION */ + +typedef void *GDExtensionScriptInstanceDataPtr; // Pointer to custom ScriptInstance native implementation. + +typedef GDExtensionBool (*GDExtensionScriptInstanceSet)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionConstVariantPtr p_value); +typedef GDExtensionBool (*GDExtensionScriptInstanceGet)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret); +typedef const GDExtensionPropertyInfo *(*GDExtensionScriptInstanceGetPropertyList)(GDExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count); +typedef void (*GDExtensionScriptInstanceFreePropertyList)(GDExtensionScriptInstanceDataPtr p_instance, const GDExtensionPropertyInfo *p_list); +typedef GDExtensionVariantType (*GDExtensionScriptInstanceGetPropertyType)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionBool *r_is_valid); + +typedef GDExtensionBool (*GDExtensionScriptInstancePropertyCanRevert)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name); +typedef GDExtensionBool (*GDExtensionScriptInstancePropertyGetRevert)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name, GDExtensionVariantPtr r_ret); + +typedef GDExtensionObjectPtr (*GDExtensionScriptInstanceGetOwner)(GDExtensionScriptInstanceDataPtr p_instance); +typedef void (*GDExtensionScriptInstancePropertyStateAdd)(GDExtensionConstStringNamePtr p_name, GDExtensionConstVariantPtr p_value, void *p_userdata); +typedef void (*GDExtensionScriptInstanceGetPropertyState)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionScriptInstancePropertyStateAdd p_add_func, void *p_userdata); + +typedef const GDExtensionMethodInfo *(*GDExtensionScriptInstanceGetMethodList)(GDExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count); +typedef void (*GDExtensionScriptInstanceFreeMethodList)(GDExtensionScriptInstanceDataPtr p_instance, const GDExtensionMethodInfo *p_list); + +typedef GDExtensionBool (*GDExtensionScriptInstanceHasMethod)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name); + +typedef void (*GDExtensionScriptInstanceCall)(GDExtensionScriptInstanceDataPtr p_self, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error); +typedef void (*GDExtensionScriptInstanceNotification)(GDExtensionScriptInstanceDataPtr p_instance, int32_t p_what); +typedef void (*GDExtensionScriptInstanceToString)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionBool *r_is_valid, GDExtensionStringPtr r_out); + +typedef void (*GDExtensionScriptInstanceRefCountIncremented)(GDExtensionScriptInstanceDataPtr p_instance); +typedef GDExtensionBool (*GDExtensionScriptInstanceRefCountDecremented)(GDExtensionScriptInstanceDataPtr p_instance); + +typedef GDExtensionObjectPtr (*GDExtensionScriptInstanceGetScript)(GDExtensionScriptInstanceDataPtr p_instance); +typedef GDExtensionBool (*GDExtensionScriptInstanceIsPlaceholder)(GDExtensionScriptInstanceDataPtr p_instance); + +typedef void *GDExtensionScriptLanguagePtr; + +typedef GDExtensionScriptLanguagePtr (*GDExtensionScriptInstanceGetLanguage)(GDExtensionScriptInstanceDataPtr p_instance); + +typedef void (*GDExtensionScriptInstanceFree)(GDExtensionScriptInstanceDataPtr p_instance); + +typedef void *GDExtensionScriptInstancePtr; // Pointer to ScriptInstance. + +typedef struct { + GDExtensionScriptInstanceSet set_func; + GDExtensionScriptInstanceGet get_func; + GDExtensionScriptInstanceGetPropertyList get_property_list_func; + GDExtensionScriptInstanceFreePropertyList free_property_list_func; + + GDExtensionScriptInstancePropertyCanRevert property_can_revert_func; + GDExtensionScriptInstancePropertyGetRevert property_get_revert_func; + + GDExtensionScriptInstanceGetOwner get_owner_func; + GDExtensionScriptInstanceGetPropertyState get_property_state_func; + + GDExtensionScriptInstanceGetMethodList get_method_list_func; + GDExtensionScriptInstanceFreeMethodList free_method_list_func; + GDExtensionScriptInstanceGetPropertyType get_property_type_func; + + GDExtensionScriptInstanceHasMethod has_method_func; + + GDExtensionScriptInstanceCall call_func; + GDExtensionScriptInstanceNotification notification_func; + + GDExtensionScriptInstanceToString to_string_func; + + GDExtensionScriptInstanceRefCountIncremented refcount_incremented_func; + GDExtensionScriptInstanceRefCountDecremented refcount_decremented_func; + + GDExtensionScriptInstanceGetScript get_script_func; + + GDExtensionScriptInstanceIsPlaceholder is_placeholder_func; + + GDExtensionScriptInstanceSet set_fallback_func; + GDExtensionScriptInstanceGet get_fallback_func; + + GDExtensionScriptInstanceGetLanguage get_language_func; + + GDExtensionScriptInstanceFree free_func; + +} GDExtensionScriptInstanceInfo; + +/* INTERFACE */ + +typedef struct { + uint32_t version_major; + uint32_t version_minor; + uint32_t version_patch; + const char *version_string; + + /* GODOT CORE */ + + void *(*mem_alloc)(size_t p_bytes); + void *(*mem_realloc)(void *p_ptr, size_t p_bytes); + void (*mem_free)(void *p_ptr); + + void (*print_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line); + void (*print_warning)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line); + void (*print_script_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line); + + uint64_t (*get_native_struct_size)(GDExtensionConstStringNamePtr p_name); + + /* GODOT VARIANT */ + + /* variant general */ + void (*variant_new_copy)(GDExtensionVariantPtr r_dest, GDExtensionConstVariantPtr p_src); + void (*variant_new_nil)(GDExtensionVariantPtr r_dest); + void (*variant_destroy)(GDExtensionVariantPtr p_self); + + /* variant type */ + void (*variant_call)(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error); + void (*variant_call_static)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error); + void (*variant_evaluate)(GDExtensionVariantOperator p_op, GDExtensionConstVariantPtr p_a, GDExtensionConstVariantPtr p_b, GDExtensionVariantPtr r_return, GDExtensionBool *r_valid); + void (*variant_set)(GDExtensionVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid); + void (*variant_set_named)(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid); + void (*variant_set_keyed)(GDExtensionVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid); + void (*variant_set_indexed)(GDExtensionVariantPtr p_self, GDExtensionInt p_index, GDExtensionConstVariantPtr p_value, GDExtensionBool *r_valid, GDExtensionBool *r_oob); + void (*variant_get)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid); + void (*variant_get_named)(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid); + void (*variant_get_keyed)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid); + void (*variant_get_indexed)(GDExtensionConstVariantPtr p_self, GDExtensionInt p_index, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid, GDExtensionBool *r_oob); + GDExtensionBool (*variant_iter_init)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionBool *r_valid); + GDExtensionBool (*variant_iter_next)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionBool *r_valid); + void (*variant_iter_get)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_iter, GDExtensionVariantPtr r_ret, GDExtensionBool *r_valid); + GDExtensionInt (*variant_hash)(GDExtensionConstVariantPtr p_self); + GDExtensionInt (*variant_recursive_hash)(GDExtensionConstVariantPtr p_self, GDExtensionInt p_recursion_count); + GDExtensionBool (*variant_hash_compare)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_other); + GDExtensionBool (*variant_booleanize)(GDExtensionConstVariantPtr p_self); + void (*variant_duplicate)(GDExtensionConstVariantPtr p_self, GDExtensionVariantPtr r_ret, GDExtensionBool p_deep); + void (*variant_stringify)(GDExtensionConstVariantPtr p_self, GDExtensionStringPtr r_ret); + + GDExtensionVariantType (*variant_get_type)(GDExtensionConstVariantPtr p_self); + GDExtensionBool (*variant_has_method)(GDExtensionConstVariantPtr p_self, GDExtensionConstStringNamePtr p_method); + GDExtensionBool (*variant_has_member)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member); + GDExtensionBool (*variant_has_key)(GDExtensionConstVariantPtr p_self, GDExtensionConstVariantPtr p_key, GDExtensionBool *r_valid); + void (*variant_get_type_name)(GDExtensionVariantType p_type, GDExtensionStringPtr r_name); + GDExtensionBool (*variant_can_convert)(GDExtensionVariantType p_from, GDExtensionVariantType p_to); + GDExtensionBool (*variant_can_convert_strict)(GDExtensionVariantType p_from, GDExtensionVariantType p_to); + + /* ptrcalls */ + GDExtensionVariantFromTypeConstructorFunc (*get_variant_from_type_constructor)(GDExtensionVariantType p_type); + GDExtensionTypeFromVariantConstructorFunc (*get_variant_to_type_constructor)(GDExtensionVariantType p_type); + GDExtensionPtrOperatorEvaluator (*variant_get_ptr_operator_evaluator)(GDExtensionVariantOperator p_operator, GDExtensionVariantType p_type_a, GDExtensionVariantType p_type_b); + GDExtensionPtrBuiltInMethod (*variant_get_ptr_builtin_method)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, GDExtensionInt p_hash); + GDExtensionPtrConstructor (*variant_get_ptr_constructor)(GDExtensionVariantType p_type, int32_t p_constructor); + GDExtensionPtrDestructor (*variant_get_ptr_destructor)(GDExtensionVariantType p_type); + void (*variant_construct)(GDExtensionVariantType p_type, GDExtensionVariantPtr p_base, const GDExtensionConstVariantPtr *p_args, int32_t p_argument_count, GDExtensionCallError *r_error); + GDExtensionPtrSetter (*variant_get_ptr_setter)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member); + GDExtensionPtrGetter (*variant_get_ptr_getter)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_member); + GDExtensionPtrIndexedSetter (*variant_get_ptr_indexed_setter)(GDExtensionVariantType p_type); + GDExtensionPtrIndexedGetter (*variant_get_ptr_indexed_getter)(GDExtensionVariantType p_type); + GDExtensionPtrKeyedSetter (*variant_get_ptr_keyed_setter)(GDExtensionVariantType p_type); + GDExtensionPtrKeyedGetter (*variant_get_ptr_keyed_getter)(GDExtensionVariantType p_type); + GDExtensionPtrKeyedChecker (*variant_get_ptr_keyed_checker)(GDExtensionVariantType p_type); + void (*variant_get_constant_value)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_constant, GDExtensionVariantPtr r_ret); + GDExtensionPtrUtilityFunction (*variant_get_ptr_utility_function)(GDExtensionConstStringNamePtr p_function, GDExtensionInt p_hash); + + /* extra utilities */ + void (*string_new_with_latin1_chars)(GDExtensionStringPtr r_dest, const char *p_contents); + void (*string_new_with_utf8_chars)(GDExtensionStringPtr r_dest, const char *p_contents); + void (*string_new_with_utf16_chars)(GDExtensionStringPtr r_dest, const char16_t *p_contents); + void (*string_new_with_utf32_chars)(GDExtensionStringPtr r_dest, const char32_t *p_contents); + void (*string_new_with_wide_chars)(GDExtensionStringPtr r_dest, const wchar_t *p_contents); + void (*string_new_with_latin1_chars_and_len)(GDExtensionStringPtr r_dest, const char *p_contents, GDExtensionInt p_size); + void (*string_new_with_utf8_chars_and_len)(GDExtensionStringPtr r_dest, const char *p_contents, GDExtensionInt p_size); + void (*string_new_with_utf16_chars_and_len)(GDExtensionStringPtr r_dest, const char16_t *p_contents, GDExtensionInt p_size); + void (*string_new_with_utf32_chars_and_len)(GDExtensionStringPtr r_dest, const char32_t *p_contents, GDExtensionInt p_size); + void (*string_new_with_wide_chars_and_len)(GDExtensionStringPtr r_dest, const wchar_t *p_contents, GDExtensionInt p_size); + /* Information about the following functions: + * - The return value is the resulting encoded string length. + * - The length returned is in characters, not in bytes. It also does not include a trailing zero. + * - These functions also do not write trailing zero, If you need it, write it yourself at the position indicated by the length (and make sure to allocate it). + * - Passing NULL in r_text means only the length is computed (again, without including trailing zero). + * - p_max_write_length argument is in characters, not bytes. It will be ignored if r_text is NULL. + * - p_max_write_length argument does not affect the return value, it's only to cap write length. + */ + GDExtensionInt (*string_to_latin1_chars)(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length); + GDExtensionInt (*string_to_utf8_chars)(GDExtensionConstStringPtr p_self, char *r_text, GDExtensionInt p_max_write_length); + GDExtensionInt (*string_to_utf16_chars)(GDExtensionConstStringPtr p_self, char16_t *r_text, GDExtensionInt p_max_write_length); + GDExtensionInt (*string_to_utf32_chars)(GDExtensionConstStringPtr p_self, char32_t *r_text, GDExtensionInt p_max_write_length); + GDExtensionInt (*string_to_wide_chars)(GDExtensionConstStringPtr p_self, wchar_t *r_text, GDExtensionInt p_max_write_length); + char32_t *(*string_operator_index)(GDExtensionStringPtr p_self, GDExtensionInt p_index); + const char32_t *(*string_operator_index_const)(GDExtensionConstStringPtr p_self, GDExtensionInt p_index); + + /* Packed array functions */ + + uint8_t *(*packed_byte_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedByteArray + const uint8_t *(*packed_byte_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedByteArray + + GDExtensionTypePtr (*packed_color_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedColorArray, returns Color ptr + GDExtensionTypePtr (*packed_color_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedColorArray, returns Color ptr + + float *(*packed_float32_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedFloat32Array + const float *(*packed_float32_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedFloat32Array + double *(*packed_float64_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedFloat64Array + const double *(*packed_float64_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedFloat64Array + + int32_t *(*packed_int32_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedInt32Array + const int32_t *(*packed_int32_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedInt32Array + int64_t *(*packed_int64_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedInt32Array + const int64_t *(*packed_int64_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedInt32Array + + GDExtensionStringPtr (*packed_string_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedStringArray + GDExtensionStringPtr (*packed_string_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedStringArray + + GDExtensionTypePtr (*packed_vector2_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr + GDExtensionTypePtr (*packed_vector2_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr + GDExtensionTypePtr (*packed_vector3_array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr + GDExtensionTypePtr (*packed_vector3_array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr + + GDExtensionVariantPtr (*array_operator_index)(GDExtensionTypePtr p_self, GDExtensionInt p_index); // p_self should be an Array ptr + GDExtensionVariantPtr (*array_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionInt p_index); // p_self should be an Array ptr + + /* Dictionary functions */ + + GDExtensionVariantPtr (*dictionary_operator_index)(GDExtensionTypePtr p_self, GDExtensionConstVariantPtr p_key); // p_self should be an Dictionary ptr + GDExtensionVariantPtr (*dictionary_operator_index_const)(GDExtensionConstTypePtr p_self, GDExtensionConstVariantPtr p_key); // p_self should be an Dictionary ptr + + /* OBJECT */ + + void (*object_method_bind_call)(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, const GDExtensionConstVariantPtr *p_args, GDExtensionInt p_arg_count, GDExtensionVariantPtr r_ret, GDExtensionCallError *r_error); + void (*object_method_bind_ptrcall)(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, const GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret); + void (*object_destroy)(GDExtensionObjectPtr p_o); + GDExtensionObjectPtr (*global_get_singleton)(GDExtensionConstStringNamePtr p_name); + + void *(*object_get_instance_binding)(GDExtensionObjectPtr p_o, void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks); + void (*object_set_instance_binding)(GDExtensionObjectPtr p_o, void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks); + + void (*object_set_instance)(GDExtensionObjectPtr p_o, GDExtensionConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance); /* p_classname should be a registered extension class and should extend the p_o object's class. */ + + GDExtensionObjectPtr (*object_cast_to)(GDExtensionConstObjectPtr p_object, void *p_class_tag); + GDExtensionObjectPtr (*object_get_instance_from_id)(GDObjectInstanceID p_instance_id); + GDObjectInstanceID (*object_get_instance_id)(GDExtensionConstObjectPtr p_object); + + /* REFERENCE */ + + GDExtensionObjectPtr (*ref_get_object)(GDExtensionConstRefPtr p_ref); + void (*ref_set_object)(GDExtensionRefPtr p_ref, GDExtensionObjectPtr p_object); + + /* SCRIPT INSTANCE */ + + GDExtensionScriptInstancePtr (*script_instance_create)(const GDExtensionScriptInstanceInfo *p_info, GDExtensionScriptInstanceDataPtr p_instance_data); + + /* CLASSDB */ + + GDExtensionObjectPtr (*classdb_construct_object)(GDExtensionConstStringNamePtr p_classname); /* The passed class must be a built-in godot class, or an already-registered extension class. In both case, object_set_instance should be called to fully initialize the object. */ + GDExtensionMethodBindPtr (*classdb_get_method_bind)(GDExtensionConstStringNamePtr p_classname, GDExtensionConstStringNamePtr p_methodname, GDExtensionInt p_hash); + void *(*classdb_get_class_tag)(GDExtensionConstStringNamePtr p_classname); + + /* CLASSDB EXTENSION */ + + /* Provided parameters for `classdb_register_extension_*` can be safely freed once the function returns. */ + void (*classdb_register_extension_class)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_parent_class_name, const GDExtensionClassCreationInfo *p_extension_funcs); + void (*classdb_register_extension_class_method)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionClassMethodInfo *p_method_info); + void (*classdb_register_extension_class_integer_constant)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_enum_name, GDExtensionConstStringNamePtr p_constant_name, GDExtensionInt p_constant_value, GDExtensionBool p_is_bitfield); + void (*classdb_register_extension_class_property)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, const GDExtensionPropertyInfo *p_info, GDExtensionConstStringNamePtr p_setter, GDExtensionConstStringNamePtr p_getter); + void (*classdb_register_extension_class_property_group)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_group_name, GDExtensionConstStringPtr p_prefix); + void (*classdb_register_extension_class_property_subgroup)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringPtr p_subgroup_name, GDExtensionConstStringPtr p_prefix); + void (*classdb_register_extension_class_signal)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name, GDExtensionConstStringNamePtr p_signal_name, const GDExtensionPropertyInfo *p_argument_info, GDExtensionInt p_argument_count); + void (*classdb_unregister_extension_class)(GDExtensionClassLibraryPtr p_library, GDExtensionConstStringNamePtr p_class_name); /* Unregistering a parent class before a class that inherits it will result in failure. Inheritors must be unregistered first. */ + + void (*get_library_path)(GDExtensionClassLibraryPtr p_library, GDExtensionStringPtr r_path); + +} GDExtensionInterface; + +/* INITIALIZATION */ + +typedef enum { + GDEXTENSION_INITIALIZATION_CORE, + GDEXTENSION_INITIALIZATION_SERVERS, + GDEXTENSION_INITIALIZATION_SCENE, + GDEXTENSION_INITIALIZATION_EDITOR, + GDEXTENSION_MAX_INITIALIZATION_LEVEL, +} GDExtensionInitializationLevel; + +typedef struct { + /* Minimum initialization level required. + * If Core or Servers, the extension needs editor or game restart to take effect */ + GDExtensionInitializationLevel minimum_initialization_level; + /* Up to the user to supply when initializing */ + void *userdata; + /* This function will be called multiple times for each initialization level. */ + void (*initialize)(void *userdata, GDExtensionInitializationLevel p_level); + void (*deinitialize)(void *userdata, GDExtensionInitializationLevel p_level); +} GDExtensionInitialization; + +/* Define a C function prototype that implements the function below and expose it to dlopen() (or similar). + * This is the entry point of the GDExtension library and will be called on initialization. + * It can be used to set up different init levels, which are called during various stages of initialization/shutdown. + * The function name must be a unique one specified in the .gdextension config file. + */ +typedef GDExtensionBool (*GDExtensionInitializationFunction)(const GDExtensionInterface *p_interface, GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization); + +#ifdef __cplusplus +} +#endif + +#endif // GDEXTENSION_INTERFACE_H diff --git a/core/extension/native_extension_manager.cpp b/core/extension/gdextension_manager.cpp index 186fcc44f6..5bdde78793 100644 --- a/core/extension/native_extension_manager.cpp +++ b/core/extension/gdextension_manager.cpp @@ -1,5 +1,5 @@ /*************************************************************************/ -/* native_extension_manager.cpp */ +/* gdextension_manager.cpp */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,91 +28,91 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#include "native_extension_manager.h" +#include "gdextension_manager.h" #include "core/io/file_access.h" -NativeExtensionManager::LoadStatus NativeExtensionManager::load_extension(const String &p_path) { - if (native_extension_map.has(p_path)) { +GDExtensionManager::LoadStatus GDExtensionManager::load_extension(const String &p_path) { + if (gdextension_map.has(p_path)) { return LOAD_STATUS_ALREADY_LOADED; } - Ref<NativeExtension> extension = ResourceLoader::load(p_path); + Ref<GDExtension> extension = ResourceLoader::load(p_path); if (extension.is_null()) { return LOAD_STATUS_FAILED; } if (level >= 0) { // Already initialized up to some level. int32_t minimum_level = extension->get_minimum_library_initialization_level(); - if (minimum_level < MIN(level, NativeExtension::INITIALIZATION_LEVEL_SCENE)) { + if (minimum_level < MIN(level, GDExtension::INITIALIZATION_LEVEL_SCENE)) { return LOAD_STATUS_NEEDS_RESTART; } // Initialize up to current level. for (int32_t i = minimum_level; i <= level; i++) { - extension->initialize_library(NativeExtension::InitializationLevel(i)); + extension->initialize_library(GDExtension::InitializationLevel(i)); } } - native_extension_map[p_path] = extension; + gdextension_map[p_path] = extension; return LOAD_STATUS_OK; } -NativeExtensionManager::LoadStatus NativeExtensionManager::reload_extension(const String &p_path) { +GDExtensionManager::LoadStatus GDExtensionManager::reload_extension(const String &p_path) { return LOAD_STATUS_OK; //TODO } -NativeExtensionManager::LoadStatus NativeExtensionManager::unload_extension(const String &p_path) { - if (!native_extension_map.has(p_path)) { +GDExtensionManager::LoadStatus GDExtensionManager::unload_extension(const String &p_path) { + if (!gdextension_map.has(p_path)) { return LOAD_STATUS_NOT_LOADED; } - Ref<NativeExtension> extension = native_extension_map[p_path]; + Ref<GDExtension> extension = gdextension_map[p_path]; if (level >= 0) { // Already initialized up to some level. int32_t minimum_level = extension->get_minimum_library_initialization_level(); - if (minimum_level < MIN(level, NativeExtension::INITIALIZATION_LEVEL_SCENE)) { + if (minimum_level < MIN(level, GDExtension::INITIALIZATION_LEVEL_SCENE)) { return LOAD_STATUS_NEEDS_RESTART; } // Deinitialize down to current level. for (int32_t i = level; i >= minimum_level; i--) { - extension->deinitialize_library(NativeExtension::InitializationLevel(i)); + extension->deinitialize_library(GDExtension::InitializationLevel(i)); } } - native_extension_map.erase(p_path); + gdextension_map.erase(p_path); return LOAD_STATUS_OK; } -bool NativeExtensionManager::is_extension_loaded(const String &p_path) const { - return native_extension_map.has(p_path); +bool GDExtensionManager::is_extension_loaded(const String &p_path) const { + return gdextension_map.has(p_path); } -Vector<String> NativeExtensionManager::get_loaded_extensions() const { +Vector<String> GDExtensionManager::get_loaded_extensions() const { Vector<String> ret; - for (const KeyValue<String, Ref<NativeExtension>> &E : native_extension_map) { + for (const KeyValue<String, Ref<GDExtension>> &E : gdextension_map) { ret.push_back(E.key); } return ret; } -Ref<NativeExtension> NativeExtensionManager::get_extension(const String &p_path) { - HashMap<String, Ref<NativeExtension>>::Iterator E = native_extension_map.find(p_path); - ERR_FAIL_COND_V(!E, Ref<NativeExtension>()); +Ref<GDExtension> GDExtensionManager::get_extension(const String &p_path) { + HashMap<String, Ref<GDExtension>>::Iterator E = gdextension_map.find(p_path); + ERR_FAIL_COND_V(!E, Ref<GDExtension>()); return E->value; } -void NativeExtensionManager::initialize_extensions(NativeExtension::InitializationLevel p_level) { +void GDExtensionManager::initialize_extensions(GDExtension::InitializationLevel p_level) { ERR_FAIL_COND(int32_t(p_level) - 1 != level); - for (KeyValue<String, Ref<NativeExtension>> &E : native_extension_map) { + for (KeyValue<String, Ref<GDExtension>> &E : gdextension_map) { E.value->initialize_library(p_level); } level = p_level; } -void NativeExtensionManager::deinitialize_extensions(NativeExtension::InitializationLevel p_level) { +void GDExtensionManager::deinitialize_extensions(GDExtension::InitializationLevel p_level) { ERR_FAIL_COND(int32_t(p_level) != level); - for (KeyValue<String, Ref<NativeExtension>> &E : native_extension_map) { + for (KeyValue<String, Ref<GDExtension>> &E : gdextension_map) { E.value->deinitialize_library(p_level); } level = int32_t(p_level) - 1; } -void NativeExtensionManager::load_extensions() { - Ref<FileAccess> f = FileAccess::open(NativeExtension::get_extension_list_config_file(), FileAccess::READ); +void GDExtensionManager::load_extensions() { + Ref<FileAccess> f = FileAccess::open(GDExtension::get_extension_list_config_file(), FileAccess::READ); while (f.is_valid() && !f->eof_reached()) { String s = f->get_line().strip_edges(); if (!s.is_empty()) { @@ -122,17 +122,17 @@ void NativeExtensionManager::load_extensions() { } } -NativeExtensionManager *NativeExtensionManager::get_singleton() { +GDExtensionManager *GDExtensionManager::get_singleton() { return singleton; } -void NativeExtensionManager::_bind_methods() { - ClassDB::bind_method(D_METHOD("load_extension", "path"), &NativeExtensionManager::load_extension); - ClassDB::bind_method(D_METHOD("reload_extension", "path"), &NativeExtensionManager::reload_extension); - ClassDB::bind_method(D_METHOD("unload_extension", "path"), &NativeExtensionManager::unload_extension); - ClassDB::bind_method(D_METHOD("is_extension_loaded", "path"), &NativeExtensionManager::is_extension_loaded); +void GDExtensionManager::_bind_methods() { + ClassDB::bind_method(D_METHOD("load_extension", "path"), &GDExtensionManager::load_extension); + ClassDB::bind_method(D_METHOD("reload_extension", "path"), &GDExtensionManager::reload_extension); + ClassDB::bind_method(D_METHOD("unload_extension", "path"), &GDExtensionManager::unload_extension); + ClassDB::bind_method(D_METHOD("is_extension_loaded", "path"), &GDExtensionManager::is_extension_loaded); - ClassDB::bind_method(D_METHOD("get_loaded_extensions"), &NativeExtensionManager::get_loaded_extensions); - ClassDB::bind_method(D_METHOD("get_extension", "path"), &NativeExtensionManager::get_extension); + ClassDB::bind_method(D_METHOD("get_loaded_extensions"), &GDExtensionManager::get_loaded_extensions); + ClassDB::bind_method(D_METHOD("get_extension", "path"), &GDExtensionManager::get_extension); BIND_ENUM_CONSTANT(LOAD_STATUS_OK); BIND_ENUM_CONSTANT(LOAD_STATUS_FAILED); @@ -141,9 +141,9 @@ void NativeExtensionManager::_bind_methods() { BIND_ENUM_CONSTANT(LOAD_STATUS_NEEDS_RESTART); } -NativeExtensionManager *NativeExtensionManager::singleton = nullptr; +GDExtensionManager *GDExtensionManager::singleton = nullptr; -NativeExtensionManager::NativeExtensionManager() { +GDExtensionManager::GDExtensionManager() { ERR_FAIL_COND(singleton != nullptr); singleton = this; } diff --git a/core/extension/native_extension_manager.h b/core/extension/gdextension_manager.h index ed80cd6b7a..2f2aa0e0d4 100644 --- a/core/extension/native_extension_manager.h +++ b/core/extension/gdextension_manager.h @@ -1,5 +1,5 @@ /*************************************************************************/ -/* native_extension_manager.h */ +/* gdextension_manager.h */ /*************************************************************************/ /* This file is part of: */ /* GODOT ENGINE */ @@ -28,20 +28,20 @@ /* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ /*************************************************************************/ -#ifndef NATIVE_EXTENSION_MANAGER_H -#define NATIVE_EXTENSION_MANAGER_H +#ifndef GDEXTENSION_MANAGER_H +#define GDEXTENSION_MANAGER_H -#include "core/extension/native_extension.h" +#include "core/extension/gdextension.h" -class NativeExtensionManager : public Object { - GDCLASS(NativeExtensionManager, Object); +class GDExtensionManager : public Object { + GDCLASS(GDExtensionManager, Object); int32_t level = -1; - HashMap<String, Ref<NativeExtension>> native_extension_map; + HashMap<String, Ref<GDExtension>> gdextension_map; static void _bind_methods(); - static NativeExtensionManager *singleton; + static GDExtensionManager *singleton; public: enum LoadStatus { @@ -57,18 +57,18 @@ public: LoadStatus unload_extension(const String &p_path); bool is_extension_loaded(const String &p_path) const; Vector<String> get_loaded_extensions() const; - Ref<NativeExtension> get_extension(const String &p_path); + Ref<GDExtension> get_extension(const String &p_path); - void initialize_extensions(NativeExtension::InitializationLevel p_level); - void deinitialize_extensions(NativeExtension::InitializationLevel p_level); + void initialize_extensions(GDExtension::InitializationLevel p_level); + void deinitialize_extensions(GDExtension::InitializationLevel p_level); - static NativeExtensionManager *get_singleton(); + static GDExtensionManager *get_singleton(); void load_extensions(); - NativeExtensionManager(); + GDExtensionManager(); }; -VARIANT_ENUM_CAST(NativeExtensionManager::LoadStatus) +VARIANT_ENUM_CAST(GDExtensionManager::LoadStatus) -#endif // NATIVE_EXTENSION_MANAGER_H +#endif // GDEXTENSION_MANAGER_H diff --git a/core/extension/gdnative_interface.cpp b/core/extension/gdnative_interface.cpp deleted file mode 100644 index 78dc6dac0b..0000000000 --- a/core/extension/gdnative_interface.cpp +++ /dev/null @@ -1,1083 +0,0 @@ -/*************************************************************************/ -/* gdnative_interface.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#include "gdnative_interface.h" - -#include "core/config/engine.h" -#include "core/object/class_db.h" -#include "core/object/script_language_extension.h" -#include "core/os/memory.h" -#include "core/variant/variant.h" -#include "core/version.h" - -// Memory Functions -static void *gdnative_alloc(size_t p_size) { - return memalloc(p_size); -} - -static void *gdnative_realloc(void *p_mem, size_t p_size) { - return memrealloc(p_mem, p_size); -} - -static void gdnative_free(void *p_mem) { - memfree(p_mem); -} - -// Helper print functions. -static void gdnative_print_error(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) { - _err_print_error(p_function, p_file, p_line, p_description, false, ERR_HANDLER_ERROR); -} -static void gdnative_print_warning(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) { - _err_print_error(p_function, p_file, p_line, p_description, false, ERR_HANDLER_WARNING); -} -static void gdnative_print_script_error(const char *p_description, const char *p_function, const char *p_file, int32_t p_line) { - _err_print_error(p_function, p_file, p_line, p_description, false, ERR_HANDLER_SCRIPT); -} - -uint64_t gdnative_get_native_struct_size(GDNativeConstStringNamePtr p_name) { - const StringName name = *reinterpret_cast<const StringName *>(p_name); - return ClassDB::get_native_struct_size(name); -} - -// Variant functions - -static void gdnative_variant_new_copy(GDNativeVariantPtr r_dest, GDNativeConstVariantPtr p_src) { - memnew_placement(reinterpret_cast<Variant *>(r_dest), Variant(*reinterpret_cast<const Variant *>(p_src))); -} -static void gdnative_variant_new_nil(GDNativeVariantPtr r_dest) { - memnew_placement(reinterpret_cast<Variant *>(r_dest), Variant); -} -static void gdnative_variant_destroy(GDNativeVariantPtr p_self) { - reinterpret_cast<Variant *>(p_self)->~Variant(); -} - -// variant type - -static void gdnative_variant_call(GDNativeVariantPtr p_self, GDNativeConstStringNamePtr p_method, GDNativeConstVariantPtr *p_args, GDNativeInt p_argcount, GDNativeVariantPtr r_return, GDNativeCallError *r_error) { - Variant *self = (Variant *)p_self; - const StringName method = *reinterpret_cast<const StringName *>(p_method); - const Variant **args = (const Variant **)p_args; - Variant ret; - Callable::CallError error; - self->callp(method, args, p_argcount, ret, error); - memnew_placement(r_return, Variant(ret)); - - if (r_error) { - r_error->error = (GDNativeCallErrorType)(error.error); - r_error->argument = error.argument; - r_error->expected = error.expected; - } -} - -static void gdnative_variant_call_static(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_method, GDNativeConstVariantPtr *p_args, GDNativeInt p_argcount, GDNativeVariantPtr r_return, GDNativeCallError *r_error) { - Variant::Type type = (Variant::Type)p_type; - const StringName method = *reinterpret_cast<const StringName *>(p_method); - const Variant **args = (const Variant **)p_args; - Variant ret; - Callable::CallError error; - Variant::call_static(type, method, args, p_argcount, ret, error); - memnew_placement(r_return, Variant(ret)); - - if (r_error) { - r_error->error = (GDNativeCallErrorType)error.error; - r_error->argument = error.argument; - r_error->expected = error.expected; - } -} - -static void gdnative_variant_evaluate(GDNativeVariantOperator p_op, GDNativeConstVariantPtr p_a, GDNativeConstVariantPtr p_b, GDNativeVariantPtr r_return, GDNativeBool *r_valid) { - Variant::Operator op = (Variant::Operator)p_op; - const Variant *a = (const Variant *)p_a; - const Variant *b = (const Variant *)p_b; - Variant *ret = (Variant *)r_return; - bool valid; - Variant::evaluate(op, *a, *b, *ret, valid); - *r_valid = valid; -} - -static void gdnative_variant_set(GDNativeVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid) { - Variant *self = (Variant *)p_self; - const Variant *key = (const Variant *)p_key; - const Variant *value = (const Variant *)p_value; - - bool valid; - self->set(*key, *value, &valid); - *r_valid = valid; -} - -static void gdnative_variant_set_named(GDNativeVariantPtr p_self, GDNativeConstStringNamePtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid) { - Variant *self = (Variant *)p_self; - const StringName *key = (const StringName *)p_key; - const Variant *value = (const Variant *)p_value; - - bool valid; - self->set_named(*key, *value, valid); - *r_valid = valid; -} - -static void gdnative_variant_set_keyed(GDNativeVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid) { - Variant *self = (Variant *)p_self; - const Variant *key = (const Variant *)p_key; - const Variant *value = (const Variant *)p_value; - - bool valid; - self->set_keyed(*key, *value, valid); - *r_valid = valid; -} - -static void gdnative_variant_set_indexed(GDNativeVariantPtr p_self, GDNativeInt p_index, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid, GDNativeBool *r_oob) { - Variant *self = (Variant *)p_self; - const Variant *value = (const Variant *)p_value; - - bool valid; - bool oob; - self->set_indexed(p_index, *value, valid, oob); - *r_valid = valid; - *r_oob = oob; -} - -static void gdnative_variant_get(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid) { - const Variant *self = (const Variant *)p_self; - const Variant *key = (const Variant *)p_key; - - bool valid; - memnew_placement(r_ret, Variant(self->get(*key, &valid))); - *r_valid = valid; -} - -static void gdnative_variant_get_named(GDNativeConstVariantPtr p_self, GDNativeConstStringNamePtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid) { - const Variant *self = (const Variant *)p_self; - const StringName *key = (const StringName *)p_key; - - bool valid; - memnew_placement(r_ret, Variant(self->get_named(*key, valid))); - *r_valid = valid; -} - -static void gdnative_variant_get_keyed(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid) { - const Variant *self = (const Variant *)p_self; - const Variant *key = (const Variant *)p_key; - - bool valid; - memnew_placement(r_ret, Variant(self->get_keyed(*key, valid))); - *r_valid = valid; -} - -static void gdnative_variant_get_indexed(GDNativeConstVariantPtr p_self, GDNativeInt p_index, GDNativeVariantPtr r_ret, GDNativeBool *r_valid, GDNativeBool *r_oob) { - const Variant *self = (const Variant *)p_self; - - bool valid; - bool oob; - memnew_placement(r_ret, Variant(self->get_indexed(p_index, valid, oob))); - *r_valid = valid; - *r_oob = oob; -} - -/// Iteration. -static GDNativeBool gdnative_variant_iter_init(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid) { - const Variant *self = (const Variant *)p_self; - Variant *iter = (Variant *)r_iter; - - bool valid; - bool ret = self->iter_init(*iter, valid); - *r_valid = valid; - return ret; -} - -static GDNativeBool gdnative_variant_iter_next(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid) { - const Variant *self = (const Variant *)p_self; - Variant *iter = (Variant *)r_iter; - - bool valid; - bool ret = self->iter_next(*iter, valid); - *r_valid = valid; - return ret; -} - -static void gdnative_variant_iter_get(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeVariantPtr r_ret, GDNativeBool *r_valid) { - const Variant *self = (const Variant *)p_self; - Variant *iter = (Variant *)r_iter; - - bool valid; - memnew_placement(r_ret, Variant(self->iter_next(*iter, valid))); - *r_valid = valid; -} - -/// Variant functions. -static GDNativeInt gdnative_variant_hash(GDNativeConstVariantPtr p_self) { - const Variant *self = (const Variant *)p_self; - return self->hash(); -} - -static GDNativeInt gdnative_variant_recursive_hash(GDNativeConstVariantPtr p_self, GDNativeInt p_recursion_count) { - const Variant *self = (const Variant *)p_self; - return self->recursive_hash(p_recursion_count); -} - -static GDNativeBool gdnative_variant_hash_compare(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_other) { - const Variant *self = (const Variant *)p_self; - const Variant *other = (const Variant *)p_other; - return self->hash_compare(*other); -} - -static GDNativeBool gdnative_variant_booleanize(GDNativeConstVariantPtr p_self) { - const Variant *self = (const Variant *)p_self; - return self->booleanize(); -} - -static void gdnative_variant_duplicate(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_ret, GDNativeBool p_deep) { - const Variant *self = (const Variant *)p_self; - memnew_placement(r_ret, Variant(self->duplicate(p_deep))); -} - -static void gdnative_variant_stringify(GDNativeConstVariantPtr p_self, GDNativeStringPtr r_ret) { - const Variant *self = (const Variant *)p_self; - memnew_placement(r_ret, String(*self)); -} - -static GDNativeVariantType gdnative_variant_get_type(GDNativeConstVariantPtr p_self) { - const Variant *self = (const Variant *)p_self; - return (GDNativeVariantType)self->get_type(); -} - -static GDNativeBool gdnative_variant_has_method(GDNativeConstVariantPtr p_self, GDNativeConstStringNamePtr p_method) { - const Variant *self = (const Variant *)p_self; - const StringName *method = (const StringName *)p_method; - return self->has_method(*method); -} - -static GDNativeBool gdnative_variant_has_member(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member) { - return Variant::has_member((Variant::Type)p_type, *((const StringName *)p_member)); -} - -static GDNativeBool gdnative_variant_has_key(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeBool *r_valid) { - const Variant *self = (const Variant *)p_self; - const Variant *key = (const Variant *)p_key; - bool valid; - bool ret = self->has_key(*key, valid); - *r_valid = valid; - return ret; -} - -static void gdnative_variant_get_type_name(GDNativeVariantType p_type, GDNativeStringPtr r_ret) { - String name = Variant::get_type_name((Variant::Type)p_type); - memnew_placement(r_ret, String(name)); -} - -static GDNativeBool gdnative_variant_can_convert(GDNativeVariantType p_from, GDNativeVariantType p_to) { - return Variant::can_convert((Variant::Type)p_from, (Variant::Type)p_to); -} - -static GDNativeBool gdnative_variant_can_convert_strict(GDNativeVariantType p_from, GDNativeVariantType p_to) { - return Variant::can_convert_strict((Variant::Type)p_from, (Variant::Type)p_to); -} - -// Variant interaction. -static GDNativeVariantFromTypeConstructorFunc gdnative_get_variant_from_type_constructor(GDNativeVariantType p_type) { - switch (p_type) { - case GDNATIVE_VARIANT_TYPE_BOOL: - return VariantTypeConstructor<bool>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_INT: - return VariantTypeConstructor<int64_t>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_FLOAT: - return VariantTypeConstructor<double>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_STRING: - return VariantTypeConstructor<String>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_VECTOR2: - return VariantTypeConstructor<Vector2>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_VECTOR2I: - return VariantTypeConstructor<Vector2i>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_RECT2: - return VariantTypeConstructor<Rect2>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_RECT2I: - return VariantTypeConstructor<Rect2i>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_VECTOR3: - return VariantTypeConstructor<Vector3>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_VECTOR3I: - return VariantTypeConstructor<Vector3i>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_TRANSFORM2D: - return VariantTypeConstructor<Transform2D>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_VECTOR4: - return VariantTypeConstructor<Vector4>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_VECTOR4I: - return VariantTypeConstructor<Vector4i>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_PLANE: - return VariantTypeConstructor<Plane>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_QUATERNION: - return VariantTypeConstructor<Quaternion>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_AABB: - return VariantTypeConstructor<AABB>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_BASIS: - return VariantTypeConstructor<Basis>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_TRANSFORM3D: - return VariantTypeConstructor<Transform3D>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_PROJECTION: - return VariantTypeConstructor<Projection>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_COLOR: - return VariantTypeConstructor<Color>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_STRING_NAME: - return VariantTypeConstructor<StringName>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_NODE_PATH: - return VariantTypeConstructor<NodePath>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_RID: - return VariantTypeConstructor<RID>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_OBJECT: - return VariantTypeConstructor<Object *>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_CALLABLE: - return VariantTypeConstructor<Callable>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_SIGNAL: - return VariantTypeConstructor<Signal>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_DICTIONARY: - return VariantTypeConstructor<Dictionary>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_ARRAY: - return VariantTypeConstructor<Array>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_PACKED_BYTE_ARRAY: - return VariantTypeConstructor<PackedByteArray>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_PACKED_INT32_ARRAY: - return VariantTypeConstructor<PackedInt32Array>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_PACKED_INT64_ARRAY: - return VariantTypeConstructor<PackedInt64Array>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_PACKED_FLOAT32_ARRAY: - return VariantTypeConstructor<PackedFloat32Array>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_PACKED_FLOAT64_ARRAY: - return VariantTypeConstructor<PackedFloat64Array>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_PACKED_STRING_ARRAY: - return VariantTypeConstructor<PackedStringArray>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_PACKED_VECTOR2_ARRAY: - return VariantTypeConstructor<PackedVector2Array>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_PACKED_VECTOR3_ARRAY: - return VariantTypeConstructor<PackedVector3Array>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_PACKED_COLOR_ARRAY: - return VariantTypeConstructor<PackedColorArray>::variant_from_type; - case GDNATIVE_VARIANT_TYPE_NIL: - case GDNATIVE_VARIANT_TYPE_VARIANT_MAX: - ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type"); - } - ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type"); -} - -static GDNativeTypeFromVariantConstructorFunc gdnative_get_type_from_variant_constructor(GDNativeVariantType p_type) { - switch (p_type) { - case GDNATIVE_VARIANT_TYPE_BOOL: - return VariantTypeConstructor<bool>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_INT: - return VariantTypeConstructor<int64_t>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_FLOAT: - return VariantTypeConstructor<double>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_STRING: - return VariantTypeConstructor<String>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_VECTOR2: - return VariantTypeConstructor<Vector2>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_VECTOR2I: - return VariantTypeConstructor<Vector2i>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_RECT2: - return VariantTypeConstructor<Rect2>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_RECT2I: - return VariantTypeConstructor<Rect2i>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_VECTOR3: - return VariantTypeConstructor<Vector3>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_VECTOR3I: - return VariantTypeConstructor<Vector3i>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_TRANSFORM2D: - return VariantTypeConstructor<Transform2D>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_VECTOR4: - return VariantTypeConstructor<Vector4>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_VECTOR4I: - return VariantTypeConstructor<Vector4i>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_PLANE: - return VariantTypeConstructor<Plane>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_QUATERNION: - return VariantTypeConstructor<Quaternion>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_AABB: - return VariantTypeConstructor<AABB>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_BASIS: - return VariantTypeConstructor<Basis>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_TRANSFORM3D: - return VariantTypeConstructor<Transform3D>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_PROJECTION: - return VariantTypeConstructor<Projection>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_COLOR: - return VariantTypeConstructor<Color>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_STRING_NAME: - return VariantTypeConstructor<StringName>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_NODE_PATH: - return VariantTypeConstructor<NodePath>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_RID: - return VariantTypeConstructor<RID>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_OBJECT: - return VariantTypeConstructor<Object *>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_CALLABLE: - return VariantTypeConstructor<Callable>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_SIGNAL: - return VariantTypeConstructor<Signal>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_DICTIONARY: - return VariantTypeConstructor<Dictionary>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_ARRAY: - return VariantTypeConstructor<Array>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_PACKED_BYTE_ARRAY: - return VariantTypeConstructor<PackedByteArray>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_PACKED_INT32_ARRAY: - return VariantTypeConstructor<PackedInt32Array>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_PACKED_INT64_ARRAY: - return VariantTypeConstructor<PackedInt64Array>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_PACKED_FLOAT32_ARRAY: - return VariantTypeConstructor<PackedFloat32Array>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_PACKED_FLOAT64_ARRAY: - return VariantTypeConstructor<PackedFloat64Array>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_PACKED_STRING_ARRAY: - return VariantTypeConstructor<PackedStringArray>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_PACKED_VECTOR2_ARRAY: - return VariantTypeConstructor<PackedVector2Array>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_PACKED_VECTOR3_ARRAY: - return VariantTypeConstructor<PackedVector3Array>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_PACKED_COLOR_ARRAY: - return VariantTypeConstructor<PackedColorArray>::type_from_variant; - case GDNATIVE_VARIANT_TYPE_NIL: - case GDNATIVE_VARIANT_TYPE_VARIANT_MAX: - ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type"); - } - ERR_FAIL_V_MSG(nullptr, "Getting Variant conversion function with invalid type"); -} - -// ptrcalls -static GDNativePtrOperatorEvaluator gdnative_variant_get_ptr_operator_evaluator(GDNativeVariantOperator p_operator, GDNativeVariantType p_type_a, GDNativeVariantType p_type_b) { - return (GDNativePtrOperatorEvaluator)Variant::get_ptr_operator_evaluator(Variant::Operator(p_operator), Variant::Type(p_type_a), Variant::Type(p_type_b)); -} -static GDNativePtrBuiltInMethod gdnative_variant_get_ptr_builtin_method(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_method, GDNativeInt p_hash) { - const StringName method = *reinterpret_cast<const StringName *>(p_method); - uint32_t hash = Variant::get_builtin_method_hash(Variant::Type(p_type), method); - if (hash != p_hash) { - ERR_PRINT_ONCE("Error getting method " + method + ", hash mismatch."); - return nullptr; - } - - return (GDNativePtrBuiltInMethod)Variant::get_ptr_builtin_method(Variant::Type(p_type), method); -} -static GDNativePtrConstructor gdnative_variant_get_ptr_constructor(GDNativeVariantType p_type, int32_t p_constructor) { - return (GDNativePtrConstructor)Variant::get_ptr_constructor(Variant::Type(p_type), p_constructor); -} -static GDNativePtrDestructor gdnative_variant_get_ptr_destructor(GDNativeVariantType p_type) { - return (GDNativePtrDestructor)Variant::get_ptr_destructor(Variant::Type(p_type)); -} -static void gdnative_variant_construct(GDNativeVariantType p_type, GDNativeVariantPtr p_base, GDNativeConstVariantPtr *p_args, int32_t p_argument_count, GDNativeCallError *r_error) { - memnew_placement(p_base, Variant); - - Callable::CallError error; - Variant::construct(Variant::Type(p_type), *(Variant *)p_base, (const Variant **)p_args, p_argument_count, error); - - if (r_error) { - r_error->error = (GDNativeCallErrorType)(error.error); - r_error->argument = error.argument; - r_error->expected = error.expected; - } -} -static GDNativePtrSetter gdnative_variant_get_ptr_setter(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member) { - const StringName member = *reinterpret_cast<const StringName *>(p_member); - return (GDNativePtrSetter)Variant::get_member_ptr_setter(Variant::Type(p_type), member); -} -static GDNativePtrGetter gdnative_variant_get_ptr_getter(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member) { - const StringName member = *reinterpret_cast<const StringName *>(p_member); - return (GDNativePtrGetter)Variant::get_member_ptr_getter(Variant::Type(p_type), member); -} -static GDNativePtrIndexedSetter gdnative_variant_get_ptr_indexed_setter(GDNativeVariantType p_type) { - return (GDNativePtrIndexedSetter)Variant::get_member_ptr_indexed_setter(Variant::Type(p_type)); -} -static GDNativePtrIndexedGetter gdnative_variant_get_ptr_indexed_getter(GDNativeVariantType p_type) { - return (GDNativePtrIndexedGetter)Variant::get_member_ptr_indexed_getter(Variant::Type(p_type)); -} -static GDNativePtrKeyedSetter gdnative_variant_get_ptr_keyed_setter(GDNativeVariantType p_type) { - return (GDNativePtrKeyedSetter)Variant::get_member_ptr_keyed_setter(Variant::Type(p_type)); -} -static GDNativePtrKeyedGetter gdnative_variant_get_ptr_keyed_getter(GDNativeVariantType p_type) { - return (GDNativePtrKeyedGetter)Variant::get_member_ptr_keyed_getter(Variant::Type(p_type)); -} -static GDNativePtrKeyedChecker gdnative_variant_get_ptr_keyed_checker(GDNativeVariantType p_type) { - return (GDNativePtrKeyedChecker)Variant::get_member_ptr_keyed_checker(Variant::Type(p_type)); -} -static void gdnative_variant_get_constant_value(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_constant, GDNativeVariantPtr r_ret) { - StringName constant = *reinterpret_cast<const StringName *>(p_constant); - memnew_placement(r_ret, Variant(Variant::get_constant_value(Variant::Type(p_type), constant))); -} -static GDNativePtrUtilityFunction gdnative_variant_get_ptr_utility_function(GDNativeConstStringNamePtr p_function, GDNativeInt p_hash) { - StringName function = *reinterpret_cast<const StringName *>(p_function); - uint32_t hash = Variant::get_utility_function_hash(function); - if (hash != p_hash) { - ERR_PRINT_ONCE("Error getting utility function " + function + ", hash mismatch."); - return nullptr; - } - return (GDNativePtrUtilityFunction)Variant::get_ptr_utility_function(function); -} - -//string helpers - -static void gdnative_string_new_with_latin1_chars(GDNativeStringPtr r_dest, const char *p_contents) { - String *dest = (String *)r_dest; - memnew_placement(dest, String); - *dest = String(p_contents); -} - -static void gdnative_string_new_with_utf8_chars(GDNativeStringPtr r_dest, const char *p_contents) { - String *dest = (String *)r_dest; - memnew_placement(dest, String); - dest->parse_utf8(p_contents); -} - -static void gdnative_string_new_with_utf16_chars(GDNativeStringPtr r_dest, const char16_t *p_contents) { - String *dest = (String *)r_dest; - memnew_placement(dest, String); - dest->parse_utf16(p_contents); -} - -static void gdnative_string_new_with_utf32_chars(GDNativeStringPtr r_dest, const char32_t *p_contents) { - String *dest = (String *)r_dest; - memnew_placement(dest, String); - *dest = String((const char32_t *)p_contents); -} - -static void gdnative_string_new_with_wide_chars(GDNativeStringPtr r_dest, const wchar_t *p_contents) { - String *dest = (String *)r_dest; - if constexpr (sizeof(wchar_t) == 2) { - // wchar_t is 16 bit, parse. - memnew_placement(dest, String); - dest->parse_utf16((const char16_t *)p_contents); - } else { - // wchar_t is 32 bit, copy. - memnew_placement(dest, String); - *dest = String((const char32_t *)p_contents); - } -} - -static void gdnative_string_new_with_latin1_chars_and_len(GDNativeStringPtr r_dest, const char *p_contents, GDNativeInt p_size) { - String *dest = (String *)r_dest; - memnew_placement(dest, String); - *dest = String(p_contents, p_size); -} - -static void gdnative_string_new_with_utf8_chars_and_len(GDNativeStringPtr r_dest, const char *p_contents, GDNativeInt p_size) { - String *dest = (String *)r_dest; - memnew_placement(dest, String); - dest->parse_utf8(p_contents, p_size); -} - -static void gdnative_string_new_with_utf16_chars_and_len(GDNativeStringPtr r_dest, const char16_t *p_contents, GDNativeInt p_size) { - String *dest = (String *)r_dest; - memnew_placement(dest, String); - dest->parse_utf16(p_contents, p_size); -} - -static void gdnative_string_new_with_utf32_chars_and_len(GDNativeStringPtr r_dest, const char32_t *p_contents, GDNativeInt p_size) { - String *dest = (String *)r_dest; - memnew_placement(dest, String); - *dest = String((const char32_t *)p_contents, p_size); -} - -static void gdnative_string_new_with_wide_chars_and_len(GDNativeStringPtr r_dest, const wchar_t *p_contents, GDNativeInt p_size) { - String *dest = (String *)r_dest; - if constexpr (sizeof(wchar_t) == 2) { - // wchar_t is 16 bit, parse. - memnew_placement(dest, String); - dest->parse_utf16((const char16_t *)p_contents, p_size); - } else { - // wchar_t is 32 bit, copy. - memnew_placement(dest, String); - *dest = String((const char32_t *)p_contents, p_size); - } -} - -static GDNativeInt gdnative_string_to_latin1_chars(GDNativeConstStringPtr p_self, char *r_text, GDNativeInt p_max_write_length) { - String *self = (String *)p_self; - CharString cs = self->ascii(true); - GDNativeInt len = cs.length(); - if (r_text) { - const char *s_text = cs.ptr(); - for (GDNativeInt i = 0; i < MIN(len, p_max_write_length); i++) { - r_text[i] = s_text[i]; - } - } - return len; -} -static GDNativeInt gdnative_string_to_utf8_chars(GDNativeConstStringPtr p_self, char *r_text, GDNativeInt p_max_write_length) { - String *self = (String *)p_self; - CharString cs = self->utf8(); - GDNativeInt len = cs.length(); - if (r_text) { - const char *s_text = cs.ptr(); - for (GDNativeInt i = 0; i < MIN(len, p_max_write_length); i++) { - r_text[i] = s_text[i]; - } - } - return len; -} -static GDNativeInt gdnative_string_to_utf16_chars(GDNativeConstStringPtr p_self, char16_t *r_text, GDNativeInt p_max_write_length) { - String *self = (String *)p_self; - Char16String cs = self->utf16(); - GDNativeInt len = cs.length(); - if (r_text) { - const char16_t *s_text = cs.ptr(); - for (GDNativeInt i = 0; i < MIN(len, p_max_write_length); i++) { - r_text[i] = s_text[i]; - } - } - return len; -} -static GDNativeInt gdnative_string_to_utf32_chars(GDNativeConstStringPtr p_self, char32_t *r_text, GDNativeInt p_max_write_length) { - String *self = (String *)p_self; - GDNativeInt len = self->length(); - if (r_text) { - const char32_t *s_text = self->ptr(); - for (GDNativeInt i = 0; i < MIN(len, p_max_write_length); i++) { - r_text[i] = s_text[i]; - } - } - return len; -} -static GDNativeInt gdnative_string_to_wide_chars(GDNativeConstStringPtr p_self, wchar_t *r_text, GDNativeInt p_max_write_length) { - if constexpr (sizeof(wchar_t) == 4) { - return gdnative_string_to_utf32_chars(p_self, (char32_t *)r_text, p_max_write_length); - } else { - return gdnative_string_to_utf16_chars(p_self, (char16_t *)r_text, p_max_write_length); - } -} - -static char32_t *gdnative_string_operator_index(GDNativeStringPtr p_self, GDNativeInt p_index) { - String *self = (String *)p_self; - ERR_FAIL_INDEX_V(p_index, self->length() + 1, nullptr); - return &self->ptrw()[p_index]; -} - -static const char32_t *gdnative_string_operator_index_const(GDNativeConstStringPtr p_self, GDNativeInt p_index) { - const String *self = (const String *)p_self; - ERR_FAIL_INDEX_V(p_index, self->length() + 1, nullptr); - return &self->ptr()[p_index]; -} - -/* Packed array functions */ - -static uint8_t *gdnative_packed_byte_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) { - PackedByteArray *self = (PackedByteArray *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return &self->ptrw()[p_index]; -} - -static const uint8_t *gdnative_packed_byte_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) { - const PackedByteArray *self = (const PackedByteArray *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return &self->ptr()[p_index]; -} - -static GDNativeTypePtr gdnative_packed_color_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) { - PackedColorArray *self = (PackedColorArray *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return (GDNativeTypePtr)&self->ptrw()[p_index]; -} - -static GDNativeTypePtr gdnative_packed_color_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) { - const PackedColorArray *self = (const PackedColorArray *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return (GDNativeTypePtr)&self->ptr()[p_index]; -} - -static float *gdnative_packed_float32_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) { - PackedFloat32Array *self = (PackedFloat32Array *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return &self->ptrw()[p_index]; -} - -static const float *gdnative_packed_float32_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) { - const PackedFloat32Array *self = (const PackedFloat32Array *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return &self->ptr()[p_index]; -} - -static double *gdnative_packed_float64_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) { - PackedFloat64Array *self = (PackedFloat64Array *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return &self->ptrw()[p_index]; -} - -static const double *gdnative_packed_float64_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) { - const PackedFloat64Array *self = (const PackedFloat64Array *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return &self->ptr()[p_index]; -} - -static int32_t *gdnative_packed_int32_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) { - PackedInt32Array *self = (PackedInt32Array *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return &self->ptrw()[p_index]; -} - -static const int32_t *gdnative_packed_int32_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) { - const PackedInt32Array *self = (const PackedInt32Array *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return &self->ptr()[p_index]; -} - -static int64_t *gdnative_packed_int64_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) { - PackedInt64Array *self = (PackedInt64Array *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return &self->ptrw()[p_index]; -} - -static const int64_t *gdnative_packed_int64_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) { - const PackedInt64Array *self = (const PackedInt64Array *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return &self->ptr()[p_index]; -} - -static GDNativeStringPtr gdnative_packed_string_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) { - PackedStringArray *self = (PackedStringArray *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return (GDNativeStringPtr)&self->ptrw()[p_index]; -} - -static GDNativeStringPtr gdnative_packed_string_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) { - const PackedStringArray *self = (const PackedStringArray *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return (GDNativeStringPtr)&self->ptr()[p_index]; -} - -static GDNativeTypePtr gdnative_packed_vector2_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) { - PackedVector2Array *self = (PackedVector2Array *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return (GDNativeTypePtr)&self->ptrw()[p_index]; -} - -static GDNativeTypePtr gdnative_packed_vector2_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) { - const PackedVector2Array *self = (const PackedVector2Array *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return (GDNativeTypePtr)&self->ptr()[p_index]; -} - -static GDNativeTypePtr gdnative_packed_vector3_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) { - PackedVector3Array *self = (PackedVector3Array *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return (GDNativeTypePtr)&self->ptrw()[p_index]; -} - -static GDNativeTypePtr gdnative_packed_vector3_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) { - const PackedVector3Array *self = (const PackedVector3Array *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return (GDNativeTypePtr)&self->ptr()[p_index]; -} - -static GDNativeVariantPtr gdnative_array_operator_index(GDNativeTypePtr p_self, GDNativeInt p_index) { - Array *self = (Array *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return (GDNativeVariantPtr)&self->operator[](p_index); -} - -static GDNativeVariantPtr gdnative_array_operator_index_const(GDNativeConstTypePtr p_self, GDNativeInt p_index) { - const Array *self = (const Array *)p_self; - ERR_FAIL_INDEX_V(p_index, self->size(), nullptr); - return (GDNativeVariantPtr)&self->operator[](p_index); -} - -/* Dictionary functions */ - -static GDNativeVariantPtr gdnative_dictionary_operator_index(GDNativeTypePtr p_self, GDNativeConstVariantPtr p_key) { - Dictionary *self = (Dictionary *)p_self; - return (GDNativeVariantPtr)&self->operator[](*(const Variant *)p_key); -} - -static GDNativeVariantPtr gdnative_dictionary_operator_index_const(GDNativeConstTypePtr p_self, GDNativeConstVariantPtr p_key) { - const Dictionary *self = (const Dictionary *)p_self; - return (GDNativeVariantPtr)&self->operator[](*(const Variant *)p_key); -} - -/* OBJECT API */ - -static void gdnative_object_method_bind_call(GDNativeMethodBindPtr p_method_bind, GDNativeObjectPtr p_instance, GDNativeConstVariantPtr *p_args, GDNativeInt p_arg_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error) { - const MethodBind *mb = reinterpret_cast<const MethodBind *>(p_method_bind); - Object *o = (Object *)p_instance; - const Variant **args = (const Variant **)p_args; - Callable::CallError error; - - Variant ret = mb->call(o, args, p_arg_count, error); - memnew_placement(r_return, Variant(ret)); - - if (r_error) { - r_error->error = (GDNativeCallErrorType)(error.error); - r_error->argument = error.argument; - r_error->expected = error.expected; - } -} - -static void gdnative_object_method_bind_ptrcall(GDNativeMethodBindPtr p_method_bind, GDNativeObjectPtr p_instance, GDNativeConstTypePtr *p_args, GDNativeTypePtr p_ret) { - const MethodBind *mb = reinterpret_cast<const MethodBind *>(p_method_bind); - Object *o = (Object *)p_instance; - mb->ptrcall(o, (const void **)p_args, p_ret); -} - -static void gdnative_object_destroy(GDNativeObjectPtr p_o) { - memdelete((Object *)p_o); -} - -static GDNativeObjectPtr gdnative_global_get_singleton(GDNativeConstStringNamePtr p_name) { - const StringName name = *reinterpret_cast<const StringName *>(p_name); - return (GDNativeObjectPtr)Engine::get_singleton()->get_singleton_object(name); -} - -static void *gdnative_object_get_instance_binding(GDNativeObjectPtr p_object, void *p_token, const GDNativeInstanceBindingCallbacks *p_callbacks) { - Object *o = (Object *)p_object; - return o->get_instance_binding(p_token, p_callbacks); -} - -static void gdnative_object_set_instance_binding(GDNativeObjectPtr p_object, void *p_token, void *p_binding, const GDNativeInstanceBindingCallbacks *p_callbacks) { - Object *o = (Object *)p_object; - o->set_instance_binding(p_token, p_binding, p_callbacks); -} - -static void gdnative_object_set_instance(GDNativeObjectPtr p_object, GDNativeConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance) { - const StringName classname = *reinterpret_cast<const StringName *>(p_classname); - Object *o = (Object *)p_object; - ClassDB::set_object_extension_instance(o, classname, p_instance); -} - -static GDNativeObjectPtr gdnative_object_get_instance_from_id(GDObjectInstanceID p_instance_id) { - return (GDNativeObjectPtr)ObjectDB::get_instance(ObjectID(p_instance_id)); -} - -static GDNativeObjectPtr gdnative_object_cast_to(GDNativeConstObjectPtr p_object, void *p_class_tag) { - if (!p_object) { - return nullptr; - } - Object *o = (Object *)p_object; - - return o->is_class_ptr(p_class_tag) ? (GDNativeObjectPtr)o : (GDNativeObjectPtr) nullptr; -} - -static GDObjectInstanceID gdnative_object_get_instance_id(GDNativeConstObjectPtr p_object) { - const Object *o = (const Object *)p_object; - return (GDObjectInstanceID)o->get_instance_id(); -} - -static GDNativeScriptInstancePtr gdnative_script_instance_create(const GDNativeExtensionScriptInstanceInfo *p_info, GDNativeExtensionScriptInstanceDataPtr p_instance_data) { - ScriptInstanceExtension *script_instance_extension = memnew(ScriptInstanceExtension); - script_instance_extension->instance = p_instance_data; - script_instance_extension->native_info = p_info; - return reinterpret_cast<GDNativeScriptInstancePtr>(script_instance_extension); -} - -static GDNativeMethodBindPtr gdnative_classdb_get_method_bind(GDNativeConstStringNamePtr p_classname, GDNativeConstStringNamePtr p_methodname, GDNativeInt p_hash) { - const StringName classname = *reinterpret_cast<const StringName *>(p_classname); - const StringName methodname = *reinterpret_cast<const StringName *>(p_methodname); - MethodBind *mb = ClassDB::get_method(classname, methodname); - ERR_FAIL_COND_V(!mb, nullptr); - if (mb->get_hash() != p_hash) { - ERR_PRINT("Hash mismatch for method '" + classname + "." + methodname + "'."); - return nullptr; - } - return (GDNativeMethodBindPtr)mb; -} - -static GDNativeObjectPtr gdnative_classdb_construct_object(GDNativeConstStringNamePtr p_classname) { - const StringName classname = *reinterpret_cast<const StringName *>(p_classname); - return (GDNativeObjectPtr)ClassDB::instantiate(classname); -} - -static void *gdnative_classdb_get_class_tag(GDNativeConstStringNamePtr p_classname) { - const StringName classname = *reinterpret_cast<const StringName *>(p_classname); - ClassDB::ClassInfo *class_info = ClassDB::classes.getptr(classname); - return class_info ? class_info->class_ptr : nullptr; -} - -void gdnative_setup_interface(GDNativeInterface *p_interface) { - GDNativeInterface &gdni = *p_interface; - - gdni.version_major = VERSION_MAJOR; - gdni.version_minor = VERSION_MINOR; -#if VERSION_PATCH - gdni.version_patch = VERSION_PATCH; -#else - gdni.version_patch = 0; -#endif - gdni.version_string = VERSION_FULL_NAME; - - /* GODOT CORE */ - - gdni.mem_alloc = gdnative_alloc; - gdni.mem_realloc = gdnative_realloc; - gdni.mem_free = gdnative_free; - - gdni.print_error = gdnative_print_error; - gdni.print_warning = gdnative_print_warning; - gdni.print_script_error = gdnative_print_script_error; - - gdni.get_native_struct_size = gdnative_get_native_struct_size; - - /* GODOT VARIANT */ - - // variant general - gdni.variant_new_copy = gdnative_variant_new_copy; - gdni.variant_new_nil = gdnative_variant_new_nil; - gdni.variant_destroy = gdnative_variant_destroy; - - gdni.variant_call = gdnative_variant_call; - gdni.variant_call_static = gdnative_variant_call_static; - gdni.variant_evaluate = gdnative_variant_evaluate; - gdni.variant_set = gdnative_variant_set; - gdni.variant_set_named = gdnative_variant_set_named; - gdni.variant_set_keyed = gdnative_variant_set_keyed; - gdni.variant_set_indexed = gdnative_variant_set_indexed; - gdni.variant_get = gdnative_variant_get; - gdni.variant_get_named = gdnative_variant_get_named; - gdni.variant_get_keyed = gdnative_variant_get_keyed; - gdni.variant_get_indexed = gdnative_variant_get_indexed; - gdni.variant_iter_init = gdnative_variant_iter_init; - gdni.variant_iter_next = gdnative_variant_iter_next; - gdni.variant_iter_get = gdnative_variant_iter_get; - gdni.variant_hash = gdnative_variant_hash; - gdni.variant_recursive_hash = gdnative_variant_recursive_hash; - gdni.variant_hash_compare = gdnative_variant_hash_compare; - gdni.variant_booleanize = gdnative_variant_booleanize; - gdni.variant_duplicate = gdnative_variant_duplicate; - gdni.variant_stringify = gdnative_variant_stringify; - - gdni.variant_get_type = gdnative_variant_get_type; - gdni.variant_has_method = gdnative_variant_has_method; - gdni.variant_has_member = gdnative_variant_has_member; - gdni.variant_has_key = gdnative_variant_has_key; - gdni.variant_get_type_name = gdnative_variant_get_type_name; - gdni.variant_can_convert = gdnative_variant_can_convert; - gdni.variant_can_convert_strict = gdnative_variant_can_convert_strict; - - gdni.get_variant_from_type_constructor = gdnative_get_variant_from_type_constructor; - gdni.get_variant_to_type_constructor = gdnative_get_type_from_variant_constructor; - - // ptrcalls. - - gdni.variant_get_ptr_operator_evaluator = gdnative_variant_get_ptr_operator_evaluator; - gdni.variant_get_ptr_builtin_method = gdnative_variant_get_ptr_builtin_method; - gdni.variant_get_ptr_constructor = gdnative_variant_get_ptr_constructor; - gdni.variant_get_ptr_destructor = gdnative_variant_get_ptr_destructor; - gdni.variant_construct = gdnative_variant_construct; - gdni.variant_get_ptr_setter = gdnative_variant_get_ptr_setter; - gdni.variant_get_ptr_getter = gdnative_variant_get_ptr_getter; - gdni.variant_get_ptr_indexed_setter = gdnative_variant_get_ptr_indexed_setter; - gdni.variant_get_ptr_indexed_getter = gdnative_variant_get_ptr_indexed_getter; - gdni.variant_get_ptr_keyed_setter = gdnative_variant_get_ptr_keyed_setter; - gdni.variant_get_ptr_keyed_getter = gdnative_variant_get_ptr_keyed_getter; - gdni.variant_get_ptr_keyed_checker = gdnative_variant_get_ptr_keyed_checker; - gdni.variant_get_constant_value = gdnative_variant_get_constant_value; - gdni.variant_get_ptr_utility_function = gdnative_variant_get_ptr_utility_function; - - // extra utilities - - gdni.string_new_with_latin1_chars = gdnative_string_new_with_latin1_chars; - gdni.string_new_with_utf8_chars = gdnative_string_new_with_utf8_chars; - gdni.string_new_with_utf16_chars = gdnative_string_new_with_utf16_chars; - gdni.string_new_with_utf32_chars = gdnative_string_new_with_utf32_chars; - gdni.string_new_with_wide_chars = gdnative_string_new_with_wide_chars; - gdni.string_new_with_latin1_chars_and_len = gdnative_string_new_with_latin1_chars_and_len; - gdni.string_new_with_utf8_chars_and_len = gdnative_string_new_with_utf8_chars_and_len; - gdni.string_new_with_utf16_chars_and_len = gdnative_string_new_with_utf16_chars_and_len; - gdni.string_new_with_utf32_chars_and_len = gdnative_string_new_with_utf32_chars_and_len; - gdni.string_new_with_wide_chars_and_len = gdnative_string_new_with_wide_chars_and_len; - gdni.string_to_latin1_chars = gdnative_string_to_latin1_chars; - gdni.string_to_utf8_chars = gdnative_string_to_utf8_chars; - gdni.string_to_utf16_chars = gdnative_string_to_utf16_chars; - gdni.string_to_utf32_chars = gdnative_string_to_utf32_chars; - gdni.string_to_wide_chars = gdnative_string_to_wide_chars; - gdni.string_operator_index = gdnative_string_operator_index; - gdni.string_operator_index_const = gdnative_string_operator_index_const; - - /* Packed array functions */ - - gdni.packed_byte_array_operator_index = gdnative_packed_byte_array_operator_index; - gdni.packed_byte_array_operator_index_const = gdnative_packed_byte_array_operator_index_const; - - gdni.packed_color_array_operator_index = gdnative_packed_color_array_operator_index; - gdni.packed_color_array_operator_index_const = gdnative_packed_color_array_operator_index_const; - - gdni.packed_float32_array_operator_index = gdnative_packed_float32_array_operator_index; - gdni.packed_float32_array_operator_index_const = gdnative_packed_float32_array_operator_index_const; - gdni.packed_float64_array_operator_index = gdnative_packed_float64_array_operator_index; - gdni.packed_float64_array_operator_index_const = gdnative_packed_float64_array_operator_index_const; - - gdni.packed_int32_array_operator_index = gdnative_packed_int32_array_operator_index; - gdni.packed_int32_array_operator_index_const = gdnative_packed_int32_array_operator_index_const; - gdni.packed_int64_array_operator_index = gdnative_packed_int64_array_operator_index; - gdni.packed_int64_array_operator_index_const = gdnative_packed_int64_array_operator_index_const; - - gdni.packed_string_array_operator_index = gdnative_packed_string_array_operator_index; - gdni.packed_string_array_operator_index_const = gdnative_packed_string_array_operator_index_const; - - gdni.packed_vector2_array_operator_index = gdnative_packed_vector2_array_operator_index; - gdni.packed_vector2_array_operator_index_const = gdnative_packed_vector2_array_operator_index_const; - gdni.packed_vector3_array_operator_index = gdnative_packed_vector3_array_operator_index; - gdni.packed_vector3_array_operator_index_const = gdnative_packed_vector3_array_operator_index_const; - - gdni.array_operator_index = gdnative_array_operator_index; - gdni.array_operator_index_const = gdnative_array_operator_index_const; - - /* Dictionary functions */ - - gdni.dictionary_operator_index = gdnative_dictionary_operator_index; - gdni.dictionary_operator_index_const = gdnative_dictionary_operator_index_const; - - /* OBJECT */ - - gdni.object_method_bind_call = gdnative_object_method_bind_call; - gdni.object_method_bind_ptrcall = gdnative_object_method_bind_ptrcall; - gdni.object_destroy = gdnative_object_destroy; - gdni.global_get_singleton = gdnative_global_get_singleton; - gdni.object_get_instance_binding = gdnative_object_get_instance_binding; - gdni.object_set_instance_binding = gdnative_object_set_instance_binding; - gdni.object_set_instance = gdnative_object_set_instance; - - gdni.object_cast_to = gdnative_object_cast_to; - gdni.object_get_instance_from_id = gdnative_object_get_instance_from_id; - gdni.object_get_instance_id = gdnative_object_get_instance_id; - - /* SCRIPT INSTANCE */ - - gdni.script_instance_create = gdnative_script_instance_create; - - /* CLASSDB */ - - gdni.classdb_construct_object = gdnative_classdb_construct_object; - gdni.classdb_get_method_bind = gdnative_classdb_get_method_bind; - gdni.classdb_get_class_tag = gdnative_classdb_get_class_tag; - - /* CLASSDB EXTENSION */ - - //these are filled by implementation, since it will want to keep track of registered classes - gdni.classdb_register_extension_class = nullptr; - gdni.classdb_register_extension_class_method = nullptr; - gdni.classdb_register_extension_class_integer_constant = nullptr; - gdni.classdb_register_extension_class_property = nullptr; - gdni.classdb_register_extension_class_property_group = nullptr; - gdni.classdb_register_extension_class_property_subgroup = nullptr; - gdni.classdb_register_extension_class_signal = nullptr; - gdni.classdb_unregister_extension_class = nullptr; - - gdni.get_library_path = nullptr; -} diff --git a/core/extension/gdnative_interface.h b/core/extension/gdnative_interface.h deleted file mode 100644 index 486f5be344..0000000000 --- a/core/extension/gdnative_interface.h +++ /dev/null @@ -1,612 +0,0 @@ -/*************************************************************************/ -/* gdnative_interface.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#ifndef GDNATIVE_INTERFACE_H -#define GDNATIVE_INTERFACE_H - -/* This is a C class header, you can copy it and use it directly in your own binders. - * Together with the JSON file, you should be able to generate any binder. - */ - -#include <stddef.h> -#include <stdint.h> -#include <stdio.h> - -#ifndef __cplusplus -typedef uint32_t char32_t; -typedef uint16_t char16_t; -#endif - -#ifdef __cplusplus -extern "C" { -#endif - -/* VARIANT TYPES */ - -typedef enum { - GDNATIVE_VARIANT_TYPE_NIL, - - /* atomic types */ - GDNATIVE_VARIANT_TYPE_BOOL, - GDNATIVE_VARIANT_TYPE_INT, - GDNATIVE_VARIANT_TYPE_FLOAT, - GDNATIVE_VARIANT_TYPE_STRING, - - /* math types */ - GDNATIVE_VARIANT_TYPE_VECTOR2, - GDNATIVE_VARIANT_TYPE_VECTOR2I, - GDNATIVE_VARIANT_TYPE_RECT2, - GDNATIVE_VARIANT_TYPE_RECT2I, - GDNATIVE_VARIANT_TYPE_VECTOR3, - GDNATIVE_VARIANT_TYPE_VECTOR3I, - GDNATIVE_VARIANT_TYPE_TRANSFORM2D, - GDNATIVE_VARIANT_TYPE_VECTOR4, - GDNATIVE_VARIANT_TYPE_VECTOR4I, - GDNATIVE_VARIANT_TYPE_PLANE, - GDNATIVE_VARIANT_TYPE_QUATERNION, - GDNATIVE_VARIANT_TYPE_AABB, - GDNATIVE_VARIANT_TYPE_BASIS, - GDNATIVE_VARIANT_TYPE_TRANSFORM3D, - GDNATIVE_VARIANT_TYPE_PROJECTION, - - /* misc types */ - GDNATIVE_VARIANT_TYPE_COLOR, - GDNATIVE_VARIANT_TYPE_STRING_NAME, - GDNATIVE_VARIANT_TYPE_NODE_PATH, - GDNATIVE_VARIANT_TYPE_RID, - GDNATIVE_VARIANT_TYPE_OBJECT, - GDNATIVE_VARIANT_TYPE_CALLABLE, - GDNATIVE_VARIANT_TYPE_SIGNAL, - GDNATIVE_VARIANT_TYPE_DICTIONARY, - GDNATIVE_VARIANT_TYPE_ARRAY, - - /* typed arrays */ - GDNATIVE_VARIANT_TYPE_PACKED_BYTE_ARRAY, - GDNATIVE_VARIANT_TYPE_PACKED_INT32_ARRAY, - GDNATIVE_VARIANT_TYPE_PACKED_INT64_ARRAY, - GDNATIVE_VARIANT_TYPE_PACKED_FLOAT32_ARRAY, - GDNATIVE_VARIANT_TYPE_PACKED_FLOAT64_ARRAY, - GDNATIVE_VARIANT_TYPE_PACKED_STRING_ARRAY, - GDNATIVE_VARIANT_TYPE_PACKED_VECTOR2_ARRAY, - GDNATIVE_VARIANT_TYPE_PACKED_VECTOR3_ARRAY, - GDNATIVE_VARIANT_TYPE_PACKED_COLOR_ARRAY, - - GDNATIVE_VARIANT_TYPE_VARIANT_MAX -} GDNativeVariantType; - -typedef enum { - /* comparison */ - GDNATIVE_VARIANT_OP_EQUAL, - GDNATIVE_VARIANT_OP_NOT_EQUAL, - GDNATIVE_VARIANT_OP_LESS, - GDNATIVE_VARIANT_OP_LESS_EQUAL, - GDNATIVE_VARIANT_OP_GREATER, - GDNATIVE_VARIANT_OP_GREATER_EQUAL, - - /* mathematic */ - GDNATIVE_VARIANT_OP_ADD, - GDNATIVE_VARIANT_OP_SUBTRACT, - GDNATIVE_VARIANT_OP_MULTIPLY, - GDNATIVE_VARIANT_OP_DIVIDE, - GDNATIVE_VARIANT_OP_NEGATE, - GDNATIVE_VARIANT_OP_POSITIVE, - GDNATIVE_VARIANT_OP_MODULE, - GDNATIVE_VARIANT_OP_POWER, - - /* bitwise */ - GDNATIVE_VARIANT_OP_SHIFT_LEFT, - GDNATIVE_VARIANT_OP_SHIFT_RIGHT, - GDNATIVE_VARIANT_OP_BIT_AND, - GDNATIVE_VARIANT_OP_BIT_OR, - GDNATIVE_VARIANT_OP_BIT_XOR, - GDNATIVE_VARIANT_OP_BIT_NEGATE, - - /* logic */ - GDNATIVE_VARIANT_OP_AND, - GDNATIVE_VARIANT_OP_OR, - GDNATIVE_VARIANT_OP_XOR, - GDNATIVE_VARIANT_OP_NOT, - - /* containment */ - GDNATIVE_VARIANT_OP_IN, - GDNATIVE_VARIANT_OP_MAX - -} GDNativeVariantOperator; - -typedef void *GDNativeVariantPtr; -typedef const void *GDNativeConstVariantPtr; -typedef void *GDNativeStringNamePtr; -typedef const void *GDNativeConstStringNamePtr; -typedef void *GDNativeStringPtr; -typedef const void *GDNativeConstStringPtr; -typedef void *GDNativeObjectPtr; -typedef const void *GDNativeConstObjectPtr; -typedef void *GDNativeTypePtr; -typedef const void *GDNativeConstTypePtr; -typedef const void *GDNativeMethodBindPtr; -typedef int64_t GDNativeInt; -typedef uint8_t GDNativeBool; -typedef uint64_t GDObjectInstanceID; - -/* VARIANT DATA I/O */ - -typedef enum { - GDNATIVE_CALL_OK, - GDNATIVE_CALL_ERROR_INVALID_METHOD, - GDNATIVE_CALL_ERROR_INVALID_ARGUMENT, // Expected a different variant type. - GDNATIVE_CALL_ERROR_TOO_MANY_ARGUMENTS, // Expected lower number of arguments. - GDNATIVE_CALL_ERROR_TOO_FEW_ARGUMENTS, // Expected higher number of arguments. - GDNATIVE_CALL_ERROR_INSTANCE_IS_NULL, - GDNATIVE_CALL_ERROR_METHOD_NOT_CONST, // Used for const call. -} GDNativeCallErrorType; - -typedef struct { - GDNativeCallErrorType error; - int32_t argument; - int32_t expected; -} GDNativeCallError; - -typedef void (*GDNativeVariantFromTypeConstructorFunc)(GDNativeVariantPtr, GDNativeTypePtr); -typedef void (*GDNativeTypeFromVariantConstructorFunc)(GDNativeTypePtr, GDNativeVariantPtr); -typedef void (*GDNativePtrOperatorEvaluator)(GDNativeConstTypePtr p_left, GDNativeConstTypePtr p_right, GDNativeTypePtr r_result); -typedef void (*GDNativePtrBuiltInMethod)(GDNativeTypePtr p_base, GDNativeConstTypePtr *p_args, GDNativeTypePtr r_return, int p_argument_count); -typedef void (*GDNativePtrConstructor)(GDNativeTypePtr p_base, GDNativeConstTypePtr *p_args); -typedef void (*GDNativePtrDestructor)(GDNativeTypePtr p_base); -typedef void (*GDNativePtrSetter)(GDNativeTypePtr p_base, GDNativeConstTypePtr p_value); -typedef void (*GDNativePtrGetter)(GDNativeConstTypePtr p_base, GDNativeTypePtr r_value); -typedef void (*GDNativePtrIndexedSetter)(GDNativeTypePtr p_base, GDNativeInt p_index, GDNativeConstTypePtr p_value); -typedef void (*GDNativePtrIndexedGetter)(GDNativeConstTypePtr p_base, GDNativeInt p_index, GDNativeTypePtr r_value); -typedef void (*GDNativePtrKeyedSetter)(GDNativeTypePtr p_base, GDNativeConstTypePtr p_key, GDNativeConstTypePtr p_value); -typedef void (*GDNativePtrKeyedGetter)(GDNativeConstTypePtr p_base, GDNativeConstTypePtr p_key, GDNativeTypePtr r_value); -typedef uint32_t (*GDNativePtrKeyedChecker)(GDNativeConstVariantPtr p_base, GDNativeConstVariantPtr p_key); -typedef void (*GDNativePtrUtilityFunction)(GDNativeTypePtr r_return, GDNativeConstTypePtr *p_arguments, int p_argument_count); - -typedef GDNativeObjectPtr (*GDNativeClassConstructor)(); - -typedef void *(*GDNativeInstanceBindingCreateCallback)(void *p_token, void *p_instance); -typedef void (*GDNativeInstanceBindingFreeCallback)(void *p_token, void *p_instance, void *p_binding); -typedef GDNativeBool (*GDNativeInstanceBindingReferenceCallback)(void *p_token, void *p_binding, GDNativeBool p_reference); - -typedef struct { - GDNativeInstanceBindingCreateCallback create_callback; - GDNativeInstanceBindingFreeCallback free_callback; - GDNativeInstanceBindingReferenceCallback reference_callback; -} GDNativeInstanceBindingCallbacks; - -/* EXTENSION CLASSES */ - -typedef void *GDExtensionClassInstancePtr; - -typedef GDNativeBool (*GDNativeExtensionClassSet)(GDExtensionClassInstancePtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeConstVariantPtr p_value); -typedef GDNativeBool (*GDNativeExtensionClassGet)(GDExtensionClassInstancePtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeVariantPtr r_ret); -typedef uint64_t (*GDNativeExtensionClassGetRID)(GDExtensionClassInstancePtr p_instance); - -typedef struct { - GDNativeVariantType type; - GDNativeStringNamePtr name; - GDNativeStringNamePtr class_name; - uint32_t hint; // Bitfield of `PropertyHint` (defined in `extension_api.json`). - GDNativeStringPtr hint_string; - uint32_t usage; // Bitfield of `PropertyUsageFlags` (defined in `extension_api.json`). -} GDNativePropertyInfo; - -typedef struct { - GDNativeStringNamePtr name; - GDNativePropertyInfo return_value; - uint32_t flags; // Bitfield of `GDNativeExtensionClassMethodFlags`. - int32_t id; - - /* Arguments: `default_arguments` is an array of size `argument_count`. */ - uint32_t argument_count; - GDNativePropertyInfo *arguments; - - /* Default arguments: `default_arguments` is an array of size `default_argument_count`. */ - uint32_t default_argument_count; - GDNativeVariantPtr *default_arguments; -} GDNativeMethodInfo; - -typedef const GDNativePropertyInfo *(*GDNativeExtensionClassGetPropertyList)(GDExtensionClassInstancePtr p_instance, uint32_t *r_count); -typedef void (*GDNativeExtensionClassFreePropertyList)(GDExtensionClassInstancePtr p_instance, const GDNativePropertyInfo *p_list); -typedef GDNativeBool (*GDNativeExtensionClassPropertyCanRevert)(GDExtensionClassInstancePtr p_instance, GDNativeConstStringNamePtr p_name); -typedef GDNativeBool (*GDNativeExtensionClassPropertyGetRevert)(GDExtensionClassInstancePtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeVariantPtr r_ret); -typedef void (*GDNativeExtensionClassNotification)(GDExtensionClassInstancePtr p_instance, int32_t p_what); -typedef void (*GDNativeExtensionClassToString)(GDExtensionClassInstancePtr p_instance, GDNativeBool *r_is_valid, GDNativeStringPtr p_out); -typedef void (*GDNativeExtensionClassReference)(GDExtensionClassInstancePtr p_instance); -typedef void (*GDNativeExtensionClassUnreference)(GDExtensionClassInstancePtr p_instance); -typedef void (*GDNativeExtensionClassCallVirtual)(GDExtensionClassInstancePtr p_instance, GDNativeConstTypePtr *p_args, GDNativeTypePtr r_ret); -typedef GDNativeObjectPtr (*GDNativeExtensionClassCreateInstance)(void *p_userdata); -typedef void (*GDNativeExtensionClassFreeInstance)(void *p_userdata, GDExtensionClassInstancePtr p_instance); -typedef GDNativeExtensionClassCallVirtual (*GDNativeExtensionClassGetVirtual)(void *p_userdata, GDNativeConstStringNamePtr p_name); - -typedef struct { - GDNativeBool is_virtual; - GDNativeBool is_abstract; - GDNativeExtensionClassSet set_func; - GDNativeExtensionClassGet get_func; - GDNativeExtensionClassGetPropertyList get_property_list_func; - GDNativeExtensionClassFreePropertyList free_property_list_func; - GDNativeExtensionClassPropertyCanRevert property_can_revert_func; - GDNativeExtensionClassPropertyGetRevert property_get_revert_func; - GDNativeExtensionClassNotification notification_func; - GDNativeExtensionClassToString to_string_func; - GDNativeExtensionClassReference reference_func; - GDNativeExtensionClassUnreference unreference_func; - GDNativeExtensionClassCreateInstance create_instance_func; // (Default) constructor; mandatory. If the class is not instantiable, consider making it virtual or abstract. - GDNativeExtensionClassFreeInstance free_instance_func; // Destructor; mandatory. - GDNativeExtensionClassGetVirtual get_virtual_func; // Queries a virtual function by name and returns a callback to invoke the requested virtual function. - GDNativeExtensionClassGetRID get_rid_func; - void *class_userdata; // Per-class user data, later accessible in instance bindings. -} GDNativeExtensionClassCreationInfo; - -typedef void *GDNativeExtensionClassLibraryPtr; - -/* Method */ - -typedef enum { - GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL = 1, - GDNATIVE_EXTENSION_METHOD_FLAG_EDITOR = 2, - GDNATIVE_EXTENSION_METHOD_FLAG_CONST = 4, - GDNATIVE_EXTENSION_METHOD_FLAG_VIRTUAL = 8, - GDNATIVE_EXTENSION_METHOD_FLAG_VARARG = 16, - GDNATIVE_EXTENSION_METHOD_FLAG_STATIC = 32, - GDNATIVE_EXTENSION_METHOD_FLAGS_DEFAULT = GDNATIVE_EXTENSION_METHOD_FLAG_NORMAL, -} GDNativeExtensionClassMethodFlags; - -typedef enum { - GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_NONE, - GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT8, - GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT16, - GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT32, - GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_INT64, - GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT8, - GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT16, - GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT32, - GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_INT_IS_UINT64, - GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_FLOAT, - GDNATIVE_EXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE -} GDNativeExtensionClassMethodArgumentMetadata; - -typedef void (*GDNativeExtensionClassMethodCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, GDNativeConstVariantPtr *p_args, GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error); -typedef void (*GDNativeExtensionClassMethodPtrCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, GDNativeConstTypePtr *p_args, GDNativeTypePtr r_ret); - -typedef struct { - GDNativeStringNamePtr name; - void *method_userdata; - GDNativeExtensionClassMethodCall call_func; - GDNativeExtensionClassMethodPtrCall ptrcall_func; - uint32_t method_flags; // Bitfield of `GDNativeExtensionClassMethodFlags`. - - /* If `has_return_value` is false, `return_value_info` and `return_value_metadata` are ignored. */ - GDNativeBool has_return_value; - GDNativePropertyInfo *return_value_info; - GDNativeExtensionClassMethodArgumentMetadata return_value_metadata; - - /* Arguments: `arguments_info` and `arguments_metadata` are array of size `argument_count`. - * Name and hint information for the argument can be omitted in release builds. Class name should always be present if it applies. - */ - uint32_t argument_count; - GDNativePropertyInfo *arguments_info; - GDNativeExtensionClassMethodArgumentMetadata *arguments_metadata; - - /* Default arguments: `default_arguments` is an array of size `default_argument_count`. */ - uint32_t default_argument_count; - GDNativeVariantPtr *default_arguments; -} GDNativeExtensionClassMethodInfo; - -/* SCRIPT INSTANCE EXTENSION */ - -typedef void *GDNativeExtensionScriptInstanceDataPtr; // Pointer to custom ScriptInstance native implementation. - -typedef GDNativeBool (*GDNativeExtensionScriptInstanceSet)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeConstVariantPtr p_value); -typedef GDNativeBool (*GDNativeExtensionScriptInstanceGet)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeVariantPtr r_ret); -typedef const GDNativePropertyInfo *(*GDNativeExtensionScriptInstanceGetPropertyList)(GDNativeExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count); -typedef void (*GDNativeExtensionScriptInstanceFreePropertyList)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativePropertyInfo *p_list); -typedef GDNativeVariantType (*GDNativeExtensionScriptInstanceGetPropertyType)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeBool *r_is_valid); - -typedef GDNativeBool (*GDNativeExtensionScriptInstancePropertyCanRevert)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name); -typedef GDNativeBool (*GDNativeExtensionScriptInstancePropertyGetRevert)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name, GDNativeVariantPtr r_ret); - -typedef GDNativeObjectPtr (*GDNativeExtensionScriptInstanceGetOwner)(GDNativeExtensionScriptInstanceDataPtr p_instance); -typedef void (*GDNativeExtensionScriptInstancePropertyStateAdd)(GDNativeConstStringNamePtr p_name, GDNativeConstVariantPtr p_value, void *p_userdata); -typedef void (*GDNativeExtensionScriptInstanceGetPropertyState)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeExtensionScriptInstancePropertyStateAdd p_add_func, void *p_userdata); - -typedef const GDNativeMethodInfo *(*GDNativeExtensionScriptInstanceGetMethodList)(GDNativeExtensionScriptInstanceDataPtr p_instance, uint32_t *r_count); -typedef void (*GDNativeExtensionScriptInstanceFreeMethodList)(GDNativeExtensionScriptInstanceDataPtr p_instance, const GDNativeMethodInfo *p_list); - -typedef GDNativeBool (*GDNativeExtensionScriptInstanceHasMethod)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeConstStringNamePtr p_name); - -typedef void (*GDNativeExtensionScriptInstanceCall)(GDNativeExtensionScriptInstanceDataPtr p_self, GDNativeConstStringNamePtr p_method, GDNativeConstVariantPtr *p_args, GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error); -typedef void (*GDNativeExtensionScriptInstanceNotification)(GDNativeExtensionScriptInstanceDataPtr p_instance, int32_t p_what); -typedef void (*GDNativeExtensionScriptInstanceToString)(GDNativeExtensionScriptInstanceDataPtr p_instance, GDNativeBool *r_is_valid, GDNativeStringPtr r_out); - -typedef void (*GDNativeExtensionScriptInstanceRefCountIncremented)(GDNativeExtensionScriptInstanceDataPtr p_instance); -typedef GDNativeBool (*GDNativeExtensionScriptInstanceRefCountDecremented)(GDNativeExtensionScriptInstanceDataPtr p_instance); - -typedef GDNativeObjectPtr (*GDNativeExtensionScriptInstanceGetScript)(GDNativeExtensionScriptInstanceDataPtr p_instance); -typedef GDNativeBool (*GDNativeExtensionScriptInstanceIsPlaceholder)(GDNativeExtensionScriptInstanceDataPtr p_instance); - -typedef void *GDNativeExtensionScriptLanguagePtr; - -typedef GDNativeExtensionScriptLanguagePtr (*GDNativeExtensionScriptInstanceGetLanguage)(GDNativeExtensionScriptInstanceDataPtr p_instance); - -typedef void (*GDNativeExtensionScriptInstanceFree)(GDNativeExtensionScriptInstanceDataPtr p_instance); - -typedef void *GDNativeScriptInstancePtr; // Pointer to ScriptInstance. - -typedef struct { - GDNativeExtensionScriptInstanceSet set_func; - GDNativeExtensionScriptInstanceGet get_func; - GDNativeExtensionScriptInstanceGetPropertyList get_property_list_func; - GDNativeExtensionScriptInstanceFreePropertyList free_property_list_func; - - GDNativeExtensionScriptInstancePropertyCanRevert property_can_revert_func; - GDNativeExtensionScriptInstancePropertyGetRevert property_get_revert_func; - - GDNativeExtensionScriptInstanceGetOwner get_owner_func; - GDNativeExtensionScriptInstanceGetPropertyState get_property_state_func; - - GDNativeExtensionScriptInstanceGetMethodList get_method_list_func; - GDNativeExtensionScriptInstanceFreeMethodList free_method_list_func; - GDNativeExtensionScriptInstanceGetPropertyType get_property_type_func; - - GDNativeExtensionScriptInstanceHasMethod has_method_func; - - GDNativeExtensionScriptInstanceCall call_func; - GDNativeExtensionScriptInstanceNotification notification_func; - - GDNativeExtensionScriptInstanceToString to_string_func; - - GDNativeExtensionScriptInstanceRefCountIncremented refcount_incremented_func; - GDNativeExtensionScriptInstanceRefCountDecremented refcount_decremented_func; - - GDNativeExtensionScriptInstanceGetScript get_script_func; - - GDNativeExtensionScriptInstanceIsPlaceholder is_placeholder_func; - - GDNativeExtensionScriptInstanceSet set_fallback_func; - GDNativeExtensionScriptInstanceGet get_fallback_func; - - GDNativeExtensionScriptInstanceGetLanguage get_language_func; - - GDNativeExtensionScriptInstanceFree free_func; - -} GDNativeExtensionScriptInstanceInfo; - -/* INTERFACE */ - -typedef struct { - uint32_t version_major; - uint32_t version_minor; - uint32_t version_patch; - const char *version_string; - - /* GODOT CORE */ - - void *(*mem_alloc)(size_t p_bytes); - void *(*mem_realloc)(void *p_ptr, size_t p_bytes); - void (*mem_free)(void *p_ptr); - - void (*print_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line); - void (*print_warning)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line); - void (*print_script_error)(const char *p_description, const char *p_function, const char *p_file, int32_t p_line); - - uint64_t (*get_native_struct_size)(GDNativeConstStringNamePtr p_name); - - /* GODOT VARIANT */ - - /* variant general */ - void (*variant_new_copy)(GDNativeVariantPtr r_dest, GDNativeConstVariantPtr p_src); - void (*variant_new_nil)(GDNativeVariantPtr r_dest); - void (*variant_destroy)(GDNativeVariantPtr p_self); - - /* variant type */ - void (*variant_call)(GDNativeVariantPtr p_self, GDNativeConstStringNamePtr p_method, GDNativeConstVariantPtr *p_args, GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error); - void (*variant_call_static)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_method, GDNativeConstVariantPtr *p_args, GDNativeInt p_argument_count, GDNativeVariantPtr r_return, GDNativeCallError *r_error); - void (*variant_evaluate)(GDNativeVariantOperator p_op, GDNativeConstVariantPtr p_a, GDNativeConstVariantPtr p_b, GDNativeVariantPtr r_return, GDNativeBool *r_valid); - void (*variant_set)(GDNativeVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid); - void (*variant_set_named)(GDNativeVariantPtr p_self, GDNativeConstStringNamePtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid); - void (*variant_set_keyed)(GDNativeVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid); - void (*variant_set_indexed)(GDNativeVariantPtr p_self, GDNativeInt p_index, GDNativeConstVariantPtr p_value, GDNativeBool *r_valid, GDNativeBool *r_oob); - void (*variant_get)(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid); - void (*variant_get_named)(GDNativeConstVariantPtr p_self, GDNativeConstStringNamePtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid); - void (*variant_get_keyed)(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeVariantPtr r_ret, GDNativeBool *r_valid); - void (*variant_get_indexed)(GDNativeConstVariantPtr p_self, GDNativeInt p_index, GDNativeVariantPtr r_ret, GDNativeBool *r_valid, GDNativeBool *r_oob); - GDNativeBool (*variant_iter_init)(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid); - GDNativeBool (*variant_iter_next)(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeBool *r_valid); - void (*variant_iter_get)(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_iter, GDNativeVariantPtr r_ret, GDNativeBool *r_valid); - GDNativeInt (*variant_hash)(GDNativeConstVariantPtr p_self); - GDNativeInt (*variant_recursive_hash)(GDNativeConstVariantPtr p_self, GDNativeInt p_recursion_count); - GDNativeBool (*variant_hash_compare)(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_other); - GDNativeBool (*variant_booleanize)(GDNativeConstVariantPtr p_self); - void (*variant_duplicate)(GDNativeConstVariantPtr p_self, GDNativeVariantPtr r_ret, GDNativeBool p_deep); - void (*variant_stringify)(GDNativeConstVariantPtr p_self, GDNativeStringPtr r_ret); - - GDNativeVariantType (*variant_get_type)(GDNativeConstVariantPtr p_self); - GDNativeBool (*variant_has_method)(GDNativeConstVariantPtr p_self, GDNativeConstStringNamePtr p_method); - GDNativeBool (*variant_has_member)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member); - GDNativeBool (*variant_has_key)(GDNativeConstVariantPtr p_self, GDNativeConstVariantPtr p_key, GDNativeBool *r_valid); - void (*variant_get_type_name)(GDNativeVariantType p_type, GDNativeStringPtr r_name); - GDNativeBool (*variant_can_convert)(GDNativeVariantType p_from, GDNativeVariantType p_to); - GDNativeBool (*variant_can_convert_strict)(GDNativeVariantType p_from, GDNativeVariantType p_to); - - /* ptrcalls */ - GDNativeVariantFromTypeConstructorFunc (*get_variant_from_type_constructor)(GDNativeVariantType p_type); - GDNativeTypeFromVariantConstructorFunc (*get_variant_to_type_constructor)(GDNativeVariantType p_type); - GDNativePtrOperatorEvaluator (*variant_get_ptr_operator_evaluator)(GDNativeVariantOperator p_operator, GDNativeVariantType p_type_a, GDNativeVariantType p_type_b); - GDNativePtrBuiltInMethod (*variant_get_ptr_builtin_method)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_method, GDNativeInt p_hash); - GDNativePtrConstructor (*variant_get_ptr_constructor)(GDNativeVariantType p_type, int32_t p_constructor); - GDNativePtrDestructor (*variant_get_ptr_destructor)(GDNativeVariantType p_type); - void (*variant_construct)(GDNativeVariantType p_type, GDNativeVariantPtr p_base, GDNativeConstVariantPtr *p_args, int32_t p_argument_count, GDNativeCallError *r_error); - GDNativePtrSetter (*variant_get_ptr_setter)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member); - GDNativePtrGetter (*variant_get_ptr_getter)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_member); - GDNativePtrIndexedSetter (*variant_get_ptr_indexed_setter)(GDNativeVariantType p_type); - GDNativePtrIndexedGetter (*variant_get_ptr_indexed_getter)(GDNativeVariantType p_type); - GDNativePtrKeyedSetter (*variant_get_ptr_keyed_setter)(GDNativeVariantType p_type); - GDNativePtrKeyedGetter (*variant_get_ptr_keyed_getter)(GDNativeVariantType p_type); - GDNativePtrKeyedChecker (*variant_get_ptr_keyed_checker)(GDNativeVariantType p_type); - void (*variant_get_constant_value)(GDNativeVariantType p_type, GDNativeConstStringNamePtr p_constant, GDNativeVariantPtr r_ret); - GDNativePtrUtilityFunction (*variant_get_ptr_utility_function)(GDNativeConstStringNamePtr p_function, GDNativeInt p_hash); - - /* extra utilities */ - void (*string_new_with_latin1_chars)(GDNativeStringPtr r_dest, const char *p_contents); - void (*string_new_with_utf8_chars)(GDNativeStringPtr r_dest, const char *p_contents); - void (*string_new_with_utf16_chars)(GDNativeStringPtr r_dest, const char16_t *p_contents); - void (*string_new_with_utf32_chars)(GDNativeStringPtr r_dest, const char32_t *p_contents); - void (*string_new_with_wide_chars)(GDNativeStringPtr r_dest, const wchar_t *p_contents); - void (*string_new_with_latin1_chars_and_len)(GDNativeStringPtr r_dest, const char *p_contents, GDNativeInt p_size); - void (*string_new_with_utf8_chars_and_len)(GDNativeStringPtr r_dest, const char *p_contents, GDNativeInt p_size); - void (*string_new_with_utf16_chars_and_len)(GDNativeStringPtr r_dest, const char16_t *p_contents, GDNativeInt p_size); - void (*string_new_with_utf32_chars_and_len)(GDNativeStringPtr r_dest, const char32_t *p_contents, GDNativeInt p_size); - void (*string_new_with_wide_chars_and_len)(GDNativeStringPtr r_dest, const wchar_t *p_contents, GDNativeInt p_size); - /* Information about the following functions: - * - The return value is the resulting encoded string length. - * - The length returned is in characters, not in bytes. It also does not include a trailing zero. - * - These functions also do not write trailing zero, If you need it, write it yourself at the position indicated by the length (and make sure to allocate it). - * - Passing NULL in r_text means only the length is computed (again, without including trailing zero). - * - p_max_write_length argument is in characters, not bytes. It will be ignored if r_text is NULL. - * - p_max_write_length argument does not affect the return value, it's only to cap write length. - */ - GDNativeInt (*string_to_latin1_chars)(GDNativeConstStringPtr p_self, char *r_text, GDNativeInt p_max_write_length); - GDNativeInt (*string_to_utf8_chars)(GDNativeConstStringPtr p_self, char *r_text, GDNativeInt p_max_write_length); - GDNativeInt (*string_to_utf16_chars)(GDNativeConstStringPtr p_self, char16_t *r_text, GDNativeInt p_max_write_length); - GDNativeInt (*string_to_utf32_chars)(GDNativeConstStringPtr p_self, char32_t *r_text, GDNativeInt p_max_write_length); - GDNativeInt (*string_to_wide_chars)(GDNativeConstStringPtr p_self, wchar_t *r_text, GDNativeInt p_max_write_length); - char32_t *(*string_operator_index)(GDNativeStringPtr p_self, GDNativeInt p_index); - const char32_t *(*string_operator_index_const)(GDNativeConstStringPtr p_self, GDNativeInt p_index); - - /* Packed array functions */ - - uint8_t *(*packed_byte_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedByteArray - const uint8_t *(*packed_byte_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedByteArray - - GDNativeTypePtr (*packed_color_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedColorArray, returns Color ptr - GDNativeTypePtr (*packed_color_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedColorArray, returns Color ptr - - float *(*packed_float32_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat32Array - const float *(*packed_float32_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat32Array - double *(*packed_float64_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat64Array - const double *(*packed_float64_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedFloat64Array - - int32_t *(*packed_int32_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array - const int32_t *(*packed_int32_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array - int64_t *(*packed_int64_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array - const int64_t *(*packed_int64_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedInt32Array - - GDNativeStringPtr (*packed_string_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedStringArray - GDNativeStringPtr (*packed_string_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedStringArray - - GDNativeTypePtr (*packed_vector2_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr - GDNativeTypePtr (*packed_vector2_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector2Array, returns Vector2 ptr - GDNativeTypePtr (*packed_vector3_array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr - GDNativeTypePtr (*packed_vector3_array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be a PackedVector3Array, returns Vector3 ptr - - GDNativeVariantPtr (*array_operator_index)(GDNativeTypePtr p_self, GDNativeInt p_index); // p_self should be an Array ptr - GDNativeVariantPtr (*array_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeInt p_index); // p_self should be an Array ptr - - /* Dictionary functions */ - - GDNativeVariantPtr (*dictionary_operator_index)(GDNativeTypePtr p_self, GDNativeConstVariantPtr p_key); // p_self should be an Dictionary ptr - GDNativeVariantPtr (*dictionary_operator_index_const)(GDNativeConstTypePtr p_self, GDNativeConstVariantPtr p_key); // p_self should be an Dictionary ptr - - /* OBJECT */ - - void (*object_method_bind_call)(GDNativeMethodBindPtr p_method_bind, GDNativeObjectPtr p_instance, GDNativeConstVariantPtr *p_args, GDNativeInt p_arg_count, GDNativeVariantPtr r_ret, GDNativeCallError *r_error); - void (*object_method_bind_ptrcall)(GDNativeMethodBindPtr p_method_bind, GDNativeObjectPtr p_instance, GDNativeConstTypePtr *p_args, GDNativeTypePtr r_ret); - void (*object_destroy)(GDNativeObjectPtr p_o); - GDNativeObjectPtr (*global_get_singleton)(GDNativeConstStringNamePtr p_name); - - void *(*object_get_instance_binding)(GDNativeObjectPtr p_o, void *p_token, const GDNativeInstanceBindingCallbacks *p_callbacks); - void (*object_set_instance_binding)(GDNativeObjectPtr p_o, void *p_token, void *p_binding, const GDNativeInstanceBindingCallbacks *p_callbacks); - - void (*object_set_instance)(GDNativeObjectPtr p_o, GDNativeConstStringNamePtr p_classname, GDExtensionClassInstancePtr p_instance); /* p_classname should be a registered extension class and should extend the p_o object's class. */ - - GDNativeObjectPtr (*object_cast_to)(GDNativeConstObjectPtr p_object, void *p_class_tag); - GDNativeObjectPtr (*object_get_instance_from_id)(GDObjectInstanceID p_instance_id); - GDObjectInstanceID (*object_get_instance_id)(GDNativeConstObjectPtr p_object); - - /* SCRIPT INSTANCE */ - - GDNativeScriptInstancePtr (*script_instance_create)(const GDNativeExtensionScriptInstanceInfo *p_info, GDNativeExtensionScriptInstanceDataPtr p_instance_data); - - /* CLASSDB */ - - GDNativeObjectPtr (*classdb_construct_object)(GDNativeConstStringNamePtr p_classname); /* The passed class must be a built-in godot class, or an already-registered extension class. In both case, object_set_instance should be called to fully initialize the object. */ - GDNativeMethodBindPtr (*classdb_get_method_bind)(GDNativeConstStringNamePtr p_classname, GDNativeConstStringNamePtr p_methodname, GDNativeInt p_hash); - void *(*classdb_get_class_tag)(GDNativeConstStringNamePtr p_classname); - - /* CLASSDB EXTENSION */ - - /* Provided parameters for `classdb_register_extension_*` can be safely freed once the function returns. */ - void (*classdb_register_extension_class)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_parent_class_name, const GDNativeExtensionClassCreationInfo *p_extension_funcs); - void (*classdb_register_extension_class_method)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativeExtensionClassMethodInfo *p_method_info); - void (*classdb_register_extension_class_integer_constant)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_enum_name, GDNativeConstStringNamePtr p_constant_name, GDNativeInt p_constant_value, GDNativeBool p_is_bitfield); - void (*classdb_register_extension_class_property)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, const GDNativePropertyInfo *p_info, GDNativeConstStringNamePtr p_setter, GDNativeConstStringNamePtr p_getter); - void (*classdb_register_extension_class_property_group)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringPtr p_group_name, GDNativeConstStringPtr p_prefix); - void (*classdb_register_extension_class_property_subgroup)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringPtr p_subgroup_name, GDNativeConstStringPtr p_prefix); - void (*classdb_register_extension_class_signal)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name, GDNativeConstStringNamePtr p_signal_name, const GDNativePropertyInfo *p_argument_info, GDNativeInt p_argument_count); - void (*classdb_unregister_extension_class)(GDNativeExtensionClassLibraryPtr p_library, GDNativeConstStringNamePtr p_class_name); /* Unregistering a parent class before a class that inherits it will result in failure. Inheritors must be unregistered first. */ - - void (*get_library_path)(GDNativeExtensionClassLibraryPtr p_library, GDNativeStringPtr r_path); - -} GDNativeInterface; - -/* INITIALIZATION */ - -typedef enum { - GDNATIVE_INITIALIZATION_CORE, - GDNATIVE_INITIALIZATION_SERVERS, - GDNATIVE_INITIALIZATION_SCENE, - GDNATIVE_INITIALIZATION_EDITOR, - GDNATIVE_MAX_INITIALIZATION_LEVEL, -} GDNativeInitializationLevel; - -typedef struct { - /* Minimum initialization level required. - * If Core or Servers, the extension needs editor or game restart to take effect */ - GDNativeInitializationLevel minimum_initialization_level; - /* Up to the user to supply when initializing */ - void *userdata; - /* This function will be called multiple times for each initialization level. */ - void (*initialize)(void *userdata, GDNativeInitializationLevel p_level); - void (*deinitialize)(void *userdata, GDNativeInitializationLevel p_level); -} GDNativeInitialization; - -/* Define a C function prototype that implements the function below and expose it to dlopen() (or similar). - * This is the entry point of the GDExtension library and will be called on initialization. - * It can be used to set up different init levels, which are called during various stages of initialization/shutdown. - * The function name must be a unique one specified in the .gdextension config file. - */ -typedef GDNativeBool (*GDNativeInitializationFunction)(const GDNativeInterface *p_interface, GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization); - -#ifdef __cplusplus -} -#endif - -#endif // GDNATIVE_INTERFACE_H diff --git a/core/extension/make_interface_dumper.py b/core/extension/make_interface_dumper.py index cc85c728d5..a8af0e9ff6 100644 --- a/core/extension/make_interface_dumper.py +++ b/core/extension/make_interface_dumper.py @@ -6,17 +6,17 @@ def run(target, source, env): g.write( """/* THIS FILE IS GENERATED DO NOT EDIT */ -#ifndef GDNATIVE_INTERFACE_DUMP_H -#define GDNATIVE_INTERFACE_DUMP_H +#ifndef GDEXTENSION_INTERFACE_DUMP_H +#define GDEXTENSION_INTERFACE_DUMP_H #ifdef TOOLS_ENABLED #include "core/io/file_access.h" #include "core/string/ustring.h" -class GDNativeInterfaceDump { +class GDExtensionInterfaceDump { private: - static constexpr char const *gdnative_interface_dump =""" + static constexpr char const *gdextension_interface_dump =""" ) for line in f: g.write('"' + line.rstrip().replace('"', '\\"') + '\\n"\n') @@ -25,16 +25,16 @@ class GDNativeInterfaceDump { g.write( """ public: - static void generate_gdnative_interface_file(const String &p_path) { + static void generate_gdextension_interface_file(const String &p_path) { Ref<FileAccess> fa = FileAccess::open(p_path, FileAccess::WRITE); - CharString cs(gdnative_interface_dump); + CharString cs(gdextension_interface_dump); fa->store_buffer((const uint8_t *)cs.ptr(), cs.length()); }; }; #endif // TOOLS_ENABLED -#endif // GDNATIVE_INTERFACE_DUMP_H +#endif // GDEXTENSION_INTERFACE_DUMP_H """ ) g.close() diff --git a/core/input/gamecontrollerdb.txt b/core/input/gamecontrollerdb.txt index 774d1be6b5..dcb6aefb00 100644 --- a/core/input/gamecontrollerdb.txt +++ b/core/input/gamecontrollerdb.txt @@ -67,9 +67,11 @@ 03000000c82d00000160000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000161000000000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00000121000000000000,8BitDo SN30 Pro for Android,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, -03000000c82d00000260000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00000261000000000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, -03000000c82d00001330000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,lefttrigger:b8,righttrigger:b9,paddle1:b23,paddle2:b19,platform:Windows, +03000000c82d00000260000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00000261000000000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, +03000000c82d00001130000000000000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001230000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000c82d00001330000000000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, 03000000a00500003232000000000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Windows, 03000000c82d00001890000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Windows, 03000000c82d00003032000000000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Windows, @@ -201,6 +203,7 @@ 03000000ac0500005b05000000000000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, 03000000ac0500002d02000000000000,GameSir G4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 03000000ac0500004d04000000000000,GameSir G4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000ac0500001a06000000000000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, 030000004c0e00001035000000000000,Gamester,a:b0,b:b1,back:b7,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b11,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Windows, 030000000d0f00001110000000000000,GameStick Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, 0300000047530000616d000000000000,GameStop,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, @@ -296,7 +299,8 @@ 030000000d0f0000ee00000000000000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000000d0f00006700000000000000,Horipad One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 030000000d0f0000dc00000000000000,Horipad Switch,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, -030000008f0e00001330000000000000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Windows, +03000000242e00000b20000000000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Windows, +03000000242e0000ff0b000000000000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Windows, 03000000790000004e95000000000000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b7,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Windows, 03000000d81d00000e00000000000000,iBuffalo AC02 Arcade Joystick,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,rightstick:b11,righttrigger:b3,rightx:a2,righty:a5,start:b8,x:b4,y:b5,platform:Windows, 03000000d81d00000f00000000000000,iBuffalo BSGP1204 Series,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, @@ -369,6 +373,7 @@ 030000002a0600001024000000000000,Matricom,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:Windows, 030000009f000000adbb000000000000,MaxJoypad Virtual Controller,a:b1,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 03000000250900000128000000000000,Mayflash Arcade Stick,a:b1,b:b2,back:b8,leftshoulder:b0,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b7,start:b9,x:b5,y:b6,platform:Windows, +030000008f0e00001330000000000000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Windows, 03000000242f00003700000000000000,Mayflash F101,a:b1,b:b2,back:b8,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 03000000790000003018000000000000,Mayflash F300 Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 03000000242f00003900000000000000,Mayflash F300 Elite Arcade Joystick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, @@ -377,8 +382,9 @@ 03000000242f00007300000000000000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b0,y:b3,platform:Windows, 0300000079000000d218000000000000,Mayflash Magic NS,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Windows, 03000000d620000010a7000000000000,Mayflash Magic NS,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, +03000000790000007918000000000000,Mayflash N64 Controller Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b9,leftx:a0,lefty:a1,righttrigger:b7,rightx:a3,righty:a2,start:b8,platform:Windows, 030000008f0e00001030000000000000,Mayflash Sega Saturn Adapter,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:b5,rightshoulder:b2,righttrigger:b7,start:b9,x:b3,y:b4,platform:Windows, -0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:b13,dpleft:b12,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, +0300000025090000e803000000000000,Mayflash Wii Classic Adapter,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:a4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:a5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Windows, 03000000790000000318000000000000,Mayflash Wii DolphinBar,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b11,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b1,platform:Windows, 03000000790000000018000000000000,Mayflash Wii U Pro Adapter,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Windows, 03000000790000002418000000000000,Mega Drive Controller,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,rightshoulder:b2,start:b9,x:b3,y:b4,platform:Windows, @@ -443,6 +449,7 @@ 030000006f0e00008501000000000000,PDP Fightpad Pro,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b0,platform:Windows, 030000006f0e00000901000000000000,PDP Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Windows, 030000008f0e00004100000000000000,PlaySega,a:b1,b:b0,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b2,start:b8,x:b4,y:b3,platform:Windows, +03000000666600006706000000000000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows, 03000000e30500009605000000000000,PlayStation Adapter,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 030000004c050000da0c000000000000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Windows, 03000000632500002306000000000000,PlayStation Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Windows, @@ -464,7 +471,6 @@ 03000000250900000088000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 03000000250900006888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b5,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b6,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, 03000000250900008888000000000000,PS2 Controller,a:b2,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, -03000000666600006706000000000000,PS2 Controller,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Windows, 030000006b1400000303000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 030000009d0d00001330000000000000,PS2 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 03000000151a00006222000000000000,PS2 Dual Plus Adapter,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Windows, @@ -505,7 +511,8 @@ 030000004c050000a00b000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 030000004c050000cc09000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, -030000004c050000e60c000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000004c050000e60c000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, +030000004c050000f20d000000000000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Windows, 03000000830500005020000000000000,PSX,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Windows, 03000000300f00000111000000000000,Qanba 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Windows, 03000000300f00000211000000000000,Qanba 2P,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, @@ -554,6 +561,7 @@ 03000000830500006020000000000000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Windows, 03000000bd12000013d0000000000000,Retrolink Sega Saturn Classic Controller,a:b0,b:b1,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b5,lefttrigger:b6,rightshoulder:b2,righttrigger:b7,start:b8,x:b3,y:b4,platform:Windows, 03000000bd12000015d0000000000000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Windows, +03000000341200000400000000000000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Windows, 0300000000f000000300000000000000,RetroUSB RetroPad,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, 0300000000f00000f100000000000000,RetroUSB Super RetroPort,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Windows, 03000000830500000960000000000000,Revenger,a:b0,b:b1,leftshoulder:b6,lefttrigger:b7,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b3,x:b4,y:b5,platform:Windows, @@ -741,9 +749,8 @@ 03000000450c00002043000000000000,Xeox SL6556BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Windows, 030000006f0e00000300000000000000,XGear,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Windows, 03000000172700004431000000000000,Xiaomi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a7,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Windows, -03000000bc2000005060000000000000,Xiaomi XMGP01YM,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,-lefty:-a1,+lefty:+a2,rightx:a3,-righty:-a4,+righty:+a5,lefttrigger:b8,righttrigger:b9,platform:Windows, -03000000172700003350000000000000,Xiaomi XMGP01YM,a:b0,b:b1,x:b3,y:b4,back:b10,guide:b12,start:b11,leftstick:b13,rightstick:b14,leftshoulder:b6,rightshoulder:b7,dpup:h0.1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,leftx:a0,lefty:a1,rightx:a3,righty:a4,platform:Windows, -03000000786901006e70000000000000,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, +03000000172700003350000000000000,Xiaomi XMGP01YM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, +03000000bc2000005060000000000000,Xiaomi XMGP01YM,+lefty:+a2,+righty:+a5,-lefty:-a1,-righty:-a4,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,start:b11,x:b3,y:b4,platform:Windows, xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Windows, 030000007d0400000340000000000000,Xterminator Digital Gamepad,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:-a4,lefttrigger:+a4,leftx:a0,lefty:a1,paddle1:b7,paddle2:b6,rightshoulder:b5,rightstick:b9,righttrigger:b2,rightx:a3,righty:a5,start:b8,x:b3,y:b4,platform:Windows, 03000000790000004f18000000000000,ZDT Android Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b3,y:b4,platform:Windows, @@ -789,8 +796,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c82d00004028000000010000,8BitDo SN30,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000160000001000000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, 03000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a5,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000260000001000000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, -03000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000260000001000000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Mac OS X, +03000000c82d00001130000000020000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001330000001000000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +03000000c82d00001330000000020000,8BitDo Ultimate Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000a00500003232000009010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000c82d00001890000001000000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Mac OS X, @@ -817,10 +827,12 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, 03000000b40400001124000000000000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:b8,leftx:a0,lefty:a1,paddle1:b4,paddle2:b5,paddle3:b17,rightshoulder:b7,rightstick:b13,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b2,y:b3,platform:Mac OS X, 03000000790000004618000000010000,GameCube Controller Adapter,a:b4,b:b0,dpdown:b56,dpleft:b60,dpright:b52,dpup:b48,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X, +03000000ac0500001a06000002020000,GameSir-T3 2.02,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000ad1b000001f9000000000000,Gamestop BB070 X360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 0500000047532047616d657061640000,GameStop Gamepad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, 03000000c01100000140000000010000,GameStop PS4 Fun Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000006f0e00000102000000000000,GameStop Xbox 360 Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, +03000000ff1100003133000007010000,GameWare PC Control Pad,a:b2,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a4,start:b11,x:b3,y:b0,platform:Mac OS X, 030000007d0400000540000001010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000280400000140000000020000,Gravis GamePad Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 030000008f0e00000300000007010000,GreenAsia Joystick,a:b2,b:b3,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b0,y:b1,platform:Mac OS X, @@ -836,11 +848,12 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f00004d00000000000000,Hori Gem Pad 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00003801000008010000,Hori PC Engine Mini Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b9,platform:Mac OS X, 030000000d0f00009200000000010000,Hori Pokken Tournament DX Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, +030000000d0f0000aa00000072050000,Hori Real Arcade Pro,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, 030000000d0f00006e00000000010000,Horipad 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00006600000000010000,Horipad 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f00006600000000000000,Horipad FPS Plus 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000000d0f0000ee00000000010000,Horipad Mini 4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000008f0e00001330000011010000,HuiJia SNES Controller,a:b4,b:b2,back:b16,dpdown:+a2,dpleft:-a0,dpright:+a0,dpup:-a2,leftshoulder:b12,rightshoulder:b14,start:b18,x:b6,y:b0,platform:Mac OS X, +03000000242e0000ff0b000000010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Mac OS X, 03000000790000004e95000000010000,Hyperkin N64 Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a5,righty:a2,start:b9,platform:Mac OS X, 03000000830500006020000000000000,iBuffalo Gamepad,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Mac OS X, 03000000ef0500000300000000020000,InterAct AxisPad,a:b2,b:b3,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a3,righty:a2,start:b11,x:b0,y:b1,platform:Mac OS X, @@ -858,10 +871,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000006d0400001fc2000000000000,Logitech F710,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 030000006d04000018c2000000010000,Logitech RumblePad 2,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3~,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000380700005032000000010000,Mad Catz PS3 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000380700008433000000010000,Mad Catz PS3 Fightstick TE S+,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700008433000000010000,Mad Catz PS3 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000380700005082000000010000,Mad Catz PS4 Fightpad Pro,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -03000000380700008483000000010000,Mad Catz PS4 Fightstick TE S+,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000380700008483000000010000,Mad Catz PS4 Fightstick TE S Plus,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000790000000600000007010000,Marvo GT-004,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, +030000008f0e00001330000011010000,Mayflash Controller Adapter,a:b2,b:b4,back:b16,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b12,lefttrigger:b16,leftx:a0,lefty:a2,rightshoulder:b14,rightx:a6~,righty:a4,start:b18,x:b0,y:b6,platform:Mac OS X, 03000000790000004318000000010000,Mayflash GameCube Adapter,a:b4,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a12,leftx:a0,lefty:a4,rightshoulder:b28,righttrigger:a16,rightx:a20,righty:a8,start:b36,x:b8,y:b12,platform:Mac OS X, 03000000790000004418000000010000,Mayflash GameCube Controller,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000242f00007300000000020000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Mac OS X, @@ -886,8 +900,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000007e0500001920000001000000,NSO N64 Controller,+rightx:b8,+righty:b7,-rightx:b3,-righty:b2,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,righttrigger:b10,start:b9,platform:Mac OS X, 030000007e0500001720000001000000,NSO SNES Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b15,start:b9,x:b2,y:b3,platform:Mac OS X, 03000000550900001472000025050000,NVIDIA Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b4,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Mac OS X, +030000004b120000014d000000010000,Nyko Airflo EX,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Mac OS X, 030000006f0e00000901000002010000,PDP Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 030000008f0e00000300000000000000,Piranha Xtreme PS3 Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000666600006706000088020000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Mac OS X, 030000004c050000da0c000000010000,PlayStation Classic Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b4,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Mac OS X, 030000004c0500003713000000010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000d62000006dca000000010000,PowerA Pro Ex,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, @@ -899,8 +915,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000004c050000c405000000000000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000004c050000c405000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, -030000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, +030000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +030000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, 050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, +050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Mac OS X, 03000000222c00000225000000010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000222c00000020000000010000,Qanba Drone Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000008916000000fd000000000000,Razer Onza TE,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, @@ -919,6 +937,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000790000001100000005010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b6,lefttrigger:b7,rightshoulder:b5,righttrigger:b4,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000830500006020000000010000,Retro Controller,a:b0,b:b1,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b5,rightshoulder:b8,righttrigger:b9,start:b7,x:b2,y:b3,platform:Mac OS X, 03000000790000001100000006010000,Retrolink SNES Controller,a:b2,b:b1,back:b8,dpdown:+a4,dpleft:-a3,dpright:+a3,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b9,x:b3,y:b0,platform:Mac OS X, +03000000341200000400000000000000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Mac OS X, 030000006b140000010d000000010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000006b140000130d000000010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000c6240000fefa000000000000,Rock Candy PS3,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, @@ -937,14 +956,13 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000381000002014000001000000,SteelSeries Nimbus,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,x:b2,y:b3,platform:Mac OS X, 05000000484944204465766963650000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, 050000004e696d6275732b0000000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, -050000004e696d6275732b008b000000,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, -05000000556e6b6e6f776e2048494400,SteelSeries Nimbus Plus,a:b0,b:b1,back:b15,dpdown:b11,dpleft:b13,dpright:b12,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3~,start:b14,x:b2,y:b3,platform:Mac OS X, 03000000381000003014000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 03000000381000003114000000000000,SteelSeries Stratus Duo,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 03000000110100001714000000000000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, 03000000110100001714000020010000,SteelSeries Stratus XL,a:b0,b:b1,dpdown:b9,dpleft:b11,dpright:b10,dpup:b8,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1~,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3~,start:b12,x:b2,y:b3,platform:Mac OS X, 030000000d0f0000f600000000010000,Switch Hori Pad,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Mac OS X, 03000000457500002211000000010000,SZMY Power PC Gamepad,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Mac OS X, +03000000790000001c18000003100000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000004f04000015b3000000000000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Mac OS X, 030000004f0400000ed0000000020000,ThrustMaster eSwap Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 030000004f04000000b3000000000000,Thrustmaster Firestorm Dual Power,a:b0,b:b2,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b11,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,righttrigger:b7,rightx:a2,righty:a3,start:b10,x:b1,y:b3,platform:Mac OS X, @@ -954,6 +972,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000571d00002000000021000000,Tomee SNES Controller Adapter,a:b0,b:b1,back:b6,dpdown:+a4,dpleft:-a0,dpright:+a0,dpup:-a4,leftshoulder:b4,rightshoulder:b5,start:b7,x:b2,y:b3,platform:Mac OS X, 030000005f140000c501000000020000,Trust Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Mac OS X, 03000000100800000100000000000000,Twin USB Joystick,a:b4,b:b2,back:b16,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b12,leftstick:b20,lefttrigger:b8,leftx:a0,lefty:a2,rightshoulder:b14,rightstick:b22,righttrigger:b10,rightx:a6,righty:a4,start:b18,x:b6,y:b0,platform:Mac OS X, +03000000632500002605000000010000,Uberwith Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000006f0e00000302000025040000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 030000006f0e00000702000003060000,Victrix PS4 Pro Fightstick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Mac OS X, 050000005769696d6f74652028303000,Wii Remote,a:b4,b:b5,back:b7,dpdown:b3,dpleft:b0,dpright:b1,dpup:b2,guide:b8,leftshoulder:b11,lefttrigger:b12,leftx:a0,lefty:a1,start:b6,x:b10,y:b9,platform:Mac OS X, @@ -965,6 +984,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000005e040000050b000003090000,Xbox Elite Controller Series 2,a:b0,b:b1,back:b31,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b53,leftshoulder:b6,leftstick:b13,lefttrigger:a6,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000005e040000130b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000005e040000200b000011050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000200b000013050000,Xbox One Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000005e040000d102000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 030000005e040000dd02000000000000,Xbox One Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 030000005e040000e002000000000000,Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Mac OS X, @@ -975,8 +995,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c62400003a54000000000000,Xbox One PowerA Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b10,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b8,x:b2,y:b3,platform:Mac OS X, 030000005e040000130b000001050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000005e040000130b000005050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, -030000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000009050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 030000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, +030000005e040000130b000015050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b15,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Mac OS X, 03000000120c0000100e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, 03000000120c0000101e000000010000,Zeroplus P4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Mac OS X, @@ -1008,6 +1029,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c82d00000751000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 05000000c82d00000851000000010000,8BitDo P30,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,lefttrigger:a8,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00000660000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001030000011010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00000660000000010000,8BitDo Pro 2,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000131000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 03000000c82d00000231000011010000,8BitDo Receiver,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, @@ -1028,9 +1050,13 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c82d00001290000011010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a3,righty:a4,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00000161000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b2,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000c82d00006228000000010000,8BitDo SN30 Pro,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -03000000c82d00000260000011010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, -05000000c82d00000261000000010000,8BitDo SN30 Pro+,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00000260000011010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +05000000c82d00000261000000010000,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, 05000000202800000900000000010000,8BitDo SNES30,a:b1,b:b0,back:b10,dpdown:b122,dpleft:b119,dpright:b120,dpup:b117,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001130000011010000,8BitDo Ultimate Wired,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00000760000011010000,8BitDo Ultimate Wireless,a:b1,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b4,y:b3,platform:Linux, +03000000c82d00001230000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, +03000000c82d00001330000011010000,8BitDo Ultimate Wireless,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b26,paddle1:b23,paddle2:b19,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 05000000a00500003232000001000000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, 05000000a00500003232000008010000,8BitDo Zero,a:b0,b:b1,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b3,y:b4,platform:Linux, 03000000c82d00001890000011010000,8BitDo Zero 2,a:b1,b:b0,back:b10,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b11,x:b4,y:b3,platform:Linux, @@ -1069,10 +1095,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000c21100000791000011010000,Be1 GC101 Controller 1.03,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 03000000c31100000791000011010000,Be1 GC101 Controller 1.03,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 030000005e0400008e02000003030000,Be1 GC101 Xbox 360,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000bc2000004d50000011010000,BEITONG A1T2 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 05000000bc2000000055000001000000,BETOP AX1 BFM,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000bc2000006412000011010000,Betop Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b30,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 030000006b1400000209000011010000,Bigben,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, -03000000666600006706000000010000,Boom PSX to PC Converter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux, 03000000120c0000200e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 03000000120c0000210e000011010000,Brook Mars PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000120c0000f70e000011010000,Brook Universal Fighting Board,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,rightstick:b11,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, @@ -1090,6 +1116,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000430b00000300000000010000,EMS Production PS2 Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a5,righty:a2,start:b9,x:b3,y:b0,platform:Linux, 03000000b40400001124000011010000,Flydigi Vader 2,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b12,lefttrigger:a5,leftx:a0,lefty:a1,paddle1:b2,paddle2:b5,paddle4:b17,rightshoulder:b7,rightstick:b13,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 05000000151900004000000001000000,Flydigi Vader 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +19000000030000000300000002030000,GameForce Controller,a:b1,b:b0,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a1,lefty:a0,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, 03000000ac0500005b05000010010000,GameSir G3w,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 03000000bc2000000055000011010000,GameSir G3w,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000558500001b06000010010000,GameSir G4 Pro,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, @@ -1099,6 +1126,9 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000006f0e00000104000000010000,Gamestop Logic3 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000008f0e00000800000010010000,Gasia PlayStation Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 03000000451300000010000010010000,Genius Maxfire Grandias 12,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, +190000004b4800000010000000010000,GO-Advance Controller,a:b1,b:b0,back:b10,dpdown:b7,dpleft:b8,dpright:b9,dpup:b6,leftshoulder:b4,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b13,start:b15,x:b2,y:b3,platform:Linux, +190000004b4800000010000001010000,GO-Advance Controller,a:b1,b:b0,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b4,leftstick:b13,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b16,righttrigger:b15,start:b17,x:b2,y:b3,platform:Linux, +190000004b4800000011000000010000,GO-Super Controller,a:b1,b:b0,back:b12,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b16,leftshoulder:b4,leftstick:b14,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b15,righttrigger:b7,rightx:a2,righty:a3,start:b13,x:b2,y:b3,platform:Linux, 03000000f0250000c183000010010000,Goodbetterbest Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 0300000079000000d418000000010000,GPD Win 2 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000007d0400000540000000010000,Gravis Eliminator Pro,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, @@ -1113,6 +1143,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000632500002605000010010000,HJDX,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a5,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 030000000d0f00000d00000000010000,Hori,a:b0,b:b6,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b3,rightshoulder:b7,start:b9,x:b1,y:b2,platform:Linux, 030000000d0f00006d00000020010000,Hori EDGE 301,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:+a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:+a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +030000000d0f00008400000011010000,Hori Fighting Commander,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00005f00000011010000,Hori Fighting Commander 4 PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00005e00000011010000,Hori Fighting Commander 4 PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 030000000d0f00005001000009040000,Hori Fighting Commander OCTA Xbox One,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, @@ -1139,7 +1170,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000000d0f0000c100000011010000,Horipad S,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 050000000d0f0000f600000001000000,Horipad Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 03000000341a000005f7000010010000,HuiJia GameCube Controller Adapter,a:b1,b:b2,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b0,y:b3,platform:Linux, -030000008f0e00001330000010010000,HuiJia SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b9,x:b3,y:b0,platform:Linux, +05000000242e00000b20000001000000,Hyperkin Admiral N64 Controller,+rightx:b11,+righty:b13,-rightx:b8,-righty:b12,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b14,leftx:a0,lefty:a1,rightshoulder:b5,start:b9,platform:Linux, +03000000242e0000ff0b000011010000,Hyperkin N64 Adapter,a:b1,b:b2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,platform:Linux, 03000000242e00008816000001010000,Hyperkin X91,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000830500006020000010010000,iBuffalo SNES Controller,a:b1,b:b0,back:b6,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,start:b7,x:b3,y:b2,platform:Linux, 050000006964726f69643a636f6e0000,idroidcon Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, @@ -1191,6 +1223,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000380700003847000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 03000000ad1b000016f0000090040000,Mad Catz Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000120c00000500000000010000,Manta Dualshock 2,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +030000008f0e00001330000010010000,Mayflash Controller Adapter,a:b1,b:b2,back:b8,dpdown:h0.8,dpleft:h0.2,dpright:h0.1,dpup:h0.4,leftshoulder:b6,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightx:a3~,righty:a2,start:b9,x:b0,y:b3,platform:Linux, 03000000790000004318000010010000,Mayflash GameCube Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, 03000000790000004418000010010000,Mayflash GameCube Controller,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, 03000000242f00007300000011010000,Mayflash Magic NS,a:b1,b:b4,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:b8,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b0,y:b3,platform:Linux, @@ -1240,6 +1273,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000790000004518000010010000,Nexilux GameCube Controller Adapter,a:b1,b:b0,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:a4,rightx:a5,righty:a2,start:b9,x:b2,y:b3,platform:Linux, 030000001008000001e5000010010000,NEXT SNES Controller,a:b2,b:b1,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b4,rightshoulder:b5,righttrigger:b6,start:b9,x:b3,y:b0,platform:Linux, 060000007e0500003713000000000000,Nintendo 3DS,a:b0,b:b1,back:b8,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a2,righty:a3,start:b9,x:b3,y:b2,platform:Linux, +030000009b2800008000000020020000,Nintendo Classic Controller,a:b1,b:b4,back:b2,dpdown:b13,dpleft:b14,dpright:b15,dpup:b12,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b5,platform:Linux, 030000007e0500003703000000016800,Nintendo GameCube Controller,a:b0,b:b2,dpdown:b6,dpleft:b4,dpright:b5,dpup:b7,lefttrigger:a4,leftx:a0,lefty:a1~,rightshoulder:b9,righttrigger:a5,rightx:a2,righty:a3~,start:b8,x:b1,y:b3,platform:Linux, 03000000790000004618000010010000,Nintendo GameCube Controller Adapter,a:b1,b:b0,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,rightx:a5~,righty:a2~,start:b9,x:b2,y:b3,platform:Linux, 060000007e0500000620000000000000,Nintendo Switch Combined Joy-Cons,a:b0,b:b1,back:b9,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,guide:b11,leftshoulder:b5,leftstick:b12,lefttrigger:b7,leftx:a0,lefty:a1,misc1:b4,rightshoulder:b6,rightstick:b13,righttrigger:b8,rightx:a2,righty:a3,start:b10,x:b3,y:b2,platform:Linux, @@ -1268,7 +1302,6 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 05000000362800000100000003010000,OUYA Controller,a:b0,b:b3,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,guide:b14,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b2,platform:Linux, 05000000362800000100000004010000,OUYA Controller,a:b0,b:b3,back:b14,dpdown:b9,dpleft:b10,dpright:b11,dpup:b8,leftshoulder:b4,leftstick:b6,lefttrigger:b12,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:b13,rightx:a3,righty:a4,start:b16,x:b1,y:b2,platform:Linux, 03000000830500005020000010010000,Padix Rockfire PlayStation Bridge,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b8,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:b7,rightx:a2,righty:a3,start:b11,x:b2,y:b3,platform:Linux, -03000000790000001c18000011010000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 03000000ff1100003133000010010000,PC Controller,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 030000006f0e0000b802000001010000,PDP Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000006f0e0000b802000013020000,PDP Afterglow Xbox One Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, @@ -1283,6 +1316,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000006f0e00000901000011010000,PDP Versus Fighting,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, 030000006f0e0000a802000023020000,PDP Xbox One Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 030000006f0e0000a702000023020000,PDP Xbox One Raven Black,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +03000000666600006706000000010000,PlayStation Adapter,a:b2,b:b1,back:b8,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b9,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b10,righttrigger:b5,rightx:a2,righty:a3,start:b11,x:b3,y:b0,platform:Linux, 030000004c050000da0c000011010000,PlayStation Controller,a:b2,b:b1,back:b8,leftshoulder:b6,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b5,start:b9,x:b3,y:b0,platform:Linux, 03000000d9040000160f000000010000,PlayStation Controller Adapter,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b3,y:b0,platform:Linux, 030000004c0500003713000011010000,PlayStation Vita,a:b1,b:b2,back:b8,dpdown:b13,dpleft:b15,dpright:b14,dpup:b12,leftshoulder:b4,leftx:a0,lefty:a1,rightshoulder:b5,rightx:a3,righty:a4,start:b9,x:b0,y:b3,platform:Linux, @@ -1326,10 +1360,12 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000004c050000cc09000000010000,PS4 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 050000004c050000cc09000000810000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, 050000004c050000cc09000001800000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, -030000004c050000e60c000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, +030000004c050000e60c000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 030000004c050000e60c000011810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +030000004c050000f20d000011010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b14,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 050000004c050000e60c000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 050000004c050000e60c000000810000,PS5 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b10,leftshoulder:b4,leftstick:b11,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:Linux, +050000004c050000f20d000000010000,PS5 Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,touchpad:b13,x:b0,y:b3,platform:Linux, 03000000300f00001211000011010000,Qanba Arcade Joystick,a:b2,b:b0,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b5,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,righttrigger:b6,start:b9,x:b1,y:b3,platform:Linux, 03000000222c00000225000011010000,Qanba Dragon Arcade Joystick (PS3),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000222c00000025000011010000,Qanba Dragon Arcade Joystick (PS4),a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, @@ -1341,7 +1377,6 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000009b2800003200000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, 030000009b2800006000000001010000,Raphnet GC and N64 Adapter,a:b0,b:b7,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b2,righttrigger:b5,rightx:a3,righty:a4,start:b3,x:b1,y:b8,platform:Linux, 030000008916000001fd000024010000,Razer Onza Classic Edition,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, -030000008916000000fd000024010000,Razer Onza Tournament Edition,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000321500000204000011010000,Razer Panthera PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000321500000104000011010000,Razer Panthera PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 03000000321500000810000011010000,Razer Panthera PS4 Evo Arcade Stick,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b13,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, @@ -1356,9 +1391,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000003215000000090000163a0000,Razer Serval,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a4,rightx:a2,righty:a3,start:b7,x:b2,y:b3,platform:Linux, 0300000032150000030a000001010000,Razer Wildcat,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 03000000790000001100000010010000,Retro Controller,a:b1,b:b2,back:b8,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,lefttrigger:b7,rightshoulder:b4,righttrigger:b5,start:b9,x:b0,y:b3,platform:Linux, +190000004b4800000111000000010000,RetroGame Joypad,a:b1,b:b0,back:b8,dpdown:b14,dpleft:b15,dpright:b16,dpup:b13,leftshoulder:b4,leftstick:b11,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b12,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 0300000081170000990a000001010000,Retronic Adapter,a:b0,leftx:a0,lefty:a1,platform:Linux, 0300000000f000000300000000010000,RetroPad,a:b1,b:b5,back:b2,leftshoulder:b6,leftx:a0,lefty:a1,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, 00000000526574726f53746f6e653200,RetroStone 2 Controller,a:b1,b:b0,back:b10,dpdown:b15,dpleft:b16,dpright:b17,dpup:b14,leftshoulder:b6,lefttrigger:b8,rightshoulder:b7,righttrigger:b9,start:b11,x:b4,y:b3,platform:Linux, +03000000341200000400000000010000,RetroUSB N64 RetroPort,+rightx:b8,+righty:b10,-rightx:b9,-righty:b11,a:b7,b:b6,dpdown:b2,dpleft:b1,dpright:b0,dpup:b3,leftshoulder:b13,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b12,start:b4,platform:Linux, 030000006b140000010d000011010000,Revolution Pro Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 030000006b140000130d000011010000,Revolution Pro Controller 3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 030000006f0e00001f01000000010000,Rock Candy,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, @@ -1414,9 +1451,11 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 03000000666600000488000000010000,Super Joy Box 5 Pro,a:b2,b:b1,back:b9,dpdown:b14,dpleft:b15,dpright:b13,dpup:b12,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a2,righty:a3,start:b8,x:b3,y:b0,platform:Linux, 0300000000f00000f100000000010000,Super RetroPort,a:b1,b:b5,back:b2,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b6,rightshoulder:b7,start:b3,x:b0,y:b4,platform:Linux, 030000008f0e00000d31000010010000,SZMY Power 3 Turbo,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, +03000000457500000401000011010000,SZMY Power DS4 Wired Controller,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:a3,leftx:a0,lefty:a1,misc1:b13,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a5,start:b9,x:b0,y:b3,platform:Linux, 03000000457500002211000010010000,SZMY Power Gamepad,a:b2,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b3,y:b0,platform:Linux, 030000008f0e00001431000010010000,SZMY Power PS3,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b0,y:b3,platform:Linux, 03000000ba2200000701000001010000,Technology Innovation PS2 Adapter,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a5,righty:a2,start:b9,x:b3,y:b2,platform:Linux, +03000000790000001c18000011010000,TGZ Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b13,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:b9,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 030000004f04000015b3000001010000,Thrustmaster Dual Analog 3.2,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, 030000004f04000015b3000010010000,Thrustmaster Dual Analog 4,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, 030000004f04000020b3000010010000,Thrustmaster Dual Trigger,a:b0,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b5,leftx:a0,lefty:a1,rightshoulder:b6,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b1,y:b3,platform:Linux, @@ -1449,6 +1488,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 030000006f0e00000302000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, 030000006f0e00000702000011010000,Victrix Pro Fightstick PS4,a:b1,b:b2,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b4,leftstick:b10,lefttrigger:b6,rightshoulder:b5,righttrigger:b7,start:b9,x:b0,y:b3,platform:Linux, 05000000ac0500003232000001000000,VR Box Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b6,leftstick:b10,lefttrigger:b4,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b11,righttrigger:b5,rightx:a3,righty:a2,start:b9,x:b2,y:b3,platform:Linux, +05000000434f4d4d414e440000000000,VX Gaming Command Series,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:a4,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 0000000058626f782033363020576900,Xbox 360 Controller,a:b0,b:b1,back:b14,dpdown:b11,dpleft:b12,dpright:b13,dpup:b10,guide:b7,leftshoulder:b4,leftstick:b8,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b9,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Linux, 030000005e0400001907000000010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:b14,dpleft:b11,dpright:b12,dpup:b13,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e0400008e02000010010000,Xbox 360 Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, @@ -1486,8 +1526,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 050000005e040000130b000013050000,Xbox Series Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 060000005e040000120b00000b050000,Xbox Series Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, 030000005e040000120b000007050000,Xbox Series X Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,start:b7,x:b2,y:b3,platform:Linux, +050000005e040000130b000007050000,Xbox Series X Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 050000005e040000130b000011050000,Xbox Series X Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,misc1:b15,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, -050000005e040000130b000007050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 050000005e040000200b000013050000,Xbox Wireless Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b12,leftshoulder:b6,leftstick:b13,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a4,rightx:a2,righty:a3,start:b11,x:b3,y:b4,platform:Linux, 03000000450c00002043000010010000,XEOX SL6556 BK,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b10,lefttrigger:b6,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b11,righttrigger:b7,rightx:a2,righty:a3,start:b9,x:b2,y:b3,platform:Linux, 05000000172700004431000029010000,XiaoMi Controller,a:b0,b:b1,back:b10,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b20,leftshoulder:b6,leftstick:b13,lefttrigger:a7,leftx:a0,lefty:a1,rightshoulder:b7,rightstick:b14,righttrigger:a6,rightx:a2,righty:a5,start:b11,x:b3,y:b4,platform:Linux, @@ -1551,13 +1591,13 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 65323563303231646531383162646335,8BitDo SN30,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftx:a0,lefty:a1,rightshoulder:b10,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 35383531346263653330306238353131,8BitDo SN30 PP,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 05000000c82d000001600000ffff3f00,8BitDo SN30 Pro,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, +05000000c82d000002600000ffff0f00,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 36653638656632326235346264663661,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, 38303232393133383836366330346462,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b17,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b18,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b19,y:b2,platform:Android, 38346630346135363335366265656666,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 38426974446f20534e33302050726f2b,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b19,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 536f6e7920436f6d707574657220456e,8BitDo SN30 Pro Plus,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 66306331643531333230306437353936,8BitDo SN30 Pro Plus,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, -05000000c82d000002600000ffff0f00,8BitDo SN30 Pro+,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b17,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 050000002028000009000000ffff3f00,8BitDo SNES30,a:b1,b:b0,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b3,y:b2,platform:Android, 050000003512000020ab000000780f00,8BitDo SNES30,a:b21,b:b20,back:b30,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b26,rightshoulder:b27,start:b31,x:b24,y:b23,platform:Android, 33666663316164653937326237613331,8BitDo Zero,a:b0,b:b1,back:b15,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b6,x:b2,y:b3,platform:Android, @@ -1580,7 +1620,6 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 34323662653333636330306631326233,Google Nexus,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 35383633353935396534393230616564,Google Stadia Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 05000000d6020000e5890000dfff3f00,GPD XD Plus,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a5,start:b6,x:b2,y:b3,platform:Android, -0500000031366332860c44aadfff0f00,GS Gamepad,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:b15,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b16,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 66633030656131663837396562323935,Hori Battle,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, 35623466343433653739346434636330,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, 484f524920434f2e2c4c54442e203130,Hori Fighting Commander 3 Pro,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, @@ -1588,6 +1627,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 65656436646661313232656661616130,Hori PC Engine Mini Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b18,platform:Android, 31303433326562636431653534636633,Hori Real Arcade Pro 3,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, 30306539356238653637313730656134,HORIPAD Switch Pro Controller,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, +48797065726b696e2050616400000000,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android, +62333331353131353034386136626636,Hyperkin Admiral N64 Controller,+rightx:b6,+righty:b7,-rightx:b17,-righty:b5,a:b1,b:b0,leftshoulder:b3,lefttrigger:b8,leftx:a0,lefty:a1,rightshoulder:b20,start:b18,platform:Android, +31306635363562663834633739396333,Hyperkin N64 Adapter,a:b1,b:b19,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, +5368616e57616e202020202048797065,Hyperkin N64 Adapter,a:b1,b:b19,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightx:a2,righty:a3,start:b18,platform:Android, 0500000083050000602000000ffe0000,iBuffalo SNES Controller,a:b0,b:b1,back:b9,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b15,rightshoulder:b16,start:b10,x:b2,y:b3,platform:Android, 64306137363261396266353433303531,InterAct GoPad,a:b24,b:b25,leftshoulder:b23,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,x:b21,y:b22,platform:Android, 532e542e442e20496e74657261637420,InterAct HammerHead FX,a:b23,b:b24,back:b30,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b22,lefttrigger:b28,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b25,righttrigger:b29,rightx:a2,righty:a3,start:b31,x:b20,y:b21,platform:Android, @@ -1604,6 +1647,7 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 35623364393661626231343866613337,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 4c6f6769746563682047616d65706164,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 64396331333230326333313330336533,Logitech F710,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +39653365373864633935383236363438,Logitech G Cloud,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4~,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5~,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 416d617a6f6e2047616d6520436f6e74,Luna Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:Android, 4c756e612047616d6570616400000000,Luna Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 30363066623539323534363639323363,Magic NS,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, @@ -1642,6 +1686,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 4f5559412047616d6520436f6e74726f,OUYA Controller,a:b0,b:b2,dpdown:b18,dpleft:b15,dpright:b6,dpup:b17,leftshoulder:b3,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b10,righttrigger:a5,rightx:a3,righty:a4,x:b1,y:b19,platform:Android, 506572666f726d616e63652044657369,PDP PS3 Rock Candy Controller,a:b1,b:b17,back:h0.2,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b4,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b16,x:b0,y:b2,platform:Android, 62653335326261303663356263626339,PlayStation Classic Controller,a:b19,b:b1,back:b17,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,lefttrigger:b3,rightshoulder:b10,righttrigger:b20,start:b18,x:b2,y:b0,platform:Android, +536f6e7920496e746572616374697665,PlayStation Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +576972656c65737320436f6e74726f6c,PlayStation Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 61653962353232366130326530363061,Pokken,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,rightshoulder:b20,righttrigger:b10,start:b18,x:b0,y:b2,platform:Android, 32666633663735353234363064386132,PS2,a:b23,b:b22,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b27,lefttrigger:b25,leftx:a0,lefty:a1,rightshoulder:b28,righttrigger:b26,rightx:a3,righty:a2,start:b30,x:b24,y:b21,platform:Android, 050000004c05000068020000dfff3f00,PS3 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, @@ -1661,20 +1707,21 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 34613139376634626133336530386430,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 35643031303033326130316330353564,PS4 Controller,a:b1,b:b17,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:+a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:+a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, 37626233336235343937333961353732,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +37626464343430636562316661643863,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 38393161636261653636653532386639,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -536f6e7920496e746572616374697665,PS4 Controller,a:b0,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, -576972656c65737320436f6e74726f6c,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 63313733393535663339656564343962,PS4 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 63393662363836383439353064663939,PS4 Controller,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 65366465656364636137653363376531,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a3,start:b18,x:b0,y:b2,platform:Android, 66613532303965383534396638613230,PS4 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, 050000004c050000e60c0000fffe3f00,PS5 Controller,a:b1,b:b17,back:b15,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b3,leftstick:b4,lefttrigger:a3,leftx:a0,lefty:a1,rightshoulder:b18,rightstick:b6,righttrigger:a4,rightx:a2,righty:a5,start:b16,x:b0,y:b2,platform:Android, +050000004c050000e60c0000ffff3f00,PS5 Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 32346465346533616263386539323932,PS5 Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 32633532643734376632656664383733,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, 37363764353731323963323639666565,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, -61303162353165316365336436343139,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, +61303162353165316365336436343139,PS5 Controller,a:b1,b:b19,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,leftstick:b15,lefttrigger:b9,leftx:a0,lefty:a1,misc1:b8,rightshoulder:b20,rightstick:b6,righttrigger:b10,rightx:a2,righty:a5,start:b18,x:b0,y:b2,platform:Android, 64336263393933626535303339616332,Qanba 4RAF,a:b0,b:b1,back:b17,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b20,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:b3,righttrigger:b9,rightx:a2,righty:a3,start:b18,x:b19,y:b2,platform:Android, 36626666353861663864336130363137,Razer Junglecat,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +05000000f8270000bf0b0000ffff3f00,Razer Kishi,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 62653861643333663663383332396665,Razer Kishi,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,lefttrigger:a5,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a4,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000003215000005070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000003215000007070000ffff3f00,Razer Raiju Mobile,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, @@ -1686,6 +1733,10 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 61343739353764363165343237303336,Retro Controller,a:b0,b:b1,back:b9,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b17,lefttrigger:b18,leftx:a0,lefty:a1,start:b10,x:b2,y:b3,platform:Android, 38653130373365613538333235303036,Retroid Pocket 2,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 64363363336633363736393038313463,Retrolink,a:b1,b:b0,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,start:b6,platform:Android, +37393234373533633333323633646531,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android, +5365616c6965436f6d707574696e6720,RetroUSB N64 RetroPort,+rightx:b17,+righty:b15,-rightx:b18,-righty:b6,a:b10,b:b9,dpdown:b19,dpleft:b1,dpright:b0,dpup:b2,leftshoulder:b7,lefttrigger:b20,leftx:a0,lefty:a1,rightshoulder:b5,start:b3,platform:Android, +526574726f5553422e636f6d20534e45,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android, +64643037633038386238303966376137,RetroUSB SNES RetroPort,a:b1,b:b20,back:b19,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,leftshoulder:b9,rightshoulder:b10,start:b2,x:b0,y:b3,platform:Android, 33373336396634316434323337666361,RumblePad 2,a:b22,b:b23,back:b29,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b25,lefttrigger:b27,leftx:a0,lefty:a1,rightshoulder:b26,righttrigger:b28,rightx:a2,righty:a3,start:b30,x:b21,y:b24,platform:Android, 66386565396238363534313863353065,Sanwa PlayOnline Mobile,a:b21,b:b22,back:b23,dpdown:+a1,dpleft:-a0,dpright:+a0,dpup:-a1,start:b24,platform:Android, 32383165316333383766336338373261,Saturn,a:b0,b:b1,back:b4,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,lefttrigger:b10,leftx:a0,lefty:a1,rightshoulder:a4,righttrigger:a5,x:b2,y:b3,platform:Android, @@ -1706,6 +1757,8 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 05000000de2800000611000001000000,Steam Controller,a:b0,b:b1,back:b6,guide:b8,leftshoulder:b4,leftstick:b9,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a3,start:b7,x:b2,y:b3,platform:Android, 0500000011010000201400000f7e0f00,SteelSeries Nimbus,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b3,lefttrigger:b9,leftx:a0,lefty:a1,rightshoulder:b20,righttrigger:b10,rightx:a2,righty:a3,x:b19,y:b2,platform:Android, 35306436396437373135383665646464,SteelSeries Nimbus Plus,a:b0,b:b1,leftshoulder:b3,leftstick:b17,lefttrigger:b9,leftx:a0,rightshoulder:b20,rightstick:b18,righttrigger:b10,rightx:a2,x:b19,y:b2,platform:Android, +54475a20436f6e74726f6c6c65720000,TGZ Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, +62363434353532386238336663643836,TGZ Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b9,leftstick:b7,lefttrigger:b17,leftx:a0,lefty:a1,rightshoulder:b10,rightstick:b8,righttrigger:b18,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 050000004f0400000ed00000fffe3f00,ThrustMaster eSwap Pro Controller,a:b0,b:b1,back:b4,dpdown:b12,dpleft:b13,dpright:b14,dpup:b11,leftshoulder:b9,leftstick:b7,lefttrigger:a4,leftx:a0,lefty:a1,rightshoulder:b10,righttrigger:a5,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, 5477696e20555342204a6f7973746963,Twin Joystick,a:b22,b:b21,back:b28,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b26,leftstick:b30,lefttrigger:b24,leftx:a0,lefty:a1,rightshoulder:b27,rightstick:b31,righttrigger:b25,rightx:a3,righty:a2,start:b29,x:b23,y:b20,platform:Android, 30623739343039643830333266346439,Valve Steam Controller,a:b0,b:b1,back:b15,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b5,leftshoulder:b9,leftstick:b7,leftx:a0,lefty:a1,paddle1:b24,paddle2:b23,rightshoulder:b10,rightstick:b8,rightx:a2,righty:a3,start:b6,x:b2,y:b3,platform:Android, @@ -1749,9 +1802,12 @@ xinput,XInput Controller,a:b0,b:b1,back:b6,dpdown:h0.4,dpleft:h0.8,dpright:h0.2, 05000000ac050000020000004f066d02,*,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b2,y:b3,platform:iOS, 4d466947616d65706164010000000000,MFi Extended Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,righttrigger:a5,rightx:a3,righty:a4,start:b6,x:b2,y:b3,platform:iOS, 4d466947616d65706164020000000000,MFi Gamepad,a:b0,b:b1,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,rightshoulder:b5,start:b6,x:b2,y:b3,platform:iOS, +050000007e050000062000000f060000,Nintendo Switch Joy-Con (L),+leftx:h0.2,+lefty:h0.4,-leftx:h0.8,-lefty:h0.1,a:b0,b:b2,leftshoulder:b4,rightshoulder:b5,x:b1,y:b3,platform:iOS, 050000007e050000062000004f060000,Nintendo Switch Joy-Con (L),+leftx:h0.1,+lefty:h0.2,-leftx:h0.4,-lefty:h0.8,dpdown:b2,dpleft:b0,dpright:b3,dpup:b1,leftshoulder:b4,misc1:b6,rightshoulder:b5,platform:iOS, +050000007e05000008200000df070000,Nintendo Switch Joy-Con (L/R),a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, 050000007e0500000e200000df070000,Nintendo Switch Joy-Con (L/R),a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:iOS, 050000007e050000072000004f060000,Nintendo Switch Joy-Con (R),+rightx:h0.4,+righty:h0.8,-rightx:h0.1,-righty:h0.2,a:b1,b:b0,guide:b6,leftshoulder:b4,rightshoulder:b5,x:b3,y:b2,platform:iOS, +050000007e05000009200000df870000,Nintendo Switch Pro Controller,a:b1,b:b0,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b10,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b3,y:b2,platform:iOS, 050000007e05000009200000ff870000,Nintendo Switch Pro Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,guide:b9,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,misc1:b11,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b10,x:b2,y:b3,platform:iOS, 050000004c050000cc090000df070000,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, 050000004c050000cc090000df870001,PS4 Controller,a:b0,b:b1,back:b8,dpdown:h0.4,dpleft:h0.8,dpright:h0.2,dpup:h0.1,leftshoulder:b4,leftstick:b6,lefttrigger:a2,leftx:a0,lefty:a1,rightshoulder:b5,rightstick:b7,righttrigger:a5,rightx:a3,righty:a4,start:b9,x:b2,y:b3,platform:iOS, diff --git a/core/io/image.cpp b/core/io/image.cpp index 1b9538794a..a2e1bc22be 100644 --- a/core/io/image.cpp +++ b/core/io/image.cpp @@ -173,6 +173,14 @@ int Image::get_format_pixel_size(Format p_format) { return 1; case FORMAT_DXT5_RA_AS_RG: return 1; + case FORMAT_ASTC_4x4: + return 1; + case FORMAT_ASTC_4x4_HDR: + return 1; + case FORMAT_ASTC_8x8: + return 1; + case FORMAT_ASTC_8x8_HDR: + return 1; case FORMAT_MAX: { } } @@ -213,7 +221,18 @@ void Image::get_format_min_pixel_size(Format p_format, int &r_w, int &r_h) { r_h = 4; } break; + case FORMAT_ASTC_4x4: + case FORMAT_ASTC_4x4_HDR: { + r_w = 4; + r_h = 4; + + } break; + case FORMAT_ASTC_8x8: + case FORMAT_ASTC_8x8_HDR: { + r_w = 8; + r_h = 8; + } break; default: { r_w = 1; r_h = 1; @@ -222,7 +241,9 @@ void Image::get_format_min_pixel_size(Format p_format, int &r_w, int &r_h) { } int Image::get_format_pixel_rshift(Format p_format) { - if (p_format == FORMAT_DXT1 || p_format == FORMAT_RGTC_R || p_format == FORMAT_ETC || p_format == FORMAT_ETC2_R11 || p_format == FORMAT_ETC2_R11S || p_format == FORMAT_ETC2_RGB8 || p_format == FORMAT_ETC2_RGB8A1) { + if (p_format == FORMAT_ASTC_8x8) { + return 2; + } else if (p_format == FORMAT_DXT1 || p_format == FORMAT_RGTC_R || p_format == FORMAT_ETC || p_format == FORMAT_ETC2_R11 || p_format == FORMAT_ETC2_R11S || p_format == FORMAT_ETC2_RGB8 || p_format == FORMAT_ETC2_RGB8A1) { return 1; } else { return 0; @@ -260,6 +281,14 @@ int Image::get_format_block_size(Format p_format) { { return 4; } + case FORMAT_ASTC_4x4: + case FORMAT_ASTC_4x4_HDR: { + return 4; + } + case FORMAT_ASTC_8x8: + case FORMAT_ASTC_8x8_HDR: { + return 8; + } default: { } } @@ -2581,19 +2610,23 @@ Error Image::decompress() { _image_decompress_etc1(this); } else if (format >= FORMAT_ETC2_R11 && format <= FORMAT_ETC2_RA_AS_RG && _image_decompress_etc2) { _image_decompress_etc2(this); + } else if (format >= FORMAT_ASTC_4x4 && format <= FORMAT_ASTC_8x8_HDR && _image_decompress_astc) { + _image_decompress_astc(this); } else { return ERR_UNAVAILABLE; } return OK; } -Error Image::compress(CompressMode p_mode, CompressSource p_source, float p_lossy_quality) { +Error Image::compress(CompressMode p_mode, CompressSource p_source, float p_lossy_quality, ASTCFormat p_astc_format) { ERR_FAIL_INDEX_V_MSG(p_mode, COMPRESS_MAX, ERR_INVALID_PARAMETER, "Invalid compress mode."); ERR_FAIL_INDEX_V_MSG(p_source, COMPRESS_SOURCE_MAX, ERR_INVALID_PARAMETER, "Invalid compress source."); - return compress_from_channels(p_mode, detect_used_channels(p_source), p_lossy_quality); + return compress_from_channels(p_mode, detect_used_channels(p_source), p_lossy_quality, p_astc_format); } -Error Image::compress_from_channels(CompressMode p_mode, UsedChannels p_channels, float p_lossy_quality) { +Error Image::compress_from_channels(CompressMode p_mode, UsedChannels p_channels, float p_lossy_quality, ASTCFormat p_astc_format) { + ERR_FAIL_COND_V(data.is_empty(), ERR_INVALID_DATA); + switch (p_mode) { case COMPRESS_S3TC: { ERR_FAIL_COND_V(!_image_compress_bc_func, ERR_UNAVAILABLE); @@ -2611,6 +2644,10 @@ Error Image::compress_from_channels(CompressMode p_mode, UsedChannels p_channels ERR_FAIL_COND_V(!_image_compress_bptc_func, ERR_UNAVAILABLE); _image_compress_bptc_func(this, p_lossy_quality, p_channels); } break; + case COMPRESS_ASTC: { + ERR_FAIL_COND_V(!_image_compress_bptc_func, ERR_UNAVAILABLE); + _image_compress_astc_func(this, p_lossy_quality, p_astc_format); + } break; case COMPRESS_MAX: { ERR_FAIL_V(ERR_INVALID_PARAMETER); } break; @@ -2967,10 +3004,12 @@ void (*Image::_image_compress_bc_func)(Image *, float, Image::UsedChannels) = nu void (*Image::_image_compress_bptc_func)(Image *, float, Image::UsedChannels) = nullptr; void (*Image::_image_compress_etc1_func)(Image *, float) = nullptr; void (*Image::_image_compress_etc2_func)(Image *, float, Image::UsedChannels) = nullptr; +void (*Image::_image_compress_astc_func)(Image *, float, Image::ASTCFormat) = nullptr; void (*Image::_image_decompress_bc)(Image *) = nullptr; void (*Image::_image_decompress_bptc)(Image *) = nullptr; void (*Image::_image_decompress_etc1)(Image *) = nullptr; void (*Image::_image_decompress_etc2)(Image *) = nullptr; +void (*Image::_image_decompress_astc)(Image *) = nullptr; Vector<uint8_t> (*Image::webp_lossy_packer)(const Ref<Image> &, float) = nullptr; Vector<uint8_t> (*Image::webp_lossless_packer)(const Ref<Image> &) = nullptr; @@ -3387,8 +3426,8 @@ void Image::_bind_methods() { ClassDB::bind_method(D_METHOD("is_invisible"), &Image::is_invisible); ClassDB::bind_method(D_METHOD("detect_used_channels", "source"), &Image::detect_used_channels, DEFVAL(COMPRESS_SOURCE_GENERIC)); - ClassDB::bind_method(D_METHOD("compress", "mode", "source", "lossy_quality"), &Image::compress, DEFVAL(COMPRESS_SOURCE_GENERIC), DEFVAL(0.7)); - ClassDB::bind_method(D_METHOD("compress_from_channels", "mode", "channels", "lossy_quality"), &Image::compress_from_channels, DEFVAL(0.7)); + ClassDB::bind_method(D_METHOD("compress", "mode", "source", "lossy_quality", "astc_format"), &Image::compress, DEFVAL(COMPRESS_SOURCE_GENERIC), DEFVAL(0.7), DEFVAL(ASTC_FORMAT_4x4)); + ClassDB::bind_method(D_METHOD("compress_from_channels", "mode", "channels", "lossy_quality", "astc_format"), &Image::compress_from_channels, DEFVAL(0.7), DEFVAL(ASTC_FORMAT_4x4)); ClassDB::bind_method(D_METHOD("decompress"), &Image::decompress); ClassDB::bind_method(D_METHOD("is_compressed"), &Image::is_compressed); @@ -3472,6 +3511,10 @@ void Image::_bind_methods() { BIND_ENUM_CONSTANT(FORMAT_ETC2_RGB8A1); BIND_ENUM_CONSTANT(FORMAT_ETC2_RA_AS_RG); BIND_ENUM_CONSTANT(FORMAT_DXT5_RA_AS_RG); + BIND_ENUM_CONSTANT(FORMAT_ASTC_4x4); + BIND_ENUM_CONSTANT(FORMAT_ASTC_4x4_HDR); + BIND_ENUM_CONSTANT(FORMAT_ASTC_8x8); + BIND_ENUM_CONSTANT(FORMAT_ASTC_8x8_HDR); BIND_ENUM_CONSTANT(FORMAT_MAX); BIND_ENUM_CONSTANT(INTERPOLATE_NEAREST); @@ -3499,6 +3542,9 @@ void Image::_bind_methods() { BIND_ENUM_CONSTANT(COMPRESS_SOURCE_GENERIC); BIND_ENUM_CONSTANT(COMPRESS_SOURCE_SRGB); BIND_ENUM_CONSTANT(COMPRESS_SOURCE_NORMAL); + + BIND_ENUM_CONSTANT(ASTC_FORMAT_4x4); + BIND_ENUM_CONSTANT(ASTC_FORMAT_8x8); } void Image::set_compress_bc_func(void (*p_compress_func)(Image *, float, UsedChannels)) { diff --git a/core/io/image.h b/core/io/image.h index ad5c0b4a04..8bcee4404b 100644 --- a/core/io/image.h +++ b/core/io/image.h @@ -109,6 +109,10 @@ public: FORMAT_ETC2_RGB8A1, FORMAT_ETC2_RA_AS_RG, //used to make basis universal happy FORMAT_DXT5_RA_AS_RG, //used to make basis universal happy + FORMAT_ASTC_4x4, + FORMAT_ASTC_4x4_HDR, + FORMAT_ASTC_8x8, + FORMAT_ASTC_8x8_HDR, FORMAT_MAX }; @@ -134,6 +138,11 @@ public: }; //some functions provided by something else + enum ASTCFormat { + ASTC_FORMAT_4x4, + ASTC_FORMAT_8x8, + }; + static ImageMemLoadFunc _png_mem_loader_func; static ImageMemLoadFunc _jpg_mem_loader_func; static ImageMemLoadFunc _webp_mem_loader_func; @@ -144,11 +153,13 @@ public: static void (*_image_compress_bptc_func)(Image *, float p_lossy_quality, UsedChannels p_channels); static void (*_image_compress_etc1_func)(Image *, float); static void (*_image_compress_etc2_func)(Image *, float, UsedChannels p_channels); + static void (*_image_compress_astc_func)(Image *, float, ASTCFormat p_format); static void (*_image_decompress_bc)(Image *); static void (*_image_decompress_bptc)(Image *); static void (*_image_decompress_etc1)(Image *); static void (*_image_decompress_etc2)(Image *); + static void (*_image_decompress_astc)(Image *); static Vector<uint8_t> (*webp_lossy_packer)(const Ref<Image> &p_image, float p_quality); static Vector<uint8_t> (*webp_lossless_packer)(const Ref<Image> &p_image); @@ -347,6 +358,7 @@ public: COMPRESS_ETC, COMPRESS_ETC2, COMPRESS_BPTC, + COMPRESS_ASTC, COMPRESS_MAX, }; enum CompressSource { @@ -356,8 +368,8 @@ public: COMPRESS_SOURCE_MAX, }; - Error compress(CompressMode p_mode, CompressSource p_source = COMPRESS_SOURCE_GENERIC, float p_lossy_quality = 0.7); - Error compress_from_channels(CompressMode p_mode, UsedChannels p_channels, float p_lossy_quality = 0.7); + Error compress(CompressMode p_mode, CompressSource p_source = COMPRESS_SOURCE_GENERIC, float p_lossy_quality = 0.7, ASTCFormat p_astc_format = ASTC_FORMAT_4x4); + Error compress_from_channels(CompressMode p_mode, UsedChannels p_channels, float p_lossy_quality = 0.7, ASTCFormat p_astc_format = ASTC_FORMAT_4x4); Error decompress(); bool is_compressed() const; @@ -429,5 +441,6 @@ VARIANT_ENUM_CAST(Image::CompressSource) VARIANT_ENUM_CAST(Image::UsedChannels) VARIANT_ENUM_CAST(Image::AlphaMode) VARIANT_ENUM_CAST(Image::RoughnessChannel) +VARIANT_ENUM_CAST(Image::ASTCFormat) #endif // IMAGE_H diff --git a/core/io/packet_peer.h b/core/io/packet_peer.h index 07045e62a6..4a5f244911 100644 --- a/core/io/packet_peer.h +++ b/core/io/packet_peer.h @@ -86,10 +86,10 @@ protected: public: virtual Error get_packet(const uint8_t **r_buffer, int &r_buffer_size) override; ///< buffer is GONE after next get_packet - GDVIRTUAL2R(Error, _get_packet, GDNativeConstPtr<const uint8_t *>, GDNativePtr<int>); + GDVIRTUAL2R(Error, _get_packet, GDExtensionConstPtr<const uint8_t *>, GDExtensionPtr<int>); virtual Error put_packet(const uint8_t *p_buffer, int p_buffer_size) override; - GDVIRTUAL2R(Error, _put_packet, GDNativeConstPtr<const uint8_t>, int); + GDVIRTUAL2R(Error, _put_packet, GDExtensionConstPtr<const uint8_t>, int); EXBIND0RC(int, get_available_packet_count); EXBIND0RC(int, get_max_packet_size); diff --git a/core/io/resource_loader.cpp b/core/io/resource_loader.cpp index 6219ea70e4..20445a8b03 100644 --- a/core/io/resource_loader.cpp +++ b/core/io/resource_loader.cpp @@ -923,6 +923,35 @@ void ResourceLoader::clear_translation_remaps() { } } +void ResourceLoader::clear_thread_load_tasks() { + thread_load_mutex->lock(); + + for (KeyValue<String, ResourceLoader::ThreadLoadTask> &E : thread_load_tasks) { + switch (E.value.status) { + case ResourceLoader::ThreadLoadStatus::THREAD_LOAD_LOADED: { + E.value.resource = Ref<Resource>(); + } break; + + case ResourceLoader::ThreadLoadStatus::THREAD_LOAD_IN_PROGRESS: { + if (E.value.thread != nullptr) { + E.value.thread->wait_to_finish(); + memdelete(E.value.thread); + E.value.thread = nullptr; + } + E.value.resource = Ref<Resource>(); + } break; + + case ResourceLoader::ThreadLoadStatus::THREAD_LOAD_FAILED: + default: { + // do nothing + } + } + } + thread_load_tasks.clear(); + + thread_load_mutex->unlock(); +} + void ResourceLoader::load_path_remaps() { if (!ProjectSettings::get_singleton()->has_setting("path_remap/remapped_paths")) { return; diff --git a/core/io/resource_loader.h b/core/io/resource_loader.h index 243670b2d0..af10098bd8 100644 --- a/core/io/resource_loader.h +++ b/core/io/resource_loader.h @@ -219,6 +219,8 @@ public: static void load_translation_remaps(); static void clear_translation_remaps(); + static void clear_thread_load_tasks(); + static void set_load_callback(ResourceLoadedCallback p_callback); static ResourceLoaderImport import; diff --git a/core/io/stream_peer.h b/core/io/stream_peer.h index 108a8ce9d9..95cc655b45 100644 --- a/core/io/stream_peer.h +++ b/core/io/stream_peer.h @@ -105,16 +105,16 @@ protected: public: virtual Error put_data(const uint8_t *p_data, int p_bytes) override; - GDVIRTUAL3R(Error, _put_data, GDNativeConstPtr<const uint8_t>, int, GDNativePtr<int>); + GDVIRTUAL3R(Error, _put_data, GDExtensionConstPtr<const uint8_t>, int, GDExtensionPtr<int>); virtual Error put_partial_data(const uint8_t *p_data, int p_bytes, int &r_sent) override; - GDVIRTUAL3R(Error, _put_partial_data, GDNativeConstPtr<const uint8_t>, int, GDNativePtr<int>); + GDVIRTUAL3R(Error, _put_partial_data, GDExtensionConstPtr<const uint8_t>, int, GDExtensionPtr<int>); virtual Error get_data(uint8_t *p_buffer, int p_bytes) override; - GDVIRTUAL3R(Error, _get_data, GDNativePtr<uint8_t>, int, GDNativePtr<int>); + GDVIRTUAL3R(Error, _get_data, GDExtensionPtr<uint8_t>, int, GDExtensionPtr<int>); virtual Error get_partial_data(uint8_t *p_buffer, int p_bytes, int &r_received) override; - GDVIRTUAL3R(Error, _get_partial_data, GDNativePtr<uint8_t>, int, GDNativePtr<int>); + GDVIRTUAL3R(Error, _get_partial_data, GDExtensionPtr<uint8_t>, int, GDExtensionPtr<int>); EXBIND0RC(int, get_available_bytes); }; diff --git a/core/math/a_star_grid_2d.cpp b/core/math/a_star_grid_2d.cpp index c30acf32bb..968102e323 100644 --- a/core/math/a_star_grid_2d.cpp +++ b/core/math/a_star_grid_2d.cpp @@ -155,6 +155,19 @@ bool AStarGrid2D::is_point_solid(const Vector2i &p_id) const { return points[p_id.y][p_id.x].solid; } +void AStarGrid2D::set_point_weight_scale(const Vector2i &p_id, real_t p_weight_scale) { + ERR_FAIL_COND_MSG(dirty, "Grid is not initialized. Call the update method."); + ERR_FAIL_COND_MSG(!is_in_boundsv(p_id), vformat("Can't set point's weight scale. Point out of bounds (%s/%s, %s/%s).", p_id.x, size.width, p_id.y, size.height)); + ERR_FAIL_COND_MSG(p_weight_scale < 0.0, vformat("Can't set point's weight scale less than 0.0: %f.", p_weight_scale)); + points[p_id.y][p_id.x].weight_scale = p_weight_scale; +} + +real_t AStarGrid2D::get_point_weight_scale(const Vector2i &p_id) const { + ERR_FAIL_COND_V_MSG(dirty, 0, "Grid is not initialized. Call the update method."); + ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_id), 0, vformat("Can't get point's weight scale. Point out of bounds (%s/%s, %s/%s).", p_id.x, size.width, p_id.y, size.height)); + return points[p_id.y][p_id.x].weight_scale; +} + AStarGrid2D::Point *AStarGrid2D::_jump(Point *p_from, Point *p_to) { if (!p_to || p_to->solid) { return nullptr; @@ -388,7 +401,10 @@ bool AStarGrid2D::_solve(Point *p_begin_point, Point *p_end_point) { _get_nbors(p, nbors); for (List<Point *>::Element *E = nbors.front(); E; E = E->next()) { Point *e = E->get(); // The neighbour point. + real_t weight_scale = 1.0; + if (jumping_enabled) { + // TODO: Make it works with weight_scale. e = _jump(p, e); if (!e || e->closed_pass == pass) { continue; @@ -397,9 +413,10 @@ bool AStarGrid2D::_solve(Point *p_begin_point, Point *p_end_point) { if (e->solid || e->closed_pass == pass) { continue; } + weight_scale = e->weight_scale; } - real_t tentative_g_score = p->g_score + _compute_cost(p->id, e->id); + real_t tentative_g_score = p->g_score + _compute_cost(p->id, e->id) * weight_scale; bool new_point = false; if (e->open_pass != pass) { // The point wasn't inside the open list. @@ -446,6 +463,12 @@ void AStarGrid2D::clear() { size = Vector2i(); } +Vector2 AStarGrid2D::get_point_position(const Vector2i &p_id) const { + ERR_FAIL_COND_V_MSG(dirty, Vector2(), "Grid is not initialized. Call the update method."); + ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_id), Vector2(), vformat("Can't get point's position. Point out of bounds (%s/%s, %s/%s).", p_id.x, size.width, p_id.y, size.height)); + return points[p_id.y][p_id.x].pos; +} + Vector<Vector2> AStarGrid2D::get_point_path(const Vector2i &p_from_id, const Vector2i &p_to_id) { ERR_FAIL_COND_V_MSG(dirty, Vector<Vector2>(), "Grid is not initialized. Call the update method."); ERR_FAIL_COND_V_MSG(!is_in_boundsv(p_from_id), Vector<Vector2>(), vformat("Can't get id path. Point out of bounds (%s/%s, %s/%s)", p_from_id.x, size.width, p_from_id.y, size.height)); @@ -559,8 +582,11 @@ void AStarGrid2D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_default_heuristic"), &AStarGrid2D::get_default_heuristic); ClassDB::bind_method(D_METHOD("set_point_solid", "id", "solid"), &AStarGrid2D::set_point_solid, DEFVAL(true)); ClassDB::bind_method(D_METHOD("is_point_solid", "id"), &AStarGrid2D::is_point_solid); + ClassDB::bind_method(D_METHOD("set_point_weight_scale", "id", "weight_scale"), &AStarGrid2D::set_point_weight_scale); + ClassDB::bind_method(D_METHOD("get_point_weight_scale", "id"), &AStarGrid2D::get_point_weight_scale); ClassDB::bind_method(D_METHOD("clear"), &AStarGrid2D::clear); + ClassDB::bind_method(D_METHOD("get_point_position", "id"), &AStarGrid2D::get_point_position); ClassDB::bind_method(D_METHOD("get_point_path", "from_id", "to_id"), &AStarGrid2D::get_point_path); ClassDB::bind_method(D_METHOD("get_id_path", "from_id", "to_id"), &AStarGrid2D::get_id_path); diff --git a/core/math/a_star_grid_2d.h b/core/math/a_star_grid_2d.h index 1002f18738..3b39d46a20 100644 --- a/core/math/a_star_grid_2d.h +++ b/core/math/a_star_grid_2d.h @@ -72,6 +72,7 @@ private: bool solid = false; Vector2 pos; + real_t weight_scale = 1.0; // Used for pathfinding. Point *prev_point = nullptr; @@ -166,8 +167,12 @@ public: void set_point_solid(const Vector2i &p_id, bool p_solid = true); bool is_point_solid(const Vector2i &p_id) const; + void set_point_weight_scale(const Vector2i &p_id, real_t p_weight_scale); + real_t get_point_weight_scale(const Vector2i &p_id) const; + void clear(); + Vector2 get_point_position(const Vector2i &p_id) const; Vector<Vector2> get_point_path(const Vector2i &p_from, const Vector2i &p_to); TypedArray<Vector2i> get_id_path(const Vector2i &p_from, const Vector2i &p_to); }; diff --git a/core/math/convex_hull.cpp b/core/math/convex_hull.cpp index 561970d2ee..51d88d8ea0 100644 --- a/core/math/convex_hull.cpp +++ b/core/math/convex_hull.cpp @@ -2274,8 +2274,7 @@ Error ConvexHullComputer::convex_hull(const Vector<Vector3> &p_points, Geometry3 // Copy the edges over. There's two "half-edges" for every edge, so we pick only one of them. r_mesh.edges.resize(ch.edges.size() / 2); - OAHashMap<uint64_t, int32_t> edge_map; - edge_map.reserve(ch.edges.size() * 4); // The higher the capacity, the faster the insert + OAHashMap<uint64_t, int32_t> edge_map(ch.edges.size() * 4); // The higher the capacity, the faster the insert uint32_t edges_copied = 0; for (uint32_t i = 0; i < ch.edges.size(); i++) { diff --git a/core/math/math_defs.h b/core/math/math_defs.h index 759667e2d5..1058a47c1a 100644 --- a/core/math/math_defs.h +++ b/core/math/math_defs.h @@ -86,6 +86,7 @@ enum InlineAlignment { // Image alignment points. INLINE_ALIGNMENT_TOP_TO = 0b0000, INLINE_ALIGNMENT_CENTER_TO = 0b0001, + INLINE_ALIGNMENT_BASELINE_TO = 0b0011, INLINE_ALIGNMENT_BOTTOM_TO = 0b0010, INLINE_ALIGNMENT_IMAGE_MASK = 0b0011, diff --git a/core/math/projection.cpp b/core/math/projection.cpp index 9af388b081..c135e1946a 100644 --- a/core/math/projection.cpp +++ b/core/math/projection.cpp @@ -134,7 +134,7 @@ Projection Projection::create_for_hmd(int p_eye, real_t p_aspect, real_t p_intra Projection Projection::create_orthogonal(real_t p_left, real_t p_right, real_t p_bottom, real_t p_top, real_t p_znear, real_t p_zfar) { Projection proj; - proj.set_orthogonal(p_left, p_right, p_bottom, p_top, p_zfar, p_zfar); + proj.set_orthogonal(p_left, p_right, p_bottom, p_top, p_znear, p_zfar); return proj; } diff --git a/core/object/class_db.cpp b/core/object/class_db.cpp index ac6ad0fdd2..529d99ec9a 100644 --- a/core/object/class_db.cpp +++ b/core/object/class_db.cpp @@ -318,7 +318,7 @@ Object *ClassDB::instantiate(const StringName &p_class) { { OBJTYPE_RLOCK; ti = classes.getptr(p_class); - if (!ti || ti->disabled || !ti->creation_func || (ti->native_extension && !ti->native_extension->create_instance)) { + if (!ti || ti->disabled || !ti->creation_func || (ti->gdextension && !ti->gdextension->create_instance)) { if (compat_classes.has(p_class)) { ti = classes.getptr(compat_classes[p_class]); } @@ -333,8 +333,8 @@ Object *ClassDB::instantiate(const StringName &p_class) { return nullptr; } #endif - if (ti->native_extension && ti->native_extension->create_instance) { - return (Object *)ti->native_extension->create_instance(ti->native_extension->class_userdata); + if (ti->gdextension && ti->gdextension->create_instance) { + return (Object *)ti->gdextension->create_instance(ti->gdextension->class_userdata); } else { return ti->creation_func(); } @@ -346,17 +346,17 @@ void ClassDB::set_object_extension_instance(Object *p_object, const StringName & { OBJTYPE_RLOCK; ti = classes.getptr(p_class); - if (!ti || ti->disabled || !ti->creation_func || (ti->native_extension && !ti->native_extension->create_instance)) { + if (!ti || ti->disabled || !ti->creation_func || (ti->gdextension && !ti->gdextension->create_instance)) { if (compat_classes.has(p_class)) { ti = classes.getptr(compat_classes[p_class]); } } ERR_FAIL_COND_MSG(!ti, "Cannot get class '" + String(p_class) + "'."); ERR_FAIL_COND_MSG(ti->disabled, "Class '" + String(p_class) + "' is disabled."); - ERR_FAIL_COND_MSG(!ti->native_extension, "Class '" + String(p_class) + "' has no native extension."); + ERR_FAIL_COND_MSG(!ti->gdextension, "Class '" + String(p_class) + "' has no native extension."); } - p_object->_extension = ti->native_extension; + p_object->_extension = ti->gdextension; p_object->_extension_instance = p_instance; } @@ -370,7 +370,7 @@ bool ClassDB::can_instantiate(const StringName &p_class) { return false; } #endif - return (!ti->disabled && ti->creation_func != nullptr && !(ti->native_extension && !ti->native_extension->create_instance)); + return (!ti->disabled && ti->creation_func != nullptr && !(ti->gdextension && !ti->gdextension->create_instance)); } bool ClassDB::is_virtual(const StringName &p_class) { @@ -388,7 +388,7 @@ bool ClassDB::is_virtual(const StringName &p_class) { return false; } #endif - return (!ti->disabled && ti->creation_func != nullptr && !(ti->native_extension && !ti->native_extension->create_instance) && ti->is_virtual); + return (!ti->disabled && ti->creation_func != nullptr && !(ti->gdextension && !ti->gdextension->create_instance) && ti->is_virtual); } void ClassDB::_add_class2(const StringName &p_class, const StringName &p_inherits) { @@ -1522,7 +1522,7 @@ Variant ClassDB::class_get_default_property_value(const StringName &p_class, con return var; } -void ClassDB::register_extension_class(ObjectNativeExtension *p_extension) { +void ClassDB::register_extension_class(ObjectGDExtension *p_extension) { GLOBAL_LOCK_FUNCTION; ERR_FAIL_COND_MSG(classes.has(p_extension->class_name), "Class already registered: " + String(p_extension->class_name)); @@ -1532,7 +1532,7 @@ void ClassDB::register_extension_class(ObjectNativeExtension *p_extension) { ClassInfo c; c.api = p_extension->editor_class ? API_EDITOR_EXTENSION : API_EXTENSION; - c.native_extension = p_extension; + c.gdextension = p_extension; c.name = p_extension->class_name; c.is_virtual = p_extension->is_virtual; if (!p_extension->is_abstract) { diff --git a/core/object/class_db.h b/core/object/class_db.h index 5fba52e23e..4b60079298 100644 --- a/core/object/class_db.h +++ b/core/object/class_db.h @@ -100,7 +100,7 @@ public: ClassInfo *inherits_ptr = nullptr; void *class_ptr = nullptr; - ObjectNativeExtension *native_extension = nullptr; + ObjectGDExtension *gdextension = nullptr; HashMap<StringName, MethodBind *> method_map; HashMap<StringName, int64_t> constant_map; @@ -203,7 +203,7 @@ public: //nothing } - static void register_extension_class(ObjectNativeExtension *p_extension); + static void register_extension_class(ObjectGDExtension *p_extension); static void unregister_extension_class(const StringName &p_class); template <class T> diff --git a/core/object/make_virtuals.py b/core/object/make_virtuals.py index c92ac0961e..0ee95835a6 100644 --- a/core/object/make_virtuals.py +++ b/core/object/make_virtuals.py @@ -2,7 +2,7 @@ proto = """ #define GDVIRTUAL$VER($RET m_name $ARG) \\ StringName _gdvirtual_##m_name##_sn = #m_name;\\ mutable bool _gdvirtual_##m_name##_initialized = false;\\ -mutable GDNativeExtensionClassCallVirtual _gdvirtual_##m_name = nullptr;\\ +mutable GDExtensionClassCallVirtual _gdvirtual_##m_name = nullptr;\\ template<bool required>\\ _FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\ ScriptInstance *_script_instance = ((Object*)(this))->get_script_instance();\\ @@ -16,8 +16,8 @@ _FORCE_INLINE_ bool _gdvirtual_##m_name##_call($CALLARGS) $CONST { \\ } \\ }\\ if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\ - /* TODO: C-style cast because GDNativeStringNamePtr's const qualifier is broken (see https://github.com/godotengine/godot/pull/67751) */\\ - _gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, (GDNativeStringNamePtr)&_gdvirtual_##m_name##_sn) : (GDNativeExtensionClassCallVirtual) nullptr;\\ + /* TODO: C-style cast because GDExtensionStringNamePtr's const qualifier is broken (see https://github.com/godotengine/godot/pull/67751) */\\ + _gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, (GDExtensionStringNamePtr)&_gdvirtual_##m_name##_sn) : (GDExtensionClassCallVirtual) nullptr;\\ _gdvirtual_##m_name##_initialized = true;\\ }\\ if (_gdvirtual_##m_name) {\\ @@ -41,8 +41,8 @@ _FORCE_INLINE_ bool _gdvirtual_##m_name##_overridden() const { \\ return _script_instance->has_method(_gdvirtual_##m_name##_sn);\\ }\\ if (unlikely(_get_extension() && !_gdvirtual_##m_name##_initialized)) {\\ - /* TODO: C-style cast because GDNativeStringNamePtr's const qualifier is broken (see https://github.com/godotengine/godot/pull/67751) */\\ - _gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, (GDNativeStringNamePtr)&_gdvirtual_##m_name##_sn) : (GDNativeExtensionClassCallVirtual) nullptr;\\ + /* TODO: C-style cast because GDExtensionStringNamePtr's const qualifier is broken (see https://github.com/godotengine/godot/pull/67751) */\\ + _gdvirtual_##m_name = (_get_extension() && _get_extension()->get_virtual) ? _get_extension()->get_virtual(_get_extension()->class_userdata, (GDExtensionStringNamePtr)&_gdvirtual_##m_name##_sn) : (GDExtensionClassCallVirtual) nullptr;\\ _gdvirtual_##m_name##_initialized = true;\\ }\\ if (_gdvirtual_##m_name) {\\ @@ -94,7 +94,7 @@ def generate_version(argcount, const=False, returns=False): argtext += ", " callsiargs = "Variant vargs[" + str(argcount) + "]={" callsiargptrs = "\t\tconst Variant *vargptrs[" + str(argcount) + "]={" - callptrargsptr = "\t\tGDNativeConstTypePtr argptrs[" + str(argcount) + "]={" + callptrargsptr = "\t\tGDExtensionConstTypePtr argptrs[" + str(argcount) + "]={" callptrargs = "" for i in range(argcount): if i > 0: @@ -121,7 +121,7 @@ def generate_version(argcount, const=False, returns=False): s = s.replace("$CALLSIARGPASS", "(const Variant **)vargptrs," + str(argcount)) callptrargsptr += "};\\\n" s = s.replace("$CALLPTRARGS", callptrargs + callptrargsptr) - s = s.replace("$CALLPTRARGPASS", "reinterpret_cast<GDNativeConstTypePtr*>(argptrs)") + s = s.replace("$CALLPTRARGPASS", "reinterpret_cast<GDExtensionConstTypePtr*>(argptrs)") else: s = s.replace("$CALLSIARGS", "") s = s.replace("$CALLSIARGPASS", "nullptr, 0") diff --git a/core/object/object.cpp b/core/object/object.cpp index 105f9560d6..cfac36127c 100644 --- a/core/object/object.cpp +++ b/core/object/object.cpp @@ -233,7 +233,7 @@ void Object::set(const StringName &p_name, const Variant &p_value, bool *r_valid #pragma GCC diagnostic push #pragma GCC diagnostic ignored "-Wignored-qualifiers" #endif - if (_extension->set(_extension_instance, (const GDNativeStringNamePtr)&p_name, (const GDNativeVariantPtr)&p_value)) { + if (_extension->set(_extension_instance, (const GDExtensionStringNamePtr)&p_name, (const GDExtensionVariantPtr)&p_value)) { if (r_valid) { *r_valid = true; } @@ -321,7 +321,7 @@ Variant Object::get(const StringName &p_name, bool *r_valid) const { #pragma GCC diagnostic ignored "-Wignored-qualifiers" #endif - if (_extension->get(_extension_instance, (const GDNativeStringNamePtr)&p_name, (GDNativeVariantPtr)&ret)) { + if (_extension->get(_extension_instance, (const GDExtensionStringNamePtr)&p_name, (GDExtensionVariantPtr)&ret)) { if (r_valid) { *r_valid = true; } @@ -477,7 +477,7 @@ void Object::get_property_list(List<PropertyInfo> *p_list, bool p_reversed) cons } if (_extension) { - const ObjectNativeExtension *current_extension = _extension; + const ObjectGDExtension *current_extension = _extension; while (current_extension) { p_list->push_back(PropertyInfo(Variant::NIL, current_extension->class_name, PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY)); ClassDB::get_property_list(current_extension->class_name, p_list, true, this); @@ -487,7 +487,7 @@ void Object::get_property_list(List<PropertyInfo> *p_list, bool p_reversed) cons if (_extension && _extension->get_property_list) { uint32_t pcount; - const GDNativePropertyInfo *pinfo = _extension->get_property_list(_extension_instance, &pcount); + const GDExtensionPropertyInfo *pinfo = _extension->get_property_list(_extension_instance, &pcount); for (uint32_t i = 0; i < pcount; i++) { p_list->push_back(PropertyInfo(pinfo[i])); } @@ -533,7 +533,7 @@ bool Object::property_can_revert(const StringName &p_name) const { #pragma GCC diagnostic ignored "-Wignored-qualifiers" #endif if (_extension && _extension->property_can_revert) { - if (_extension->property_can_revert(_extension_instance, (const GDNativeStringNamePtr)&p_name)) { + if (_extension->property_can_revert(_extension_instance, (const GDExtensionStringNamePtr)&p_name)) { return true; } } @@ -559,7 +559,7 @@ Variant Object::property_get_revert(const StringName &p_name) const { #pragma GCC diagnostic ignored "-Wignored-qualifiers" #endif if (_extension && _extension->property_get_revert) { - if (_extension->property_get_revert(_extension_instance, (const GDNativeStringNamePtr)&p_name, (GDNativeVariantPtr)&ret)) { + if (_extension->property_get_revert(_extension_instance, (const GDExtensionStringNamePtr)&p_name, (GDExtensionVariantPtr)&ret)) { return ret; } } @@ -808,7 +808,7 @@ String Object::to_string() { } if (_extension && _extension->to_string) { String ret; - GDNativeBool is_valid; + GDExtensionBool is_valid; _extension->to_string(_extension_instance, &is_valid, &ret); return ret; } @@ -1701,7 +1701,7 @@ uint32_t Object::get_edited_version() const { } #endif -void Object::set_instance_binding(void *p_token, void *p_binding, const GDNativeInstanceBindingCallbacks *p_callbacks) { +void Object::set_instance_binding(void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks) { // This is only meant to be used on creation by the binder. ERR_FAIL_COND(_instance_bindings != nullptr); _instance_bindings = (InstanceBinding *)memalloc(sizeof(InstanceBinding)); @@ -1712,7 +1712,7 @@ void Object::set_instance_binding(void *p_token, void *p_binding, const GDNative _instance_binding_count = 1; } -void *Object::get_instance_binding(void *p_token, const GDNativeInstanceBindingCallbacks *p_callbacks) { +void *Object::get_instance_binding(void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks) { void *binding = nullptr; _instance_binding_mutex.lock(); for (uint32_t i = 0; i < _instance_binding_count; i++) { diff --git a/core/object/object.h b/core/object/object.h index 3ad8391dd6..d52cf7d62e 100644 --- a/core/object/object.h +++ b/core/object/object.h @@ -31,7 +31,7 @@ #ifndef OBJECT_H #define OBJECT_H -#include "core/extension/gdnative_interface.h" +#include "core/extension/gdextension_interface.h" #include "core/object/message_queue.h" #include "core/object/object_id.h" #include "core/os/rw_lock.h" @@ -191,7 +191,7 @@ struct PropertyInfo { type(Variant::OBJECT), class_name(p_class_name) {} - explicit PropertyInfo(const GDNativePropertyInfo &pinfo) : + explicit PropertyInfo(const GDExtensionPropertyInfo &pinfo) : type((Variant::Type)pinfo.type), name(*reinterpret_cast<StringName *>(pinfo.name)), class_name(*reinterpret_cast<StringName *>(pinfo.class_name)), @@ -243,7 +243,7 @@ struct MethodInfo { MethodInfo() {} - explicit MethodInfo(const GDNativeMethodInfo &pinfo) : + explicit MethodInfo(const GDExtensionMethodInfo &pinfo) : name(*reinterpret_cast<StringName *>(pinfo.name)), return_val(PropertyInfo(pinfo.return_value)), flags(pinfo.flags), @@ -301,31 +301,31 @@ struct MethodInfo { } }; -// API used to extend in GDNative and other C compatible compiled languages. +// API used to extend in GDExtension and other C compatible compiled languages. class MethodBind; -struct ObjectNativeExtension { - ObjectNativeExtension *parent = nullptr; - List<ObjectNativeExtension *> children; +struct ObjectGDExtension { + ObjectGDExtension *parent = nullptr; + List<ObjectGDExtension *> children; StringName parent_class_name; StringName class_name; bool editor_class = false; bool is_virtual = false; bool is_abstract = false; - GDNativeExtensionClassSet set; - GDNativeExtensionClassGet get; - GDNativeExtensionClassGetPropertyList get_property_list; - GDNativeExtensionClassFreePropertyList free_property_list; - GDNativeExtensionClassPropertyCanRevert property_can_revert; - GDNativeExtensionClassPropertyGetRevert property_get_revert; - GDNativeExtensionClassNotification notification; - GDNativeExtensionClassToString to_string; - GDNativeExtensionClassReference reference; - GDNativeExtensionClassReference unreference; - GDNativeExtensionClassGetRID get_rid; + GDExtensionClassSet set; + GDExtensionClassGet get; + GDExtensionClassGetPropertyList get_property_list; + GDExtensionClassFreePropertyList free_property_list; + GDExtensionClassPropertyCanRevert property_can_revert; + GDExtensionClassPropertyGetRevert property_get_revert; + GDExtensionClassNotification notification; + GDExtensionClassToString to_string; + GDExtensionClassReference reference; + GDExtensionClassReference unreference; + GDExtensionClassGetRID get_rid; _FORCE_INLINE_ bool is_class(const String &p_class) const { - const ObjectNativeExtension *e = this; + const ObjectGDExtension *e = this; while (e) { if (p_class == e->class_name.operator String()) { return true; @@ -336,9 +336,9 @@ struct ObjectNativeExtension { } void *class_userdata = nullptr; - GDNativeExtensionClassCreateInstance create_instance; - GDNativeExtensionClassFreeInstance free_instance; - GDNativeExtensionClassGetVirtual get_virtual; + GDExtensionClassCreateInstance create_instance; + GDExtensionClassFreeInstance free_instance; + GDExtensionClassGetVirtual get_virtual; }; #define GDVIRTUAL_CALL(m_name, ...) _gdvirtual_##m_name##_call<false>(__VA_ARGS__) @@ -556,6 +556,7 @@ public: CONNECT_PERSIST = 2, // hint for scene to save this connection CONNECT_ONE_SHOT = 4, CONNECT_REFERENCE_COUNTED = 8, + CONNECT_INHERITED = 16, // Used in editor builds. }; struct Connection { @@ -578,7 +579,7 @@ private: friend bool predelete_handler(Object *); friend void postinitialize_handler(Object *); - ObjectNativeExtension *_extension = nullptr; + ObjectGDExtension *_extension = nullptr; GDExtensionClassInstancePtr _extension_instance = nullptr; struct SignalData { @@ -636,8 +637,8 @@ private: struct InstanceBinding { void *binding = nullptr; void *token = nullptr; - GDNativeInstanceBindingFreeCallback free_callback = nullptr; - GDNativeInstanceBindingReferenceCallback reference_callback = nullptr; + GDExtensionInstanceBindingFreeCallback free_callback = nullptr; + GDExtensionInstanceBindingReferenceCallback reference_callback = nullptr; }; InstanceBinding *_instance_bindings = nullptr; uint32_t _instance_binding_count = 0; @@ -661,8 +662,8 @@ protected: return can_die; } - friend class NativeExtensionMethodBind; - _ALWAYS_INLINE_ const ObjectNativeExtension *_get_extension() const { return _extension; } + friend class GDExtensionMethodBind; + _ALWAYS_INLINE_ const ObjectGDExtension *_get_extension() const { return _extension; } _ALWAYS_INLINE_ GDExtensionClassInstancePtr _get_extension_instance() const { return _extension_instance; } virtual void _initialize_classv() { initialize_class(); } virtual bool _setv(const StringName &p_name, const Variant &p_property) { return false; }; @@ -916,9 +917,9 @@ public: #endif // Used by script languages to store binding data. - void *get_instance_binding(void *p_token, const GDNativeInstanceBindingCallbacks *p_callbacks); + void *get_instance_binding(void *p_token, const GDExtensionInstanceBindingCallbacks *p_callbacks); // Used on creation by binding only. - void set_instance_binding(void *p_token, void *p_binding, const GDNativeInstanceBindingCallbacks *p_callbacks); + void set_instance_binding(void *p_token, void *p_binding, const GDExtensionInstanceBindingCallbacks *p_callbacks); bool has_instance_binding(void *p_token); void clear_internal_resource_paths(); diff --git a/core/object/ref_counted.h b/core/object/ref_counted.h index 71790fb825..411c589739 100644 --- a/core/object/ref_counted.h +++ b/core/object/ref_counted.h @@ -253,12 +253,14 @@ public: template <class T> struct PtrToArg<Ref<T>> { _FORCE_INLINE_ static Ref<T> convert(const void *p_ptr) { + // p_ptr points to a RefCounted object return Ref<T>(const_cast<T *>(reinterpret_cast<const T *>(p_ptr))); } typedef Ref<T> EncodeT; _FORCE_INLINE_ static void encode(Ref<T> p_val, const void *p_ptr) { + // p_ptr points to an EncodeT object which is a Ref<T> object. *(const_cast<Ref<RefCounted> *>(reinterpret_cast<const Ref<RefCounted> *>(p_ptr))) = p_val; } }; @@ -268,6 +270,7 @@ struct PtrToArg<const Ref<T> &> { typedef Ref<T> EncodeT; _FORCE_INLINE_ static Ref<T> convert(const void *p_ptr) { + // p_ptr points to a RefCounted object return Ref<T>((T *)p_ptr); } }; diff --git a/core/object/script_language_extension.h b/core/object/script_language_extension.h index 5262c41644..0ecd98152a 100644 --- a/core/object/script_language_extension.h +++ b/core/object/script_language_extension.h @@ -43,7 +43,7 @@ class ScriptExtension : public Script { protected: EXBIND0R(bool, editor_can_reload_from_file) - GDVIRTUAL1(_placeholder_erased, GDNativePtr<void>) + GDVIRTUAL1(_placeholder_erased, GDExtensionPtr<void>) virtual void _placeholder_erased(PlaceHolderScriptInstance *p_placeholder) override { GDVIRTUAL_CALL(_placeholder_erased, p_placeholder); } @@ -56,15 +56,15 @@ public: EXBIND1RC(bool, inherits_script, const Ref<Script> &) EXBIND0RC(StringName, get_instance_base_type) - GDVIRTUAL1RC(GDNativePtr<void>, _instance_create, Object *) + GDVIRTUAL1RC(GDExtensionPtr<void>, _instance_create, Object *) virtual ScriptInstance *instance_create(Object *p_this) override { - GDNativePtr<void> ret = nullptr; + GDExtensionPtr<void> ret = nullptr; GDVIRTUAL_REQUIRED_CALL(_instance_create, p_this, ret); return reinterpret_cast<ScriptInstance *>(ret.operator void *()); } - GDVIRTUAL1RC(GDNativePtr<void>, _placeholder_instance_create, Object *) + GDVIRTUAL1RC(GDExtensionPtr<void>, _placeholder_instance_create, Object *) PlaceHolderScriptInstance *placeholder_instance_create(Object *p_this) override { - GDNativePtr<void> ret = nullptr; + GDExtensionPtr<void> ret = nullptr; GDVIRTUAL_REQUIRED_CALL(_placeholder_instance_create, p_this, ret); return reinterpret_cast<PlaceHolderScriptInstance *>(ret.operator void *()); } @@ -482,10 +482,10 @@ public: } } } - GDVIRTUAL1R(GDNativePtr<void>, _debug_get_stack_level_instance, int) + GDVIRTUAL1R(GDExtensionPtr<void>, _debug_get_stack_level_instance, int) virtual ScriptInstance *debug_get_stack_level_instance(int p_level) override { - GDNativePtr<void> ret = nullptr; + GDExtensionPtr<void> ret = nullptr; GDVIRTUAL_REQUIRED_CALL(_debug_get_stack_level_instance, p_level, ret); return reinterpret_cast<ScriptInstance *>(ret.operator void *()); } @@ -578,7 +578,7 @@ public: EXBIND0(profiling_start) EXBIND0(profiling_stop) - GDVIRTUAL2R(int, _profiling_get_accumulated_data, GDNativePtr<ScriptLanguageExtensionProfilingInfo>, int) + GDVIRTUAL2R(int, _profiling_get_accumulated_data, GDExtensionPtr<ScriptLanguageExtensionProfilingInfo>, int) virtual int profiling_get_accumulated_data(ProfilingInfo *p_info_arr, int p_info_max) override { int ret = 0; @@ -586,7 +586,7 @@ public: return ret; } - GDVIRTUAL2R(int, _profiling_get_frame_data, GDNativePtr<ScriptLanguageExtensionProfilingInfo>, int) + GDVIRTUAL2R(int, _profiling_get_frame_data, GDExtensionPtr<ScriptLanguageExtensionProfilingInfo>, int) virtual int profiling_get_frame_data(ProfilingInfo *p_info_arr, int p_info_max) override { int ret = 0; @@ -594,15 +594,15 @@ public: return ret; } - GDVIRTUAL1R(GDNativePtr<void>, _alloc_instance_binding_data, Object *) + GDVIRTUAL1R(GDExtensionPtr<void>, _alloc_instance_binding_data, Object *) virtual void *alloc_instance_binding_data(Object *p_object) override { - GDNativePtr<void> ret = nullptr; + GDExtensionPtr<void> ret = nullptr; GDVIRTUAL_REQUIRED_CALL(_alloc_instance_binding_data, p_object, ret); return ret.operator void *(); } - GDVIRTUAL1(_free_instance_binding_data, GDNativePtr<void>) + GDVIRTUAL1(_free_instance_binding_data, GDExtensionPtr<void>) virtual void free_instance_binding_data(void *p_data) override { GDVIRTUAL_REQUIRED_CALL(_free_instance_binding_data, p_data); @@ -639,8 +639,8 @@ VARIANT_ENUM_CAST(ScriptLanguageExtension::CodeCompletionLocation) class ScriptInstanceExtension : public ScriptInstance { public: - const GDNativeExtensionScriptInstanceInfo *native_info; - GDNativeExtensionScriptInstanceDataPtr instance = nullptr; + const GDExtensionScriptInstanceInfo *native_info; + GDExtensionScriptInstanceDataPtr instance = nullptr; // There should not be warnings on explicit casts. #if defined(__GNUC__) && !defined(__clang__) @@ -650,20 +650,20 @@ public: virtual bool set(const StringName &p_name, const Variant &p_value) override { if (native_info->set_func) { - return native_info->set_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeConstVariantPtr)&p_value); + return native_info->set_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionConstVariantPtr)&p_value); } return false; } virtual bool get(const StringName &p_name, Variant &r_ret) const override { if (native_info->get_func) { - return native_info->get_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeVariantPtr)&r_ret); + return native_info->get_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionVariantPtr)&r_ret); } return false; } virtual void get_property_list(List<PropertyInfo> *p_list) const override { if (native_info->get_property_list_func) { uint32_t pcount; - const GDNativePropertyInfo *pinfo = native_info->get_property_list_func(instance, &pcount); + const GDExtensionPropertyInfo *pinfo = native_info->get_property_list_func(instance, &pcount); #ifdef TOOLS_ENABLED Ref<Script> script = get_script(); @@ -682,8 +682,8 @@ public: } virtual Variant::Type get_property_type(const StringName &p_name, bool *r_is_valid = nullptr) const override { if (native_info->get_property_type_func) { - GDNativeBool is_valid = 0; - GDNativeVariantType type = native_info->get_property_type_func(instance, (GDNativeConstStringNamePtr)&p_name, &is_valid); + GDExtensionBool is_valid = 0; + GDExtensionVariantType type = native_info->get_property_type_func(instance, (GDExtensionConstStringNamePtr)&p_name, &is_valid); if (r_is_valid) { *r_is_valid = is_valid != 0; } @@ -694,13 +694,13 @@ public: virtual bool property_can_revert(const StringName &p_name) const override { if (native_info->property_can_revert_func) { - return native_info->property_can_revert_func(instance, (GDNativeConstStringNamePtr)&p_name); + return native_info->property_can_revert_func(instance, (GDExtensionConstStringNamePtr)&p_name); } return false; } virtual bool property_get_revert(const StringName &p_name, Variant &r_ret) const override { if (native_info->property_get_revert_func) { - return native_info->property_get_revert_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeVariantPtr)&r_ret); + return native_info->property_get_revert_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionVariantPtr)&r_ret); } return false; } @@ -711,7 +711,7 @@ public: } return nullptr; } - static void _add_property_with_state(GDNativeConstStringNamePtr p_name, GDNativeConstVariantPtr p_value, void *p_userdata) { + static void _add_property_with_state(GDExtensionConstStringNamePtr p_name, GDExtensionConstVariantPtr p_value, void *p_userdata) { List<Pair<StringName, Variant>> *state = (List<Pair<StringName, Variant>> *)p_userdata; state->push_back(Pair<StringName, Variant>(*(const StringName *)p_name, *(const Variant *)p_value)); } @@ -724,7 +724,7 @@ public: virtual void get_method_list(List<MethodInfo> *p_list) const override { if (native_info->get_method_list_func) { uint32_t mcount; - const GDNativeMethodInfo *minfo = native_info->get_method_list_func(instance, &mcount); + const GDExtensionMethodInfo *minfo = native_info->get_method_list_func(instance, &mcount); for (uint32_t i = 0; i < mcount; i++) { p_list->push_back(MethodInfo(minfo[i])); } @@ -735,7 +735,7 @@ public: } virtual bool has_method(const StringName &p_method) const override { if (native_info->has_method_func) { - return native_info->has_method_func(instance, (GDNativeStringNamePtr)&p_method); + return native_info->has_method_func(instance, (GDExtensionStringNamePtr)&p_method); } return false; } @@ -743,8 +743,8 @@ public: virtual Variant callp(const StringName &p_method, const Variant **p_args, int p_argcount, Callable::CallError &r_error) override { Variant ret; if (native_info->call_func) { - GDNativeCallError ce; - native_info->call_func(instance, (GDNativeConstStringNamePtr)&p_method, (GDNativeConstVariantPtr *)p_args, p_argcount, (GDNativeVariantPtr)&ret, &ce); + GDExtensionCallError ce; + native_info->call_func(instance, (GDExtensionConstStringNamePtr)&p_method, (GDExtensionConstVariantPtr *)p_args, p_argcount, (GDExtensionVariantPtr)&ret, &ce); r_error.error = Callable::CallError::Error(ce.error); r_error.argument = ce.argument; r_error.expected = ce.expected; @@ -759,9 +759,9 @@ public: } virtual String to_string(bool *r_valid) override { if (native_info->to_string_func) { - GDNativeBool valid; + GDExtensionBool valid; String ret; - native_info->to_string_func(instance, &valid, reinterpret_cast<GDNativeStringPtr>(&ret)); + native_info->to_string_func(instance, &valid, reinterpret_cast<GDExtensionStringPtr>(&ret)); if (r_valid) { *r_valid = valid != 0; } @@ -784,7 +784,7 @@ public: virtual Ref<Script> get_script() const override { if (native_info->get_script_func) { - GDNativeObjectPtr script = native_info->get_script_func(instance); + GDExtensionObjectPtr script = native_info->get_script_func(instance); return Ref<Script>(reinterpret_cast<Script *>(script)); } return Ref<Script>(); @@ -799,7 +799,7 @@ public: virtual void property_set_fallback(const StringName &p_name, const Variant &p_value, bool *r_valid) override { if (native_info->set_fallback_func) { - bool ret = native_info->set_fallback_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeConstVariantPtr)&p_value); + bool ret = native_info->set_fallback_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionConstVariantPtr)&p_value); if (r_valid) { *r_valid = ret; } @@ -808,7 +808,7 @@ public: virtual Variant property_get_fallback(const StringName &p_name, bool *r_valid) override { Variant ret; if (native_info->get_fallback_func) { - bool valid = native_info->get_fallback_func(instance, (GDNativeConstStringNamePtr)&p_name, (GDNativeVariantPtr)&ret); + bool valid = native_info->get_fallback_func(instance, (GDExtensionConstStringNamePtr)&p_name, (GDExtensionVariantPtr)&ret); if (r_valid) { *r_valid = valid; } @@ -818,7 +818,7 @@ public: virtual ScriptLanguage *get_language() override { if (native_info->get_language_func) { - GDNativeExtensionScriptLanguagePtr lang = native_info->get_language_func(instance); + GDExtensionScriptLanguagePtr lang = native_info->get_language_func(instance); return reinterpret_cast<ScriptLanguage *>(lang); } return nullptr; diff --git a/core/os/os.cpp b/core/os/os.cpp index 055385579f..6b199e883f 100644 --- a/core/os/os.cpp +++ b/core/os/os.cpp @@ -155,10 +155,6 @@ int OS::get_process_id() const { return -1; } -void OS::vibrate_handheld(int p_duration_ms) { - WARN_PRINT("vibrate_handheld() only works with Android, iOS and Web"); -} - bool OS::is_stdout_verbose() const { return _verbose_stdout; } @@ -374,6 +370,16 @@ bool OS::has_feature(const String &p_feature) { #endif // DEBUG_ENABLED #endif // TOOLS_ENABLED +#ifdef REAL_T_IS_DOUBLE + if (p_feature == "double") { + return true; + } +#else + if (p_feature == "single") { + return true; + } +#endif // REAL_T_IS_DOUBLE + if (sizeof(void *) == 8 && p_feature == "64") { return true; } diff --git a/core/os/os.h b/core/os/os.h index 72a91f318a..07e9020a51 100644 --- a/core/os/os.h +++ b/core/os/os.h @@ -159,7 +159,7 @@ public: virtual Error kill(const ProcessID &p_pid) = 0; virtual int get_process_id() const; virtual bool is_process_running(const ProcessID &p_pid) const = 0; - virtual void vibrate_handheld(int p_duration_ms = 500); + virtual void vibrate_handheld(int p_duration_ms = 500) {} virtual Error shell_open(String p_uri); virtual Error set_cwd(const String &p_cwd); diff --git a/core/register_core_types.cpp b/core/register_core_types.cpp index 2e144a4c9a..7a7e45f752 100644 --- a/core/register_core_types.cpp +++ b/core/register_core_types.cpp @@ -38,8 +38,8 @@ #include "core/crypto/crypto.h" #include "core/crypto/hashing_context.h" #include "core/debugger/engine_profiler.h" -#include "core/extension/native_extension.h" -#include "core/extension/native_extension_manager.h" +#include "core/extension/gdextension.h" +#include "core/extension/gdextension_manager.h" #include "core/input/input.h" #include "core/input/input_map.h" #include "core/input/shortcut.h" @@ -88,7 +88,7 @@ static Ref<ResourceFormatLoaderImage> resource_format_image; static Ref<TranslationLoaderPO> resource_format_po; static Ref<ResourceFormatSaverCrypto> resource_format_saver_crypto; static Ref<ResourceFormatLoaderCrypto> resource_format_loader_crypto; -static Ref<NativeExtensionResourceLoader> resource_loader_native_extension; +static Ref<GDExtensionResourceLoader> resource_loader_gdextension; static Ref<ResourceFormatSaverJSON> resource_saver_json; static Ref<ResourceFormatLoaderJSON> resource_loader_json; @@ -109,7 +109,7 @@ static WorkerThreadPool *worker_thread_pool = nullptr; extern Mutex _global_mutex; -static NativeExtensionManager *native_extension_manager = nullptr; +static GDExtensionManager *gdextension_manager = nullptr; extern void register_global_constants(); extern void unregister_global_constants(); @@ -256,9 +256,9 @@ void register_core_types() { GDREGISTER_CLASS(ImageFormatLoaderExtension); GDREGISTER_ABSTRACT_CLASS(ResourceImporter); - GDREGISTER_CLASS(NativeExtension); + GDREGISTER_CLASS(GDExtension); - GDREGISTER_ABSTRACT_CLASS(NativeExtensionManager); + GDREGISTER_ABSTRACT_CLASS(GDExtensionManager); GDREGISTER_ABSTRACT_CLASS(ResourceUID); @@ -266,10 +266,10 @@ void register_core_types() { resource_uid = memnew(ResourceUID); - native_extension_manager = memnew(NativeExtensionManager); + gdextension_manager = memnew(GDExtensionManager); - resource_loader_native_extension.instantiate(); - ResourceLoader::add_resource_format_loader(resource_loader_native_extension); + resource_loader_gdextension.instantiate(); + ResourceLoader::add_resource_format_loader(resource_loader_gdextension); ip = IP::create(); @@ -344,27 +344,27 @@ void register_core_singletons() { Engine::get_singleton()->add_singleton(Engine::Singleton("InputMap", InputMap::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("EngineDebugger", core_bind::EngineDebugger::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("Time", Time::get_singleton())); - Engine::get_singleton()->add_singleton(Engine::Singleton("NativeExtensionManager", NativeExtensionManager::get_singleton())); + Engine::get_singleton()->add_singleton(Engine::Singleton("GDExtensionManager", GDExtensionManager::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("ResourceUID", ResourceUID::get_singleton())); Engine::get_singleton()->add_singleton(Engine::Singleton("WorkerThreadPool", worker_thread_pool)); } void register_core_extensions() { // Hardcoded for now. - NativeExtension::initialize_native_extensions(); - native_extension_manager->load_extensions(); - native_extension_manager->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_CORE); + GDExtension::initialize_gdextensions(); + gdextension_manager->load_extensions(); + gdextension_manager->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_CORE); _is_core_extensions_registered = true; } void unregister_core_extensions() { if (_is_core_extensions_registered) { - native_extension_manager->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_CORE); + gdextension_manager->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_CORE); } } void unregister_core_types() { - memdelete(native_extension_manager); + memdelete(gdextension_manager); memdelete(resource_uid); memdelete(_resource_loader); @@ -410,8 +410,8 @@ void unregister_core_types() { memdelete(ip); } - ResourceLoader::remove_resource_format_loader(resource_loader_native_extension); - resource_loader_native_extension.unref(); + ResourceLoader::remove_resource_format_loader(resource_loader_gdextension); + resource_loader_gdextension.unref(); ResourceLoader::finalize(); diff --git a/core/string/string_name.cpp b/core/string/string_name.cpp index 9c4fc4e1b7..64d49b8b93 100644 --- a/core/string/string_name.cpp +++ b/core/string/string_name.cpp @@ -169,6 +169,10 @@ bool StringName::operator!=(const String &p_name) const { return !(operator==(p_name)); } +bool StringName::operator!=(const char *p_name) const { + return !(operator==(p_name)); +} + bool StringName::operator!=(const StringName &p_name) const { // the real magic of all this mess happens here. // this is why path comparisons are very fast diff --git a/core/string/string_name.h b/core/string/string_name.h index ff4c41af94..6a2420e02a 100644 --- a/core/string/string_name.h +++ b/core/string/string_name.h @@ -102,6 +102,7 @@ public: bool operator==(const String &p_name) const; bool operator==(const char *p_name) const; bool operator!=(const String &p_name) const; + bool operator!=(const char *p_name) const; _FORCE_INLINE_ bool is_node_unique_name() const { if (!_data) { diff --git a/core/string/ustring.cpp b/core/string/ustring.cpp index 4e26b61334..adab6d07c7 100644 --- a/core/string/ustring.cpp +++ b/core/string/ustring.cpp @@ -220,37 +220,6 @@ void CharString::copy_from(const char *p_cstr) { /* String */ /*************************************************************************/ -//kind of poor should be rewritten properly -String String::word_wrap(int p_chars_per_line) const { - int from = 0; - int last_space = 0; - String ret; - for (int i = 0; i < length(); i++) { - if (i - from >= p_chars_per_line) { - if (last_space == -1) { - ret += substr(from, i - from + 1) + "\n"; - } else { - ret += substr(from, last_space - from) + "\n"; - i = last_space; //rewind - } - from = i + 1; - last_space = -1; - } else if (operator[](i) == ' ' || operator[](i) == '\t') { - last_space = i; - } else if (operator[](i) == '\n') { - ret += substr(from, i - from) + "\n"; - from = i + 1; - last_space = -1; - } - } - - if (from < length()) { - ret += substr(from, length()); - } - - return ret; -} - Error String::parse_url(String &r_scheme, String &r_host, int &r_port, String &r_path) const { // Splits the URL into scheme, host, port, path. Strip credentials when present. String base = *this; diff --git a/core/string/ustring.h b/core/string/ustring.h index ed3848fb8a..559f679f0f 100644 --- a/core/string/ustring.h +++ b/core/string/ustring.h @@ -425,7 +425,6 @@ public: String c_escape_multiline() const; String c_unescape() const; String json_escape() const; - String word_wrap(int p_chars_per_line) const; Error parse_url(String &r_scheme, String &r_host, int &r_port, String &r_path) const; String property_name_encode() const; diff --git a/core/variant/array.cpp b/core/variant/array.cpp index 6c4e8ba450..53891a9823 100644 --- a/core/variant/array.cpp +++ b/core/variant/array.cpp @@ -38,6 +38,7 @@ #include "core/templates/search_array.h" #include "core/templates/vector.h" #include "core/variant/callable.h" +#include "core/variant/dictionary.h" #include "core/variant/variant.h" class ArrayPrivate { @@ -201,16 +202,21 @@ uint32_t Array::recursive_hash(int recursion_count) const { } bool Array::_assign(const Array &p_array) { + bool can_convert = p_array._p->typed.type == Variant::NIL; + can_convert |= _p->typed.type == Variant::STRING && p_array._p->typed.type == Variant::STRING_NAME; + can_convert |= _p->typed.type == Variant::STRING_NAME && p_array._p->typed.type == Variant::STRING; + if (_p->typed.type != Variant::OBJECT && _p->typed.type == p_array._p->typed.type) { //same type or untyped, just reference, should be fine _ref(p_array); } else if (_p->typed.type == Variant::NIL) { //from typed to untyped, must copy, but this is cheap anyway _p->array = p_array._p->array; - } else if (p_array._p->typed.type == Variant::NIL) { //from untyped to typed, must try to check if they are all valid + } else if (can_convert) { //from untyped to typed, must try to check if they are all valid if (_p->typed.type == Variant::OBJECT) { //for objects, it needs full validation, either can be converted or fail for (int i = 0; i < p_array._p->array.size(); i++) { - if (!_p->typed.validate(p_array._p->array[i], "assign")) { + const Variant &element = p_array._p->array[i]; + if (element.get_type() != Variant::OBJECT || !_p->typed.validate_object(element, "assign")) { return false; } } @@ -255,16 +261,20 @@ void Array::operator=(const Array &p_array) { void Array::push_back(const Variant &p_value) { ERR_FAIL_COND_MSG(_p->read_only, "Array is in read-only state."); - ERR_FAIL_COND(!_p->typed.validate(p_value, "push_back")); - _p->array.push_back(p_value); + Variant value = p_value; + ERR_FAIL_COND(!_p->typed.validate(value, "push_back")); + _p->array.push_back(value); } void Array::append_array(const Array &p_array) { ERR_FAIL_COND_MSG(_p->read_only, "Array is in read-only state."); - for (int i = 0; i < p_array.size(); ++i) { - ERR_FAIL_COND(!_p->typed.validate(p_array[i], "append_array")); + + Vector<Variant> validated_array = p_array._p->array; + for (int i = 0; i < validated_array.size(); ++i) { + ERR_FAIL_COND(!_p->typed.validate(validated_array.write[i], "append_array")); } - _p->array.append_array(p_array._p->array); + + _p->array.append_array(validated_array); } Error Array::resize(int p_new_size) { @@ -274,20 +284,23 @@ Error Array::resize(int p_new_size) { Error Array::insert(int p_pos, const Variant &p_value) { ERR_FAIL_COND_V_MSG(_p->read_only, ERR_LOCKED, "Array is in read-only state."); - ERR_FAIL_COND_V(!_p->typed.validate(p_value, "insert"), ERR_INVALID_PARAMETER); - return _p->array.insert(p_pos, p_value); + Variant value = p_value; + ERR_FAIL_COND_V(!_p->typed.validate(value, "insert"), ERR_INVALID_PARAMETER); + return _p->array.insert(p_pos, value); } void Array::fill(const Variant &p_value) { ERR_FAIL_COND_MSG(_p->read_only, "Array is in read-only state."); - ERR_FAIL_COND(!_p->typed.validate(p_value, "fill")); - _p->array.fill(p_value); + Variant value = p_value; + ERR_FAIL_COND(!_p->typed.validate(value, "fill")); + _p->array.fill(value); } void Array::erase(const Variant &p_value) { ERR_FAIL_COND_MSG(_p->read_only, "Array is in read-only state."); - ERR_FAIL_COND(!_p->typed.validate(p_value, "erase")); - _p->array.erase(p_value); + Variant value = p_value; + ERR_FAIL_COND(!_p->typed.validate(value, "erase")); + _p->array.erase(value); } Variant Array::front() const { @@ -306,15 +319,34 @@ Variant Array::pick_random() const { } int Array::find(const Variant &p_value, int p_from) const { - ERR_FAIL_COND_V(!_p->typed.validate(p_value, "find"), -1); - return _p->array.find(p_value, p_from); + if (_p->array.size() == 0) { + return -1; + } + Variant value = p_value; + ERR_FAIL_COND_V(!_p->typed.validate(value, "find"), -1); + + int ret = -1; + + if (p_from < 0 || size() == 0) { + return ret; + } + + for (int i = p_from; i < size(); i++) { + if (StringLikeVariantComparator::compare(_p->array[i], value)) { + ret = i; + break; + } + } + + return ret; } int Array::rfind(const Variant &p_value, int p_from) const { if (_p->array.size() == 0) { return -1; } - ERR_FAIL_COND_V(!_p->typed.validate(p_value, "rfind"), -1); + Variant value = p_value; + ERR_FAIL_COND_V(!_p->typed.validate(value, "rfind"), -1); if (p_from < 0) { // Relative offset from the end @@ -326,7 +358,7 @@ int Array::rfind(const Variant &p_value, int p_from) const { } for (int i = p_from; i >= 0; i--) { - if (_p->array[i] == p_value) { + if (StringLikeVariantComparator::compare(_p->array[i], value)) { return i; } } @@ -335,14 +367,15 @@ int Array::rfind(const Variant &p_value, int p_from) const { } int Array::count(const Variant &p_value) const { - ERR_FAIL_COND_V(!_p->typed.validate(p_value, "count"), 0); + Variant value = p_value; + ERR_FAIL_COND_V(!_p->typed.validate(value, "count"), 0); if (_p->array.size() == 0) { return 0; } int amount = 0; for (int i = 0; i < _p->array.size(); i++) { - if (_p->array[i] == p_value) { + if (StringLikeVariantComparator::compare(_p->array[i], value)) { amount++; } } @@ -351,9 +384,10 @@ int Array::count(const Variant &p_value) const { } bool Array::has(const Variant &p_value) const { - ERR_FAIL_COND_V(!_p->typed.validate(p_value, "use 'has'"), false); + Variant value = p_value; + ERR_FAIL_COND_V(!_p->typed.validate(value, "use 'has'"), false); - return _p->array.find(p_value, 0) != -1; + return find(value) != -1; } void Array::remove_at(int p_pos) { @@ -363,9 +397,10 @@ void Array::remove_at(int p_pos) { void Array::set(int p_idx, const Variant &p_value) { ERR_FAIL_COND_MSG(_p->read_only, "Array is in read-only state."); - ERR_FAIL_COND(!_p->typed.validate(p_value, "set")); + Variant value = p_value; + ERR_FAIL_COND(!_p->typed.validate(value, "set")); - operator[](p_idx) = p_value; + operator[](p_idx) = value; } const Variant &Array::get(int p_idx) const { @@ -588,15 +623,17 @@ void Array::shuffle() { } int Array::bsearch(const Variant &p_value, bool p_before) { - ERR_FAIL_COND_V(!_p->typed.validate(p_value, "binary search"), -1); + Variant value = p_value; + ERR_FAIL_COND_V(!_p->typed.validate(value, "binary search"), -1); SearchArray<Variant, _ArrayVariantSort> avs; - return avs.bisect(_p->array.ptrw(), _p->array.size(), p_value, p_before); + return avs.bisect(_p->array.ptrw(), _p->array.size(), value, p_before); } int Array::bsearch_custom(const Variant &p_value, const Callable &p_callable, bool p_before) { - ERR_FAIL_COND_V(!_p->typed.validate(p_value, "custom binary search"), -1); + Variant value = p_value; + ERR_FAIL_COND_V(!_p->typed.validate(value, "custom binary search"), -1); - return _p->array.bsearch_custom<CallableComparator>(p_value, p_before, p_callable); + return _p->array.bsearch_custom<CallableComparator>(value, p_before, p_callable); } void Array::reverse() { @@ -606,8 +643,9 @@ void Array::reverse() { void Array::push_front(const Variant &p_value) { ERR_FAIL_COND_MSG(_p->read_only, "Array is in read-only state."); - ERR_FAIL_COND(!_p->typed.validate(p_value, "push_front")); - _p->array.insert(0, p_value); + Variant value = p_value; + ERR_FAIL_COND(!_p->typed.validate(value, "push_front")); + _p->array.insert(0, value); } Variant Array::pop_back() { diff --git a/core/variant/container_type_validate.h b/core/variant/container_type_validate.h index 427a337aab..9976fce47f 100644 --- a/core/variant/container_type_validate.h +++ b/core/variant/container_type_validate.h @@ -74,22 +74,37 @@ struct ContainerTypeValidate { return true; } - _FORCE_INLINE_ bool validate(const Variant &p_variant, const char *p_operation = "use") { + // Coerces String and StringName into each other when needed. + _FORCE_INLINE_ bool validate(Variant &inout_variant, const char *p_operation = "use") { if (type == Variant::NIL) { return true; } - if (type != p_variant.get_type()) { - if (p_variant.get_type() == Variant::NIL && type == Variant::OBJECT) { + if (type != inout_variant.get_type()) { + if (inout_variant.get_type() == Variant::NIL && type == Variant::OBJECT) { + return true; + } + if (type == Variant::STRING && inout_variant.get_type() == Variant::STRING_NAME) { + inout_variant = String(inout_variant); + return true; + } else if (type == Variant::STRING_NAME && inout_variant.get_type() == Variant::STRING) { + inout_variant = StringName(inout_variant); return true; } - ERR_FAIL_V_MSG(false, "Attempted to " + String(p_operation) + " a variable of type '" + Variant::get_type_name(p_variant.get_type()) + "' into a " + where + " of type '" + Variant::get_type_name(type) + "'."); + ERR_FAIL_V_MSG(false, "Attempted to " + String(p_operation) + " a variable of type '" + Variant::get_type_name(inout_variant.get_type()) + "' into a " + where + " of type '" + Variant::get_type_name(type) + "'."); } if (type != Variant::OBJECT) { return true; } + + return validate_object(inout_variant, p_operation); + } + + _FORCE_INLINE_ bool validate_object(const Variant &p_variant, const char *p_operation = "use") { + ERR_FAIL_COND_V(p_variant.get_type() != Variant::OBJECT, false); + #ifdef DEBUG_ENABLED ObjectID object_id = p_variant; if (object_id == ObjectID()) { diff --git a/core/variant/dictionary.cpp b/core/variant/dictionary.cpp index c1cb782a57..77d9fb0bc2 100644 --- a/core/variant/dictionary.cpp +++ b/core/variant/dictionary.cpp @@ -42,7 +42,7 @@ struct DictionaryPrivate { SafeRefCount refcount; Variant *read_only = nullptr; // If enabled, a pointer is used to a temporary value that is used to return read-only values. - HashMap<Variant, Variant, VariantHasher, VariantComparator> variant_map; + HashMap<Variant, Variant, VariantHasher, StringLikeVariantComparator> variant_map; }; void Dictionary::get_key_list(List<Variant> *p_keys) const { @@ -100,24 +100,12 @@ Variant &Dictionary::operator[](const Variant &p_key) { } const Variant &Dictionary::operator[](const Variant &p_key) const { - if (p_key.get_type() == Variant::STRING_NAME) { - const StringName *sn = VariantInternal::get_string_name(&p_key); - return _p->variant_map[sn->operator String()]; - } else { - return _p->variant_map[p_key]; - } + // Will not insert key, so no conversion is necessary. + return _p->variant_map[p_key]; } const Variant *Dictionary::getptr(const Variant &p_key) const { - HashMap<Variant, Variant, VariantHasher, VariantComparator>::ConstIterator E; - - if (p_key.get_type() == Variant::STRING_NAME) { - const StringName *sn = VariantInternal::get_string_name(&p_key); - E = ((const HashMap<Variant, Variant, VariantHasher, VariantComparator> *)&_p->variant_map)->find(sn->operator String()); - } else { - E = ((const HashMap<Variant, Variant, VariantHasher, VariantComparator> *)&_p->variant_map)->find(p_key); - } - + HashMap<Variant, Variant, VariantHasher, StringLikeVariantComparator>::ConstIterator E(_p->variant_map.find(p_key)); if (!E) { return nullptr; } @@ -125,14 +113,7 @@ const Variant *Dictionary::getptr(const Variant &p_key) const { } Variant *Dictionary::getptr(const Variant &p_key) { - HashMap<Variant, Variant, VariantHasher, VariantComparator>::Iterator E; - - if (p_key.get_type() == Variant::STRING_NAME) { - const StringName *sn = VariantInternal::get_string_name(&p_key); - E = ((HashMap<Variant, Variant, VariantHasher, VariantComparator> *)&_p->variant_map)->find(sn->operator String()); - } else { - E = ((HashMap<Variant, Variant, VariantHasher, VariantComparator> *)&_p->variant_map)->find(p_key); - } + HashMap<Variant, Variant, VariantHasher, StringLikeVariantComparator>::Iterator E(_p->variant_map.find(p_key)); if (!E) { return nullptr; } @@ -145,14 +126,7 @@ Variant *Dictionary::getptr(const Variant &p_key) { } Variant Dictionary::get_valid(const Variant &p_key) const { - HashMap<Variant, Variant, VariantHasher, VariantComparator>::ConstIterator E; - - if (p_key.get_type() == Variant::STRING_NAME) { - const StringName *sn = VariantInternal::get_string_name(&p_key); - E = ((const HashMap<Variant, Variant, VariantHasher, VariantComparator> *)&_p->variant_map)->find(sn->operator String()); - } else { - E = ((const HashMap<Variant, Variant, VariantHasher, VariantComparator> *)&_p->variant_map)->find(p_key); - } + HashMap<Variant, Variant, VariantHasher, StringLikeVariantComparator>::ConstIterator E(_p->variant_map.find(p_key)); if (!E) { return Variant(); @@ -178,12 +152,7 @@ bool Dictionary::is_empty() const { } bool Dictionary::has(const Variant &p_key) const { - if (p_key.get_type() == Variant::STRING_NAME) { - const StringName *sn = VariantInternal::get_string_name(&p_key); - return _p->variant_map.has(sn->operator String()); - } else { - return _p->variant_map.has(p_key); - } + return _p->variant_map.has(p_key); } bool Dictionary::has_all(const Array &p_keys) const { @@ -206,12 +175,7 @@ Variant Dictionary::find_key(const Variant &p_value) const { bool Dictionary::erase(const Variant &p_key) { ERR_FAIL_COND_V_MSG(_p->read_only, false, "Dictionary is in read-only state."); - if (p_key.get_type() == Variant::STRING_NAME) { - const StringName *sn = VariantInternal::get_string_name(&p_key); - return _p->variant_map.erase(sn->operator String()); - } else { - return _p->variant_map.erase(p_key); - } + return _p->variant_map.erase(p_key); } bool Dictionary::operator==(const Dictionary &p_dictionary) const { @@ -238,7 +202,7 @@ bool Dictionary::recursive_equal(const Dictionary &p_dictionary, int recursion_c } recursion_count++; for (const KeyValue<Variant, Variant> &this_E : _p->variant_map) { - HashMap<Variant, Variant, VariantHasher, VariantComparator>::ConstIterator other_E = ((const HashMap<Variant, Variant, VariantHasher, VariantComparator> *)&p_dictionary._p->variant_map)->find(this_E.key); + HashMap<Variant, Variant, VariantHasher, StringLikeVariantComparator>::ConstIterator other_E(p_dictionary._p->variant_map.find(this_E.key)); if (!other_E || !this_E.value.hash_compare(other_E->value, recursion_count)) { return false; } @@ -360,7 +324,7 @@ const Variant *Dictionary::next(const Variant *p_key) const { } return nullptr; } - HashMap<Variant, Variant, VariantHasher, VariantComparator>::Iterator E = _p->variant_map.find(*p_key); + HashMap<Variant, Variant, VariantHasher, StringLikeVariantComparator>::Iterator E = _p->variant_map.find(*p_key); if (!E) { return nullptr; diff --git a/core/variant/native_ptr.h b/core/variant/native_ptr.h index ed68e0f6c9..18670310b0 100644 --- a/core/variant/native_ptr.h +++ b/core/variant/native_ptr.h @@ -36,90 +36,90 @@ #include "core/variant/type_info.h" template <class T> -struct GDNativeConstPtr { +struct GDExtensionConstPtr { const T *data = nullptr; - GDNativeConstPtr(const T *p_assign) { data = p_assign; } + GDExtensionConstPtr(const T *p_assign) { data = p_assign; } static const char *get_name() { return "const void"; } operator const T *() const { return data; } operator Variant() const { return uint64_t(data); } }; template <class T> -struct GDNativePtr { +struct GDExtensionPtr { T *data = nullptr; - GDNativePtr(T *p_assign) { data = p_assign; } + GDExtensionPtr(T *p_assign) { data = p_assign; } static const char *get_name() { return "void"; } operator T *() const { return data; } operator Variant() const { return uint64_t(data); } }; -#define GDVIRTUAL_NATIVE_PTR(m_type) \ - template <> \ - struct GDNativeConstPtr<const m_type> { \ - const m_type *data = nullptr; \ - GDNativeConstPtr() {} \ - GDNativeConstPtr(const m_type *p_assign) { data = p_assign; } \ - static const char *get_name() { return "const " #m_type; } \ - operator const m_type *() const { return data; } \ - operator Variant() const { return uint64_t(data); } \ - }; \ - template <> \ - struct VariantCaster<GDNativeConstPtr<const m_type>> { \ - static _FORCE_INLINE_ GDNativeConstPtr<const m_type> cast(const Variant &p_variant) { \ - return GDNativeConstPtr<const m_type>((const m_type *)p_variant.operator uint64_t()); \ - } \ - }; \ - template <> \ - struct GDNativePtr<m_type> { \ - m_type *data = nullptr; \ - GDNativePtr() {} \ - GDNativePtr(m_type *p_assign) { data = p_assign; } \ - static const char *get_name() { return #m_type; } \ - operator m_type *() const { return data; } \ - operator Variant() const { return uint64_t(data); } \ - }; \ - template <> \ - struct VariantCaster<GDNativePtr<m_type>> { \ - static _FORCE_INLINE_ GDNativePtr<m_type> cast(const Variant &p_variant) { \ - return GDNativePtr<m_type>((m_type *)p_variant.operator uint64_t()); \ - } \ +#define GDVIRTUAL_NATIVE_PTR(m_type) \ + template <> \ + struct GDExtensionConstPtr<const m_type> { \ + const m_type *data = nullptr; \ + GDExtensionConstPtr() {} \ + GDExtensionConstPtr(const m_type *p_assign) { data = p_assign; } \ + static const char *get_name() { return "const " #m_type; } \ + operator const m_type *() const { return data; } \ + operator Variant() const { return uint64_t(data); } \ + }; \ + template <> \ + struct VariantCaster<GDExtensionConstPtr<const m_type>> { \ + static _FORCE_INLINE_ GDExtensionConstPtr<const m_type> cast(const Variant &p_variant) { \ + return GDExtensionConstPtr<const m_type>((const m_type *)p_variant.operator uint64_t()); \ + } \ + }; \ + template <> \ + struct GDExtensionPtr<m_type> { \ + m_type *data = nullptr; \ + GDExtensionPtr() {} \ + GDExtensionPtr(m_type *p_assign) { data = p_assign; } \ + static const char *get_name() { return #m_type; } \ + operator m_type *() const { return data; } \ + operator Variant() const { return uint64_t(data); } \ + }; \ + template <> \ + struct VariantCaster<GDExtensionPtr<m_type>> { \ + static _FORCE_INLINE_ GDExtensionPtr<m_type> cast(const Variant &p_variant) { \ + return GDExtensionPtr<m_type>((m_type *)p_variant.operator uint64_t()); \ + } \ }; template <class T> -struct GetTypeInfo<GDNativeConstPtr<T>> { +struct GetTypeInfo<GDExtensionConstPtr<T>> { static const Variant::Type VARIANT_TYPE = Variant::NIL; static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; static inline PropertyInfo get_class_info() { - return PropertyInfo(Variant::INT, String(), PROPERTY_HINT_INT_IS_POINTER, GDNativeConstPtr<T>::get_name()); + return PropertyInfo(Variant::INT, String(), PROPERTY_HINT_INT_IS_POINTER, GDExtensionConstPtr<T>::get_name()); } }; template <class T> -struct GetTypeInfo<GDNativePtr<T>> { +struct GetTypeInfo<GDExtensionPtr<T>> { static const Variant::Type VARIANT_TYPE = Variant::NIL; static const GodotTypeInfo::Metadata METADATA = GodotTypeInfo::METADATA_NONE; static inline PropertyInfo get_class_info() { - return PropertyInfo(Variant::INT, String(), PROPERTY_HINT_INT_IS_POINTER, GDNativePtr<T>::get_name()); + return PropertyInfo(Variant::INT, String(), PROPERTY_HINT_INT_IS_POINTER, GDExtensionPtr<T>::get_name()); } }; template <class T> -struct PtrToArg<GDNativeConstPtr<T>> { - _FORCE_INLINE_ static GDNativeConstPtr<T> convert(const void *p_ptr) { - return GDNativeConstPtr<T>(reinterpret_cast<const T *>(p_ptr)); +struct PtrToArg<GDExtensionConstPtr<T>> { + _FORCE_INLINE_ static GDExtensionConstPtr<T> convert(const void *p_ptr) { + return GDExtensionConstPtr<T>(reinterpret_cast<const T *>(p_ptr)); } typedef const T *EncodeT; - _FORCE_INLINE_ static void encode(GDNativeConstPtr<T> p_val, void *p_ptr) { + _FORCE_INLINE_ static void encode(GDExtensionConstPtr<T> p_val, void *p_ptr) { *((const T **)p_ptr) = p_val.data; } }; template <class T> -struct PtrToArg<GDNativePtr<T>> { - _FORCE_INLINE_ static GDNativePtr<T> convert(const void *p_ptr) { - return GDNativePtr<T>(reinterpret_cast<const T *>(p_ptr)); +struct PtrToArg<GDExtensionPtr<T>> { + _FORCE_INLINE_ static GDExtensionPtr<T> convert(const void *p_ptr) { + return GDExtensionPtr<T>(reinterpret_cast<const T *>(p_ptr)); } typedef T *EncodeT; - _FORCE_INLINE_ static void encode(GDNativePtr<T> p_val, void *p_ptr) { + _FORCE_INLINE_ static void encode(GDExtensionPtr<T> p_val, void *p_ptr) { *((T **)p_ptr) = p_val.data; } }; diff --git a/core/variant/type_info.h b/core/variant/type_info.h index e355053296..8e2d150430 100644 --- a/core/variant/type_info.h +++ b/core/variant/type_info.h @@ -290,6 +290,7 @@ public: _FORCE_INLINE_ void set_flag(T p_flag) { value |= p_flag; } _FORCE_INLINE_ bool has_flag(T p_flag) const { return value & p_flag; } _FORCE_INLINE_ void clear_flag(T p_flag) { return value &= ~p_flag; } + _FORCE_INLINE_ BitField() = default; _FORCE_INLINE_ BitField(int64_t p_value) { value = p_value; } _FORCE_INLINE_ operator int64_t() const { return value; } _FORCE_INLINE_ operator Variant() const { return value; } diff --git a/core/variant/variant.cpp b/core/variant/variant.cpp index c1166a0a14..39b7cbee0d 100644 --- a/core/variant/variant.cpp +++ b/core/variant/variant.cpp @@ -940,7 +940,7 @@ bool Variant::is_zero() const { return reinterpret_cast<const Signal *>(_data._mem)->is_null(); } case STRING_NAME: { - return *reinterpret_cast<const StringName *>(_data._mem) != StringName(); + return *reinterpret_cast<const StringName *>(_data._mem) == StringName(); } case NODE_PATH: { return reinterpret_cast<const NodePath *>(_data._mem)->is_empty(); @@ -3491,6 +3491,19 @@ bool Variant::hash_compare(const Variant &p_variant, int recursion_count) const } } +bool StringLikeVariantComparator::compare(const Variant &p_lhs, const Variant &p_rhs) { + if (p_lhs.hash_compare(p_rhs)) { + return true; + } + if (p_lhs.get_type() == Variant::STRING && p_rhs.get_type() == Variant::STRING_NAME) { + return *VariantInternal::get_string(&p_lhs) == *VariantInternal::get_string_name(&p_rhs); + } + if (p_lhs.get_type() == Variant::STRING_NAME && p_rhs.get_type() == Variant::STRING) { + return *VariantInternal::get_string_name(&p_lhs) == *VariantInternal::get_string(&p_rhs); + } + return false; +} + bool Variant::is_ref_counted() const { return type == OBJECT && _get_obj().id.is_ref_counted(); } diff --git a/core/variant/variant.h b/core/variant/variant.h index c5be609184..f7221e206f 100644 --- a/core/variant/variant.h +++ b/core/variant/variant.h @@ -797,6 +797,10 @@ struct VariantComparator { static _FORCE_INLINE_ bool compare(const Variant &p_lhs, const Variant &p_rhs) { return p_lhs.hash_compare(p_rhs); } }; +struct StringLikeVariantComparator { + static bool compare(const Variant &p_lhs, const Variant &p_rhs); +}; + Variant::ObjData &Variant::_get_obj() { return *reinterpret_cast<ObjData *>(&_data._mem[0]); } diff --git a/core/variant/variant_call.cpp b/core/variant/variant_call.cpp index 2cb80dcab4..ac569941bf 100644 --- a/core/variant/variant_call.cpp +++ b/core/variant/variant_call.cpp @@ -73,6 +73,30 @@ static _FORCE_INLINE_ void vc_method_call(void (T::*method)(P...) const, Variant call_with_variant_argsc_dv(VariantGetInternalPtr<T>::get_ptr(base), method, p_args, p_argcount, r_error, p_defvals); } +template <class From, class R, class T, class... P> +static _FORCE_INLINE_ void vc_convert_method_call(R (T::*method)(P...), Variant *base, const Variant **p_args, int p_argcount, Variant &r_ret, const Vector<Variant> &p_defvals, Callable::CallError &r_error) { + T converted(static_cast<T>(*VariantGetInternalPtr<From>::get_ptr(base))); + call_with_variant_args_ret_dv(&converted, method, p_args, p_argcount, r_ret, r_error, p_defvals); +} + +template <class From, class R, class T, class... P> +static _FORCE_INLINE_ void vc_convert_method_call(R (T::*method)(P...) const, Variant *base, const Variant **p_args, int p_argcount, Variant &r_ret, const Vector<Variant> &p_defvals, Callable::CallError &r_error) { + T converted(static_cast<T>(*VariantGetInternalPtr<From>::get_ptr(base))); + call_with_variant_args_retc_dv(&converted, method, p_args, p_argcount, r_ret, r_error, p_defvals); +} + +template <class From, class T, class... P> +static _FORCE_INLINE_ void vc_convert_method_call(void (T::*method)(P...), Variant *base, const Variant **p_args, int p_argcount, Variant &r_ret, const Vector<Variant> &p_defvals, Callable::CallError &r_error) { + T converted(static_cast<T>(*VariantGetInternalPtr<From>::get_ptr(base))); + call_with_variant_args_dv(&converted, method, p_args, p_argcount, r_error, p_defvals); +} + +template <class From, class T, class... P> +static _FORCE_INLINE_ void vc_convert_method_call(void (T::*method)(P...) const, Variant *base, const Variant **p_args, int p_argcount, Variant &r_ret, const Vector<Variant> &p_defvals, Callable::CallError &r_error) { + T converted(static_cast<T>(*VariantGetInternalPtr<From>::get_ptr(base))); + call_with_variant_argsc_dv(&converted, method, p_args, p_argcount, r_error, p_defvals); +} + template <class R, class T, class... P> static _FORCE_INLINE_ void vc_method_call_static(R (*method)(T *, P...), Variant *base, const Variant **p_args, int p_argcount, Variant &r_ret, const Vector<Variant> &p_defvals, Callable::CallError &r_error) { call_with_variant_args_retc_static_helper_dv(VariantGetInternalPtr<T>::get_ptr(base), method, p_args, p_argcount, r_ret, p_defvals, r_error); @@ -102,6 +126,29 @@ static _FORCE_INLINE_ void vc_validated_call(void (T::*method)(P...) const, Vari call_with_validated_variant_argsc(base, method, p_args); } +template <class From, class R, class T, class... P> +static _FORCE_INLINE_ void vc_convert_validated_call(R (T::*method)(P...), Variant *base, const Variant **p_args, Variant *r_ret) { + T converted(static_cast<T>(*VariantGetInternalPtr<From>::get_ptr(base))); + call_with_validated_variant_args_ret_helper<T, R, P...>(&converted, method, p_args, r_ret, BuildIndexSequence<sizeof...(P)>{}); +} + +template <class From, class R, class T, class... P> +static _FORCE_INLINE_ void vc_convert_validated_call(R (T::*method)(P...) const, Variant *base, const Variant **p_args, Variant *r_ret) { + T converted(static_cast<T>(*VariantGetInternalPtr<From>::get_ptr(base))); + call_with_validated_variant_args_retc_helper<T, R, P...>(&converted, method, p_args, r_ret, BuildIndexSequence<sizeof...(P)>{}); +} +template <class From, class T, class... P> +static _FORCE_INLINE_ void vc_convert_validated_call(void (T::*method)(P...), Variant *base, const Variant **p_args, Variant *r_ret) { + T converted(static_cast<T>(*VariantGetInternalPtr<From>::get_ptr(base))); + call_with_validated_variant_args_helper<T, P...>(&converted, method, p_args, r_ret, BuildIndexSequence<sizeof...(P)>{}); +} + +template <class From, class T, class... P> +static _FORCE_INLINE_ void vc_convert_validated_call(void (T::*method)(P...) const, Variant *base, const Variant **p_args, Variant *r_ret) { + T converted(static_cast<T>(*VariantGetInternalPtr<From>::get_ptr(base))); + call_with_validated_variant_argsc_helper<T, P...>(&converted, method, p_args, r_ret, BuildIndexSequence<sizeof...(P)>{}); +} + template <class R, class T, class... P> static _FORCE_INLINE_ void vc_validated_call_static(R (*method)(T *, P...), Variant *base, const Variant **p_args, Variant *r_ret) { call_with_validated_variant_args_static_retc(base, method, p_args, r_ret); @@ -142,6 +189,30 @@ static _FORCE_INLINE_ void vc_ptrcall(void (T::*method)(P...) const, void *p_bas call_with_ptr_argsc(reinterpret_cast<T *>(p_base), method, p_args); } +template <class From, class R, class T, class... P> +static _FORCE_INLINE_ void vc_convert_ptrcall(R (T::*method)(P...), void *p_base, const void **p_args, void *r_ret) { + T converted(*reinterpret_cast<From *>(p_base)); + call_with_ptr_args_ret(&converted, method, p_args, r_ret); +} + +template <class From, class R, class T, class... P> +static _FORCE_INLINE_ void vc_convert_ptrcall(R (T::*method)(P...) const, void *p_base, const void **p_args, void *r_ret) { + T converted(*reinterpret_cast<From *>(p_base)); + call_with_ptr_args_retc(&converted, method, p_args, r_ret); +} + +template <class From, class T, class... P> +static _FORCE_INLINE_ void vc_convert_ptrcall(void (T::*method)(P...), void *p_base, const void **p_args, void *r_ret) { + T converted(*reinterpret_cast<From *>(p_base)); + call_with_ptr_args(&converted, method, p_args); +} + +template <class From, class T, class... P> +static _FORCE_INLINE_ void vc_convert_ptrcall(void (T::*method)(P...) const, void *p_base, const void **p_args, void *r_ret) { + T converted(*reinterpret_cast<From *>(p_base)); + call_with_ptr_argsc(&converted, method, p_args); +} + template <class R, class T, class... P> static _FORCE_INLINE_ int vc_get_argument_count(R (T::*method)(P...)) { return sizeof...(P); @@ -337,6 +408,46 @@ static _FORCE_INLINE_ Variant::Type vc_get_base_type(void (T::*method)(P...) con } \ }; +#define CONVERT_METHOD_CLASS(m_class, m_method_name, m_method_ptr) \ + struct Method_##m_class##_##m_method_name { \ + static void call(Variant *base, const Variant **p_args, int p_argcount, Variant &r_ret, const Vector<Variant> &p_defvals, Callable::CallError &r_error) { \ + vc_convert_method_call<m_class>(m_method_ptr, base, p_args, p_argcount, r_ret, p_defvals, r_error); \ + } \ + static void validated_call(Variant *base, const Variant **p_args, int p_argcount, Variant *r_ret) { \ + vc_convert_validated_call<m_class>(m_method_ptr, base, p_args, r_ret); \ + } \ + static void ptrcall(void *p_base, const void **p_args, void *r_ret, int p_argcount) { \ + vc_convert_ptrcall<m_class>(m_method_ptr, p_base, p_args, r_ret); \ + } \ + static int get_argument_count() { \ + return vc_get_argument_count(m_method_ptr); \ + } \ + static Variant::Type get_argument_type(int p_arg) { \ + return vc_get_argument_type(m_method_ptr, p_arg); \ + } \ + static Variant::Type get_return_type() { \ + return vc_get_return_type(m_method_ptr); \ + } \ + static bool has_return_type() { \ + return vc_has_return_type(m_method_ptr); \ + } \ + static bool is_const() { \ + return vc_is_const(m_method_ptr); \ + } \ + static bool is_static() { \ + return false; \ + } \ + static bool is_vararg() { \ + return false; \ + } \ + static Variant::Type get_base_type() { \ + return GetTypeInfo<m_class>::VARIANT_TYPE; \ + } \ + static StringName get_name() { \ + return #m_method_name; \ + } \ + }; + template <class R, class... P> static _FORCE_INLINE_ void vc_static_ptrcall(R (*method)(P...), const void **p_args, void *r_ret) { call_with_ptr_args_static_method_ret<R, P...>(method, p_args, r_ret); @@ -1422,6 +1533,16 @@ int Variant::get_enum_value(Variant::Type p_type, StringName p_enum_name, String #endif #ifdef DEBUG_METHODS_ENABLED +#define bind_convert_method(m_type_from, m_type_to, m_method, m_arg_names, m_default_args) \ + CONVERT_METHOD_CLASS(m_type_from, m_method, &m_type_to::m_method); \ + register_builtin_method<Method_##m_type_from##_##m_method>(m_arg_names, m_default_args); +#else +#define bind_convert_method(m_type_from, m_type_to, m_method, m_arg_names, m_default_args) \ + CONVERT_METHOD_CLASS(m_type_from, m_method, &m_type_to ::m_method); \ + register_builtin_method<Method_##m_type_from##_##m_method>(sarray(), m_default_args); +#endif + +#ifdef DEBUG_METHODS_ENABLED #define bind_static_method(m_type, m_method, m_arg_names, m_default_args) \ STATIC_METHOD_CLASS(m_type, m_method, m_type::m_method); \ register_builtin_method<Method_##m_type##_##m_method>(m_arg_names, m_default_args); @@ -1442,6 +1563,16 @@ int Variant::get_enum_value(Variant::Type p_type, StringName p_enum_name, String #endif #ifdef DEBUG_METHODS_ENABLED +#define bind_convert_methodv(m_type_from, m_type_to, m_name, m_method, m_arg_names, m_default_args) \ + CONVERT_METHOD_CLASS(m_type_from, m_name, m_method); \ + register_builtin_method<Method_##m_type_from##_##m_name>(m_arg_names, m_default_args); +#else +#define bind_convert_methodv(m_type_from, m_type_to, m_name, m_method, m_arg_names, m_default_args) \ + CONVERT_METHOD_CLASS(m_type_from, m_name, m_method); \ + register_builtin_method<Method_##m_type_from##_##m_name>(sarray(), m_default_args); +#endif + +#ifdef DEBUG_METHODS_ENABLED #define bind_function(m_type, m_name, m_method, m_arg_names, m_default_args) \ FUNCTION_CLASS(m_type, m_name, m_method, true); \ register_builtin_method<Method_##m_type##_##m_name>(m_arg_names, m_default_args); @@ -1461,6 +1592,14 @@ int Variant::get_enum_value(Variant::Type p_type, StringName p_enum_name, String register_builtin_method<Method_##m_type##_##m_name>(sarray(), m_default_args); #endif +#define bind_string_method(m_method, m_arg_names, m_default_args) \ + bind_method(String, m_method, m_arg_names, m_default_args); \ + bind_convert_method(StringName, String, m_method, m_arg_names, m_default_args); + +#define bind_string_methodv(m_name, m_method, m_arg_names, m_default_args) \ + bind_methodv(String, m_name, m_method, m_arg_names, m_default_args); \ + bind_convert_methodv(StringName, String, m_name, m_method, m_arg_names, m_default_args); + #define bind_custom(m_type, m_name, m_method, m_has_return, m_ret_type) \ VARARG_CLASS(m_type, m_name, m_method, m_has_return, m_ret_type) \ register_builtin_method<Method_##m_type##_##m_name>(sarray(), Vector<Variant>()); @@ -1477,108 +1616,108 @@ static void _register_variant_builtin_methods() { /* String */ - bind_method(String, casecmp_to, sarray("to"), varray()); - bind_method(String, nocasecmp_to, sarray("to"), varray()); - bind_method(String, naturalnocasecmp_to, sarray("to"), varray()); - bind_method(String, length, sarray(), varray()); - bind_method(String, substr, sarray("from", "len"), varray(-1)); - bind_method(String, get_slice, sarray("delimiter", "slice"), varray()); - bind_method(String, get_slicec, sarray("delimiter", "slice"), varray()); - bind_method(String, get_slice_count, sarray("delimiter"), varray()); - bind_methodv(String, find, static_cast<int (String::*)(const String &, int) const>(&String::find), sarray("what", "from"), varray(0)); - bind_method(String, count, sarray("what", "from", "to"), varray(0, 0)); - bind_method(String, countn, sarray("what", "from", "to"), varray(0, 0)); - bind_method(String, findn, sarray("what", "from"), varray(0)); - bind_method(String, rfind, sarray("what", "from"), varray(-1)); - bind_method(String, rfindn, sarray("what", "from"), varray(-1)); - bind_method(String, match, sarray("expr"), varray()); - bind_method(String, matchn, sarray("expr"), varray()); - bind_methodv(String, begins_with, static_cast<bool (String::*)(const String &) const>(&String::begins_with), sarray("text"), varray()); - bind_method(String, ends_with, sarray("text"), varray()); - bind_method(String, is_subsequence_of, sarray("text"), varray()); - bind_method(String, is_subsequence_ofn, sarray("text"), varray()); - bind_method(String, bigrams, sarray(), varray()); - bind_method(String, similarity, sarray("text"), varray()); - - bind_method(String, format, sarray("values", "placeholder"), varray("{_}")); - bind_methodv(String, replace, static_cast<String (String::*)(const String &, const String &) const>(&String::replace), sarray("what", "forwhat"), varray()); - bind_method(String, replacen, sarray("what", "forwhat"), varray()); - bind_method(String, repeat, sarray("count"), varray()); - bind_method(String, insert, sarray("position", "what"), varray()); - bind_method(String, capitalize, sarray(), varray()); - bind_method(String, to_camel_case, sarray(), varray()); - bind_method(String, to_pascal_case, sarray(), varray()); - bind_method(String, to_snake_case, sarray(), varray()); - bind_method(String, split, sarray("delimiter", "allow_empty", "maxsplit"), varray("", true, 0)); - bind_method(String, rsplit, sarray("delimiter", "allow_empty", "maxsplit"), varray("", true, 0)); - bind_method(String, split_floats, sarray("delimiter", "allow_empty"), varray(true)); - bind_method(String, join, sarray("parts"), varray()); - - bind_method(String, to_upper, sarray(), varray()); - bind_method(String, to_lower, sarray(), varray()); - - bind_method(String, left, sarray("length"), varray()); - bind_method(String, right, sarray("length"), varray()); - - bind_method(String, strip_edges, sarray("left", "right"), varray(true, true)); - bind_method(String, strip_escapes, sarray(), varray()); - bind_method(String, lstrip, sarray("chars"), varray()); - bind_method(String, rstrip, sarray("chars"), varray()); - bind_method(String, get_extension, sarray(), varray()); - bind_method(String, get_basename, sarray(), varray()); - bind_method(String, path_join, sarray("file"), varray()); - bind_method(String, unicode_at, sarray("at"), varray()); - bind_method(String, indent, sarray("prefix"), varray()); - bind_method(String, dedent, sarray(), varray()); + bind_string_method(casecmp_to, sarray("to"), varray()); + bind_string_method(nocasecmp_to, sarray("to"), varray()); + bind_string_method(naturalnocasecmp_to, sarray("to"), varray()); + bind_string_method(length, sarray(), varray()); + bind_string_method(substr, sarray("from", "len"), varray(-1)); + bind_string_method(get_slice, sarray("delimiter", "slice"), varray()); + bind_string_method(get_slicec, sarray("delimiter", "slice"), varray()); + bind_string_method(get_slice_count, sarray("delimiter"), varray()); + bind_string_methodv(find, static_cast<int (String::*)(const String &, int) const>(&String::find), sarray("what", "from"), varray(0)); + bind_string_method(count, sarray("what", "from", "to"), varray(0, 0)); + bind_string_method(countn, sarray("what", "from", "to"), varray(0, 0)); + bind_string_method(findn, sarray("what", "from"), varray(0)); + bind_string_method(rfind, sarray("what", "from"), varray(-1)); + bind_string_method(rfindn, sarray("what", "from"), varray(-1)); + bind_string_method(match, sarray("expr"), varray()); + bind_string_method(matchn, sarray("expr"), varray()); + bind_string_methodv(begins_with, static_cast<bool (String::*)(const String &) const>(&String::begins_with), sarray("text"), varray()); + bind_string_method(ends_with, sarray("text"), varray()); + bind_string_method(is_subsequence_of, sarray("text"), varray()); + bind_string_method(is_subsequence_ofn, sarray("text"), varray()); + bind_string_method(bigrams, sarray(), varray()); + bind_string_method(similarity, sarray("text"), varray()); + + bind_string_method(format, sarray("values", "placeholder"), varray("{_}")); + bind_string_methodv(replace, static_cast<String (String::*)(const String &, const String &) const>(&String::replace), sarray("what", "forwhat"), varray()); + bind_string_method(replacen, sarray("what", "forwhat"), varray()); + bind_string_method(repeat, sarray("count"), varray()); + bind_string_method(insert, sarray("position", "what"), varray()); + bind_string_method(capitalize, sarray(), varray()); + bind_string_method(to_camel_case, sarray(), varray()); + bind_string_method(to_pascal_case, sarray(), varray()); + bind_string_method(to_snake_case, sarray(), varray()); + bind_string_method(split, sarray("delimiter", "allow_empty", "maxsplit"), varray("", true, 0)); + bind_string_method(rsplit, sarray("delimiter", "allow_empty", "maxsplit"), varray("", true, 0)); + bind_string_method(split_floats, sarray("delimiter", "allow_empty"), varray(true)); + bind_string_method(join, sarray("parts"), varray()); + + bind_string_method(to_upper, sarray(), varray()); + bind_string_method(to_lower, sarray(), varray()); + + bind_string_method(left, sarray("length"), varray()); + bind_string_method(right, sarray("length"), varray()); + + bind_string_method(strip_edges, sarray("left", "right"), varray(true, true)); + bind_string_method(strip_escapes, sarray(), varray()); + bind_string_method(lstrip, sarray("chars"), varray()); + bind_string_method(rstrip, sarray("chars"), varray()); + bind_string_method(get_extension, sarray(), varray()); + bind_string_method(get_basename, sarray(), varray()); + bind_string_method(path_join, sarray("file"), varray()); + bind_string_method(unicode_at, sarray("at"), varray()); + bind_string_method(indent, sarray("prefix"), varray()); + bind_string_method(dedent, sarray(), varray()); bind_method(String, hash, sarray(), varray()); - bind_method(String, md5_text, sarray(), varray()); - bind_method(String, sha1_text, sarray(), varray()); - bind_method(String, sha256_text, sarray(), varray()); - bind_method(String, md5_buffer, sarray(), varray()); - bind_method(String, sha1_buffer, sarray(), varray()); - bind_method(String, sha256_buffer, sarray(), varray()); - bind_method(String, is_empty, sarray(), varray()); - bind_methodv(String, contains, static_cast<bool (String::*)(const String &) const>(&String::contains), sarray("what"), varray()); - - bind_method(String, is_absolute_path, sarray(), varray()); - bind_method(String, is_relative_path, sarray(), varray()); - bind_method(String, simplify_path, sarray(), varray()); - bind_method(String, get_base_dir, sarray(), varray()); - bind_method(String, get_file, sarray(), varray()); - bind_method(String, xml_escape, sarray("escape_quotes"), varray(false)); - bind_method(String, xml_unescape, sarray(), varray()); - bind_method(String, uri_encode, sarray(), varray()); - bind_method(String, uri_decode, sarray(), varray()); - bind_method(String, c_escape, sarray(), varray()); - bind_method(String, c_unescape, sarray(), varray()); - bind_method(String, json_escape, sarray(), varray()); - - bind_method(String, validate_node_name, sarray(), varray()); - - bind_method(String, is_valid_identifier, sarray(), varray()); - bind_method(String, is_valid_int, sarray(), varray()); - bind_method(String, is_valid_float, sarray(), varray()); - bind_method(String, is_valid_hex_number, sarray("with_prefix"), varray(false)); - bind_method(String, is_valid_html_color, sarray(), varray()); - bind_method(String, is_valid_ip_address, sarray(), varray()); - bind_method(String, is_valid_filename, sarray(), varray()); - - bind_method(String, to_int, sarray(), varray()); - bind_method(String, to_float, sarray(), varray()); - bind_method(String, hex_to_int, sarray(), varray()); - bind_method(String, bin_to_int, sarray(), varray()); - - bind_method(String, lpad, sarray("min_length", "character"), varray(" ")); - bind_method(String, rpad, sarray("min_length", "character"), varray(" ")); - bind_method(String, pad_decimals, sarray("digits"), varray()); - bind_method(String, pad_zeros, sarray("digits"), varray()); - bind_method(String, trim_prefix, sarray("prefix"), varray()); - bind_method(String, trim_suffix, sarray("suffix"), varray()); - - bind_method(String, to_ascii_buffer, sarray(), varray()); - bind_method(String, to_utf8_buffer, sarray(), varray()); - bind_method(String, to_utf16_buffer, sarray(), varray()); - bind_method(String, to_utf32_buffer, sarray(), varray()); + bind_string_method(md5_text, sarray(), varray()); + bind_string_method(sha1_text, sarray(), varray()); + bind_string_method(sha256_text, sarray(), varray()); + bind_string_method(md5_buffer, sarray(), varray()); + bind_string_method(sha1_buffer, sarray(), varray()); + bind_string_method(sha256_buffer, sarray(), varray()); + bind_string_method(is_empty, sarray(), varray()); + bind_string_methodv(contains, static_cast<bool (String::*)(const String &) const>(&String::contains), sarray("what"), varray()); + + bind_string_method(is_absolute_path, sarray(), varray()); + bind_string_method(is_relative_path, sarray(), varray()); + bind_string_method(simplify_path, sarray(), varray()); + bind_string_method(get_base_dir, sarray(), varray()); + bind_string_method(get_file, sarray(), varray()); + bind_string_method(xml_escape, sarray("escape_quotes"), varray(false)); + bind_string_method(xml_unescape, sarray(), varray()); + bind_string_method(uri_encode, sarray(), varray()); + bind_string_method(uri_decode, sarray(), varray()); + bind_string_method(c_escape, sarray(), varray()); + bind_string_method(c_unescape, sarray(), varray()); + bind_string_method(json_escape, sarray(), varray()); + + bind_string_method(validate_node_name, sarray(), varray()); + + bind_string_method(is_valid_identifier, sarray(), varray()); + bind_string_method(is_valid_int, sarray(), varray()); + bind_string_method(is_valid_float, sarray(), varray()); + bind_string_method(is_valid_hex_number, sarray("with_prefix"), varray(false)); + bind_string_method(is_valid_html_color, sarray(), varray()); + bind_string_method(is_valid_ip_address, sarray(), varray()); + bind_string_method(is_valid_filename, sarray(), varray()); + + bind_string_method(to_int, sarray(), varray()); + bind_string_method(to_float, sarray(), varray()); + bind_string_method(hex_to_int, sarray(), varray()); + bind_string_method(bin_to_int, sarray(), varray()); + + bind_string_method(lpad, sarray("min_length", "character"), varray(" ")); + bind_string_method(rpad, sarray("min_length", "character"), varray(" ")); + bind_string_method(pad_decimals, sarray("digits"), varray()); + bind_string_method(pad_zeros, sarray("digits"), varray()); + bind_string_method(trim_prefix, sarray("prefix"), varray()); + bind_string_method(trim_suffix, sarray("suffix"), varray()); + + bind_string_method(to_ascii_buffer, sarray(), varray()); + bind_string_method(to_utf8_buffer, sarray(), varray()); + bind_string_method(to_utf16_buffer, sarray(), varray()); + bind_string_method(to_utf32_buffer, sarray(), varray()); bind_static_method(String, num_scientific, sarray("number"), varray()); bind_static_method(String, num, sarray("number", "decimals"), varray(-1)); diff --git a/core/variant/variant_internal.h b/core/variant/variant_internal.h index 94e7296a99..f3b9bd235c 100644 --- a/core/variant/variant_internal.h +++ b/core/variant/variant_internal.h @@ -1314,7 +1314,7 @@ struct VariantZeroAssigner<float> { template <> struct VariantZeroAssigner<String> { - static _FORCE_INLINE_ void zero(Variant *v) {} + static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_string(v) = String(); } }; template <> @@ -1399,12 +1399,12 @@ struct VariantZeroAssigner<Color> { template <> struct VariantZeroAssigner<StringName> { - static _FORCE_INLINE_ void zero(Variant *v) {} + static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_string_name(v) = StringName(); } }; template <> struct VariantZeroAssigner<NodePath> { - static _FORCE_INLINE_ void zero(Variant *v) {} + static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_node_path(v) = NodePath(); } }; template <> @@ -1414,12 +1414,12 @@ struct VariantZeroAssigner<::RID> { template <> struct VariantZeroAssigner<Callable> { - static _FORCE_INLINE_ void zero(Variant *v) {} + static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_callable(v) = Callable(); } }; template <> struct VariantZeroAssigner<Signal> { - static _FORCE_INLINE_ void zero(Variant *v) {} + static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_signal(v) = Signal(); } }; template <> @@ -1434,47 +1434,47 @@ struct VariantZeroAssigner<Array> { template <> struct VariantZeroAssigner<PackedByteArray> { - static _FORCE_INLINE_ void zero(Variant *v) {} + static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_byte_array(v) = PackedByteArray(); } }; template <> struct VariantZeroAssigner<PackedInt32Array> { - static _FORCE_INLINE_ void zero(Variant *v) {} + static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_int32_array(v) = PackedInt32Array(); } }; template <> struct VariantZeroAssigner<PackedInt64Array> { - static _FORCE_INLINE_ void zero(Variant *v) {} + static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_int64_array(v) = PackedInt64Array(); } }; template <> struct VariantZeroAssigner<PackedFloat32Array> { - static _FORCE_INLINE_ void zero(Variant *v) {} + static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_float32_array(v) = PackedFloat32Array(); } }; template <> struct VariantZeroAssigner<PackedFloat64Array> { - static _FORCE_INLINE_ void zero(Variant *v) {} + static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_float64_array(v) = PackedFloat64Array(); } }; template <> struct VariantZeroAssigner<PackedStringArray> { - static _FORCE_INLINE_ void zero(Variant *v) {} + static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_string_array(v) = PackedStringArray(); } }; template <> struct VariantZeroAssigner<PackedVector2Array> { - static _FORCE_INLINE_ void zero(Variant *v) {} + static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_vector2_array(v) = PackedVector2Array(); } }; template <> struct VariantZeroAssigner<PackedVector3Array> { - static _FORCE_INLINE_ void zero(Variant *v) {} + static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_vector3_array(v) = PackedVector3Array(); } }; template <> struct VariantZeroAssigner<PackedColorArray> { - static _FORCE_INLINE_ void zero(Variant *v) {} + static _FORCE_INLINE_ void zero(Variant *v) { *VariantInternal::get_color_array(v) = PackedColorArray(); } }; template <class T> @@ -1517,7 +1517,7 @@ struct VariantTypeAdjust<Object *> { } }; -// GDNative extension helpers. +// GDExtension helpers. template <class T> struct VariantTypeConstructor { diff --git a/core/variant/variant_op.cpp b/core/variant/variant_op.cpp index 25bc241e9b..d4e6dfb4d1 100644 --- a/core/variant/variant_op.cpp +++ b/core/variant/variant_op.cpp @@ -229,6 +229,20 @@ public: static Variant::Type get_return_type() { return GetTypeInfo<Vector4>::VARIANT_TYPE; } }; +#define register_string_op(m_op_type, m_op_code) \ + do { \ + register_op<m_op_type<String, String>>(m_op_code, Variant::STRING, Variant::STRING); \ + register_op<m_op_type<String, StringName>>(m_op_code, Variant::STRING, Variant::STRING_NAME); \ + register_op<m_op_type<StringName, String>>(m_op_code, Variant::STRING_NAME, Variant::STRING); \ + register_op<m_op_type<StringName, StringName>>(m_op_code, Variant::STRING_NAME, Variant::STRING_NAME); \ + } while (false) + +#define register_string_modulo_op(m_class, m_type) \ + do { \ + register_op<OperatorEvaluatorStringFormat<String, m_class>>(Variant::OP_MODULE, Variant::STRING, m_type); \ + register_op<OperatorEvaluatorStringFormat<StringName, m_class>>(Variant::OP_MODULE, Variant::STRING_NAME, m_type); \ + } while (false) + void Variant::_register_variant_operators() { memset(operator_return_type_table, 0, sizeof(operator_return_type_table)); memset(operator_evaluator_table, 0, sizeof(operator_evaluator_table)); @@ -239,7 +253,7 @@ void Variant::_register_variant_operators() { register_op<OperatorEvaluatorAdd<double, int64_t, double>>(Variant::OP_ADD, Variant::INT, Variant::FLOAT); register_op<OperatorEvaluatorAdd<double, double, int64_t>>(Variant::OP_ADD, Variant::FLOAT, Variant::INT); register_op<OperatorEvaluatorAdd<double, double, double>>(Variant::OP_ADD, Variant::FLOAT, Variant::FLOAT); - register_op<OperatorEvaluatorAdd<String, String, String>>(Variant::OP_ADD, Variant::STRING, Variant::STRING); + register_string_op(OperatorEvaluatorStringConcat, Variant::OP_ADD); register_op<OperatorEvaluatorAdd<Vector2, Vector2, Vector2>>(Variant::OP_ADD, Variant::VECTOR2, Variant::VECTOR2); register_op<OperatorEvaluatorAdd<Vector2i, Vector2i, Vector2i>>(Variant::OP_ADD, Variant::VECTOR2I, Variant::VECTOR2I); register_op<OperatorEvaluatorAdd<Vector3, Vector3, Vector3>>(Variant::OP_ADD, Variant::VECTOR3, Variant::VECTOR3); @@ -415,46 +429,46 @@ void Variant::_register_variant_operators() { register_op<OperatorEvaluatorModNZ<Vector4i, Vector4i, Vector4i>>(Variant::OP_MODULE, Variant::VECTOR4I, Variant::VECTOR4I); register_op<OperatorEvaluatorModNZ<Vector4i, Vector4i, int64_t>>(Variant::OP_MODULE, Variant::VECTOR4I, Variant::INT); - register_op<OperatorEvaluatorStringModNil>(Variant::OP_MODULE, Variant::STRING, Variant::NIL); - - register_op<OperatorEvaluatorStringModT<bool>>(Variant::OP_MODULE, Variant::STRING, Variant::BOOL); - register_op<OperatorEvaluatorStringModT<int64_t>>(Variant::OP_MODULE, Variant::STRING, Variant::INT); - register_op<OperatorEvaluatorStringModT<double>>(Variant::OP_MODULE, Variant::STRING, Variant::FLOAT); - register_op<OperatorEvaluatorStringModT<String>>(Variant::OP_MODULE, Variant::STRING, Variant::STRING); - register_op<OperatorEvaluatorStringModT<Vector2>>(Variant::OP_MODULE, Variant::STRING, Variant::VECTOR2); - register_op<OperatorEvaluatorStringModT<Vector2i>>(Variant::OP_MODULE, Variant::STRING, Variant::VECTOR2I); - register_op<OperatorEvaluatorStringModT<Rect2>>(Variant::OP_MODULE, Variant::STRING, Variant::RECT2); - register_op<OperatorEvaluatorStringModT<Rect2i>>(Variant::OP_MODULE, Variant::STRING, Variant::RECT2I); - register_op<OperatorEvaluatorStringModT<Vector3>>(Variant::OP_MODULE, Variant::STRING, Variant::VECTOR3); - register_op<OperatorEvaluatorStringModT<Vector3i>>(Variant::OP_MODULE, Variant::STRING, Variant::VECTOR3I); - register_op<OperatorEvaluatorStringModT<Vector4>>(Variant::OP_MODULE, Variant::STRING, Variant::VECTOR4); - register_op<OperatorEvaluatorStringModT<Vector4i>>(Variant::OP_MODULE, Variant::STRING, Variant::VECTOR4I); - register_op<OperatorEvaluatorStringModT<Transform2D>>(Variant::OP_MODULE, Variant::STRING, Variant::TRANSFORM2D); - register_op<OperatorEvaluatorStringModT<Plane>>(Variant::OP_MODULE, Variant::STRING, Variant::PLANE); - register_op<OperatorEvaluatorStringModT<Quaternion>>(Variant::OP_MODULE, Variant::STRING, Variant::QUATERNION); - register_op<OperatorEvaluatorStringModT<::AABB>>(Variant::OP_MODULE, Variant::STRING, Variant::AABB); - register_op<OperatorEvaluatorStringModT<Basis>>(Variant::OP_MODULE, Variant::STRING, Variant::BASIS); - register_op<OperatorEvaluatorStringModT<Transform3D>>(Variant::OP_MODULE, Variant::STRING, Variant::TRANSFORM3D); - register_op<OperatorEvaluatorStringModT<Projection>>(Variant::OP_MODULE, Variant::STRING, Variant::PROJECTION); - - register_op<OperatorEvaluatorStringModT<Color>>(Variant::OP_MODULE, Variant::STRING, Variant::COLOR); - register_op<OperatorEvaluatorStringModT<StringName>>(Variant::OP_MODULE, Variant::STRING, Variant::STRING_NAME); - register_op<OperatorEvaluatorStringModT<NodePath>>(Variant::OP_MODULE, Variant::STRING, Variant::NODE_PATH); - register_op<OperatorEvaluatorStringModObject>(Variant::OP_MODULE, Variant::STRING, Variant::OBJECT); - register_op<OperatorEvaluatorStringModT<Callable>>(Variant::OP_MODULE, Variant::STRING, Variant::CALLABLE); - register_op<OperatorEvaluatorStringModT<Signal>>(Variant::OP_MODULE, Variant::STRING, Variant::SIGNAL); - register_op<OperatorEvaluatorStringModT<Dictionary>>(Variant::OP_MODULE, Variant::STRING, Variant::DICTIONARY); - register_op<OperatorEvaluatorStringModArray>(Variant::OP_MODULE, Variant::STRING, Variant::ARRAY); - - register_op<OperatorEvaluatorStringModT<PackedByteArray>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_BYTE_ARRAY); - register_op<OperatorEvaluatorStringModT<PackedInt32Array>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_INT32_ARRAY); - register_op<OperatorEvaluatorStringModT<PackedInt64Array>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_INT64_ARRAY); - register_op<OperatorEvaluatorStringModT<PackedFloat32Array>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_FLOAT32_ARRAY); - register_op<OperatorEvaluatorStringModT<PackedFloat64Array>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_FLOAT64_ARRAY); - register_op<OperatorEvaluatorStringModT<PackedStringArray>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_STRING_ARRAY); - register_op<OperatorEvaluatorStringModT<PackedVector2Array>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_VECTOR2_ARRAY); - register_op<OperatorEvaluatorStringModT<PackedVector3Array>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_VECTOR3_ARRAY); - register_op<OperatorEvaluatorStringModT<PackedColorArray>>(Variant::OP_MODULE, Variant::STRING, Variant::PACKED_COLOR_ARRAY); + register_string_modulo_op(void, Variant::NIL); + + register_string_modulo_op(bool, Variant::BOOL); + register_string_modulo_op(int64_t, Variant::INT); + register_string_modulo_op(double, Variant::FLOAT); + register_string_modulo_op(String, Variant::STRING); + register_string_modulo_op(Vector2, Variant::VECTOR2); + register_string_modulo_op(Vector2i, Variant::VECTOR2I); + register_string_modulo_op(Rect2, Variant::RECT2); + register_string_modulo_op(Rect2i, Variant::RECT2I); + register_string_modulo_op(Vector3, Variant::VECTOR3); + register_string_modulo_op(Vector3i, Variant::VECTOR3I); + register_string_modulo_op(Vector4, Variant::VECTOR4); + register_string_modulo_op(Vector4i, Variant::VECTOR4I); + register_string_modulo_op(Transform2D, Variant::TRANSFORM2D); + register_string_modulo_op(Plane, Variant::PLANE); + register_string_modulo_op(Quaternion, Variant::QUATERNION); + register_string_modulo_op(::AABB, Variant::AABB); + register_string_modulo_op(Basis, Variant::BASIS); + register_string_modulo_op(Transform3D, Variant::TRANSFORM3D); + register_string_modulo_op(Projection, Variant::PROJECTION); + + register_string_modulo_op(Color, Variant::COLOR); + register_string_modulo_op(StringName, Variant::STRING_NAME); + register_string_modulo_op(NodePath, Variant::NODE_PATH); + register_string_modulo_op(Object, Variant::OBJECT); + register_string_modulo_op(Callable, Variant::CALLABLE); + register_string_modulo_op(Signal, Variant::SIGNAL); + register_string_modulo_op(Dictionary, Variant::DICTIONARY); + register_string_modulo_op(Array, Variant::ARRAY); + + register_string_modulo_op(PackedByteArray, Variant::PACKED_BYTE_ARRAY); + register_string_modulo_op(PackedInt32Array, Variant::PACKED_INT32_ARRAY); + register_string_modulo_op(PackedInt64Array, Variant::PACKED_INT64_ARRAY); + register_string_modulo_op(PackedFloat32Array, Variant::PACKED_FLOAT32_ARRAY); + register_string_modulo_op(PackedFloat64Array, Variant::PACKED_FLOAT64_ARRAY); + register_string_modulo_op(PackedStringArray, Variant::PACKED_STRING_ARRAY); + register_string_modulo_op(PackedVector2Array, Variant::PACKED_VECTOR2_ARRAY); + register_string_modulo_op(PackedVector3Array, Variant::PACKED_VECTOR3_ARRAY); + register_string_modulo_op(PackedColorArray, Variant::PACKED_COLOR_ARRAY); register_op<OperatorEvaluatorPow<int64_t, int64_t, int64_t>>(Variant::OP_POWER, Variant::INT, Variant::INT); register_op<OperatorEvaluatorPow<double, int64_t, double>>(Variant::OP_POWER, Variant::INT, Variant::FLOAT); @@ -498,7 +512,7 @@ void Variant::_register_variant_operators() { register_op<OperatorEvaluatorEqual<int64_t, double>>(Variant::OP_EQUAL, Variant::INT, Variant::FLOAT); register_op<OperatorEvaluatorEqual<double, int64_t>>(Variant::OP_EQUAL, Variant::FLOAT, Variant::INT); register_op<OperatorEvaluatorEqual<double, double>>(Variant::OP_EQUAL, Variant::FLOAT, Variant::FLOAT); - register_op<OperatorEvaluatorEqual<String, String>>(Variant::OP_EQUAL, Variant::STRING, Variant::STRING); + register_string_op(OperatorEvaluatorEqual, Variant::OP_EQUAL); register_op<OperatorEvaluatorEqual<Vector2, Vector2>>(Variant::OP_EQUAL, Variant::VECTOR2, Variant::VECTOR2); register_op<OperatorEvaluatorEqual<Vector2i, Vector2i>>(Variant::OP_EQUAL, Variant::VECTOR2I, Variant::VECTOR2I); register_op<OperatorEvaluatorEqual<Rect2, Rect2>>(Variant::OP_EQUAL, Variant::RECT2, Variant::RECT2); @@ -516,10 +530,6 @@ void Variant::_register_variant_operators() { register_op<OperatorEvaluatorEqual<Projection, Projection>>(Variant::OP_EQUAL, Variant::PROJECTION, Variant::PROJECTION); register_op<OperatorEvaluatorEqual<Color, Color>>(Variant::OP_EQUAL, Variant::COLOR, Variant::COLOR); - register_op<OperatorEvaluatorEqual<StringName, String>>(Variant::OP_EQUAL, Variant::STRING_NAME, Variant::STRING); - register_op<OperatorEvaluatorEqual<String, StringName>>(Variant::OP_EQUAL, Variant::STRING, Variant::STRING_NAME); - register_op<OperatorEvaluatorEqual<StringName, StringName>>(Variant::OP_EQUAL, Variant::STRING_NAME, Variant::STRING_NAME); - register_op<OperatorEvaluatorEqual<NodePath, NodePath>>(Variant::OP_EQUAL, Variant::NODE_PATH, Variant::NODE_PATH); register_op<OperatorEvaluatorEqual<::RID, ::RID>>(Variant::OP_EQUAL, Variant::RID, Variant::RID); @@ -621,7 +631,7 @@ void Variant::_register_variant_operators() { register_op<OperatorEvaluatorNotEqual<int64_t, double>>(Variant::OP_NOT_EQUAL, Variant::INT, Variant::FLOAT); register_op<OperatorEvaluatorNotEqual<double, int64_t>>(Variant::OP_NOT_EQUAL, Variant::FLOAT, Variant::INT); register_op<OperatorEvaluatorNotEqual<double, double>>(Variant::OP_NOT_EQUAL, Variant::FLOAT, Variant::FLOAT); - register_op<OperatorEvaluatorNotEqual<String, String>>(Variant::OP_NOT_EQUAL, Variant::STRING, Variant::STRING); + register_string_op(OperatorEvaluatorNotEqual, Variant::OP_NOT_EQUAL); register_op<OperatorEvaluatorNotEqual<Vector2, Vector2>>(Variant::OP_NOT_EQUAL, Variant::VECTOR2, Variant::VECTOR2); register_op<OperatorEvaluatorNotEqual<Vector2i, Vector2i>>(Variant::OP_NOT_EQUAL, Variant::VECTOR2I, Variant::VECTOR2I); register_op<OperatorEvaluatorNotEqual<Rect2, Rect2>>(Variant::OP_NOT_EQUAL, Variant::RECT2, Variant::RECT2); @@ -639,10 +649,6 @@ void Variant::_register_variant_operators() { register_op<OperatorEvaluatorNotEqual<Projection, Projection>>(Variant::OP_NOT_EQUAL, Variant::PROJECTION, Variant::PROJECTION); register_op<OperatorEvaluatorNotEqual<Color, Color>>(Variant::OP_NOT_EQUAL, Variant::COLOR, Variant::COLOR); - register_op<OperatorEvaluatorNotEqual<StringName, String>>(Variant::OP_NOT_EQUAL, Variant::STRING_NAME, Variant::STRING); - register_op<OperatorEvaluatorNotEqual<String, StringName>>(Variant::OP_NOT_EQUAL, Variant::STRING, Variant::STRING_NAME); - register_op<OperatorEvaluatorNotEqual<StringName, StringName>>(Variant::OP_NOT_EQUAL, Variant::STRING_NAME, Variant::STRING_NAME); - register_op<OperatorEvaluatorNotEqual<NodePath, NodePath>>(Variant::OP_NOT_EQUAL, Variant::NODE_PATH, Variant::NODE_PATH); register_op<OperatorEvaluatorNotEqual<::RID, ::RID>>(Variant::OP_NOT_EQUAL, Variant::RID, Variant::RID); @@ -895,10 +901,7 @@ void Variant::_register_variant_operators() { register_op<OperatorEvaluatorNotFloat>(Variant::OP_NOT, Variant::FLOAT, Variant::NIL); register_op<OperatorEvaluatorNotObject>(Variant::OP_NOT, Variant::OBJECT, Variant::NIL); - register_op<OperatorEvaluatorInStringFind<String>>(Variant::OP_IN, Variant::STRING, Variant::STRING); - register_op<OperatorEvaluatorInStringFind<StringName>>(Variant::OP_IN, Variant::STRING_NAME, Variant::STRING); - register_op<OperatorEvaluatorInStringNameFind<String>>(Variant::OP_IN, Variant::STRING, Variant::STRING_NAME); - register_op<OperatorEvaluatorInStringNameFind<StringName>>(Variant::OP_IN, Variant::STRING_NAME, Variant::STRING_NAME); + register_string_op(OperatorEvaluatorInStringFind, Variant::OP_IN); register_op<OperatorEvaluatorInDictionaryHasNil>(Variant::OP_IN, Variant::NIL, Variant::DICTIONARY); register_op<OperatorEvaluatorInDictionaryHas<bool>>(Variant::OP_IN, Variant::BOOL, Variant::DICTIONARY); @@ -996,6 +999,7 @@ void Variant::_register_variant_operators() { register_op<OperatorEvaluatorInArrayFind<float, PackedFloat64Array>>(Variant::OP_IN, Variant::FLOAT, Variant::PACKED_FLOAT64_ARRAY); register_op<OperatorEvaluatorInArrayFind<String, PackedStringArray>>(Variant::OP_IN, Variant::STRING, Variant::PACKED_STRING_ARRAY); + register_op<OperatorEvaluatorInArrayFind<StringName, PackedStringArray>>(Variant::OP_IN, Variant::STRING_NAME, Variant::PACKED_STRING_ARRAY); register_op<OperatorEvaluatorInArrayFind<Vector2, PackedVector2Array>>(Variant::OP_IN, Variant::VECTOR2, Variant::PACKED_VECTOR2_ARRAY); register_op<OperatorEvaluatorInArrayFind<Vector3, PackedVector3Array>>(Variant::OP_IN, Variant::VECTOR3, Variant::PACKED_VECTOR3_ARRAY); @@ -1006,6 +1010,9 @@ void Variant::_register_variant_operators() { register_op<OperatorEvaluatorObjectHasPropertyStringName>(Variant::OP_IN, Variant::STRING_NAME, Variant::OBJECT); } +#undef register_string_op +#undef register_string_modulo_op + void Variant::_unregister_variant_operators() { } diff --git a/core/variant/variant_op.h b/core/variant/variant_op.h index 34858540ec..ea4216322c 100644 --- a/core/variant/variant_op.h +++ b/core/variant/variant_op.h @@ -875,7 +875,33 @@ public: static Variant::Type get_return_type() { return GetTypeInfo<Vector<T>>::VARIANT_TYPE; } }; -class OperatorEvaluatorStringModNil { +template <class Left, class Right> +class OperatorEvaluatorStringConcat { +public: + static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) { + const String a(*VariantGetInternalPtr<Left>::get_ptr(&p_left)); + const String b(*VariantGetInternalPtr<Right>::get_ptr(&p_right)); + *r_ret = a + b; + r_valid = true; + } + static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) { + const String a(*VariantGetInternalPtr<Left>::get_ptr(left)); + const String b(*VariantGetInternalPtr<Right>::get_ptr(right)); + *VariantGetInternalPtr<String>::get_ptr(r_ret) = a + b; + } + static void ptr_evaluate(const void *left, const void *right, void *r_ret) { + const String a(PtrToArg<Left>::convert(left)); + const String b(PtrToArg<Right>::convert(right)); + PtrToArg<String>::encode(a + b, r_ret); + } + static Variant::Type get_return_type() { return Variant::STRING; } +}; + +template <class S, class T> +class OperatorEvaluatorStringFormat; + +template <class S> +class OperatorEvaluatorStringFormat<S, void> { public: _FORCE_INLINE_ static String do_mod(const String &s, bool *r_valid) { Array values; @@ -888,22 +914,22 @@ public: return a; } static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) { - const String &a = *VariantGetInternalPtr<String>::get_ptr(&p_left); - *r_ret = do_mod(a, &r_valid); + *r_ret = do_mod(*VariantGetInternalPtr<S>::get_ptr(&p_left), &r_valid); } static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) { bool valid = true; - String result = do_mod(*VariantGetInternalPtr<String>::get_ptr(left), &valid); + String result = do_mod(*VariantGetInternalPtr<S>::get_ptr(left), &valid); ERR_FAIL_COND_MSG(!valid, result); *VariantGetInternalPtr<String>::get_ptr(r_ret) = result; } static void ptr_evaluate(const void *left, const void *right, void *r_ret) { - PtrToArg<String>::encode(do_mod(PtrToArg<String>::convert(left), nullptr), r_ret); + PtrToArg<String>::encode(do_mod(PtrToArg<S>::convert(left), nullptr), r_ret); } static Variant::Type get_return_type() { return Variant::STRING; } }; -class OperatorEvaluatorStringModArray { +template <class S> +class OperatorEvaluatorStringFormat<S, Array> { public: _FORCE_INLINE_ static String do_mod(const String &s, const Array &p_values, bool *r_valid) { String a = s.sprintf(p_values, r_valid); @@ -913,22 +939,22 @@ public: return a; } static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) { - const String &a = *VariantGetInternalPtr<String>::get_ptr(&p_left); - *r_ret = do_mod(a, *VariantGetInternalPtr<Array>::get_ptr(&p_right), &r_valid); + *r_ret = do_mod(*VariantGetInternalPtr<S>::get_ptr(&p_left), *VariantGetInternalPtr<Array>::get_ptr(&p_right), &r_valid); } static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) { bool valid = true; - String result = do_mod(*VariantGetInternalPtr<String>::get_ptr(left), *VariantGetInternalPtr<Array>::get_ptr(right), &valid); + String result = do_mod(*VariantGetInternalPtr<S>::get_ptr(left), *VariantGetInternalPtr<Array>::get_ptr(right), &valid); ERR_FAIL_COND_MSG(!valid, result); *VariantGetInternalPtr<String>::get_ptr(r_ret) = result; } static void ptr_evaluate(const void *left, const void *right, void *r_ret) { - PtrToArg<String>::encode(do_mod(PtrToArg<String>::convert(left), PtrToArg<Array>::convert(right), nullptr), r_ret); + PtrToArg<String>::encode(do_mod(PtrToArg<S>::convert(left), PtrToArg<Array>::convert(right), nullptr), r_ret); } static Variant::Type get_return_type() { return Variant::STRING; } }; -class OperatorEvaluatorStringModObject { +template <class S> +class OperatorEvaluatorStringFormat<S, Object> { public: _FORCE_INLINE_ static String do_mod(const String &s, const Object *p_object, bool *r_valid) { Array values; @@ -941,23 +967,22 @@ public: return a; } static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) { - const String &a = *VariantGetInternalPtr<String>::get_ptr(&p_left); - *r_ret = do_mod(a, p_right.get_validated_object(), &r_valid); + *r_ret = do_mod(*VariantGetInternalPtr<S>::get_ptr(&p_left), p_right.get_validated_object(), &r_valid); } static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) { bool valid = true; - String result = do_mod(*VariantGetInternalPtr<String>::get_ptr(left), right->get_validated_object(), &valid); + String result = do_mod(*VariantGetInternalPtr<S>::get_ptr(left), right->get_validated_object(), &valid); ERR_FAIL_COND_MSG(!valid, result); *VariantGetInternalPtr<String>::get_ptr(r_ret) = result; } static void ptr_evaluate(const void *left, const void *right, void *r_ret) { - PtrToArg<String>::encode(do_mod(PtrToArg<String>::convert(left), PtrToArg<Object *>::convert(right), nullptr), r_ret); + PtrToArg<String>::encode(do_mod(PtrToArg<S>::convert(left), PtrToArg<Object *>::convert(right), nullptr), r_ret); } static Variant::Type get_return_type() { return Variant::STRING; } }; -template <class T> -class OperatorEvaluatorStringModT { +template <class S, class T> +class OperatorEvaluatorStringFormat { public: _FORCE_INLINE_ static String do_mod(const String &s, const T &p_value, bool *r_valid) { Array values; @@ -969,17 +994,16 @@ public: return a; } static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) { - const String &a = *VariantGetInternalPtr<String>::get_ptr(&p_left); - *r_ret = do_mod(a, *VariantGetInternalPtr<T>::get_ptr(&p_right), &r_valid); + *r_ret = do_mod(*VariantGetInternalPtr<S>::get_ptr(&p_left), *VariantGetInternalPtr<T>::get_ptr(&p_right), &r_valid); } static inline void validated_evaluate(const Variant *left, const Variant *right, Variant *r_ret) { bool valid = true; - String result = do_mod(*VariantGetInternalPtr<String>::get_ptr(left), *VariantGetInternalPtr<T>::get_ptr(right), &valid); + String result = do_mod(*VariantGetInternalPtr<S>::get_ptr(left), *VariantGetInternalPtr<T>::get_ptr(right), &valid); ERR_FAIL_COND_MSG(!valid, result); *VariantGetInternalPtr<String>::get_ptr(r_ret) = result; } static void ptr_evaluate(const void *left, const void *right, void *r_ret) { - PtrToArg<String>::encode(do_mod(PtrToArg<String>::convert(left), PtrToArg<T>::convert(right), nullptr), r_ret); + PtrToArg<String>::encode(do_mod(PtrToArg<S>::convert(left), PtrToArg<T>::convert(right), nullptr), r_ret); } static Variant::Type get_return_type() { return Variant::STRING; } }; @@ -1288,8 +1312,11 @@ public: //// +template <class Left, class Right> +class OperatorEvaluatorInStringFind; + template <class Left> -class OperatorEvaluatorInStringFind { +class OperatorEvaluatorInStringFind<Left, String> { public: static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) { const Left &str_a = *VariantGetInternalPtr<Left>::get_ptr(&p_left); @@ -1310,7 +1337,7 @@ public: }; template <class Left> -class OperatorEvaluatorInStringNameFind { +class OperatorEvaluatorInStringFind<Left, StringName> { public: static void evaluate(const Variant &p_left, const Variant &p_right, Variant *r_ret, bool &r_valid) { const Left &str_a = *VariantGetInternalPtr<Left>::get_ptr(&p_left); diff --git a/core/variant/variant_parser.cpp b/core/variant/variant_parser.cpp index 9f500dbf5e..f122ed5f8f 100644 --- a/core/variant/variant_parser.cpp +++ b/core/variant/variant_parser.cpp @@ -42,7 +42,7 @@ char32_t VariantParser::Stream::get_char() { } // attempt to readahead - readahead_filled = _read_buffer(readahead_buffer, READAHEAD_SIZE); + readahead_filled = _read_buffer(readahead_buffer, readahead_enabled ? READAHEAD_SIZE : 1); if (readahead_filled) { readahead_pointer = 0; } else { @@ -54,10 +54,21 @@ char32_t VariantParser::Stream::get_char() { return get_char(); } +bool VariantParser::Stream::is_eof() const { + if (readahead_enabled) { + return eof; + } + return _is_eof(); +} + bool VariantParser::StreamFile::is_utf8() const { return true; } +bool VariantParser::StreamFile::_is_eof() const { + return f->eof_reached(); +} + uint32_t VariantParser::StreamFile::_read_buffer(char32_t *p_buffer, uint32_t p_num_chars) { // The buffer is assumed to include at least one character (for null terminator) ERR_FAIL_COND_V(!p_num_chars, 0); @@ -79,6 +90,10 @@ bool VariantParser::StreamString::is_utf8() const { return false; } +bool VariantParser::StreamString::_is_eof() const { + return pos > s.length(); +} + uint32_t VariantParser::StreamString::_read_buffer(char32_t *p_buffer, uint32_t p_num_chars) { // The buffer is assumed to include at least one character (for null terminator) ERR_FAIL_COND_V(!p_num_chars, 0); diff --git a/core/variant/variant_parser.h b/core/variant/variant_parser.h index 6b1d095ab5..fdea355c4b 100644 --- a/core/variant/variant_parser.h +++ b/core/variant/variant_parser.h @@ -46,14 +46,16 @@ public: bool eof = false; protected: + bool readahead_enabled = true; virtual uint32_t _read_buffer(char32_t *p_buffer, uint32_t p_num_chars) = 0; + virtual bool _is_eof() const = 0; public: char32_t saved = 0; char32_t get_char(); virtual bool is_utf8() const = 0; - bool is_eof() const { return eof; } + bool is_eof() const; Stream() {} virtual ~Stream() {} @@ -62,13 +64,14 @@ public: struct StreamFile : public Stream { protected: virtual uint32_t _read_buffer(char32_t *p_buffer, uint32_t p_num_chars) override; + virtual bool _is_eof() const override; public: Ref<FileAccess> f; virtual bool is_utf8() const override; - StreamFile() {} + StreamFile(bool p_readahead_enabled = true) { readahead_enabled = p_readahead_enabled; } }; struct StreamString : public Stream { @@ -79,10 +82,11 @@ public: protected: virtual uint32_t _read_buffer(char32_t *p_buffer, uint32_t p_num_chars) override; + virtual bool _is_eof() const override; public: virtual bool is_utf8() const override; - StreamString() {} + StreamString(bool p_readahead_enabled = true) { readahead_enabled = p_readahead_enabled; } }; typedef Error (*ParseResourceFunc)(void *p_self, Stream *p_stream, Ref<Resource> &r_res, int &line, String &r_err_str); diff --git a/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml index 4a6b85f229..6b0dccd7fc 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -1319,6 +1319,9 @@ <member name="EngineDebugger" type="EngineDebugger" setter="" getter=""> The [EngineDebugger] singleton. </member> + <member name="GDExtensionManager" type="GDExtensionManager" setter="" getter=""> + The [GDExtensionManager] singleton. + </member> <member name="Geometry2D" type="Geometry2D" setter="" getter=""> The [Geometry2D] singleton. </member> @@ -1348,9 +1351,6 @@ <member name="Marshalls" type="Marshalls" setter="" getter=""> The [Marshalls] singleton. </member> - <member name="NativeExtensionManager" type="NativeExtensionManager" setter="" getter=""> - The [NativeExtensionManager] singleton. - </member> <member name="NavigationMeshGenerator" type="NavigationMeshGenerator" setter="" getter=""> The [NavigationMeshGenerator] singleton. </member> @@ -1479,6 +1479,9 @@ <constant name="INLINE_ALIGNMENT_CENTER_TO" value="1" enum="InlineAlignment"> Aligns the center of the inline object (e.g. image, table) to the position of the text specified by [code]INLINE_ALIGNMENT_TO_*[/code] constant. </constant> + <constant name="INLINE_ALIGNMENT_BASELINE_TO" value="3" enum="InlineAlignment"> + Aligns the baseline (user defined) of the inline object (e.g. image, table) to the position of the text specified by [code]INLINE_ALIGNMENT_TO_*[/code] constant. + </constant> <constant name="INLINE_ALIGNMENT_BOTTOM_TO" value="2" enum="InlineAlignment"> Aligns the bottom of the inline object (e.g. image, table) to the position of the text specified by [code]INLINE_ALIGNMENT_TO_*[/code] constant. </constant> diff --git a/doc/classes/AStarGrid2D.xml b/doc/classes/AStarGrid2D.xml index 8dde3748d7..cba783246f 100644 --- a/doc/classes/AStarGrid2D.xml +++ b/doc/classes/AStarGrid2D.xml @@ -69,6 +69,20 @@ [b]Note:[/b] This method is not thread-safe. If called from a [Thread], it will return an empty [PackedVector3Array] and will print an error message. </description> </method> + <method name="get_point_position" qualifiers="const"> + <return type="Vector2" /> + <param index="0" name="id" type="Vector2i" /> + <description> + Returns the position of the point associated with the given [param id]. + </description> + </method> + <method name="get_point_weight_scale" qualifiers="const"> + <return type="float" /> + <param index="0" name="id" type="Vector2i" /> + <description> + Returns the weight scale of the point associated with the given [param id]. + </description> + </method> <method name="is_dirty" qualifiers="const"> <return type="bool" /> <description> @@ -103,6 +117,16 @@ <param index="1" name="solid" type="bool" default="true" /> <description> Disables or enables the specified point for pathfinding. Useful for making an obstacle. By default, all points are enabled. + [b]Note:[/b] Calling [method update] is not needed after the call of this function. + </description> + </method> + <method name="set_point_weight_scale"> + <return type="void" /> + <param index="0" name="id" type="Vector2i" /> + <param index="1" name="weight_scale" type="float" /> + <description> + Sets the [param weight_scale] for the point with the given [param id]. The [param weight_scale] is multiplied by the result of [method _compute_cost] when determining the overall cost of traveling across a segment from a neighboring point to this point. + [b]Note:[/b] Calling [method update] is not needed after the call of this function. </description> </method> <method name="update"> @@ -124,6 +148,7 @@ </member> <member name="jumping_enabled" type="bool" setter="set_jumping_enabled" getter="is_jumping_enabled" default="false"> Enables or disables jumping to skip up the intermediate points and speeds up the searching algorithm. + [b]Note:[/b] Currently, toggling it on disables the consideration of weight scaling in pathfinding. </member> <member name="offset" type="Vector2" setter="set_offset" getter="get_offset" default="Vector2(0, 0)"> The offset of the grid which will be applied to calculate the resulting point position returned by [method get_point_path]. If changed, [method update] needs to be called before finding the next path. @@ -134,20 +159,22 @@ </members> <constants> <constant name="HEURISTIC_EUCLIDEAN" value="0" enum="Heuristic"> - The Euclidean heuristic to be used for the pathfinding using the following formula: + The [url=https://en.wikipedia.org/wiki/Euclidean_distance]Euclidean heuristic[/url] to be used for the pathfinding using the following formula: [codeblock] dx = abs(to_id.x - from_id.x) dy = abs(to_id.y - from_id.y) result = sqrt(dx * dx + dy * dy) [/codeblock] + [b]Note:[/b] This is also the internal heuristic used in [AStar3D] and [AStar2D] by default (with the inclusion of possible z-axis coordinate). </constant> <constant name="HEURISTIC_MANHATTAN" value="1" enum="Heuristic"> - The Manhattan heuristic to be used for the pathfinding using the following formula: + The [url=https://en.wikipedia.org/wiki/Taxicab_geometry]Manhattan heuristic[/url] to be used for the pathfinding using the following formula: [codeblock] dx = abs(to_id.x - from_id.x) dy = abs(to_id.y - from_id.y) result = dx + dy [/codeblock] + [b]Note:[/b] This heuristic is intended to be used with 4-side orthogonal movements, provided by setting the [member diagonal_mode] to [constant DIAGONAL_MODE_NEVER]. </constant> <constant name="HEURISTIC_OCTILE" value="2" enum="Heuristic"> The Octile heuristic to be used for the pathfinding using the following formula: @@ -159,7 +186,7 @@ [/codeblock] </constant> <constant name="HEURISTIC_CHEBYSHEV" value="3" enum="Heuristic"> - The Chebyshev heuristic to be used for the pathfinding using the following formula: + The [url=https://en.wikipedia.org/wiki/Chebyshev_distance]Chebyshev heuristic[/url] to be used for the pathfinding using the following formula: [codeblock] dx = abs(to_id.x - from_id.x) dy = abs(to_id.y - from_id.y) diff --git a/doc/classes/Area2D.xml b/doc/classes/Area2D.xml index 29592f133d..3f76cc16ec 100644 --- a/doc/classes/Area2D.xml +++ b/doc/classes/Area2D.xml @@ -114,15 +114,13 @@ <signal name="area_entered"> <param index="0" name="area" type="Area2D" /> <description> - Emitted when another Area2D enters this Area2D. Requires [member monitoring] to be set to [code]true[/code]. - [param area] the other Area2D. + Emitted when the received [param area] enters this area. Requires [member monitoring] to be set to [code]true[/code]. </description> </signal> <signal name="area_exited"> <param index="0" name="area" type="Area2D" /> <description> - Emitted when another Area2D exits this Area2D. Requires [member monitoring] to be set to [code]true[/code]. - [param area] the other Area2D. + Emitted when the received [param area] exits this area. Requires [member monitoring] to be set to [code]true[/code]. </description> </signal> <signal name="area_shape_entered"> @@ -131,11 +129,18 @@ <param index="2" name="area_shape_index" type="int" /> <param index="3" name="local_shape_index" type="int" /> <description> - Emitted when one of another Area2D's [Shape2D]s enters one of this Area2D's [Shape2D]s. Requires [member monitoring] to be set to [code]true[/code]. - [param area_rid] the [RID] of the other Area2D's [CollisionObject2D] used by the [PhysicsServer2D]. - [param area] the other Area2D. - [param area_shape_index] the index of the [Shape2D] of the other Area2D used by the [PhysicsServer2D]. Get the [CollisionShape2D] node with [code]area.shape_owner_get_owner(area.shape_find_owner(area_shape_index))[/code]. - [param local_shape_index] the index of the [Shape2D] of this Area2D used by the [PhysicsServer2D]. Get the [CollisionShape2D] node with [code]self.shape_owner_get_owner(self.shape_find_owner(local_shape_index))[/code]. + Emitted when a [Shape2D] of the received [param area] enters a shape of this area. Requires [member monitoring] to be set to [code]true[/code]. + [param local_shape_index] and [param area_shape_index] contain indices of the interacting shapes from this area and the other area, respectively. [param area_rid] contains the [RID] of the other area. These values can be used with the [PhysicsServer2D]. + [b]Example of getting the[/b] [CollisionShape2D] [b]node from the shape index:[/b] + [codeblocks] + [gdscript] + var other_shape_owner = area.shape_find_owner(area_shape_index) + var other_shape_node = area.shape_owner_get_owner(other_shape_owner) + + var local_shape_owner = shape_find_owner(local_shape_index) + var local_shape_node = shape_owner_get_owner(local_shape_owner) + [/gdscript] + [/codeblocks] </description> </signal> <signal name="area_shape_exited"> @@ -144,25 +149,20 @@ <param index="2" name="area_shape_index" type="int" /> <param index="3" name="local_shape_index" type="int" /> <description> - Emitted when one of another Area2D's [Shape2D]s exits one of this Area2D's [Shape2D]s. Requires [member monitoring] to be set to [code]true[/code]. - [param area_rid] the [RID] of the other Area2D's [CollisionObject2D] used by the [PhysicsServer2D]. - [param area] the other Area2D. - [param area_shape_index] the index of the [Shape2D] of the other Area2D used by the [PhysicsServer2D]. Get the [CollisionShape2D] node with [code]area.shape_owner_get_owner(area.shape_find_owner(area_shape_index))[/code]. - [param local_shape_index] the index of the [Shape2D] of this Area2D used by the [PhysicsServer2D]. Get the [CollisionShape2D] node with [code]self.shape_owner_get_owner(self.shape_find_owner(local_shape_index))[/code]. + Emitted when a [Shape2D] of the received [param area] exits a shape of this area. Requires [member monitoring] to be set to [code]true[/code]. + See also [signal area_shape_entered]. </description> </signal> <signal name="body_entered"> <param index="0" name="body" type="Node2D" /> <description> - Emitted when a [PhysicsBody2D] or [TileMap] enters this Area2D. Requires [member monitoring] to be set to [code]true[/code]. [TileMap]s are detected if the [TileSet] has Collision [Shape2D]s. - [param body] the [Node], if it exists in the tree, of the other [PhysicsBody2D] or [TileMap]. + Emitted when the received [param body] enters this area. [param body] can be a [PhysicsBody2D] or a [TileMap]. [TileMap]s are detected if their [TileSet] has collision shapes configured. Requires [member monitoring] to be set to [code]true[/code]. </description> </signal> <signal name="body_exited"> <param index="0" name="body" type="Node2D" /> <description> - Emitted when a [PhysicsBody2D] or [TileMap] exits this Area2D. Requires [member monitoring] to be set to [code]true[/code]. [TileMap]s are detected if the [TileSet] has Collision [Shape2D]s. - [param body] the [Node], if it exists in the tree, of the other [PhysicsBody2D] or [TileMap]. + Emitted when the received [param body] exits this area. [param body] can be a [PhysicsBody2D] or a [TileMap]. [TileMap]s are detected if their [TileSet] has collision shapes configured. Requires [member monitoring] to be set to [code]true[/code]. </description> </signal> <signal name="body_shape_entered"> @@ -171,11 +171,18 @@ <param index="2" name="body_shape_index" type="int" /> <param index="3" name="local_shape_index" type="int" /> <description> - Emitted when one of a [PhysicsBody2D] or [TileMap]'s [Shape2D]s enters one of this Area2D's [Shape2D]s. Requires [member monitoring] to be set to [code]true[/code]. [TileMap]s are detected if the [TileSet] has Collision [Shape2D]s. - [param body_rid] the [RID] of the [PhysicsBody2D] or [TileSet]'s [CollisionObject2D] used by the [PhysicsServer2D]. - [param body] the [Node], if it exists in the tree, of the [PhysicsBody2D] or [TileMap]. - [param body_shape_index] the index of the [Shape2D] of the [PhysicsBody2D] or [TileMap] used by the [PhysicsServer2D]. Get the [CollisionShape2D] node with [code]body.shape_owner_get_owner(body.shape_find_owner(body_shape_index))[/code]. - [param local_shape_index] the index of the [Shape2D] of this Area2D used by the [PhysicsServer2D]. Get the [CollisionShape2D] node with [code]self.shape_owner_get_owner(self.shape_find_owner(local_shape_index))[/code]. + Emitted when a [Shape2D] of the received [param body] enters a shape of this area. [param body] can be a [PhysicsBody2D] or a [TileMap]. [TileMap]s are detected if their [TileSet] has collision shapes configured. Requires [member monitoring] to be set to [code]true[/code]. + [param local_shape_index] and [param body_shape_index] contain indices of the interacting shapes from this area and the interacting body, respectively. [param body_rid] contains the [RID] of the body. These values can be used with the [PhysicsServer2D]. + [b]Example of getting the[/b] [CollisionShape2D] [b]node from the shape index:[/b] + [codeblocks] + [gdscript] + var body_shape_owner = body.shape_find_owner(body_shape_index) + var body_shape_node = body.shape_owner_get_owner(body_shape_owner) + + var local_shape_owner = shape_find_owner(local_shape_index) + var local_shape_node = shape_owner_get_owner(local_shape_owner) + [/gdscript] + [/codeblocks] </description> </signal> <signal name="body_shape_exited"> @@ -184,11 +191,8 @@ <param index="2" name="body_shape_index" type="int" /> <param index="3" name="local_shape_index" type="int" /> <description> - Emitted when one of a [PhysicsBody2D] or [TileMap]'s [Shape2D]s exits one of this Area2D's [Shape2D]s. Requires [member monitoring] to be set to [code]true[/code]. [TileMap]s are detected if the [TileSet] has Collision [Shape2D]s. - [param body_rid] the [RID] of the [PhysicsBody2D] or [TileSet]'s [CollisionObject2D] used by the [PhysicsServer2D]. - [param body] the [Node], if it exists in the tree, of the [PhysicsBody2D] or [TileMap]. - [param body_shape_index] the index of the [Shape2D] of the [PhysicsBody2D] or [TileMap] used by the [PhysicsServer2D]. Get the [CollisionShape2D] node with [code]body.shape_owner_get_owner(body.shape_find_owner(body_shape_index))[/code]. - [param local_shape_index] the index of the [Shape2D] of this Area2D used by the [PhysicsServer2D]. Get the [CollisionShape2D] node with [code]self.shape_owner_get_owner(self.shape_find_owner(local_shape_index))[/code]. + Emitted when a [Shape2D] of the received [param body] exits a shape of this area. [param body] can be a [PhysicsBody2D] or a [TileMap]. [TileMap]s are detected if their [TileSet] has collision shapes configured. Requires [member monitoring] to be set to [code]true[/code]. + See also [signal body_shape_entered]. </description> </signal> </signals> diff --git a/doc/classes/Area3D.xml b/doc/classes/Area3D.xml index ea8cab324d..8923ac8aae 100644 --- a/doc/classes/Area3D.xml +++ b/doc/classes/Area3D.xml @@ -133,15 +133,13 @@ <signal name="area_entered"> <param index="0" name="area" type="Area3D" /> <description> - Emitted when another Area3D enters this Area3D. Requires [member monitoring] to be set to [code]true[/code]. - [param area] the other Area3D. + Emitted when the received [param area] enters this area. Requires [member monitoring] to be set to [code]true[/code]. </description> </signal> <signal name="area_exited"> <param index="0" name="area" type="Area3D" /> <description> - Emitted when another Area3D exits this Area3D. Requires [member monitoring] to be set to [code]true[/code]. - [param area] the other Area3D. + Emitted when the received [param area] exits this area. Requires [member monitoring] to be set to [code]true[/code]. </description> </signal> <signal name="area_shape_entered"> @@ -150,11 +148,18 @@ <param index="2" name="area_shape_index" type="int" /> <param index="3" name="local_shape_index" type="int" /> <description> - Emitted when one of another Area3D's [Shape3D]s enters one of this Area3D's [Shape3D]s. Requires [member monitoring] to be set to [code]true[/code]. - [param area_rid] the [RID] of the other Area3D's [CollisionObject3D] used by the [PhysicsServer3D]. - [param area] the other Area3D. - [param area_shape_index] the index of the [Shape3D] of the other Area3D used by the [PhysicsServer3D]. Get the [CollisionShape3D] node with [code]area.shape_owner_get_owner(area.shape_find_owner(area_shape_index))[/code]. - [param local_shape_index] the index of the [Shape3D] of this Area3D used by the [PhysicsServer3D]. Get the [CollisionShape3D] node with [code]self.shape_owner_get_owner(self.shape_find_owner(local_shape_index))[/code]. + Emitted when a [Shape3D] of the received [param area] enters a shape of this area. Requires [member monitoring] to be set to [code]true[/code]. + [param local_shape_index] and [param area_shape_index] contain indices of the interacting shapes from this area and the other area, respectively. [param area_rid] contains the [RID] of the other area. These values can be used with the [PhysicsServer3D]. + [b]Example of getting the[/b] [CollisionShape3D] [b]node from the shape index:[/b] + [codeblocks] + [gdscript] + var other_shape_owner = area.shape_find_owner(area_shape_index) + var other_shape_node = area.shape_owner_get_owner(other_shape_owner) + + var local_shape_owner = shape_find_owner(local_shape_index) + var local_shape_node = shape_owner_get_owner(local_shape_owner) + [/gdscript] + [/codeblocks] </description> </signal> <signal name="area_shape_exited"> @@ -163,25 +168,20 @@ <param index="2" name="area_shape_index" type="int" /> <param index="3" name="local_shape_index" type="int" /> <description> - Emitted when one of another Area3D's [Shape3D]s exits one of this Area3D's [Shape3D]s. Requires [member monitoring] to be set to [code]true[/code]. - [param area_rid] the [RID] of the other Area3D's [CollisionObject3D] used by the [PhysicsServer3D]. - [param area] the other Area3D. - [param area_shape_index] the index of the [Shape3D] of the other Area3D used by the [PhysicsServer3D]. Get the [CollisionShape3D] node with [code]area.shape_owner_get_owner(area.shape_find_owner(area_shape_index))[/code]. - [param local_shape_index] the index of the [Shape3D] of this Area3D used by the [PhysicsServer3D]. Get the [CollisionShape3D] node with [code]self.shape_owner_get_owner(self.shape_find_owner(local_shape_index))[/code]. + Emitted when a [Shape3D] of the received [param area] exits a shape of this area. Requires [member monitoring] to be set to [code]true[/code]. + See also [signal area_shape_entered]. </description> </signal> <signal name="body_entered"> <param index="0" name="body" type="Node3D" /> <description> - Emitted when a [PhysicsBody3D] or [GridMap] enters this Area3D. Requires [member monitoring] to be set to [code]true[/code]. [GridMap]s are detected if the [MeshLibrary] has Collision [Shape3D]s. - [param body] the [Node], if it exists in the tree, of the other [PhysicsBody3D] or [GridMap]. + Emitted when the received [param body] enters this area. [param body] can be a [PhysicsBody3D] or a [GridMap]. [GridMap]s are detected if their [MeshLibrary] has collision shapes configured. Requires [member monitoring] to be set to [code]true[/code]. </description> </signal> <signal name="body_exited"> <param index="0" name="body" type="Node3D" /> <description> - Emitted when a [PhysicsBody3D] or [GridMap] exits this Area3D. Requires [member monitoring] to be set to [code]true[/code]. [GridMap]s are detected if the [MeshLibrary] has Collision [Shape3D]s. - [param body] the [Node], if it exists in the tree, of the other [PhysicsBody3D] or [GridMap]. + Emitted when the received [param body] exits this area. [param body] can be a [PhysicsBody3D] or a [GridMap]. [GridMap]s are detected if their [MeshLibrary] has collision shapes configured. Requires [member monitoring] to be set to [code]true[/code]. </description> </signal> <signal name="body_shape_entered"> @@ -190,11 +190,18 @@ <param index="2" name="body_shape_index" type="int" /> <param index="3" name="local_shape_index" type="int" /> <description> - Emitted when one of a [PhysicsBody3D] or [GridMap]'s [Shape3D]s enters one of this Area3D's [Shape3D]s. Requires [member monitoring] to be set to [code]true[/code]. [GridMap]s are detected if the [MeshLibrary] has Collision [Shape3D]s. - [param body_rid] the [RID] of the [PhysicsBody3D] or [MeshLibrary]'s [CollisionObject3D] used by the [PhysicsServer3D]. - [param body] the [Node], if it exists in the tree, of the [PhysicsBody3D] or [GridMap]. - [param body_shape_index] the index of the [Shape3D] of the [PhysicsBody3D] or [GridMap] used by the [PhysicsServer3D]. Get the [CollisionShape3D] node with [code]body.shape_owner_get_owner(body.shape_find_owner(body_shape_index))[/code]. - [param local_shape_index] the index of the [Shape3D] of this Area3D used by the [PhysicsServer3D]. Get the [CollisionShape3D] node with [code]self.shape_owner_get_owner(self.shape_find_owner(local_shape_index))[/code]. + Emitted when a [Shape3D] of the received [param body] enters a shape of this area. [param body] can be a [PhysicsBody3D] or a [GridMap]. [GridMap]s are detected if their [MeshLibrary] has collision shapes configured. Requires [member monitoring] to be set to [code]true[/code]. + [param local_shape_index] and [param body_shape_index] contain indices of the interacting shapes from this area and the interacting body, respectively. [param body_rid] contains the [RID] of the body. These values can be used with the [PhysicsServer3D]. + [b]Example of getting the[/b] [CollisionShape3D] [b]node from the shape index:[/b] + [codeblocks] + [gdscript] + var body_shape_owner = body.shape_find_owner(body_shape_index) + var body_shape_node = body.shape_owner_get_owner(body_shape_owner) + + var local_shape_owner = shape_find_owner(local_shape_index) + var local_shape_node = shape_owner_get_owner(local_shape_owner) + [/gdscript] + [/codeblocks] </description> </signal> <signal name="body_shape_exited"> @@ -203,11 +210,8 @@ <param index="2" name="body_shape_index" type="int" /> <param index="3" name="local_shape_index" type="int" /> <description> - Emitted when one of a [PhysicsBody3D] or [GridMap]'s [Shape3D]s enters one of this Area3D's [Shape3D]s. Requires [member monitoring] to be set to [code]true[/code]. [GridMap]s are detected if the [MeshLibrary] has Collision [Shape3D]s. - [param body_rid] the [RID] of the [PhysicsBody3D] or [MeshLibrary]'s [CollisionObject3D] used by the [PhysicsServer3D]. - [param body] the [Node], if it exists in the tree, of the [PhysicsBody3D] or [GridMap]. - [param body_shape_index] the index of the [Shape3D] of the [PhysicsBody3D] or [GridMap] used by the [PhysicsServer3D]. Get the [CollisionShape3D] node with [code]body.shape_owner_get_owner(body.shape_find_owner(body_shape_index))[/code]. - [param local_shape_index] the index of the [Shape3D] of this Area3D used by the [PhysicsServer3D]. Get the [CollisionShape3D] node with [code]self.shape_owner_get_owner(self.shape_find_owner(local_shape_index))[/code]. + Emitted when a [Shape3D] of the received [param body] exits a shape of this area. [param body] can be a [PhysicsBody3D] or a [GridMap]. [GridMap]s are detected if their [MeshLibrary] has collision shapes configured. Requires [member monitoring] to be set to [code]true[/code]. + See also [signal body_shape_entered]. </description> </signal> </signals> diff --git a/doc/classes/AudioStreamRandomizer.xml b/doc/classes/AudioStreamRandomizer.xml index 5490770b7d..d93f853c89 100644 --- a/doc/classes/AudioStreamRandomizer.xml +++ b/doc/classes/AudioStreamRandomizer.xml @@ -12,8 +12,10 @@ <method name="add_stream"> <return type="void" /> <param index="0" name="index" type="int" /> + <param index="1" name="stream" type="AudioStream" /> + <param index="2" name="weight" type="float" default="1.0" /> <description> - Insert a stream at the specified index. + Insert a stream at the specified index. If the index is less than zero, the insertion occurs at the end of the underlying pool. </description> </method> <method name="get_stream" qualifiers="const"> @@ -78,13 +80,13 @@ </members> <constants> <constant name="PLAYBACK_RANDOM_NO_REPEATS" value="0" enum="PlaybackMode"> - Pick a stream at random according to the probability weights chosen for each stream, but avoid playing the same stream twice in a row whenever possible. + Pick a stream at random according to the probability weights chosen for each stream, but avoid playing the same stream twice in a row whenever possible. If only 1 sound is present in the pool, the same sound will always play, effectively allowing repeats to occur. </constant> <constant name="PLAYBACK_RANDOM" value="1" enum="PlaybackMode"> - Pick a stream at random according to the probability weights chosen for each stream. + Pick a stream at random according to the probability weights chosen for each stream. If only 1 sound is present in the pool, the same sound will always play. </constant> <constant name="PLAYBACK_SEQUENTIAL" value="2" enum="PlaybackMode"> - Play streams in the order they appear in the stream pool. + Play streams in the order they appear in the stream pool. If only 1 sound is present in the pool, the same sound will always play. </constant> </constants> </class> diff --git a/doc/classes/BackBufferCopy.xml b/doc/classes/BackBufferCopy.xml index 3c811e6226..b2c5a1756f 100644 --- a/doc/classes/BackBufferCopy.xml +++ b/doc/classes/BackBufferCopy.xml @@ -4,8 +4,8 @@ Copies a region of the screen (or the whole screen) to a buffer so it can be accessed in your shader scripts through the [code]texture(SCREEN_TEXTURE, ...)[/code] function. </brief_description> <description> - Node for back-buffering the currently-displayed screen. The region defined in the BackBufferCopy node is buffered with the content of the screen it covers, or the entire screen according to the copy mode set. Use the [code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to access the buffer. - [b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), anchors and margins won't apply to child [Control]-derived nodes. This can be problematic when resizing the window. To avoid this, add [Control]-derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of adding them as children. + Node for back-buffering the currently-displayed screen. The region defined in the [BackBufferCopy] node is buffered with the content of the screen it covers, or the entire screen according to the copy mode set. Use the [code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to access the buffer. + [b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), anchors and margins won't apply to child [Control]-derived nodes. This can be problematic when resizing the window. To avoid this, add [Control]-derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of adding them as children. </description> <tutorials> </tutorials> @@ -14,18 +14,18 @@ Buffer mode. See [enum CopyMode] constants. </member> <member name="rect" type="Rect2" setter="set_rect" getter="get_rect" default="Rect2(-100, -100, 200, 200)"> - The area covered by the BackBufferCopy. Only used if [member copy_mode] is [constant COPY_MODE_RECT]. + The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is [constant COPY_MODE_RECT]. </member> </members> <constants> <constant name="COPY_MODE_DISABLED" value="0" enum="CopyMode"> - Disables the buffering mode. This means the BackBufferCopy node will directly use the portion of screen it covers. + Disables the buffering mode. This means the [BackBufferCopy] node will directly use the portion of screen it covers. </constant> <constant name="COPY_MODE_RECT" value="1" enum="CopyMode"> - BackBufferCopy buffers a rectangular region. + [BackBufferCopy] buffers a rectangular region. </constant> <constant name="COPY_MODE_VIEWPORT" value="2" enum="CopyMode"> - BackBufferCopy buffers the entire screen. + [BackBufferCopy] buffers the entire screen. </constant> </constants> </class> diff --git a/doc/classes/Button.xml b/doc/classes/Button.xml index d2c9a77486..961f3c495a 100644 --- a/doc/classes/Button.xml +++ b/doc/classes/Button.xml @@ -118,6 +118,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="font" data_type="font" type="Font"> [Font] of the [Button]'s text. diff --git a/doc/classes/CanvasGroup.xml b/doc/classes/CanvasGroup.xml index d2bcf3c7ac..37827defec 100644 --- a/doc/classes/CanvasGroup.xml +++ b/doc/classes/CanvasGroup.xml @@ -5,16 +5,33 @@ </brief_description> <description> Child [CanvasItem] nodes of a [CanvasGroup] are drawn as a single object. It allows to e.g. draw overlapping translucent 2D nodes without blending (set [member CanvasItem.self_modulate] property of [CanvasGroup] to achieve this effect). + [b]Note:[/b] The [CanvasGroup] uses a custom shader to read from the backbuffer to draw its children. Assigning a [Material] to the [CanvasGroup] overrides the builtin shader. To duplicate the behavior of the builtin shader in a custom [Shader] use the following: + [codeblock] + shader_type canvas_item; + + void fragment() { + vec4 c = textureLod(SCREEN_TEXTURE, SCREEN_UV, 0.0); + + if (c.a > 0.0001) { + c.rgb /= c.a; + } + + COLOR *= c; + } + [/codeblock] [b]Note:[/b] Since [CanvasGroup] and [member CanvasItem.clip_children] both utilize the backbuffer, children of a [CanvasGroup] who have their [member CanvasItem.clip_children] set to anything other than [constant CanvasItem.CLIP_CHILDREN_DISABLED] will not function correctly. </description> <tutorials> </tutorials> <members> <member name="clear_margin" type="float" setter="set_clear_margin" getter="get_clear_margin" default="10.0"> + Sets the size of the margin used to expand the clearing rect of this [CanvasGroup]. This expands the area of the backbuffer that will be used by the [CanvasGroup]. A smaller margin will reduce the area of the backbuffer used which can increase performance, however if [member use_mipmaps] is enabled, a small margin may result in mipmap errors at the edge of the [CanvasGroup]. Accordingly, this should be left as small as possible, but should be increased if artifacts appear along the edges of the canvas group. </member> <member name="fit_margin" type="float" setter="set_fit_margin" getter="get_fit_margin" default="10.0"> + Sets the size of a margin used to expand the drawable rect of this [CanvasGroup]. The size of the [CanvasGroup] is determined by fitting a rect around its children then expanding that rect by [member fit_margin]. This increases both the backbuffer area used and the area covered by the [CanvasGroup] both of which can reduce performance. This should be kept as small as possible and should only be expanded when an increased size is needed (e.g. for custom shader effects). </member> <member name="use_mipmaps" type="bool" setter="set_use_mipmaps" getter="is_using_mipmaps" default="false"> + If [code]true[/code], calculates mipmaps for the backbuffer before drawing the [CanvasGroup] so that mipmaps can be used in a custom [ShaderMaterial] attached to the [CanvasGroup]. Generating mipmaps has a performance cost so this should not be enabled unless required. </member> </members> </class> diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml index 499d53e63c..5171e0acbe 100644 --- a/doc/classes/CanvasItem.xml +++ b/doc/classes/CanvasItem.xml @@ -153,6 +153,7 @@ <param index="3" name="modulate" type="Color" default="Color(1, 1, 1, 1)" /> <param index="4" name="outline" type="float" default="0.0" /> <param index="5" name="pixel_range" type="float" default="4.0" /> + <param index="6" name="scale" type="float" default="1.0" /> <description> Draws a textured rectangle region of the multi-channel signed distance field texture at a given position, optionally modulated by a color. See [member FontFile.multichannel_signed_distance_field] for more information and caveats about MSDF font rendering. If [param outline] is positive, each alpha channel value of pixel in region is set to maximum value of true distance in the [param outline] radius. @@ -404,7 +405,7 @@ <method name="get_canvas_transform" qualifiers="const"> <return type="Transform2D" /> <description> - Returns the transform matrix of this item's canvas. + Returns the transform from the coordinate system of the canvas, this item is in, to the [Viewport]s coordinate system. </description> </method> <method name="get_global_mouse_position" qualifiers="const"> @@ -422,7 +423,7 @@ <method name="get_global_transform_with_canvas" qualifiers="const"> <return type="Transform2D" /> <description> - Returns the global transform matrix of this item in relation to the canvas. + Returns the transform from the local coordinate system of this [CanvasItem] to the [Viewport]s coordinate system. </description> </method> <method name="get_local_mouse_position" qualifiers="const"> @@ -453,7 +454,7 @@ <method name="get_viewport_transform" qualifiers="const"> <return type="Transform2D" /> <description> - Returns this item's transform in relation to the viewport. + Returns the transform from the coordinate system of the canvas, this item is in, to the [Viewport]s embedders coordinate system. </description> </method> <method name="get_visibility_layer_bit" qualifiers="const"> diff --git a/doc/classes/CanvasLayer.xml b/doc/classes/CanvasLayer.xml index 7c1b19b961..ce999c06d3 100644 --- a/doc/classes/CanvasLayer.xml +++ b/doc/classes/CanvasLayer.xml @@ -19,6 +19,12 @@ Returns the RID of the canvas used by this layer. </description> </method> + <method name="get_final_transform" qualifiers="const"> + <return type="Transform2D" /> + <description> + Returns the transform from the [CanvasLayer]s coordinate system to the [Viewport]s coordinate system. + </description> + </method> <method name="hide"> <return type="void" /> <description> diff --git a/doc/classes/CheckBox.xml b/doc/classes/CheckBox.xml index 699e872e99..3ee18cf351 100644 --- a/doc/classes/CheckBox.xml +++ b/doc/classes/CheckBox.xml @@ -43,6 +43,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="font" data_type="font" type="Font"> The [Font] to use for the [CheckBox] text. diff --git a/doc/classes/CheckButton.xml b/doc/classes/CheckButton.xml index dfbaa7cbee..03578cafd0 100644 --- a/doc/classes/CheckButton.xml +++ b/doc/classes/CheckButton.xml @@ -43,6 +43,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="font" data_type="font" type="Font"> The [Font] to use for the [CheckButton] text. diff --git a/doc/classes/CodeEdit.xml b/doc/classes/CodeEdit.xml index e7ef5fb289..c313e6c875 100644 --- a/doc/classes/CodeEdit.xml +++ b/doc/classes/CodeEdit.xml @@ -651,6 +651,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="font" data_type="font" type="Font"> Sets the default [Font]. diff --git a/doc/classes/CollisionObject2D.xml b/doc/classes/CollisionObject2D.xml index ee69015ae1..3ed2c9d3de 100644 --- a/doc/classes/CollisionObject2D.xml +++ b/doc/classes/CollisionObject2D.xml @@ -157,7 +157,7 @@ <param index="0" name="owner_id" type="int" /> <param index="1" name="shape_id" type="int" /> <description> - Returns the [Shape2D] with the given id from the given shape owner. + Returns the [Shape2D] with the given ID from the given shape owner. </description> </method> <method name="shape_owner_get_shape_count" qualifiers="const"> @@ -172,7 +172,7 @@ <param index="0" name="owner_id" type="int" /> <param index="1" name="shape_id" type="int" /> <description> - Returns the child index of the [Shape2D] with the given id from the given shape owner. + Returns the child index of the [Shape2D] with the given ID from the given shape owner. </description> </method> <method name="shape_owner_get_transform" qualifiers="const"> diff --git a/doc/classes/CollisionObject3D.xml b/doc/classes/CollisionObject3D.xml index f10136521a..c302963b92 100644 --- a/doc/classes/CollisionObject3D.xml +++ b/doc/classes/CollisionObject3D.xml @@ -130,7 +130,7 @@ <param index="0" name="owner_id" type="int" /> <param index="1" name="shape_id" type="int" /> <description> - Returns the [Shape3D] with the given id from the given shape owner. + Returns the [Shape3D] with the given ID from the given shape owner. </description> </method> <method name="shape_owner_get_shape_count" qualifiers="const"> @@ -145,7 +145,7 @@ <param index="0" name="owner_id" type="int" /> <param index="1" name="shape_id" type="int" /> <description> - Returns the child index of the [Shape3D] with the given id from the given shape owner. + Returns the child index of the [Shape3D] with the given ID from the given shape owner. </description> </method> <method name="shape_owner_get_transform" qualifiers="const"> diff --git a/doc/classes/Color.xml b/doc/classes/Color.xml index 4d78433915..d1387d088d 100644 --- a/doc/classes/Color.xml +++ b/doc/classes/Color.xml @@ -205,11 +205,18 @@ <description> Returns the [Color] associated with the provided [param hex] integer in 32-bit ARGB format (8 bits per channel, alpha channel first). In GDScript and C#, the [int] is best visualized with hexadecimal notation ([code]"0x"[/code] prefix). - [codeblock] + [codeblocks] + [gdscript] var red = Color.hex(0xffff0000) var dark_cyan = Color.hex(0xff008b8b) var my_color = Color.hex(0xa4bbefd2) - [/codeblock] + [/gdscript] + [csharp] + var red = new Color(0xffff0000); + var dark_cyan = new Color(0xff008b8b); + var my_color = new Color(0xa4bbefd2); + [/csharp] + [/codeblocks] </description> </method> <method name="hex64" qualifiers="static"> @@ -234,9 +241,9 @@ var col = Color.html("663399cc") # col is Color(0.4, 0.2, 0.6, 0.8) [/gdscript] [csharp] - var blue = new Color("#0000ff"); // blue is Color(0.0, 0.0, 1.0, 1.0) - var green = new Color("#0F0"); // green is Color(0.0, 1.0, 0.0, 1.0) - var col = new Color("663399cc"); // col is Color(0.4, 0.2, 0.6, 0.8) + var blue = Color.FromHtml("#0000ff"); // blue is Color(0.0, 0.0, 1.0, 1.0) + var green = Color.FromHtml("#0F0"); // green is Color(0.0, 1.0, 0.0, 1.0) + var col = Color.FromHtml("663399cc"); // col is Color(0.4, 0.2, 0.6, 0.8) [/csharp] [/codeblocks] </description> @@ -257,14 +264,13 @@ Color.html_is_valid("#55aaFF5") # Returns false [/gdscript] [csharp] - // This method is not available in C#. Use `StringExtensions.IsValidHtmlColor()`, instead. - "#55AAFF".IsValidHtmlColor(); // Returns true - "#55AAFF20".IsValidHtmlColor(); // Returns true - "55AAFF".IsValidHtmlColor(); // Returns true - "#F2C".IsValidHtmlColor(); // Returns true + Color.IsHtmlValid("#55AAFF"); // Returns true + Color.IsHtmlValid("#55AAFF20"); // Returns true + Color.IsHtmlValid("55AAFF"); // Returns true + Color.IsHtmlValid("#F2C"); // Returns true - "#AABBC".IsValidHtmlColor(); // Returns false - "#55aaFF5".IsValidHtmlColor(); // Returns false + Color.IsHtmlValid("#AABBC"); // Returns false + Color.IsHtmlValid("#55aaFF5"); // Returns false [/csharp] [/codeblocks] </description> diff --git a/doc/classes/ColorPickerButton.xml b/doc/classes/ColorPickerButton.xml index b7a0bdfb0c..2a37cc162a 100644 --- a/doc/classes/ColorPickerButton.xml +++ b/doc/classes/ColorPickerButton.xml @@ -79,6 +79,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="font" data_type="font" type="Font"> [Font] of the [ColorPickerButton]'s text. diff --git a/doc/classes/Control.xml b/doc/classes/Control.xml index 8a38deeebe..b0351559ee 100644 --- a/doc/classes/Control.xml +++ b/doc/classes/Control.xml @@ -1050,6 +1050,9 @@ <member name="rotation" type="float" setter="set_rotation" getter="get_rotation" default="0.0"> The node's rotation around its pivot, in radians. See [member pivot_offset] to change the pivot's position. </member> + <member name="rotation_degrees" type="float" setter="set_rotation_degrees" getter="get_rotation_degrees"> + Helper property to access [member rotation] in degrees instead of radians. + </member> <member name="scale" type="Vector2" setter="set_scale" getter="get_scale" default="Vector2(1, 1)"> The node's scale, relative to its [member size]. Change this property to scale the node around its [member pivot_offset]. The Control's [member tooltip_text] will also scale according to this value. [b]Note:[/b] This property is mainly intended to be used for animation purposes. Text inside the Control will look pixelated or blurry when the Control is scaled. To support multiple resolutions in your project, use an appropriate viewport stretch mode as described in the [url=$DOCS_URL/tutorials/rendering/multiple_resolutions.html]documentation[/url] instead of scaling Controls individually. @@ -1071,7 +1074,8 @@ Tells the parent [Container] nodes how they should resize and place the node on the Y axis. Use one of the [enum SizeFlags] constants to change the flags. See the constants to learn what each does. </member> <member name="theme" type="Theme" setter="set_theme" getter="get_theme"> - The [Theme] resource this node and all its [Control] children use. If a child node has its own [Theme] resource set, theme items are merged with child's definitions having higher priority. + The [Theme] resource this node and all its [Control] and [Window] children use. If a child node has its own [Theme] resource set, theme items are merged with child's definitions having higher priority. + [b]Note:[/b] [Window] styles will have no effect unless the window is embedded. </member> <member name="theme_type_variation" type="StringName" setter="set_theme_type_variation" getter="get_theme_type_variation" default="&"""> The name of a theme type variation used by this [Control] to look up its own theme items. When empty, the class name of the node is used (e.g. [code]Button[/code] for the [Button] control), as well as the class names of all parent classes (in order of inheritance). diff --git a/doc/classes/Curve3D.xml b/doc/classes/Curve3D.xml index cfe2036499..362d792b39 100644 --- a/doc/classes/Curve3D.xml +++ b/doc/classes/Curve3D.xml @@ -138,7 +138,7 @@ <param index="1" name="cubic" type="bool" default="false" /> <param index="2" name="apply_tilt" type="bool" default="false" /> <description> - Similar with [code]interpolate_baked()[/code]. The the return value is [code]Transform3D[/code], with [code]origin[/code] as point position, [code]basis.x[/code] as sideway vector, [code]basis.y[/code] as up vector, [code]basis.z[/code] as forward vector. When the curve length is 0, there is no reasonable way to caculate the rotation, all vectors aligned with global space axes. + Similar with [code]interpolate_baked()[/code]. The the return value is [code]Transform3D[/code], with [code]origin[/code] as point position, [code]basis.x[/code] as sideway vector, [code]basis.y[/code] as up vector, [code]basis.z[/code] as forward vector. When the curve length is 0, there is no reasonable way to calculate the rotation, all vectors aligned with global space axes. </description> </method> <method name="samplef" qualifiers="const"> diff --git a/doc/classes/Dictionary.xml b/doc/classes/Dictionary.xml index 92225b816f..5f99ba82b8 100644 --- a/doc/classes/Dictionary.xml +++ b/doc/classes/Dictionary.xml @@ -135,7 +135,7 @@ [/csharp] [/codeblocks] [b]Note:[/b] Erasing elements while iterating over dictionaries is [b]not[/b] supported and will result in unpredictable behavior. - [b]Note:[/b] When declaring a dictionary with [code]const[/code], the dictionary becomes read-only. A read-only Dictionary's entries cannot be overriden at run-time. This does [i]not[/i] affect nested [Array] and [Dictionary] values. + [b]Note:[/b] When declaring a dictionary with [code]const[/code], the dictionary becomes read-only. A read-only Dictionary's entries cannot be overridden at run-time. This does [i]not[/i] affect nested [Array] and [Dictionary] values. </description> <tutorials> <link title="GDScript basics: Dictionary">$DOCS_URL/tutorials/scripting/gdscript/gdscript_basics.html#dictionary</link> diff --git a/doc/classes/DisplayServer.xml b/doc/classes/DisplayServer.xml index c59bfbfe4f..29135376c5 100644 --- a/doc/classes/DisplayServer.xml +++ b/doc/classes/DisplayServer.xml @@ -719,6 +719,12 @@ [b]Note:[/b] This method is implemented on macOS, Windows and Linux (X11). </description> </method> + <method name="is_touchscreen_available" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if touch events are available (Android or iOS), the capability is detected on the Webplatform or if [member ProjectSettings.input_devices/pointing/emulate_touch_from_mouse] is [code]true[/code]. + </description> + </method> <method name="keyboard_get_current_layout" qualifiers="const"> <return type="int" /> <description> @@ -889,13 +895,6 @@ Returns [code]true[/code] if the screen should never be turned off by the operating system's power-saving measures. See also [method screen_set_keep_on]. </description> </method> - <method name="screen_is_touchscreen" qualifiers="const"> - <return type="bool" /> - <param index="0" name="screen" type="int" default="-1" /> - <description> - Returns [code]true[/code] if the screen can send touch events or if [member ProjectSettings.input_devices/pointing/emulate_touch_from_mouse] is [code]true[/code]. - </description> - </method> <method name="screen_set_keep_on"> <return type="void" /> <param index="0" name="enable" type="bool" /> @@ -1156,14 +1155,14 @@ <return type="Vector2i" /> <param index="0" name="window_id" type="int" default="0" /> <description> - Returns the position of the given window to on the screen. + Returns the position of the client area of the given window on the screen. </description> </method> - <method name="window_get_real_size" qualifiers="const"> + <method name="window_get_position_with_decorations" qualifiers="const"> <return type="Vector2i" /> <param index="0" name="window_id" type="int" default="0" /> <description> - Returns the size of the window specified by [param window_id] (in pixels), including the borders drawn by the operating system. See also [method window_get_size]. + Returns the position of the given window on the screen including the borders drawn by the operating system. See also [method window_get_position]. </description> </method> <method name="window_get_safe_title_margins" qualifiers="const"> @@ -1177,7 +1176,14 @@ <return type="Vector2i" /> <param index="0" name="window_id" type="int" default="0" /> <description> - Returns the size of the window specified by [param window_id] (in pixels), excluding the borders drawn by the operating system. This is also called the "client area". See also [method window_get_real_size], [method window_set_size] and [method window_get_position]. + Returns the size of the window specified by [param window_id] (in pixels), excluding the borders drawn by the operating system. This is also called the "client area". See also [method window_get_size_with_decorations], [method window_set_size] and [method window_get_position]. + </description> + </method> + <method name="window_get_size_with_decorations" qualifiers="const"> + <return type="Vector2i" /> + <param index="0" name="window_id" type="int" default="0" /> + <description> + Returns the size of the window specified by [param window_id] (in pixels), including the borders drawn by the operating system. See also [method window_get_size]. </description> </method> <method name="window_get_vsync_mode" qualifiers="const"> @@ -1634,14 +1640,17 @@ Maximized window mode, i.e. [Window] will occupy whole screen area except task bar and still display its borders. Normally happens when the minimize button is pressed. </constant> <constant name="WINDOW_MODE_FULLSCREEN" value="3" enum="WindowMode"> - Full screen window mode. Note that this is not [i]exclusive[/i] full screen. On Windows and Linux (X11), a borderless window is used to emulate full screen. On macOS, a new desktop is used to display the running project. - Regardless of the platform, enabling full screen will change the window size to match the monitor's size. Therefore, make sure your project supports [url=$DOCS_URL/tutorials/rendering/multiple_resolutions.html]multiple resolutions[/url] when enabling full screen mode. + Full screen mode with full multi-window support. + Full screen window cover the entire display area of a screen, have no border or decorations. Display video mode is not changed. + [b]Note:[/b] Regardless of the platform, enabling full screen will change the window size to match the monitor's size. Therefore, make sure your project supports [url=$DOCS_URL/tutorials/rendering/multiple_resolutions.html]multiple resolutions[/url] when enabling full screen mode. </constant> <constant name="WINDOW_MODE_EXCLUSIVE_FULLSCREEN" value="4" enum="WindowMode"> - Exclusive full screen window mode. This mode is implemented on Windows and macOS only. On other platforms, it is equivalent to [constant WINDOW_MODE_FULLSCREEN]. - [b]On Windows:[/b] Only one window in exclusive full screen mode can be visible on a given screen at a time. If multiple windows are in exclusive full screen mode for the same screen, the last one being set to this mode takes precedence. - [b]On macOS:[/b] Exclusive full-screen mode prevents Dock and Menu from showing up when the mouse pointer is hovering the edge of the screen. - Regardless of the platform, enabling full screen will change the window size to match the monitor's size. Therefore, make sure your project supports [url=$DOCS_URL/tutorials/rendering/multiple_resolutions.html]multiple resolutions[/url] when enabling full screen mode. + A single window full screen mode. This mode has less overhead, but only one window can be open on a given screen at a time (opening a child window or application switching will trigger a full screen transition). + Full screen window cover the entire display area of a screen, have no border or decorations. Display video mode is not changed. + [b]On Windows:[/b] Depending on video driver, full screen transition might cause screens to go black for a moment. + [b]On macOS:[/b] Exclusive full screen mode prevents Dock and Menu from showing up when the mouse pointer is hovering the edge of the screen. + [b]On Linux (X11):[/b] Exclusive full screen mode bypasses compositor. + [b]Note:[/b] Regardless of the platform, enabling full screen will change the window size to match the monitor's size. Therefore, make sure your project supports [url=$DOCS_URL/tutorials/rendering/multiple_resolutions.html]multiple resolutions[/url] when enabling full screen mode. </constant> <constant name="WINDOW_FLAG_RESIZE_DISABLED" value="0" enum="WindowFlags"> The window can't be resizing by dragging its resize grip. It's still possible to resize the window using [method window_set_size]. This flag is ignored for full screen windows. diff --git a/doc/classes/EditorPaths.xml b/doc/classes/EditorPaths.xml index 2975ea6d75..929cf767a6 100644 --- a/doc/classes/EditorPaths.xml +++ b/doc/classes/EditorPaths.xml @@ -6,7 +6,7 @@ <description> This editor-only singleton returns OS-specific paths to various data folders and files. It can be used in editor plugins to ensure files are saved in the correct location on each operating system. [b]Note:[/b] This singleton is not accessible in exported projects. Attempting to access it in an exported project will result in a script error as the singleton won't be declared. To prevent script errors in exported projects, use [method Engine.has_singleton] to check whether the singleton is available before using it. - [b]Note:[/b] Godot complies with the [url=https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html]XDG Base Directory Specification[/url] on [i]all[/i] platforms. You can override environment variables following the specification to change the editor and project data paths. + [b]Note:[/b] On the Linux/BSD platform, Godot complies with the [url=https://specifications.freedesktop.org/basedir-spec/basedir-spec-latest.html]XDG Base Directory Specification[/url]. You can override environment variables following the specification to change the editor and project data paths. </description> <tutorials> <link title="File paths in Godot projects">https://docs.godotengine.org/en/latest/tutorials/io/data_paths.html</link> diff --git a/doc/classes/EditorScenePostImport.xml b/doc/classes/EditorScenePostImport.xml index 2bf2accf17..d2ad8d1bed 100644 --- a/doc/classes/EditorScenePostImport.xml +++ b/doc/classes/EditorScenePostImport.xml @@ -28,12 +28,12 @@ // This sample changes all node names. // Called right after the scene is imported and gets the root node. [Tool] - public class NodeRenamer : EditorScenePostImport + public partial class NodeRenamer : EditorScenePostImport { - public override Object PostImport(Object scene) + public override Object _PostImport(Node scene) { // Change all node names to "modified_[oldnodename]" - Iterate(scene as Node); + Iterate(scene); return scene; // Remember to return the imported scene } public void Iterate(Node node) diff --git a/doc/classes/EditorSettings.xml b/doc/classes/EditorSettings.xml index 865faa13ae..98f4789163 100644 --- a/doc/classes/EditorSettings.xml +++ b/doc/classes/EditorSettings.xml @@ -628,6 +628,9 @@ <member name="network/tls/editor_tls_certificates" type="String" setter="" getter=""> The TLS certificate bundle to use for HTTP requests made within the editor (e.g. from the AssetLib tab). If left empty, the [url=https://github.com/godotengine/godot/blob/master/thirdparty/certs/ca-certificates.crt]included Mozilla certificate bundle[/url] will be used. </member> + <member name="project_manager/default_renderer" type="String" setter="" getter=""> + The renderer type that will be checked off by default when creating a new project. Accepted strings are "forward_plus", "mobile" or "gl_compatibility". + </member> <member name="project_manager/sorting_order" type="int" setter="" getter=""> The sorting order to use in the project manager. When changing the sorting order in the project manager, this setting is set permanently in the editor settings. </member> diff --git a/doc/classes/EditorUndoRedoManager.xml b/doc/classes/EditorUndoRedoManager.xml index 133ee9db0d..cd96e740e8 100644 --- a/doc/classes/EditorUndoRedoManager.xml +++ b/doc/classes/EditorUndoRedoManager.xml @@ -123,6 +123,9 @@ <constant name="GLOBAL_HISTORY" value="0" enum="SpecialHistory"> Global history not associated with any scene, but with external resources etc. </constant> + <constant name="REMOTE_HISTORY" value="-9" enum="SpecialHistory"> + History associated with remote inspector. Used when live editing a running project. + </constant> <constant name="INVALID_HISTORY" value="-99" enum="SpecialHistory"> Invalid "null" history. It's a special value, not associated with any object. </constant> diff --git a/doc/classes/EditorVCSInterface.xml b/doc/classes/EditorVCSInterface.xml index b766978c04..85c10fefd9 100644 --- a/doc/classes/EditorVCSInterface.xml +++ b/doc/classes/EditorVCSInterface.xml @@ -53,7 +53,7 @@ </description> </method> <method name="_get_branch_list" qualifiers="virtual"> - <return type="Dictionary[]" /> + <return type="String[]" /> <description> Gets an instance of an [Array] of [String]s containing available branch names in the VCS. </description> @@ -94,7 +94,7 @@ </description> </method> <method name="_get_remotes" qualifiers="virtual"> - <return type="Dictionary[]" /> + <return type="String[]" /> <description> Returns an [Array] of [String]s, each containing the name of a remote configured in the VCS. </description> diff --git a/doc/classes/FontFile.xml b/doc/classes/FontFile.xml index 1019c271dc..69a7627774 100644 --- a/doc/classes/FontFile.xml +++ b/doc/classes/FontFile.xml @@ -570,7 +570,7 @@ Weight (boldness) of the font. A value in the [code]100...999[/code] range, normal font weight is [code]400[/code], bold font weight is [code]700[/code]. </member> <member name="force_autohinter" type="bool" setter="set_force_autohinter" getter="is_force_autohinter" default="false"> - If set to [code]true[/code], auto-hinting is supported and preferred over font built-in hinting. Used by dynamic fonts only. + If set to [code]true[/code], auto-hinting is supported and preferred over font built-in hinting. Used by dynamic fonts only (MSDF fonts don't support hinting). </member> <member name="generate_mipmaps" type="bool" setter="set_generate_mipmaps" getter="get_generate_mipmaps" default="false"> If set to [code]true[/code], generate mipmaps for the font textures. @@ -579,25 +579,27 @@ Font hinting mode. Used by dynamic fonts only. </member> <member name="msdf_pixel_range" type="int" setter="set_msdf_pixel_range" getter="get_msdf_pixel_range" default="16"> - The width of the range around the shape between the minimum and maximum representable signed distance. + The width of the range around the shape between the minimum and maximum representable signed distance. If using font outlines, [member msdf_pixel_range] must be set to at least [i]twice[/i] the size of the largest font outline. The default [member msdf_pixel_range] value of [code]16[/code] allows outline sizes up to [code]8[/code] to look correct. </member> <member name="msdf_size" type="int" setter="set_msdf_size" getter="get_msdf_size" default="48"> - Source font size used to generate MSDF textures. + Source font size used to generate MSDF textures. Higher values allow for more precision, but are slower to render and require more memory. Only increase this value if you notice a visible lack of precision in glyph rendering. </member> <member name="multichannel_signed_distance_field" type="bool" setter="set_multichannel_signed_distance_field" getter="is_multichannel_signed_distance_field" default="false"> - If set to [code]true[/code], glyphs of all sizes are rendered using single multichannel signed distance field generated from the dynamic font vector data. + If set to [code]true[/code], glyphs of all sizes are rendered using single multichannel signed distance field (MSDF) generated from the dynamic font vector data. Since this approach does not rely on rasterizing the font every time its size changes, this allows for resizing the font in real-time without any performance penalty. Text will also not look grainy for [Control]s that are scaled down (or for [Label3D]s viewed from a long distance). As a downside, font hinting is not available with MSDF. The lack of font hinting may result in less crisp and less readable fonts at small sizes. + [b]Note:[/b] If using font outlines, [member msdf_pixel_range] must be set to at least [i]twice[/i] the size of the largest font outline. + [b]Note:[/b] MSDF font rendering does not render glyphs with overlapping shapes correctly. Overlapping shapes are not valid per the OpenType standard, but are still commonly found in many font files, especially those converted by Google Fonts. To avoid issues with overlapping glyphs, consider downloading the font file directly from the type foundry instead of relying on Google Fonts. </member> <member name="opentype_feature_overrides" type="Dictionary" setter="set_opentype_feature_overrides" getter="get_opentype_feature_overrides" default="{}"> Font OpenType feature set override. </member> <member name="oversampling" type="float" setter="set_oversampling" getter="get_oversampling" default="0.0"> - Font oversampling factor, if set to [code]0.0[/code] global oversampling factor is used instead. Used by dynamic fonts only. + Font oversampling factor. If set to [code]0.0[/code], the global oversampling factor is used instead. Used by dynamic fonts only (MSDF fonts ignore oversampling). </member> <member name="style_name" type="String" setter="set_font_style_name" getter="get_font_style_name" default=""""> Font style name. </member> <member name="subpixel_positioning" type="int" setter="set_subpixel_positioning" getter="get_subpixel_positioning" enum="TextServer.SubpixelPositioning" default="1"> - Font glyph subpixel positioning mode. Subpixel positioning provides shaper text and better kerning for smaller font sizes, at the cost of memory usage and font rasterization speed. Use [constant TextServer.SUBPIXEL_POSITIONING_AUTO] to automatically enable it based on the font size. + Font glyph subpixel positioning mode. Subpixel positioning provides shaper text and better kerning for smaller font sizes, at the cost of higher memory usage and lower font rasterization speed. Use [constant TextServer.SUBPIXEL_POSITIONING_AUTO] to automatically enable it based on the font size. </member> </members> </class> diff --git a/doc/classes/NativeExtension.xml b/doc/classes/GDExtension.xml index 50f976ca6f..9791290bd9 100644 --- a/doc/classes/NativeExtension.xml +++ b/doc/classes/GDExtension.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NativeExtension" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="GDExtension" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> </brief_description> <description> @@ -13,13 +13,13 @@ </description> </method> <method name="get_minimum_library_initialization_level" qualifiers="const"> - <return type="int" enum="NativeExtension.InitializationLevel" /> + <return type="int" enum="GDExtension.InitializationLevel" /> <description> </description> </method> <method name="initialize_library"> <return type="void" /> - <param index="0" name="level" type="int" enum="NativeExtension.InitializationLevel" /> + <param index="0" name="level" type="int" enum="GDExtension.InitializationLevel" /> <description> </description> </method> diff --git a/doc/classes/NativeExtensionManager.xml b/doc/classes/GDExtensionManager.xml index 7d6eefa94f..f682d800c6 100644 --- a/doc/classes/NativeExtensionManager.xml +++ b/doc/classes/GDExtensionManager.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NativeExtensionManager" inherits="Object" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="GDExtensionManager" inherits="Object" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> </brief_description> <description> @@ -8,7 +8,7 @@ </tutorials> <methods> <method name="get_extension"> - <return type="NativeExtension" /> + <return type="GDExtension" /> <param index="0" name="path" type="String" /> <description> </description> @@ -25,19 +25,19 @@ </description> </method> <method name="load_extension"> - <return type="int" enum="NativeExtensionManager.LoadStatus" /> + <return type="int" enum="GDExtensionManager.LoadStatus" /> <param index="0" name="path" type="String" /> <description> </description> </method> <method name="reload_extension"> - <return type="int" enum="NativeExtensionManager.LoadStatus" /> + <return type="int" enum="GDExtensionManager.LoadStatus" /> <param index="0" name="path" type="String" /> <description> </description> </method> <method name="unload_extension"> - <return type="int" enum="NativeExtensionManager.LoadStatus" /> + <return type="int" enum="GDExtensionManager.LoadStatus" /> <param index="0" name="path" type="String" /> <description> </description> diff --git a/doc/classes/GeometryInstance3D.xml b/doc/classes/GeometryInstance3D.xml index 90a983d28b..1ae4718536 100644 --- a/doc/classes/GeometryInstance3D.xml +++ b/doc/classes/GeometryInstance3D.xml @@ -16,13 +16,6 @@ Get the value of a shader parameter as set on this instance. </description> </method> - <method name="set_custom_aabb"> - <return type="void" /> - <param index="0" name="aabb" type="AABB" /> - <description> - Overrides the bounding box of this node with a custom one. To remove it, set an [AABB] with all fields set to zero. - </description> - </method> <method name="set_instance_shader_parameter"> <return type="void" /> <param index="0" name="name" type="StringName" /> @@ -36,6 +29,9 @@ <member name="cast_shadow" type="int" setter="set_cast_shadows_setting" getter="get_cast_shadows_setting" enum="GeometryInstance3D.ShadowCastingSetting" default="1"> The selected shadow casting flag. See [enum ShadowCastingSetting] for possible values. </member> + <member name="custom_aabb" type="AABB" setter="set_custom_aabb" getter="get_custom_aabb" default="AABB(0, 0, 0, 0, 0, 0)"> + Overrides the bounding box of this node with a custom one. This can be used to avoid the expensive [AABB] recalculation that happens when a skeleton is used with a [MeshInstance3D] or to have fine control over the [MeshInstance3D]'s bounding box. To remove this, set value to an [AABB] with all fields set to zero. + </member> <member name="extra_cull_margin" type="float" setter="set_extra_cull_margin" getter="get_extra_cull_margin" default="0.0"> The extra distance added to the GeometryInstance3D's bounding box ([AABB]) to increase its cull box. </member> diff --git a/doc/classes/Image.xml b/doc/classes/Image.xml index be66b8a7b9..ed1b40488e 100644 --- a/doc/classes/Image.xml +++ b/doc/classes/Image.xml @@ -76,8 +76,12 @@ <param index="0" name="mode" type="int" enum="Image.CompressMode" /> <param index="1" name="source" type="int" enum="Image.CompressSource" default="0" /> <param index="2" name="lossy_quality" type="float" default="0.7" /> + <param index="3" name="astc_format" type="int" enum="Image.ASTCFormat" default="0" /> <description> - Compresses the image to use less memory. Can not directly access pixel data while the image is compressed. Returns error if the chosen compression mode is not available. See [enum CompressMode] and [enum CompressSource] constants. + Compresses the image to use less memory. Can not directly access pixel data while the image is compressed. Returns error if the chosen compression mode is not available. + The [param mode] parameter helps to pick the best compression method for DXT and ETC2 formats. It is ignored for ASTC compression. + The [param lossy_quality] parameter is optional for compressors that support it. + For ASTC compression, the [param astc_format] parameter must be supplied. </description> </method> <method name="compress_from_channels"> @@ -85,7 +89,12 @@ <param index="0" name="mode" type="int" enum="Image.CompressMode" /> <param index="1" name="channels" type="int" enum="Image.UsedChannels" /> <param index="2" name="lossy_quality" type="float" default="0.7" /> + <param index="3" name="astc_format" type="int" enum="Image.ASTCFormat" default="0" /> <description> + Compresses the image to use less memory. Can not directly access pixel data while the image is compressed. Returns error if the chosen compression mode is not available. + This is an alternative to [method compress] that lets the user supply the channels used in order for the compressor to pick the best DXT and ETC2 formats. For other formats (non DXT or ETC2), this argument is ignored. + The [param lossy_quality] parameter is optional for compressors that support it. + For ASTC compression, the [param astc_format] parameter must be supplied. </description> </method> <method name="compute_image_metrics"> @@ -658,7 +667,19 @@ </constant> <constant name="FORMAT_DXT5_RA_AS_RG" value="34" enum="Format"> </constant> - <constant name="FORMAT_MAX" value="35" enum="Format"> + <constant name="FORMAT_ASTC_4x4" value="35" enum="Format"> + [url=https://en.wikipedia.org/wiki/Adaptive_scalable_texture_compression]Adaptive Scalable Texutre Compression[/url]. This implements the 4x4 (high quality) mode. + </constant> + <constant name="FORMAT_ASTC_4x4_HDR" value="36" enum="Format"> + Same format as [constant FORMAT_ASTC_4x4], but with the hint to let the GPU know it is used for HDR. + </constant> + <constant name="FORMAT_ASTC_8x8" value="37" enum="Format"> + [url=https://en.wikipedia.org/wiki/Adaptive_scalable_texture_compression]Adaptive Scalable Texutre Compression[/url]. This implements the 8x8 (low quality) mode. + </constant> + <constant name="FORMAT_ASTC_8x8_HDR" value="38" enum="Format"> + Same format as [constant FORMAT_ASTC_8x8], but with the hint to let the GPU know it is used for HDR. + </constant> + <constant name="FORMAT_MAX" value="39" enum="Format"> Represents the size of the [enum Format] enum. </constant> <constant name="INTERPOLATE_NEAREST" value="0" enum="Interpolation"> @@ -722,5 +743,11 @@ <constant name="COMPRESS_SOURCE_NORMAL" value="2" enum="CompressSource"> Source texture (before compression) is a normal texture (e.g. it can be compressed into two channels). </constant> + <constant name="ASTC_FORMAT_4x4" value="0" enum="ASTCFormat"> + Hint to indicate that the high quality 4x4 ASTC compression format should be used. + </constant> + <constant name="ASTC_FORMAT_8x8" value="1" enum="ASTCFormat"> + Hint to indicate that the low quality 8x8 ASTC compression format should be used. + </constant> </constants> </class> diff --git a/doc/classes/Input.xml b/doc/classes/Input.xml index d246e64251..be8c8ff83f 100644 --- a/doc/classes/Input.xml +++ b/doc/classes/Input.xml @@ -339,7 +339,7 @@ <param index="2" name="strong_magnitude" type="float" /> <param index="3" name="duration" type="float" default="0" /> <description> - Starts to vibrate the joypad. Joypads usually come with two rumble motors, a strong and a weak one. [param weak_magnitude] is the strength of the weak motor (between 0 and 1) and [param strong_magnitude] is the strength of the strong motor (between 0 and 1). [param duration] is the duration of the effect in seconds (a duration of 0 will try to play the vibration indefinitely). + Starts to vibrate the joypad. Joypads usually come with two rumble motors, a strong and a weak one. [param weak_magnitude] is the strength of the weak motor (between 0 and 1) and [param strong_magnitude] is the strength of the strong motor (between 0 and 1). [param duration] is the duration of the effect in seconds (a duration of 0 will try to play the vibration indefinitely). The vibration can be stopped early by calling [method stop_joy_vibration]. [b]Note:[/b] Not every hardware is compatible with long effect durations; it is recommended to restart an effect if it has to be played for more than a few seconds. </description> </method> @@ -347,18 +347,18 @@ <return type="void" /> <param index="0" name="device" type="int" /> <description> - Stops the vibration of the joypad. + Stops the vibration of the joypad started with [method start_joy_vibration]. </description> </method> <method name="vibrate_handheld"> <return type="void" /> <param index="0" name="duration_ms" type="int" default="500" /> <description> - Vibrate handheld devices. - [b]Note:[/b] This method is implemented on Android, iOS, and Web. - [b]Note:[/b] For Android, it requires enabling the [code]VIBRATE[/code] permission in the export preset. - [b]Note:[/b] For iOS, specifying the duration is supported in iOS 13 and later. - [b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not support this method. + Vibrate the handheld device for the specified duration in milliseconds. + [b]Note:[/b] This method is implemented on Android, iOS, and Web. It has no effect on other platforms. + [b]Note:[/b] For Android, [method vibrate_handheld] requires enabling the [code]VIBRATE[/code] permission in the export preset. Otherwise, [method vibrate_handheld] will have no effect. + [b]Note:[/b] For iOS, specifying the duration is only supported in iOS 13 and later. + [b]Note:[/b] Some web browsers such as Safari and Firefox for Android do not support [method vibrate_handheld]. </description> </method> <method name="warp_mouse"> diff --git a/doc/classes/ItemList.xml b/doc/classes/ItemList.xml index 844f260971..c485d26e0c 100644 --- a/doc/classes/ItemList.xml +++ b/doc/classes/ItemList.xml @@ -459,6 +459,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the item text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="v_separation" data_type="constant" type="int" default="2"> The vertical spacing between items. diff --git a/doc/classes/Label.xml b/doc/classes/Label.xml index cd87b4558f..1a8cbf0584 100644 --- a/doc/classes/Label.xml +++ b/doc/classes/Label.xml @@ -111,6 +111,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> Text outline size. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="shadow_offset_x" data_type="constant" type="int" default="1"> The horizontal offset of the text's shadow. diff --git a/doc/classes/LineEdit.xml b/doc/classes/LineEdit.xml index e57cc68b36..b8383aaed9 100644 --- a/doc/classes/LineEdit.xml +++ b/doc/classes/LineEdit.xml @@ -424,6 +424,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="font" data_type="font" type="Font"> Font used for the text. diff --git a/doc/classes/LinkButton.xml b/doc/classes/LinkButton.xml index d7701ea184..b3938999f3 100644 --- a/doc/classes/LinkButton.xml +++ b/doc/classes/LinkButton.xml @@ -28,7 +28,23 @@ Base text writing direction. </member> <member name="underline" type="int" setter="set_underline_mode" getter="get_underline_mode" enum="LinkButton.UnderlineMode" default="0"> - Determines when to show the underline. See [enum UnderlineMode] for options. + The underline mode to use for the text. See [enum LinkButton.UnderlineMode] for the available modes. + </member> + <member name="uri" type="String" setter="set_uri" getter="get_uri" default=""""> + The [url=https://en.wikipedia.org/wiki/Uniform_Resource_Identifier]URI[/url] for this [LinkButton]. If set to a valid URI, pressing the button opens the URI using the operating system's default program for the protocol (via [method OS.shell_open]). HTTP and HTTPS URLs open the default web browser. + [b]Examples:[/b] + [codeblocks] + [gdscript] + uri = "https://godotengine.org" # Opens the URL in the default web browser. + uri = "C:\SomeFolder" # Opens the file explorer at the given path. + uri = "C:\SomeImage.png" # Opens the given image in the default viewing app. + [/gdscript] + [csharp] + Uri = "https://godotengine.org"; // Opens the URL in the default web browser. + Uri = "C:\SomeFolder"; // Opens the file explorer at the given path. + Uri = "C:\SomeImage.png"; // Opens the given image in the default viewing app. + [/csharp] + [/codeblocks] </member> </members> <constants> @@ -60,6 +76,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="underline_spacing" data_type="constant" type="int" default="2"> The vertical space between the baseline of text and the underline. diff --git a/doc/classes/MenuBar.xml b/doc/classes/MenuBar.xml index e8505937ff..79876e56a3 100644 --- a/doc/classes/MenuBar.xml +++ b/doc/classes/MenuBar.xml @@ -143,6 +143,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="font" data_type="font" type="Font"> [Font] of the menu item's text. diff --git a/doc/classes/MenuButton.xml b/doc/classes/MenuButton.xml index 4d5d5a011b..3061149570 100644 --- a/doc/classes/MenuButton.xml +++ b/doc/classes/MenuButton.xml @@ -75,6 +75,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="font" data_type="font" type="Font"> [Font] of the [MenuButton]'s text. diff --git a/doc/classes/MeshLibrary.xml b/doc/classes/MeshLibrary.xml index 85e57dd0f3..7c93ba5dce 100644 --- a/doc/classes/MeshLibrary.xml +++ b/doc/classes/MeshLibrary.xml @@ -59,14 +59,21 @@ Returns the item's name. </description> </method> - <method name="get_item_navmesh" qualifiers="const"> + <method name="get_item_navigation_layers" qualifiers="const"> + <return type="int" /> + <param index="0" name="id" type="int" /> + <description> + Returns the item's navigation layers bitmask. + </description> + </method> + <method name="get_item_navigation_mesh" qualifiers="const"> <return type="NavigationMesh" /> <param index="0" name="id" type="int" /> <description> Returns the item's navigation mesh. </description> </method> - <method name="get_item_navmesh_transform" qualifiers="const"> + <method name="get_item_navigation_mesh_transform" qualifiers="const"> <return type="Transform3D" /> <param index="0" name="id" type="int" /> <description> @@ -126,18 +133,26 @@ This name is shown in the editor. It can also be used to look up the item later using [method find_item_by_name]. </description> </method> - <method name="set_item_navmesh"> + <method name="set_item_navigation_layers"> + <return type="void" /> + <param index="0" name="id" type="int" /> + <param index="1" name="navigation_layers" type="int" /> + <description> + Sets the item's navigation layers bitmask. + </description> + </method> + <method name="set_item_navigation_mesh"> <return type="void" /> <param index="0" name="id" type="int" /> - <param index="1" name="navmesh" type="NavigationMesh" /> + <param index="1" name="navigation_mesh" type="NavigationMesh" /> <description> Sets the item's navigation mesh. </description> </method> - <method name="set_item_navmesh_transform"> + <method name="set_item_navigation_mesh_transform"> <return type="void" /> <param index="0" name="id" type="int" /> - <param index="1" name="navmesh" type="Transform3D" /> + <param index="1" name="navigation_mesh" type="Transform3D" /> <description> Sets the transform to apply to the item's navigation mesh. </description> diff --git a/doc/classes/NavigationAgent2D.xml b/doc/classes/NavigationAgent2D.xml index 8cf7824ff7..31d347d76c 100644 --- a/doc/classes/NavigationAgent2D.xml +++ b/doc/classes/NavigationAgent2D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationAgent2D" inherits="Node" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationAgent2D" inherits="Node" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> 2D Agent used in navigation for collision avoidance. </brief_description> @@ -16,24 +16,30 @@ Returns the distance to the target location, using the agent's global position. The user must set [member target_location] in order for this to be accurate. </description> </method> - <method name="get_final_location"> - <return type="Vector2" /> - <description> - Returns the reachable final location in global coordinates. This can change if the navigation path is altered in any way. Because of this, it would be best to check this each frame. - </description> - </method> - <method name="get_nav_path" qualifiers="const"> + <method name="get_current_navigation_path" qualifiers="const"> <return type="PackedVector2Array" /> <description> Returns this agent's current path from start to finish in global coordinates. The path only updates when the target location is changed or the agent requires a repath. The path array is not intended to be used in direct path movement as the agent has its own internal path logic that would get corrupted by changing the path array manually. Use the intended [method get_next_location] once every physics frame to receive the next path point for the agents movement as this function also updates the internal path logic. </description> </method> - <method name="get_nav_path_index" qualifiers="const"> + <method name="get_current_navigation_path_index" qualifiers="const"> <return type="int" /> <description> Returns which index the agent is currently on in the navigation path's [PackedVector2Array]. </description> </method> + <method name="get_current_navigation_result" qualifiers="const"> + <return type="NavigationPathQueryResult2D" /> + <description> + Returns the path query result for the path the agent is currently following. + </description> + </method> + <method name="get_final_location"> + <return type="Vector2" /> + <description> + Returns the reachable final location in global coordinates. This can change if the navigation path is altered in any way. Because of this, it would be best to check this each frame. + </description> + </method> <method name="get_navigation_layer_value" qualifiers="const"> <return type="bool" /> <param index="0" name="layer_number" type="int" /> @@ -122,6 +128,9 @@ <member name="path_max_distance" type="float" setter="set_path_max_distance" getter="get_path_max_distance" default="3.0"> The maximum distance the agent is allowed away from the ideal path to the final location. This can happen due to trying to avoid collisions. When the maximum distance is exceeded, it recalculates the ideal path. </member> + <member name="path_metadata_flags" type="int" setter="set_path_metadata_flags" getter="get_path_metadata_flags" enum="NavigationPathQueryParameters2D.PathMetadataFlags" default="7"> + Additional information to return with the navigation path. + </member> <member name="radius" type="float" setter="set_radius" getter="get_radius" default="10.0"> The radius of the avoidance agent. This is the "body" of the avoidance agent and not the avoidance maneuver starting radius (which is controlled by [member neighbor_distance]). Does not affect normal pathfinding. To change an actor's pathfinding radius bake [NavigationMesh] resources with a different [member NavigationMesh.agent_radius] property and use different navigation maps for each actor size. @@ -137,6 +146,17 @@ </member> </members> <signals> + <signal name="link_reached"> + <param index="0" name="details" type="Dictionary" /> + <description> + Notifies when a navigation link has been reached. + The details dictionary may contain the following keys depending on the value of [member path_metadata_flags]: + - [code]location[/code]: The start location of the link that was reached. + - [code]type[/code]: Always [constant NavigationPathQueryResult2D.PATH_SEGMENT_TYPE_LINK]. + - [code]rid[/code]: The [RID] of the link. + - [code]owner[/code]: The object which manages the link (usually [NavigationLink2D]). + </description> + </signal> <signal name="navigation_finished"> <description> Notifies when the final location is reached. @@ -158,5 +178,16 @@ Notifies when the collision avoidance velocity is calculated. Emitted by [method set_velocity]. Only emitted when [member avoidance_enabled] is true. </description> </signal> + <signal name="waypoint_reached"> + <param index="0" name="details" type="Dictionary" /> + <description> + Notifies when a waypoint along the path has been reached. + The details dictionary may contain the following keys depending on the value of [member path_metadata_flags]: + - [code]location[/code]: The location of the waypoint that was reached. + - [code]type[/code]: The type of navigation primitive (region or link) that contains this waypoint. + - [code]rid[/code]: The [RID] of the containing navigation primitive (region or link). + - [code]owner[/code]: The object which manages the containing navigation primitive (region or link). + </description> + </signal> </signals> </class> diff --git a/doc/classes/NavigationAgent3D.xml b/doc/classes/NavigationAgent3D.xml index 44c17647f7..c3f4809b5e 100644 --- a/doc/classes/NavigationAgent3D.xml +++ b/doc/classes/NavigationAgent3D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationAgent3D" inherits="Node" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationAgent3D" inherits="Node" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> 3D Agent used in navigation for collision avoidance. </brief_description> @@ -16,24 +16,30 @@ Returns the distance to the target location, using the agent's global position. The user must set [member target_location] in order for this to be accurate. </description> </method> - <method name="get_final_location"> - <return type="Vector3" /> - <description> - Returns the reachable final location in global coordinates. This can change if the navigation path is altered in any way. Because of this, it would be best to check this each frame. - </description> - </method> - <method name="get_nav_path" qualifiers="const"> + <method name="get_current_navigation_path" qualifiers="const"> <return type="PackedVector3Array" /> <description> Returns this agent's current path from start to finish in global coordinates. The path only updates when the target location is changed or the agent requires a repath. The path array is not intended to be used in direct path movement as the agent has its own internal path logic that would get corrupted by changing the path array manually. Use the intended [method get_next_location] once every physics frame to receive the next path point for the agents movement as this function also updates the internal path logic. </description> </method> - <method name="get_nav_path_index" qualifiers="const"> + <method name="get_current_navigation_path_index" qualifiers="const"> <return type="int" /> <description> Returns which index the agent is currently on in the navigation path's [PackedVector3Array]. </description> </method> + <method name="get_current_navigation_result" qualifiers="const"> + <return type="NavigationPathQueryResult3D" /> + <description> + Returns the path query result for the path the agent is currently following. + </description> + </method> + <method name="get_final_location"> + <return type="Vector3" /> + <description> + Returns the reachable final location in global coordinates. This can change if the navigation path is altered in any way. Because of this, it would be best to check this each frame. + </description> + </method> <method name="get_navigation_layer_value" qualifiers="const"> <return type="bool" /> <param index="0" name="layer_number" type="int" /> @@ -128,6 +134,9 @@ <member name="path_max_distance" type="float" setter="set_path_max_distance" getter="get_path_max_distance" default="3.0"> The maximum distance the agent is allowed away from the ideal path to the final location. This can happen due to trying to avoid collisions. When the maximum distance is exceeded, it recalculates the ideal path. </member> + <member name="path_metadata_flags" type="int" setter="set_path_metadata_flags" getter="get_path_metadata_flags" enum="NavigationPathQueryParameters3D.PathMetadataFlags" default="7"> + Additional information to return with the navigation path. + </member> <member name="radius" type="float" setter="set_radius" getter="get_radius" default="1.0"> The radius of the avoidance agent. This is the "body" of the avoidance agent and not the avoidance maneuver starting radius (which is controlled by [member neighbor_distance]). Does not affect normal pathfinding. To change an actor's pathfinding radius bake [NavigationMesh] resources with a different [member NavigationMesh.agent_radius] property and use different navigation maps for each actor size. @@ -143,6 +152,17 @@ </member> </members> <signals> + <signal name="link_reached"> + <param index="0" name="details" type="Dictionary" /> + <description> + Notifies when a navigation link has been reached. + The details dictionary may contain the following keys depending on the value of [member path_metadata_flags]: + - [code]location[/code]: The start location of the link that was reached. + - [code]type[/code]: Always [constant NavigationPathQueryResult3D.PATH_SEGMENT_TYPE_LINK]. + - [code]rid[/code]: The [RID] of the link. + - [code]owner[/code]: The object which manages the link (usually [NavigationLink3D]). + </description> + </signal> <signal name="navigation_finished"> <description> Notifies when the final location is reached. @@ -164,5 +184,16 @@ Notifies when the collision avoidance velocity is calculated. Emitted by [method set_velocity]. Only emitted when [member avoidance_enabled] is true. </description> </signal> + <signal name="waypoint_reached"> + <param index="0" name="details" type="Dictionary" /> + <description> + Notifies when a waypoint along the path has been reached. + The details dictionary may contain the following keys depending on the value of [member path_metadata_flags]: + - [code]location[/code]: The location of the waypoint that was reached. + - [code]type[/code]: The type of navigation primitive (region or link) that contains this waypoint. + - [code]rid[/code]: The [RID] of the containing navigation primitive (region or link). + - [code]owner[/code]: The object which manages the containing navigation primitive (region or link). + </description> + </signal> </signals> </class> diff --git a/doc/classes/NavigationLink2D.xml b/doc/classes/NavigationLink2D.xml index 1e086fb730..9d75694360 100644 --- a/doc/classes/NavigationLink2D.xml +++ b/doc/classes/NavigationLink2D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationLink2D" inherits="Node2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationLink2D" inherits="Node2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Creates a link between two locations that [NavigationServer2D] can route agents through. </brief_description> @@ -38,7 +38,7 @@ The distance the link will search is controlled by [method NavigationServer2D.map_set_link_connection_radius]. </member> <member name="enter_cost" type="float" setter="set_enter_cost" getter="get_enter_cost" default="0.0"> - When pathfinding enters this link from another regions navmesh the [code]enter_cost[/code] value is added to the path distance for determining the shortest path. + When pathfinding enters this link from another regions navigation mesh the [code]enter_cost[/code] value is added to the path distance for determining the shortest path. </member> <member name="navigation_layers" type="int" setter="set_navigation_layers" getter="get_navigation_layers" default="1"> A bitfield determining all navigation layers the link belongs to. These navigation layers will be checked when requesting a path with [method NavigationServer2D.map_get_path]. diff --git a/doc/classes/NavigationLink3D.xml b/doc/classes/NavigationLink3D.xml index 4d5d81bec5..730c43c5a8 100644 --- a/doc/classes/NavigationLink3D.xml +++ b/doc/classes/NavigationLink3D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationLink3D" inherits="Node3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationLink3D" inherits="Node3D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Creates a link between two locations that [NavigationServer3D] can route agents through. </brief_description> @@ -38,7 +38,7 @@ The distance the link will search is controlled by [method NavigationServer3D.map_set_link_connection_radius]. </member> <member name="enter_cost" type="float" setter="set_enter_cost" getter="get_enter_cost" default="0.0"> - When pathfinding enters this link from another regions navmesh the [code]enter_cost[/code] value is added to the path distance for determining the shortest path. + When pathfinding enters this link from another regions navigation mesh the [code]enter_cost[/code] value is added to the path distance for determining the shortest path. </member> <member name="navigation_layers" type="int" setter="set_navigation_layers" getter="get_navigation_layers" default="1"> A bitfield determining all navigation layers the link belongs to. These navigation layers will be checked when requesting a path with [method NavigationServer3D.map_get_path]. diff --git a/doc/classes/NavigationMesh.xml b/doc/classes/NavigationMesh.xml index c86bc47e04..ff898551d4 100644 --- a/doc/classes/NavigationMesh.xml +++ b/doc/classes/NavigationMesh.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationMesh" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationMesh" inherits="Resource" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A mesh to approximate the walkable areas and obstacles. </brief_description> @@ -133,13 +133,10 @@ <member name="geometry_source_geometry_mode" type="int" setter="set_source_geometry_mode" getter="get_source_geometry_mode" enum="NavigationMesh.SourceGeometryMode" default="0"> The source of the geometry used when baking. See [enum SourceGeometryMode] for possible values. </member> - <member name="geometry_source_group_name" type="StringName" setter="set_source_group_name" getter="get_source_group_name" default="&"navmesh""> + <member name="geometry_source_group_name" type="StringName" setter="set_source_group_name" getter="get_source_group_name" default="&"navigation_mesh_source_group""> The name of the group to scan for geometry. Only used when [member geometry_source_geometry_mode] is [constant SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN] or [constant SOURCE_GEOMETRY_GROUPS_EXPLICIT]. </member> - <member name="polygon_verts_per_poly" type="float" setter="set_verts_per_poly" getter="get_verts_per_poly" default="6.0"> - The maximum number of vertices allowed for polygons generated during the contour to polygon conversion process. - </member> <member name="region_merge_size" type="float" setter="set_region_merge_size" getter="get_region_merge_size" default="20.0"> Any regions with a size smaller than this will be merged with larger regions if possible. [b]Note:[/b] This value will be squared to calculate the number of cells. For example, a value of 20 will set the number of cells to 400. @@ -151,6 +148,9 @@ <member name="sample_partition_type" type="int" setter="set_sample_partition_type" getter="get_sample_partition_type" enum="NavigationMesh.SamplePartitionType" default="0"> Partitioning algorithm for creating the navigation mesh polys. See [enum SamplePartitionType] for possible values. </member> + <member name="vertices_per_polygon" type="float" setter="set_vertices_per_polygon" getter="get_vertices_per_polygon" default="6.0"> + The maximum number of vertices allowed for polygons generated during the contour to polygon conversion process. + </member> </members> <constants> <constant name="SAMPLE_PARTITION_WATERSHED" value="0" enum="SamplePartitionType"> @@ -177,8 +177,8 @@ <constant name="PARSED_GEOMETRY_MAX" value="3" enum="ParsedGeometryType"> Represents the size of the [enum ParsedGeometryType] enum. </constant> - <constant name="SOURCE_GEOMETRY_NAVMESH_CHILDREN" value="0" enum="SourceGeometryMode"> - Scans the child nodes of [NavigationRegion3D] recursively for geometry. + <constant name="SOURCE_GEOMETRY_ROOT_NODE_CHILDREN" value="0" enum="SourceGeometryMode"> + Scans the child nodes of the root node recursively for geometry. </constant> <constant name="SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN" value="1" enum="SourceGeometryMode"> Scans nodes in a group and their child nodes recursively for geometry. The group is specified by [member geometry_source_group_name]. diff --git a/doc/classes/NavigationMeshGenerator.xml b/doc/classes/NavigationMeshGenerator.xml index 4c337db90f..15d149a229 100644 --- a/doc/classes/NavigationMeshGenerator.xml +++ b/doc/classes/NavigationMeshGenerator.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationMeshGenerator" inherits="Object" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationMeshGenerator" inherits="Object" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Helper class for creating and clearing navigation meshes. </brief_description> @@ -15,17 +15,17 @@ <methods> <method name="bake"> <return type="void" /> - <param index="0" name="nav_mesh" type="NavigationMesh" /> + <param index="0" name="navigation_mesh" type="NavigationMesh" /> <param index="1" name="root_node" type="Node" /> <description> - Bakes navigation data to the provided [param nav_mesh] by parsing child nodes under the provided [param root_node] or a specific group of nodes for potential source geometry. The parse behavior can be controlled with the [member NavigationMesh.geometry_parsed_geometry_type] and [member NavigationMesh.geometry_source_geometry_mode] properties on the [NavigationMesh] resource. + Bakes navigation data to the provided [param navigation_mesh] by parsing child nodes under the provided [param root_node] or a specific group of nodes for potential source geometry. The parse behavior can be controlled with the [member NavigationMesh.geometry_parsed_geometry_type] and [member NavigationMesh.geometry_source_geometry_mode] properties on the [NavigationMesh] resource. </description> </method> <method name="clear"> <return type="void" /> - <param index="0" name="nav_mesh" type="NavigationMesh" /> + <param index="0" name="navigation_mesh" type="NavigationMesh" /> <description> - Removes all polygons and vertices from the provided [param nav_mesh] resource. + Removes all polygons and vertices from the provided [param navigation_mesh] resource. </description> </method> </methods> diff --git a/doc/classes/NavigationObstacle2D.xml b/doc/classes/NavigationObstacle2D.xml index 68d9691ccf..ce0f05ad28 100644 --- a/doc/classes/NavigationObstacle2D.xml +++ b/doc/classes/NavigationObstacle2D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationObstacle2D" inherits="Node" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationObstacle2D" inherits="Node" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> 2D Obstacle used in navigation for collision avoidance. </brief_description> diff --git a/doc/classes/NavigationObstacle3D.xml b/doc/classes/NavigationObstacle3D.xml index 90eb55887f..78bbb788d9 100644 --- a/doc/classes/NavigationObstacle3D.xml +++ b/doc/classes/NavigationObstacle3D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationObstacle3D" inherits="Node" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationObstacle3D" inherits="Node" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> 3D Obstacle used in navigation for collision avoidance. </brief_description> diff --git a/doc/classes/NavigationPathQueryParameters2D.xml b/doc/classes/NavigationPathQueryParameters2D.xml index 397ca8b713..511b2e7a8c 100644 --- a/doc/classes/NavigationPathQueryParameters2D.xml +++ b/doc/classes/NavigationPathQueryParameters2D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationPathQueryParameters2D" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationPathQueryParameters2D" inherits="RefCounted" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Parameters to be sent to a 2D navigation path query. </brief_description> @@ -12,6 +12,9 @@ <member name="map" type="RID" setter="set_map" getter="get_map"> The navigation [code]map[/code] [RID] used in the path query. </member> + <member name="metadata_flags" type="int" setter="set_metadata_flags" getter="get_metadata_flags" enum="NavigationPathQueryParameters2D.PathMetadataFlags" default="7"> + Additional information to include with the navigation path. + </member> <member name="navigation_layers" type="int" setter="set_navigation_layers" getter="get_navigation_layers" default="1"> The navigation layers the query will use (as a bitmask). </member> @@ -33,10 +36,25 @@ The path query uses the default A* pathfinding algorithm. </constant> <constant name="PATH_POSTPROCESSING_CORRIDORFUNNEL" value="0" enum="PathPostProcessing"> - Applies a funnel algorithm to the raw path corridor found by the pathfinding algorithm. This will result in the shortest path possible inside the path corridor. This postprocessing very much depends on the navmesh polygon layout and the created corridor. Especially tile- or gridbased layouts can face artificial corners with diagonal movement due to a jagged path corridor imposed by the cell shapes. + Applies a funnel algorithm to the raw path corridor found by the pathfinding algorithm. This will result in the shortest path possible inside the path corridor. This postprocessing very much depends on the navigation mesh polygon layout and the created corridor. Especially tile- or gridbased layouts can face artificial corners with diagonal movement due to a jagged path corridor imposed by the cell shapes. </constant> <constant name="PATH_POSTPROCESSING_EDGECENTERED" value="1" enum="PathPostProcessing"> - Centers every path position in the middle of the traveled navmesh polygon edge. This creates better paths for tile- or gridbased layouts that restrict the movement to the cells center. + Centers every path position in the middle of the traveled navigation mesh polygon edge. This creates better paths for tile- or gridbased layouts that restrict the movement to the cells center. + </constant> + <constant name="PATH_METADATA_INCLUDE_NONE" value="0" enum="PathMetadataFlags" is_bitfield="true"> + Don't include any additional metadata about the returned path. + </constant> + <constant name="PATH_METADATA_INCLUDE_TYPES" value="1" enum="PathMetadataFlags" is_bitfield="true"> + Include the type of navigation primitive (region or link) that each point of the path goes through. + </constant> + <constant name="PATH_METADATA_INCLUDE_RIDS" value="2" enum="PathMetadataFlags" is_bitfield="true"> + Include the [RID]s of the regions and links that each point of the path goes through. + </constant> + <constant name="PATH_METADATA_INCLUDE_OWNERS" value="4" enum="PathMetadataFlags" is_bitfield="true"> + Include the [code]ObjectID[/code]s of the [Object]s which manage the regions and links each point of the path goes through. + </constant> + <constant name="PATH_METADATA_INCLUDE_ALL" value="7" enum="PathMetadataFlags" is_bitfield="true"> + Include all available metadata about the returned path. </constant> </constants> </class> diff --git a/doc/classes/NavigationPathQueryParameters3D.xml b/doc/classes/NavigationPathQueryParameters3D.xml index 29faa5561b..b5031f60f2 100644 --- a/doc/classes/NavigationPathQueryParameters3D.xml +++ b/doc/classes/NavigationPathQueryParameters3D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationPathQueryParameters3D" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationPathQueryParameters3D" inherits="RefCounted" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Parameters to be sent to a 3D navigation path query. </brief_description> @@ -12,6 +12,9 @@ <member name="map" type="RID" setter="set_map" getter="get_map"> The navigation [code]map[/code] [RID] used in the path query. </member> + <member name="metadata_flags" type="int" setter="set_metadata_flags" getter="get_metadata_flags" enum="NavigationPathQueryParameters3D.PathMetadataFlags" default="7"> + Additional information to include with the navigation path. + </member> <member name="navigation_layers" type="int" setter="set_navigation_layers" getter="get_navigation_layers" default="1"> The navigation layers the query will use (as a bitmask). </member> @@ -33,10 +36,25 @@ The path query uses the default A* pathfinding algorithm. </constant> <constant name="PATH_POSTPROCESSING_CORRIDORFUNNEL" value="0" enum="PathPostProcessing"> - Applies a funnel algorithm to the raw path corridor found by the pathfinding algorithm. This will result in the shortest path possible inside the path corridor. This postprocessing very much depends on the navmesh polygon layout and the created corridor. Especially tile- or gridbased layouts can face artificial corners with diagonal movement due to a jagged path corridor imposed by the cell shapes. + Applies a funnel algorithm to the raw path corridor found by the pathfinding algorithm. This will result in the shortest path possible inside the path corridor. This postprocessing very much depends on the navigation mesh polygon layout and the created corridor. Especially tile- or gridbased layouts can face artificial corners with diagonal movement due to a jagged path corridor imposed by the cell shapes. </constant> <constant name="PATH_POSTPROCESSING_EDGECENTERED" value="1" enum="PathPostProcessing"> - Centers every path position in the middle of the traveled navmesh polygon edge. This creates better paths for tile- or gridbased layouts that restrict the movement to the cells center. + Centers every path position in the middle of the traveled navigation mesh polygon edge. This creates better paths for tile- or gridbased layouts that restrict the movement to the cells center. + </constant> + <constant name="PATH_METADATA_INCLUDE_NONE" value="0" enum="PathMetadataFlags" is_bitfield="true"> + Don't include any additional metadata about the returned path. + </constant> + <constant name="PATH_METADATA_INCLUDE_TYPES" value="1" enum="PathMetadataFlags" is_bitfield="true"> + Include the type of navigation primitive (region or link) that each point of the path goes through. + </constant> + <constant name="PATH_METADATA_INCLUDE_RIDS" value="2" enum="PathMetadataFlags" is_bitfield="true"> + Include the [RID]s of the regions and links that each point of the path goes through. + </constant> + <constant name="PATH_METADATA_INCLUDE_OWNERS" value="4" enum="PathMetadataFlags" is_bitfield="true"> + Include the [code]ObjectID[/code]s of the [Object]s which manage the regions and links each point of the path goes through. + </constant> + <constant name="PATH_METADATA_INCLUDE_ALL" value="7" enum="PathMetadataFlags" is_bitfield="true"> + Include all available metadata about the returned path. </constant> </constants> </class> diff --git a/doc/classes/NavigationPathQueryResult2D.xml b/doc/classes/NavigationPathQueryResult2D.xml index 95b90e9383..75f7cc47aa 100644 --- a/doc/classes/NavigationPathQueryResult2D.xml +++ b/doc/classes/NavigationPathQueryResult2D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationPathQueryResult2D" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationPathQueryResult2D" inherits="RefCounted" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Result from a [NavigationPathQueryParameters2D] navigation path query. </brief_description> @@ -20,5 +20,22 @@ <member name="path" type="PackedVector2Array" setter="set_path" getter="get_path" default="PackedVector2Array()"> The resulting path array from the navigation query. All path array positions are in global coordinates. Without customized query parameters this is the same path as returned by [method NavigationServer2D.map_get_path]. </member> + <member name="path_owner_ids" type="PackedInt64Array" setter="set_path_owner_ids" getter="get_path_owner_ids" default="PackedInt64Array()"> + The [code]ObjectID[/code]s of the [Object]s which manage the regions and links each point of the path goes through. + </member> + <member name="path_rids" type="RID[]" setter="set_path_rids" getter="get_path_rids" default="[]"> + The [RID]s of the regions and links that each point of the path goes through. + </member> + <member name="path_types" type="PackedInt32Array" setter="set_path_types" getter="get_path_types" default="PackedInt32Array()"> + The type of navigation primitive (region or link) that each point of the path goes through. + </member> </members> + <constants> + <constant name="PATH_SEGMENT_TYPE_REGION" value="0" enum="PathSegmentType"> + This segment of the path goes through a region. + </constant> + <constant name="PATH_SEGMENT_TYPE_LINK" value="1" enum="PathSegmentType"> + This segment of the path goes through a link. + </constant> + </constants> </class> diff --git a/doc/classes/NavigationPathQueryResult3D.xml b/doc/classes/NavigationPathQueryResult3D.xml index b4ca8288db..03d41cb230 100644 --- a/doc/classes/NavigationPathQueryResult3D.xml +++ b/doc/classes/NavigationPathQueryResult3D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationPathQueryResult3D" inherits="RefCounted" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationPathQueryResult3D" inherits="RefCounted" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Result from a [NavigationPathQueryParameters3D] navigation path query. </brief_description> @@ -20,5 +20,22 @@ <member name="path" type="PackedVector3Array" setter="set_path" getter="get_path" default="PackedVector3Array()"> The resulting path array from the navigation query. All path array positions are in global coordinates. Without customized query parameters this is the same path as returned by [method NavigationServer3D.map_get_path]. </member> + <member name="path_owner_ids" type="PackedInt64Array" setter="set_path_owner_ids" getter="get_path_owner_ids" default="PackedInt64Array()"> + The [code]ObjectID[/code]s of the [Object]s which manage the regions and links each point of the path goes through. + </member> + <member name="path_rids" type="RID[]" setter="set_path_rids" getter="get_path_rids" default="[]"> + The [RID]s of the regions and links that each point of the path goes through. + </member> + <member name="path_types" type="PackedInt32Array" setter="set_path_types" getter="get_path_types" default="PackedInt32Array()"> + The type of navigation primitive (region or link) that each point of the path goes through. + </member> </members> + <constants> + <constant name="PATH_SEGMENT_TYPE_REGION" value="0" enum="PathSegmentType"> + This segment of the path goes through a region. + </constant> + <constant name="PATH_SEGMENT_TYPE_LINK" value="1" enum="PathSegmentType"> + This segment of the path goes through a link. + </constant> + </constants> </class> diff --git a/doc/classes/NavigationPolygon.xml b/doc/classes/NavigationPolygon.xml index 19466c171f..b30dd2703a 100644 --- a/doc/classes/NavigationPolygon.xml +++ b/doc/classes/NavigationPolygon.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationPolygon" inherits="Resource" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationPolygon" inherits="Resource" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A node that has methods to draw outlines or use indices of vertices to create navigation polygons. </brief_description> @@ -12,14 +12,14 @@ var outline = PackedVector2Array([Vector2(0, 0), Vector2(0, 50), Vector2(50, 50), Vector2(50, 0)]) polygon.add_outline(outline) polygon.make_polygons_from_outlines() - $NavigationRegion2D.navpoly = polygon + $NavigationRegion2D.navigation_polygon = polygon [/gdscript] [csharp] var polygon = new NavigationPolygon(); var outline = new Vector2[] { new Vector2(0, 0), new Vector2(0, 50), new Vector2(50, 50), new Vector2(50, 0) }; polygon.AddOutline(outline); polygon.MakePolygonsFromOutlines(); - GetNode<NavigationRegion2D>("NavigationRegion2D").Navpoly = polygon; + GetNode<NavigationRegion2D>("NavigationRegion2D").NavigationPolygon = polygon; [/csharp] [/codeblocks] Using [method add_polygon] and indices of the vertices array. @@ -30,7 +30,7 @@ polygon.vertices = vertices var indices = PackedInt32Array([0, 1, 2, 3]) polygon.add_polygon(indices) - $NavigationRegion2D.navpoly = polygon + $NavigationRegion2D.navigation_polygon = polygon [/gdscript] [csharp] var polygon = new NavigationPolygon(); @@ -38,7 +38,7 @@ polygon.Vertices = vertices; var indices = new int[] { 0, 1, 2, 3 }; polygon.AddPolygon(indices); - GetNode<NavigationRegion2D>("NavigationRegion2D").Navpoly = polygon; + GetNode<NavigationRegion2D>("NavigationRegion2D").NavigationPolygon = polygon; [/csharp] [/codeblocks] </description> @@ -80,10 +80,10 @@ Clears the array of polygons, but it doesn't clear the array of outlines and vertices. </description> </method> - <method name="get_mesh"> + <method name="get_navigation_mesh"> <return type="NavigationMesh" /> <description> - Returns the [NavigationMesh] resulting from this navigation polygon. This navmesh can be used to update the navmesh of a region with the [method NavigationServer3D.region_set_navmesh] API directly (as 2D uses the 3D server behind the scene). + Returns the [NavigationMesh] resulting from this navigation polygon. This navigation mesh can be used to update the navigation mesh of a region with the [method NavigationServer3D.region_set_navigation_mesh] API directly (as 2D uses the 3D server behind the scene). </description> </method> <method name="get_outline" qualifiers="const"> diff --git a/doc/classes/NavigationRegion2D.xml b/doc/classes/NavigationRegion2D.xml index 0f28081201..8b8793b3b4 100644 --- a/doc/classes/NavigationRegion2D.xml +++ b/doc/classes/NavigationRegion2D.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationRegion2D" inherits="Node2D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationRegion2D" inherits="Node2D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A region of the 2D navigation map. </brief_description> <description> A region of the navigation map. It tells the [NavigationServer2D] what can be navigated and what cannot, based on its [NavigationPolygon] resource. Two regions can be connected to each other if they share a similar edge. You can set the minimum distance between two vertices required to connect two edges by using [method NavigationServer2D.map_set_edge_connection_margin]. - [b]Note:[/b] Overlapping two regions' polygons is not enough for connecting two regions. They must share a similar edge. + [b]Note:[/b] Overlapping two regions' navigation polygons is not enough for connecting two regions. They must share a similar edge. The pathfinding cost of entering this region from another region can be controlled with the [member enter_cost] value. [b]Note:[/b] This value is not added to the path cost when the start position is already inside this region. The pathfinding cost of traveling distances inside this region can be controlled with the [member travel_cost] multiplier. @@ -42,16 +42,16 @@ Determines if the [NavigationRegion2D] is enabled or disabled. </member> <member name="enter_cost" type="float" setter="set_enter_cost" getter="get_enter_cost" default="0.0"> - When pathfinding enters this region's navmesh from another regions navmesh the [code]enter_cost[/code] value is added to the path distance for determining the shortest path. + When pathfinding enters this region's navigation mesh from another regions navigation mesh the [code]enter_cost[/code] value is added to the path distance for determining the shortest path. </member> <member name="navigation_layers" type="int" setter="set_navigation_layers" getter="get_navigation_layers" default="1"> A bitfield determining all navigation layers the region belongs to. These navigation layers can be checked upon when requesting a path with [method NavigationServer2D.map_get_path]. </member> - <member name="navpoly" type="NavigationPolygon" setter="set_navigation_polygon" getter="get_navigation_polygon"> + <member name="navigation_polygon" type="NavigationPolygon" setter="set_navigation_polygon" getter="get_navigation_polygon"> The [NavigationPolygon] resource to use. </member> <member name="travel_cost" type="float" setter="set_travel_cost" getter="get_travel_cost" default="1.0"> - When pathfinding moves inside this region's navmesh the traveled distances are multiplied with [code]travel_cost[/code] for determining the shortest path. + When pathfinding moves inside this region's navigation mesh the traveled distances are multiplied with [code]travel_cost[/code] for determining the shortest path. </member> </members> </class> diff --git a/doc/classes/NavigationRegion3D.xml b/doc/classes/NavigationRegion3D.xml index 85f163b3c2..10662db869 100644 --- a/doc/classes/NavigationRegion3D.xml +++ b/doc/classes/NavigationRegion3D.xml @@ -1,12 +1,12 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationRegion3D" inherits="Node3D" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationRegion3D" inherits="Node3D" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> A region of the navigation map. </brief_description> <description> A region of the navigation map. It tells the [NavigationServer3D] what can be navigated and what cannot, based on its [NavigationMesh] resource. Two regions can be connected to each other if they share a similar edge. You can set the minimum distance between two vertices required to connect two edges by using [method NavigationServer3D.map_set_edge_connection_margin]. - [b]Note:[/b] Overlapping two regions' navmeshes is not enough for connecting two regions. They must share a similar edge. + [b]Note:[/b] Overlapping two regions' navigation meshes is not enough for connecting two regions. They must share a similar edge. The cost of entering this region from another region can be controlled with the [member enter_cost] value. [b]Note:[/b] This value is not added to the path cost when the start position is already inside this region. The cost of traveling distances inside this region can be controlled with the [member travel_cost] multiplier. @@ -49,16 +49,16 @@ Determines if the [NavigationRegion3D] is enabled or disabled. </member> <member name="enter_cost" type="float" setter="set_enter_cost" getter="get_enter_cost" default="0.0"> - When pathfinding enters this region's navmesh from another regions navmesh the [code]enter_cost[/code] value is added to the path distance for determining the shortest path. + When pathfinding enters this region's navigation mesh from another regions navigation mesh the [code]enter_cost[/code] value is added to the path distance for determining the shortest path. </member> <member name="navigation_layers" type="int" setter="set_navigation_layers" getter="get_navigation_layers" default="1"> A bitfield determining all navigation layers the region belongs to. These navigation layers can be checked upon when requesting a path with [method NavigationServer3D.map_get_path]. </member> - <member name="navmesh" type="NavigationMesh" setter="set_navigation_mesh" getter="get_navigation_mesh"> + <member name="navigation_mesh" type="NavigationMesh" setter="set_navigation_mesh" getter="get_navigation_mesh"> The [NavigationMesh] resource to use. </member> <member name="travel_cost" type="float" setter="set_travel_cost" getter="get_travel_cost" default="1.0"> - When pathfinding moves inside this region's navmesh the traveled distances are multiplied with [code]travel_cost[/code] for determining the shortest path. + When pathfinding moves inside this region's navigation mesh the traveled distances are multiplied with [code]travel_cost[/code] for determining the shortest path. </member> </members> <signals> diff --git a/doc/classes/NavigationServer2D.xml b/doc/classes/NavigationServer2D.xml index 981ab8a5e1..32e48cde54 100644 --- a/doc/classes/NavigationServer2D.xml +++ b/doc/classes/NavigationServer2D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationServer2D" inherits="Object" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationServer2D" inherits="Object" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Server interface for low-level 2D navigation access </brief_description> @@ -40,12 +40,12 @@ <method name="agent_set_callback" qualifiers="const"> <return type="void" /> <param index="0" name="agent" type="RID" /> - <param index="1" name="receiver" type="Object" /> + <param index="1" name="object_id" type="int" /> <param index="2" name="method" type="StringName" /> <param index="3" name="userdata" type="Variant" default="null" /> <description> - Callback called at the end of the RVO process. If a callback is created manually and the agent is placed on a navigation map it will calculate avoidance for the agent and dispatch the calculated [code]safe_velocity[/code] to the [param receiver] object with a signal to the chosen [param method] name. - [b]Note:[/b] Created callbacks are always processed independently of the SceneTree state as long as the agent is on a navigation map and not freed. To disable the dispatch of a callback from an agent use [method agent_set_callback] again with a [code]null[/code] object as the [param receiver]. + Sets the callback [param object_id] and [param method] that gets called after each avoidance processing step for the [param agent]. The calculated [code]safe_velocity[/code] will be dispatched with a signal to the object just before the physics calculations. + [b]Note:[/b] Created callbacks are always processed independently of the SceneTree state as long as the agent is on a navigation map and not freed. To disable the dispatch of a callback from an agent use [method agent_set_callback] again with a [code]0[/code] ObjectID as the [param object_id]. </description> </method> <method name="agent_set_map" qualifiers="const"> @@ -167,6 +167,13 @@ Returns the navigation layers for this [code]link[/code]. </description> </method> + <method name="link_get_owner_id" qualifiers="const"> + <return type="int" /> + <param index="0" name="link" type="RID" /> + <description> + Returns the [code]ObjectID[/code] of the object which manages this link. + </description> + </method> <method name="link_get_start_location" qualifiers="const"> <return type="Vector2" /> <param index="0" name="link" type="RID" /> @@ -228,6 +235,14 @@ Set the links's navigation layers. This allows selecting links from a path request (when using [method NavigationServer2D.map_get_path]). </description> </method> + <method name="link_set_owner_id" qualifiers="const"> + <return type="void" /> + <param index="0" name="link" type="RID" /> + <param index="1" name="owner_id" type="int" /> + <description> + Set the [code]ObjectID[/code] of the object which manages this link. + </description> + </method> <method name="link_set_start_location" qualifiers="const"> <return type="void" /> <param index="0" name="link" type="RID" /> @@ -426,6 +441,13 @@ Returns the region's navigation layers. </description> </method> + <method name="region_get_owner_id" qualifiers="const"> + <return type="int" /> + <param index="0" name="region" type="RID" /> + <description> + Returns the [code]ObjectID[/code] of the object which manages this region. + </description> + </method> <method name="region_get_travel_cost" qualifiers="const"> <return type="float" /> <param index="0" name="region" type="RID" /> @@ -467,12 +489,20 @@ Set the region's navigation layers. This allows selecting regions from a path request (when using [method NavigationServer2D.map_get_path]). </description> </method> - <method name="region_set_navpoly" qualifiers="const"> + <method name="region_set_navigation_polygon" qualifiers="const"> + <return type="void" /> + <param index="0" name="region" type="RID" /> + <param index="1" name="navigation_polygon" type="NavigationPolygon" /> + <description> + Sets the [param navigation_polygon] for the region. + </description> + </method> + <method name="region_set_owner_id" qualifiers="const"> <return type="void" /> <param index="0" name="region" type="RID" /> - <param index="1" name="nav_poly" type="NavigationPolygon" /> + <param index="1" name="owner_id" type="int" /> <description> - Sets the navigation mesh for the region. + Set the [code]ObjectID[/code] of the object which manages this region. </description> </method> <method name="region_set_transform" qualifiers="const"> diff --git a/doc/classes/NavigationServer3D.xml b/doc/classes/NavigationServer3D.xml index 943aa03ef7..c156dfac16 100644 --- a/doc/classes/NavigationServer3D.xml +++ b/doc/classes/NavigationServer3D.xml @@ -1,5 +1,5 @@ <?xml version="1.0" encoding="UTF-8" ?> -<class name="NavigationServer3D" inherits="Object" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> +<class name="NavigationServer3D" inherits="Object" is_experimental="true" version="4.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="../class.xsd"> <brief_description> Server interface for low-level 3D navigation access </brief_description> @@ -40,12 +40,12 @@ <method name="agent_set_callback" qualifiers="const"> <return type="void" /> <param index="0" name="agent" type="RID" /> - <param index="1" name="receiver" type="Object" /> + <param index="1" name="object_id" type="int" /> <param index="2" name="method" type="StringName" /> <param index="3" name="userdata" type="Variant" default="null" /> <description> - Callback called at the end of the RVO process. If a callback is created manually and the agent is placed on a navigation map it will calculate avoidance for the agent and dispatch the calculated [code]safe_velocity[/code] to the [param receiver] object with a signal to the chosen [param method] name. - [b]Note:[/b] Created callbacks are always processed independently of the SceneTree state as long as the agent is on a navigation map and not freed. To disable the dispatch of a callback from an agent use [method agent_set_callback] again with a [code]null[/code] object as the [param receiver]. + Sets the callback [param object_id] and [param method] that gets called after each avoidance processing step for the [param agent]. The calculated [code]safe_velocity[/code] will be dispatched with a signal to the object just before the physics calculations. + [b]Note:[/b] Created callbacks are always processed independently of the SceneTree state as long as the agent is on a navigation map and not freed. To disable the dispatch of a callback from an agent use [method agent_set_callback] again with a [code]0[/code] ObjectID as the [param object_id]. </description> </method> <method name="agent_set_map" qualifiers="const"> @@ -167,6 +167,13 @@ Returns the navigation layers for this [code]link[/code]. </description> </method> + <method name="link_get_owner_id" qualifiers="const"> + <return type="int" /> + <param index="0" name="link" type="RID" /> + <description> + Returns the [code]ObjectID[/code] of the object which manages this link. + </description> + </method> <method name="link_get_start_location" qualifiers="const"> <return type="Vector3" /> <param index="0" name="link" type="RID" /> @@ -228,6 +235,14 @@ Set the links's navigation layers. This allows selecting links from a path request (when using [method NavigationServer3D.map_get_path]). </description> </method> + <method name="link_set_owner_id" qualifiers="const"> + <return type="void" /> + <param index="0" name="link" type="RID" /> + <param index="1" name="owner_id" type="int" /> + <description> + Set the [code]ObjectID[/code] of the object which manages this link. + </description> + </method> <method name="link_set_start_location" qualifiers="const"> <return type="void" /> <param index="0" name="link" type="RID" /> @@ -418,12 +433,12 @@ Queries a path in a given navigation map. Start and target position and other parameters are defined through [NavigationPathQueryParameters3D]. Updates the provided [NavigationPathQueryResult3D] result object with the path among other results requested by the query. </description> </method> - <method name="region_bake_navmesh" qualifiers="const"> + <method name="region_bake_navigation_mesh" qualifiers="const"> <return type="void" /> - <param index="0" name="mesh" type="NavigationMesh" /> - <param index="1" name="node" type="Node" /> + <param index="0" name="navigation_mesh" type="NavigationMesh" /> + <param index="1" name="root_node" type="Node" /> <description> - Bakes the navigation mesh. + Bakes the [param navigation_mesh] with bake source geometry collected starting from the [param root_node]. </description> </method> <method name="region_create" qualifiers="const"> @@ -476,6 +491,13 @@ Returns the region's navigation layers. </description> </method> + <method name="region_get_owner_id" qualifiers="const"> + <return type="int" /> + <param index="0" name="region" type="RID" /> + <description> + Returns the [code]ObjectID[/code] of the object which manages this region. + </description> + </method> <method name="region_get_travel_cost" qualifiers="const"> <return type="float" /> <param index="0" name="region" type="RID" /> @@ -517,14 +539,22 @@ Set the region's navigation layers. This allows selecting regions from a path request (when using [method NavigationServer3D.map_get_path]). </description> </method> - <method name="region_set_navmesh" qualifiers="const"> + <method name="region_set_navigation_mesh" qualifiers="const"> <return type="void" /> <param index="0" name="region" type="RID" /> - <param index="1" name="nav_mesh" type="NavigationMesh" /> + <param index="1" name="navigation_mesh" type="NavigationMesh" /> <description> Sets the navigation mesh for the region. </description> </method> + <method name="region_set_owner_id" qualifiers="const"> + <return type="void" /> + <param index="0" name="region" type="RID" /> + <param index="1" name="owner_id" type="int" /> + <description> + Set the [code]ObjectID[/code] of the object which manages this region. + </description> + </method> <method name="region_set_transform" qualifiers="const"> <return type="void" /> <param index="0" name="region" type="RID" /> diff --git a/doc/classes/Node2D.xml b/doc/classes/Node2D.xml index 26efe37dce..9d224f09b1 100644 --- a/doc/classes/Node2D.xml +++ b/doc/classes/Node2D.xml @@ -99,6 +99,9 @@ <member name="global_rotation" type="float" setter="set_global_rotation" getter="get_global_rotation"> Global rotation in radians. </member> + <member name="global_rotation_degrees" type="float" setter="set_global_rotation_degrees" getter="get_global_rotation_degrees"> + Helper property to access [member global_rotation] in degrees instead of radians. + </member> <member name="global_scale" type="Vector2" setter="set_global_scale" getter="get_global_scale"> Global scale. </member> @@ -114,6 +117,9 @@ <member name="rotation" type="float" setter="set_rotation" getter="get_rotation" default="0.0"> Rotation in radians, relative to the node's parent. </member> + <member name="rotation_degrees" type="float" setter="set_rotation_degrees" getter="get_rotation_degrees"> + Helper property to access [member rotation] in degrees instead of radians. + </member> <member name="scale" type="Vector2" setter="set_scale" getter="get_scale" default="Vector2(1, 1)"> The node's scale. Unscaled value: [code](1, 1)[/code]. [b]Note:[/b] Negative X scales in 2D are not decomposable from the transformation matrix. Due to the way scale is represented with transformation matrices in Godot, negative scales on the X axis will be changed to negative scales on the Y axis and a rotation of 180 degrees when decomposed. diff --git a/doc/classes/Node3D.xml b/doc/classes/Node3D.xml index b6024b1887..1aa71113e9 100644 --- a/doc/classes/Node3D.xml +++ b/doc/classes/Node3D.xml @@ -274,6 +274,9 @@ Rotation part of the global transformation in radians, specified in terms of YXZ-Euler angles in the format (X angle, Y angle, Z angle). [b]Note:[/b] In the mathematical sense, rotation is a matrix and not a vector. The three Euler angles, which are the three independent parameters of the Euler-angle parametrization of the rotation matrix, are stored in a [Vector3] data structure not because the rotation is a vector, but only because [Vector3] exists as a convenient data-structure to store 3 floating-point numbers. Therefore, applying affine operations on the rotation "vector" is not meaningful. </member> + <member name="global_rotation_degrees" type="Vector3" setter="set_global_rotation_degrees" getter="get_global_rotation_degrees"> + Helper property to access [member global_rotation] in degrees instead of radians. + </member> <member name="global_transform" type="Transform3D" setter="set_global_transform" getter="get_global_transform"> World3D space (global) [Transform3D] of this node. </member> @@ -287,6 +290,9 @@ Rotation part of the local transformation in radians, specified in terms of Euler angles. The angles construct a rotaton in the order specified by the [member rotation_order] property. [b]Note:[/b] In the mathematical sense, rotation is a matrix and not a vector. The three Euler angles, which are the three independent parameters of the Euler-angle parametrization of the rotation matrix, are stored in a [Vector3] data structure not because the rotation is a vector, but only because [Vector3] exists as a convenient data-structure to store 3 floating-point numbers. Therefore, applying affine operations on the rotation "vector" is not meaningful. </member> + <member name="rotation_degrees" type="Vector3" setter="set_rotation_degrees" getter="get_rotation_degrees"> + Helper property to access [member rotation] in degrees instead of radians. + </member> <member name="rotation_edit_mode" type="int" setter="set_rotation_edit_mode" getter="get_rotation_edit_mode" enum="Node3D.RotationEditMode" default="0"> Specify how rotation (and scale) will be presented in the editor. </member> diff --git a/doc/classes/Object.xml b/doc/classes/Object.xml index 5e834b3d91..e015bec134 100644 --- a/doc/classes/Object.xml +++ b/doc/classes/Object.xml @@ -8,7 +8,7 @@ You can create new instances, using [code]Object.new()[/code] in GDScript, or [code]new Object[/code] in C#. To delete an Object instance, call [method free]. This is necessary for most classes inheriting Object, because they do not manage memory on their own, and will otherwise cause memory leaks when no longer in use. There are a few classes that perform memory management. For example, [RefCounted] (and by extension [Resource]) deletes itself when no longer referenced, and [Node] deletes its children when freed. Objects can have a [Script] attached to them. Once the [Script] is instantiated, it effectively acts as an extension to the base class, allowing it to define and inherit new properties, methods and signals. - Inside a [Script], [method _get_property_list] may be overriden to customize properties in several ways. This allows them to be available to the editor, display as lists of options, sub-divide into groups, save on disk, etc. Scripting languages offer easier ways to customize properties, such as with the [annotation @GDScript.@export] annotation. + Inside a [Script], [method _get_property_list] may be overridden to customize properties in several ways. This allows them to be available to the editor, display as lists of options, sub-divide into groups, save on disk, etc. Scripting languages offer easier ways to customize properties, such as with the [annotation @GDScript.@export] annotation. Godot is very dynamic. An object's script, and therefore its properties, methods and signals, can be changed at run-time. Because of this, there can be occasions where, for example, a property required by a method may not exist. To prevent run-time errors, see methods such as [method set], [method get], [method call], [method has_method], [method has_signal], etc. Note that these methods are [b]much[/b] slower than direct references. In GDScript, you can also check if a given property, method, or signal name exists in an object with the [code]in[/code] operator: [codeblock] diff --git a/doc/classes/OptionButton.xml b/doc/classes/OptionButton.xml index e63e822648..a58a6249ae 100644 --- a/doc/classes/OptionButton.xml +++ b/doc/classes/OptionButton.xml @@ -259,6 +259,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="font" data_type="font" type="Font"> [Font] of the [OptionButton]'s text. diff --git a/doc/classes/PathFollow3D.xml b/doc/classes/PathFollow3D.xml index fa7580b7b6..01275471d0 100644 --- a/doc/classes/PathFollow3D.xml +++ b/doc/classes/PathFollow3D.xml @@ -15,7 +15,7 @@ <param index="0" name="transform" type="Transform3D" /> <param index="1" name="rotation_mode" type="int" enum="PathFollow3D.RotationMode" /> <description> - Correct the [code]transform[/code]. [code]rotation_mode[/code] implicitly specifies how posture (forward, up and sideway direction) is caculated. + Correct the [code]transform[/code]. [code]rotation_mode[/code] implicitly specifies how posture (forward, up and sideway direction) is calculated. </description> </method> </methods> diff --git a/doc/classes/PhysicsPointQueryParameters2D.xml b/doc/classes/PhysicsPointQueryParameters2D.xml index e49d2a9f5f..76dc816dab 100644 --- a/doc/classes/PhysicsPointQueryParameters2D.xml +++ b/doc/classes/PhysicsPointQueryParameters2D.xml @@ -10,7 +10,7 @@ </tutorials> <members> <member name="canvas_instance_id" type="int" setter="set_canvas_instance_id" getter="get_canvas_instance_id" default="0"> - If different from [code]0[/code], restricts the query to a specific canvas layer specified by its instance id. See [method Object.get_instance_id]. + If different from [code]0[/code], restricts the query to a specific canvas layer specified by its instance ID. See [method Object.get_instance_id]. </member> <member name="collide_with_areas" type="bool" setter="set_collide_with_areas" getter="is_collide_with_areas_enabled" default="false"> If [code]true[/code], the query will take [Area2D]s into account. diff --git a/doc/classes/PopupMenu.xml b/doc/classes/PopupMenu.xml index a69163f429..8dec4eaf86 100644 --- a/doc/classes/PopupMenu.xml +++ b/doc/classes/PopupMenu.xml @@ -206,7 +206,7 @@ <return type="int" /> <param index="0" name="index" type="int" /> <description> - Returns the id of the item at the given [param index]. [code]id[/code] can be manually assigned, while index can not. + Returns the ID of the item at the given [param index]. [code]id[/code] can be manually assigned, while index can not. </description> </method> <method name="get_item_indent" qualifiers="const"> @@ -584,6 +584,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the item text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="separator_outline_size" data_type="constant" type="int" default="0"> The size of the labeled separator text outline. diff --git a/doc/classes/ProgressBar.xml b/doc/classes/ProgressBar.xml index 510b8d5bd1..9f89a4e4c3 100644 --- a/doc/classes/ProgressBar.xml +++ b/doc/classes/ProgressBar.xml @@ -42,6 +42,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="font" data_type="font" type="Font"> Font used to draw the fill percentage if [member show_percentage] is [code]true[/code]. diff --git a/doc/classes/ProjectSettings.xml b/doc/classes/ProjectSettings.xml index 1f0a8d91fa..b80d6b2216 100644 --- a/doc/classes/ProjectSettings.xml +++ b/doc/classes/ProjectSettings.xml @@ -344,9 +344,6 @@ <member name="compression/formats/zstd/window_log_size" type="int" setter="" getter="" default="27"> Largest size limit (in power of 2) allowed when compressing using long-distance matching with Zstandard. Higher values can result in better compression, but will require more memory when compressing and decompressing. </member> - <member name="debug/disable_touch" type="bool" setter="" getter="" default="false"> - Disable touch input. Only has effect on iOS. - </member> <member name="debug/file_logging/enable_file_logging" type="bool" setter="" getter="" default="false"> If [code]true[/code], logs all output to files. </member> @@ -585,7 +582,7 @@ [b]Note:[/b] This setting has no effect on the home indicator if [code]hide_home_indicator[/code] is [code]true[/code]. </member> <member name="display/window/per_pixel_transparency/allowed" type="bool" setter="" getter="" default="false"> - If [code]true[/code], allows per-pixel transparency for the window background. This affects performance, so leave it on [code]false[/code] unless you need it. See also [member display/window/size/transparent] and [member rendering/transparent_background]. + If [code]true[/code], allows per-pixel transparency for the window background. This affects performance, so leave it on [code]false[/code] unless you need it. See also [member display/window/size/transparent] and [member rendering/viewport/transparent_background]. </member> <member name="display/window/size/always_on_top" type="bool" setter="" getter="" default="false"> Forces the main window to be always on top. @@ -610,7 +607,7 @@ [b]Note:[/b] This setting is ignored on iOS. </member> <member name="display/window/size/transparent" type="bool" setter="" getter="" default="false"> - If [code]true[/code], enables a window manager hint that the main window background [i]can[/i] be transparent. This does not make the background actually transparent. For the background to be transparent, the root viewport must also be made transparent by enabling [member rendering/transparent_background]. + If [code]true[/code], enables a window manager hint that the main window background [i]can[/i] be transparent. This does not make the background actually transparent. For the background to be transparent, the root viewport must also be made transparent by enabling [member rendering/viewport/transparent_background]. [b]Note:[/b] To use a transparent splash screen, set [member application/boot_splash/bg_color] to [code]Color(0, 0, 0, 0)[/code]. [b]Note:[/b] This setting has no effect if [member display/window/per_pixel_transparency/allowed] is set to [code]false[/code]. </member> @@ -1895,9 +1892,6 @@ <member name="rendering/environment/glow/upscale_mode.mobile" type="int" setter="" getter="" default="0"> Lower-end override for [member rendering/environment/glow/upscale_mode] on mobile devices, due to performance concerns or driver support. </member> - <member name="rendering/environment/glow/use_high_quality" type="bool" setter="" getter="" default="false"> - Takes more samples during downsample pass of glow. This ensures that single pixels are captured by glow which makes the glow look smoother and more stable during movement. However, it is very expensive and makes the glow post process take twice as long. - </member> <member name="rendering/environment/screen_space_reflection/roughness_quality" type="int" setter="" getter="" default="1"> Sets the quality for rough screen-space reflections. Turning off will make all screen space reflections sharp, while higher values make rough reflections look better. </member> @@ -2259,7 +2253,7 @@ <member name="rendering/textures/webp_compression/lossless_compression_factor" type="float" setter="" getter="" default="25"> The default compression factor for lossless WebP. Decompression speed is mostly unaffected by the compression factor. Supported values are 0 to 100. </member> - <member name="rendering/transparent_background" type="bool" setter="" getter="" default="false"> + <member name="rendering/viewport/transparent_background" type="bool" setter="" getter="" default="false"> If [code]true[/code], enables [member Viewport.transparent_bg] on the root viewport. This allows per-pixel transparency to be effective after also enabling [member display/window/size/transparent] and [member display/window/per_pixel_transparency/allowed]. </member> <member name="rendering/vrs/mode" type="int" setter="" getter="" default="0"> @@ -2299,6 +2293,9 @@ <member name="xr/openxr/reference_space" type="int" setter="" getter="" default=""1""> Specify the default reference space. </member> + <member name="xr/openxr/submit_depth_buffer" type="bool" setter="" getter="" default="false"> + If [code]true[/code], OpenXR will manage the depth buffer and use the depth buffer for advanced reprojection provided this is supported by the XR runtime. Note that some rendering features in Godot can't be used with this feature. + </member> <member name="xr/openxr/view_configuration" type="int" setter="" getter="" default=""1""> Specify the view configuration with which to configure OpenXR setting up either Mono or Stereo rendering. </member> diff --git a/doc/classes/RenderingDevice.xml b/doc/classes/RenderingDevice.xml index 8afe6eb935..f318430611 100644 --- a/doc/classes/RenderingDevice.xml +++ b/doc/classes/RenderingDevice.xml @@ -425,7 +425,7 @@ <param index="5" name="multisample_state" type="RDPipelineMultisampleState" /> <param index="6" name="stencil_state" type="RDPipelineDepthStencilState" /> <param index="7" name="color_blend_state" type="RDPipelineColorBlendState" /> - <param index="8" name="dynamic_state_flags" type="int" default="0" /> + <param index="8" name="dynamic_state_flags" type="int" enum="RenderingDevice.PipelineDynamicStateFlags" default="0" /> <param index="9" name="for_render_pass" type="int" default="0" /> <param index="10" name="specialization_constants" type="RDPipelineSpecializationConstant[]" default="[]" /> <description> @@ -504,7 +504,7 @@ <return type="RID" /> <param index="0" name="size_bytes" type="int" /> <param index="1" name="data" type="PackedByteArray" default="PackedByteArray()" /> - <param index="2" name="usage" type="int" default="0" /> + <param index="2" name="usage" type="int" enum="RenderingDevice.StorageBufferUsage" default="0" /> <description> </description> </method> @@ -1273,7 +1273,7 @@ </constant> <constant name="INDEX_BUFFER_FORMAT_UINT32" value="1" enum="IndexBufferFormat"> </constant> - <constant name="STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT" value="1" enum="StorageBufferUsage"> + <constant name="STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT" value="1" enum="StorageBufferUsage" is_bitfield="true"> </constant> <constant name="UNIFORM_TYPE_SAMPLER" value="0" enum="UniformType"> </constant> @@ -1453,19 +1453,19 @@ </constant> <constant name="BLEND_OP_MAX" value="5" enum="BlendOperation"> </constant> - <constant name="DYNAMIC_STATE_LINE_WIDTH" value="1" enum="PipelineDynamicStateFlags"> + <constant name="DYNAMIC_STATE_LINE_WIDTH" value="1" enum="PipelineDynamicStateFlags" is_bitfield="true"> </constant> - <constant name="DYNAMIC_STATE_DEPTH_BIAS" value="2" enum="PipelineDynamicStateFlags"> + <constant name="DYNAMIC_STATE_DEPTH_BIAS" value="2" enum="PipelineDynamicStateFlags" is_bitfield="true"> </constant> - <constant name="DYNAMIC_STATE_BLEND_CONSTANTS" value="4" enum="PipelineDynamicStateFlags"> + <constant name="DYNAMIC_STATE_BLEND_CONSTANTS" value="4" enum="PipelineDynamicStateFlags" is_bitfield="true"> </constant> - <constant name="DYNAMIC_STATE_DEPTH_BOUNDS" value="8" enum="PipelineDynamicStateFlags"> + <constant name="DYNAMIC_STATE_DEPTH_BOUNDS" value="8" enum="PipelineDynamicStateFlags" is_bitfield="true"> </constant> - <constant name="DYNAMIC_STATE_STENCIL_COMPARE_MASK" value="16" enum="PipelineDynamicStateFlags"> + <constant name="DYNAMIC_STATE_STENCIL_COMPARE_MASK" value="16" enum="PipelineDynamicStateFlags" is_bitfield="true"> </constant> - <constant name="DYNAMIC_STATE_STENCIL_WRITE_MASK" value="32" enum="PipelineDynamicStateFlags"> + <constant name="DYNAMIC_STATE_STENCIL_WRITE_MASK" value="32" enum="PipelineDynamicStateFlags" is_bitfield="true"> </constant> - <constant name="DYNAMIC_STATE_STENCIL_REFERENCE" value="64" enum="PipelineDynamicStateFlags"> + <constant name="DYNAMIC_STATE_STENCIL_REFERENCE" value="64" enum="PipelineDynamicStateFlags" is_bitfield="true"> </constant> <constant name="INITIAL_ACTION_CLEAR" value="0" enum="InitialAction"> </constant> diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml index 2ffa4dc50b..1cc52e6837 100644 --- a/doc/classes/RenderingServer.xml +++ b/doc/classes/RenderingServer.xml @@ -241,6 +241,7 @@ <param index="4" name="modulate" type="Color" default="Color(1, 1, 1, 1)" /> <param index="5" name="outline_size" type="int" default="0" /> <param index="6" name="px_range" type="float" default="1.0" /> + <param index="7" name="scale" type="float" default="1.0" /> <description> </description> </method> @@ -962,12 +963,6 @@ <description> </description> </method> - <method name="environment_glow_set_use_high_quality"> - <return type="void" /> - <param index="0" name="enable" type="bool" /> - <description> - </description> - </method> <method name="environment_set_adjustment"> <return type="void" /> <param index="0" name="env" type="RID" /> @@ -1295,13 +1290,13 @@ <method name="get_test_cube"> <return type="RID" /> <description> - Returns the id of the test cube. Creates one if none exists. + Returns the ID of the test cube. Creates one if none exists. </description> </method> <method name="get_test_texture"> <return type="RID" /> <description> - Returns the id of the test texture. Creates one if none exists. + Returns the ID of the test texture. Creates one if none exists. </description> </method> <method name="get_video_adapter_api_version" qualifiers="const"> @@ -1335,7 +1330,7 @@ <method name="get_white_texture"> <return type="RID" /> <description> - Returns the id of a white texture. Creates one if none exists. + Returns the ID of a white texture. Creates one if none exists. </description> </method> <method name="gi_set_use_half_resolution"> @@ -1565,7 +1560,7 @@ <param index="0" name="instance" type="RID" /> <param index="1" name="aabb" type="AABB" /> <description> - Sets a custom AABB to use when culling objects from the view frustum. Equivalent to [method GeometryInstance3D.set_custom_aabb]. + Sets a custom AABB to use when culling objects from the view frustum. Equivalent to setting [member GeometryInstance3D.custom_aabb]. </description> </method> <method name="instance_set_extra_visibility_margin"> diff --git a/doc/classes/RichTextLabel.xml b/doc/classes/RichTextLabel.xml index e222894647..e4bc2db104 100644 --- a/doc/classes/RichTextLabel.xml +++ b/doc/classes/RichTextLabel.xml @@ -367,6 +367,7 @@ <return type="void" /> <param index="0" name="columns" type="int" /> <param index="1" name="inline_align" type="int" enum="InlineAlignment" default="0" /> + <param index="2" name="align_to_row" type="int" default="-1" /> <description> Adds a [code][table=columns,inline_align][/code] tag to the tag stack. </description> @@ -655,6 +656,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="shadow_offset_x" data_type="constant" type="int" default="1"> The horizontal offset of the font's shadow. diff --git a/doc/classes/SceneTree.xml b/doc/classes/SceneTree.xml index 070b98f21d..bd5b656e1a 100644 --- a/doc/classes/SceneTree.xml +++ b/doc/classes/SceneTree.xml @@ -308,6 +308,7 @@ </constant> <constant name="GROUP_CALL_UNIQUE" value="4" enum="GroupCallFlags"> Call a group only once even if the call is executed many times. + [b]Note:[/b] Arguments are not taken into account when deciding whether the call is unique or not. Therefore when the same method is called with different arguments, only the first call will be performed. </constant> </constants> </class> diff --git a/doc/classes/String.xml b/doc/classes/String.xml index 7e76a134ff..97466e7860 100644 --- a/doc/classes/String.xml +++ b/doc/classes/String.xml @@ -185,16 +185,16 @@ [gdscript] print("Team".find("I")) # Prints -1 - print("Potato".find("t")) # Prints 2 - print("Potato".find("t", 3)) # Prints 4 - print("Potato".find("t", 5)) # Prints -1 + print("Potato".find("t")) # Prints 2 + print("Potato".find("t", 3)) # Prints 4 + print("Potato".find("t", 5)) # Prints -1 [/gdscript] [csharp] GD.Print("Team".Find("I")); // Prints -1 - GD.Print("Potato".Find("t")); // Prints 2 - GD.print("Potato".Find("t", 3)); // Prints 4 - GD.print("Potato".Find("t", 5)); // Prints -1 + GD.Print("Potato".Find("t")); // Prints 2 + GD.print("Potato".Find("t", 3)); // Prints 4 + GD.print("Potato".Find("t", 5)); // Prints -1 [/csharp] [/codeblocks] [b]Note:[/b] If you just want to know whether the string contains [param what], use [method contains]. In GDScript, you may also use the [code]in[/code] operator. @@ -237,7 +237,7 @@ <description> If the string is a valid file path, returns the base directory name. [codeblock] - var dir_path = "/path/to/file.txt".get_basename() # dir_path is "/path/to" + var dir_path = "/path/to/file.txt".get_base_dir() # dir_path is "/path/to" [/codeblock] </description> </method> @@ -973,11 +973,11 @@ [codeblocks] [gdscript] var url = "$DOCS_URL/?highlight=Godot%20Engine%3%docs" - print(url.uri_decode()) # Prints "$DOCS_URL/?hightlight=Godot Engine:docs" + print(url.uri_decode()) # Prints "$DOCS_URL/?highlight=Godot Engine:docs" [/gdscript] [csharp] var url = "$DOCS_URL/?highlight=Godot%20Engine%3%docs" - GD.Print(url.URIDecode()) // Prints "$DOCS_URL/?hightlight=Godot Engine:docs" + GD.Print(url.URIDecode()) // Prints "$DOCS_URL/?highlight=Godot Engine:docs" [/csharp] [/codeblocks] </description> @@ -988,13 +988,13 @@ Encodes the string to URL-friendly format. This method is meant to properly encode the parameters in a URL when sending an HTTP request. [codeblocks] [gdscript] - var prefix = "$DOCS_URL/?hightlight=" + var prefix = "$DOCS_URL/?highlight=" var url = prefix + "Godot Engine:docs".uri_encode() print(url) # Prints "$DOCS_URL/?highlight=Godot%20Engine%3%docs" [/gdscript] [csharp] - var prefix = "$DOCS_URL/?hightlight="; + var prefix = "$DOCS_URL/?highlight="; var url = prefix + "Godot Engine:docs".URIEncode(); GD.Print(url); // Prints "$DOCS_URL/?highlight=Godot%20Engine%3%docs" @@ -1062,6 +1062,12 @@ Appends [param right] at the end of this [String], also known as a string concatenation. </description> </operator> + <operator name="operator +"> + <return type="String" /> + <param index="0" name="right" type="StringName" /> + <description> + </description> + </operator> <operator name="operator <"> <return type="bool" /> <param index="0" name="right" type="String" /> diff --git a/doc/classes/StringName.xml b/doc/classes/StringName.xml index 02e9c62cd6..b46e39b8d7 100644 --- a/doc/classes/StringName.xml +++ b/doc/classes/StringName.xml @@ -7,6 +7,8 @@ [StringName]s are immutable strings designed for general-purpose representation of unique names (also called "string interning"). [StringName] ensures that only one instance of a given name exists (so two [StringName]s with the same value are the same object). Comparing them is much faster than with regular [String]s, because only the pointers are compared, not the whole strings. You will usually just pass a [String] to methods expecting a [StringName] and it will be automatically converted, but you may occasionally want to construct a [StringName] ahead of time with [StringName] or, in GDScript, the literal syntax [code]&"example"[/code]. See also [NodePath], which is a similar concept specifically designed to store pre-parsed node paths. + Some string methods have corresponding variations. Variations suffixed with [code]n[/code] ([method countn], [method findn], [method replacen], etc.) are [b]case-insensitive[/b] (they make no distinction between uppercase and lowercase letters). Method variations prefixed with [code]r[/code] ([method rfind], [method rsplit], etc.) are reversed, and start from the end of the string, instead of the beginning. + [b]Note:[/b] In a boolean context, a [StringName] will evaluate to [code]false[/code] if it is empty ([code]StringName("")[/code]). Otherwise, a [StringName] will always evaluate to [code]true[/code]. </description> <tutorials> </tutorials> @@ -33,10 +35,897 @@ </constructor> </constructors> <methods> + <method name="begins_with" qualifiers="const"> + <return type="bool" /> + <param index="0" name="text" type="String" /> + <description> + Returns [code]true[/code] if the string begins with the given [param text]. See also [method ends_with]. + </description> + </method> + <method name="bigrams" qualifiers="const"> + <return type="PackedStringArray" /> + <description> + Returns an array containing the bigrams (pairs of consecutive characters) of this string. + [codeblock] + print("Get up!".bigrams()) # Prints ["Ge", "et", "t ", " u", "up", "p!"] + [/codeblock] + </description> + </method> + <method name="bin_to_int" qualifiers="const"> + <return type="int" /> + <description> + Converts the string representing a binary number into an [int]. The string may optionally be prefixed with [code]"0b"[/code], and an additional [code]-[/code] prefix for negative numbers. + [codeblocks] + [gdscript] + print("101".bin_to_int()) # Prints 5 + print("0b101".bin_to_int()) # Prints 5 + print("-0b10".bin_to_int()) # Prints -2 + [/gdscript] + [csharp] + GD.Print("101".BinToInt()); // Prints 5 + GD.Print("0b101".BinToInt()); // Prints 5 + GD.Print("-0b10".BinToInt()); // Prints -2 + [/csharp] + [/codeblocks] + </description> + </method> + <method name="c_escape" qualifiers="const"> + <return type="String" /> + <description> + Returns a copy of the string with special characters escaped using the C language standard. + </description> + </method> + <method name="c_unescape" qualifiers="const"> + <return type="String" /> + <description> + Returns a copy of the string with escaped characters replaced by their meanings. Supported escape sequences are [code]\'[/code], [code]\"[/code], [code]\\[/code], [code]\a[/code], [code]\b[/code], [code]\f[/code], [code]\n[/code], [code]\r[/code], [code]\t[/code], [code]\v[/code]. + [b]Note:[/b] Unlike the GDScript parser, this method doesn't support the [code]\uXXXX[/code] escape sequence. + </description> + </method> + <method name="capitalize" qualifiers="const"> + <return type="String" /> + <description> + Changes the appearance of the string: replaces underscores ([code]_[/code]) with spaces, adds spaces before uppercase letters in the middle of a word, converts all letters to lowercase, then converts the first one and each one following a space to uppercase. + [codeblocks] + [gdscript] + "move_local_x".capitalize() # Returns "Move Local X" + "sceneFile_path".capitalize() # Returns "Scene File Path" + [/gdscript] + [csharp] + "move_local_x".Capitalize(); // Returns "Move Local X" + "sceneFile_path".Capitalize(); // Returns "Scene File Path" + [/csharp] + [/codeblocks] + [b]Note:[/b] This method not the same as the default appearance of properties in the Inspector dock, as it does not capitalize acronyms ([code]"2D"[/code], [code]"FPS"[/code], [code]"PNG"[/code], etc.) as you may expect. + </description> + </method> + <method name="casecmp_to" qualifiers="const"> + <return type="int" /> + <param index="0" name="to" type="String" /> + <description> + Performs a case-sensitive comparison to another string. Returns [code]-1[/code] if less than, [code]1[/code] if greater than, or [code]0[/code] if equal. "Less than" and "greater than" are determined by the [url=https://en.wikipedia.org/wiki/List_of_Unicode_characters]Unicode code points[/url] of each string, which roughly matches the alphabetical order. + With different string lengths, returns [code]1[/code] if this string is longer than the [param to] string, or [code]-1[/code] if shorter. Note that the length of empty strings is [i]always[/i] [code]0[/code]. + To get a [bool] result from a string comparison, use the [code]==[/code] operator instead. See also [method nocasecmp_to] and [method naturalnocasecmp_to]. + </description> + </method> + <method name="contains" qualifiers="const"> + <return type="bool" /> + <param index="0" name="what" type="String" /> + <description> + Returns [code]true[/code] if the string contains [param what]. In GDScript, this corresponds to the [code]in[/code] operator. + [codeblocks] + [gdscript] + print("Node".contains("de")) # Prints true + print("team".contains("I")) # Prints false + print("I" in "team") # Prints false + [/gdscript] + [csharp] + GD.Print("Node".Contains("de")); // Prints true + GD.Print("team".Contains("I")); // Prints false + [/csharp] + [/codeblocks] + If you need to know where [param what] is within the string, use [method find]. + </description> + </method> + <method name="count" qualifiers="const"> + <return type="int" /> + <param index="0" name="what" type="String" /> + <param index="1" name="from" type="int" default="0" /> + <param index="2" name="to" type="int" default="0" /> + <description> + Returns the number of occurrences of the substring [param what] between [param from] and [param to] positions. If [param to] is 0, the search continues until the end of the string. + </description> + </method> + <method name="countn" qualifiers="const"> + <return type="int" /> + <param index="0" name="what" type="String" /> + <param index="1" name="from" type="int" default="0" /> + <param index="2" name="to" type="int" default="0" /> + <description> + Returns the number of occurrences of the substring [param what] between [param from] and [param to] positions, [b]ignoring case[/b]. If [param to] is 0, the search continues until the end of the string. + </description> + </method> + <method name="dedent" qualifiers="const"> + <return type="String" /> + <description> + Returns a copy of the string with indentation (leading tabs and spaces) removed. See also [method indent] to add indentation. + </description> + </method> + <method name="ends_with" qualifiers="const"> + <return type="bool" /> + <param index="0" name="text" type="String" /> + <description> + Returns [code]true[/code] if the string ends with the given [param text]. See also [method begins_with]. + </description> + </method> + <method name="find" qualifiers="const"> + <return type="int" /> + <param index="0" name="what" type="String" /> + <param index="1" name="from" type="int" default="0" /> + <description> + Returns the index of the [b]first[/b] occurrence of [param what] in this string, or [code]-1[/code] if there are none. The search's start can be specified with [param from], continuing to the end of the string. + [codeblocks] + [gdscript] + print("Team".find("I")) # Prints -1 + + print("Potato".find("t")) # Prints 2 + print("Potato".find("t", 3)) # Prints 4 + print("Potato".find("t", 5)) # Prints -1 + [/gdscript] + [csharp] + GD.Print("Team".Find("I")); // Prints -1 + + GD.Print("Potato".Find("t")); // Prints 2 + GD.print("Potato".Find("t", 3)); // Prints 4 + GD.print("Potato".Find("t", 5)); // Prints -1 + [/csharp] + [/codeblocks] + [b]Note:[/b] If you just want to know whether the string contains [param what], use [method contains]. In GDScript, you may also use the [code]in[/code] operator. + </description> + </method> + <method name="findn" qualifiers="const"> + <return type="int" /> + <param index="0" name="what" type="String" /> + <param index="1" name="from" type="int" default="0" /> + <description> + Returns the index of the [b]first[/b] [b]case-insensitive[/b] occurrence of [param what] in this string, or [code]-1[/code] if there are none. The starting search index can be specified with [param from], continuing to the end of the string. + </description> + </method> + <method name="format" qualifiers="const"> + <return type="String" /> + <param index="0" name="values" type="Variant" /> + <param index="1" name="placeholder" type="String" default=""{_}"" /> + <description> + Formats the string by replacing all occurrences of [param placeholder] with the elements of [param values]. + [param values] can be a [Dictionary] or an [Array]. Any underscores in [param placeholder] will be replaced with the corresponding keys in advance. Array elements use their index as keys. + [codeblock] + # Prints "Waiting for Godot is a play by Samuel Beckett, and Godot Engine is named after it." + var use_array_values = "Waiting for {0} is a play by {1}, and {0} Engine is named after it." + print(use_array_values.format(["Godot", "Samuel Beckett"])) + + # Prints "User 42 is Godot." + print("User {id} is {name}.".format({"id": 42, "name": "Godot"})) + [/codeblock] + Some additional handling is performed when [param values] is an [Array]. If [param placeholder] does not contain an underscore, the elements of the [param values] array will be used to replace one occurrence of the placeholder in order; If an element of [param values] is another 2-element array, it'll be interpreted as a key-value pair. + [codeblock] + # Prints "User 42 is Godot." + print("User {} is {}.".format([42, "Godot"], "{}")) + print("User {id} is {name}.".format([["id", 42], ["name", "Godot"]])) + [/codeblock] + See also the [url=$DOCS_URL/tutorials/scripting/gdscript/gdscript_format_string.html]GDScript format string[/url] tutorial. + </description> + </method> + <method name="get_base_dir" qualifiers="const"> + <return type="String" /> + <description> + If the string is a valid file path, returns the base directory name. + [codeblock] + var dir_path = "/path/to/file.txt".get_base_dir() # dir_path is "/path/to" + [/codeblock] + </description> + </method> + <method name="get_basename" qualifiers="const"> + <return type="String" /> + <description> + If the string is a valid file path, returns the full file path, without the extension. + [codeblock] + var base = "/path/to/file.txt".get_basename() # base is "/path/to/file" + [/codeblock] + </description> + </method> + <method name="get_extension" qualifiers="const"> + <return type="String" /> + <description> + If the string is a valid file name or path, returns the file extension without the leading period ([code].[/code]). Otherwise, returns an empty string. + [codeblock] + var a = "/path/to/file.txt".get_extension() # a is "txt" + var b = "cool.txt".get_extension() # b is "txt" + var c = "cool.font.tres".get_extension() # c is "tres" + var d = ".pack1".get_extension() # d is "pack1" + + var e = "file.txt.".get_extension() # e is "" + var f = "file.txt..".get_extension() # f is "" + var g = "txt".get_extension() # g is "" + var h = "".get_extension() # h is "" + [/codeblock] + </description> + </method> + <method name="get_file" qualifiers="const"> + <return type="String" /> + <description> + If the string is a valid file path, returns the file name, including the extension. + [codeblock] + var file = "/path/to/icon.png".get_file() # file is "icon.png" + [/codeblock] + </description> + </method> + <method name="get_slice" qualifiers="const"> + <return type="String" /> + <param index="0" name="delimiter" type="String" /> + <param index="1" name="slice" type="int" /> + <description> + Splits the string using a [param delimiter] and returns the substring at index [param slice]. Returns an empty string if the [param slice] does not exist. + This is faster than [method split], if you only need one substring. + [b]Example:[/b] + [codeblock] + print("i/am/example/hi".get_slice("/", 2)) # Prints "example" + [/codeblock] + </description> + </method> + <method name="get_slice_count" qualifiers="const"> + <return type="int" /> + <param index="0" name="delimiter" type="String" /> + <description> + Returns the total number of slices when the string is split with the given [param delimiter] (see [method split]). + </description> + </method> + <method name="get_slicec" qualifiers="const"> + <return type="String" /> + <param index="0" name="delimiter" type="int" /> + <param index="1" name="slice" type="int" /> + <description> + Splits the string using a Unicode character with code [param delimiter] and returns the substring at index [param slice]. Returns an empty string if the [param slice] does not exist. + This is faster than [method split], if you only need one substring. + </description> + </method> <method name="hash" qualifiers="const"> <return type="int" /> <description> - Returns the 32-bit hash value representing the [StringName]'s contents. + Returns the 32-bit hash value representing the string's contents. + [b]Note:[/b] Strings with equal hash values are [i]not[/i] guaranteed to be the same, as a result of hash collisions. On the countrary, strings with different hash values are guaranteed to be different. + </description> + </method> + <method name="hex_to_int" qualifiers="const"> + <return type="int" /> + <description> + Converts the string representing a hexadecimal number into an [int]. The string may be optionally prefixed with [code]"0x"[/code], and an additional [code]-[/code] prefix for negative numbers. + [codeblocks] + [gdscript] + print("0xff".hex_to_int()) # Prints 255 + print("ab".hex_to_int()) # Prints 171 + [/gdscript] + [csharp] + GD.Print("0xff".HexToInt()); // Prints 255 + GD.Print("ab".HexToInt()); // Prints 171 + [/csharp] + [/codeblocks] + </description> + </method> + <method name="indent" qualifiers="const"> + <return type="String" /> + <param index="0" name="prefix" type="String" /> + <description> + Indents every line of the string with the given [param prefix]. Empty lines are not indented. See also [method dedent] to remove indentation. + For example, the string can be indented with two tabulations using [code]"\t\t"[/code], or four spaces using [code]" "[/code]. + </description> + </method> + <method name="insert" qualifiers="const"> + <return type="String" /> + <param index="0" name="position" type="int" /> + <param index="1" name="what" type="String" /> + <description> + Inserts [param what] at the given [param position] in the string. + </description> + </method> + <method name="is_absolute_path" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if the string is a path to a file or directory, and its starting point is explicitly defined. This method is the opposite of [method is_relative_path]. + This includes all paths starting with [code]"res://"[/code], [code]"user://"[/code], [code]"C:\"[/code], [code]"/"[/code], etc. + </description> + </method> + <method name="is_empty" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if the string's length is [code]0[/code] ([code]""[/code]). See also [method length]. + </description> + </method> + <method name="is_relative_path" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if the string is a path, and its starting point is dependent on context. The path could begin from the current directory, or the current [Node] (if the string is derived from a [NodePath]), and may sometimes be prefixed with [code]"./"[/code]. This method is the opposite of [method is_absolute_path]. + </description> + </method> + <method name="is_subsequence_of" qualifiers="const"> + <return type="bool" /> + <param index="0" name="text" type="String" /> + <description> + Returns [code]true[/code] if all characters of this string can be found in [param text] in their original order. + [codeblock] + var text = "Wow, incredible!" + + print("inedible".is_subsequence_of(text)) # Prints true + print("Word!".is_subsequence_of(text)) # Prints true + print("Window".is_subsequence_of(text)) # Prints false + print("".is_subsequence_of(text)) # Prints true + [/codeblock] + </description> + </method> + <method name="is_subsequence_ofn" qualifiers="const"> + <return type="bool" /> + <param index="0" name="text" type="String" /> + <description> + Returns [code]true[/code] if all characters of this string can be found in [param text] in their original order, [b]ignoring case[/b]. + </description> + </method> + <method name="is_valid_filename" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if this string does not contain characters that are not allowed in file names ([code]:[/code] [code]/[/code] [code]\[/code] [code]?[/code] [code]*[/code] [code]"[/code] [code]|[/code] [code]%[/code] [code]<[/code] [code]>[/code]). + </description> + </method> + <method name="is_valid_float" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if this string represents a valid floating-point number. A valid float may contain only digits, one decimal point ([code].[/code]), and the exponent letter ([code]e[/code]). It may also be prefixed with a positive ([code]+[/code]) or negative ([code]-[/code]) sign. Any valid integer is also a valid float (see [method is_valid_int]). See also [method to_float]. + [codeblock] + print("1.7".is_valid_float()) # Prints true + print("24".is_valid_float()) # Prints true + print("7e3".is_valid_float()) # Prints true + print("Hello".is_valid_float()) # Prints false + [/codeblock] + </description> + </method> + <method name="is_valid_hex_number" qualifiers="const"> + <return type="bool" /> + <param index="0" name="with_prefix" type="bool" default="false" /> + <description> + Returns [code]true[/code] if this string is a valid hexadecimal number. A valid hexadecimal number only contains digits or letters [code]A[/code] to [code]F[/code] (either uppercase or lowercase), and may be prefixed with a positive ([code]+[/code]) or negative ([code]-[/code]) sign. + If [param with_prefix] is [code]true[/code], the hexadecimal number needs to prefixed by [code]"0x"[/code] to be considered valid. + [codeblock] + print("A08E".is_valid_hex_number()) # Prints true + print("-AbCdEf".is_valid_hex_number()) # Prints true + print("2.5".is_valid_hex_number()) # Prints false + + print("0xDEADC0DE".is_valid_hex_number(true)) # Prints true + [/codeblock] + </description> + </method> + <method name="is_valid_html_color" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if this string is a valid color in hexadecimal HTML notation. The string must be a hexadecimal value (see [method is_valid_hex_number]) of either 3, 4, 6 or 8 digits, and may be prefixed by a hash sign ([code]#[/code]). Other HTML notations for colors, such as names or [code]hsl()[/code], are not considered valid. See also [method Color.html]. + </description> + </method> + <method name="is_valid_identifier" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if this string is a valid identifier. A valid identifier may contain only letters, digits and underscores ([code]_[/code]), and the first character may not be a digit. + [codeblock] + print("node_2d".is_valid_identifier()) # Prints true + print("TYPE_FLOAT".is_valid_identifier()) # Prints true + print("1st_method".is_valid_identifier()) # Prints false + print("MyMethod#2".is_valid_identifier()) # Prints false + [/codeblock] + </description> + </method> + <method name="is_valid_int" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if this string represents a valid integer. A valid integer only contains digits, and may be prefixed with a positive ([code]+[/code]) or negative ([code]-[/code]) sign. See also [method to_int]. + [codeblock] + print("7".is_valid_int()) # Prints true + print("1.65".is_valid_int()) # Prints false + print("Hi".is_valid_int()) # Prints false + print("+3".is_valid_int()) # Prints true + print("-12".is_valid_int()) # Prints true + [/codeblock] + </description> + </method> + <method name="is_valid_ip_address" qualifiers="const"> + <return type="bool" /> + <description> + Returns [code]true[/code] if this string represents a well-formatted IPv4 or IPv6 address. This method considers [url=https://en.wikipedia.org/wiki/Reserved_IP_addresses]reserved IP addresses[/url] such as [code]"0.0.0.0"[/code] and [code]"ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff"[/code] as valid. + </description> + </method> + <method name="join" qualifiers="const"> + <return type="String" /> + <param index="0" name="parts" type="PackedStringArray" /> + <description> + Returns the concatenation of [param parts]' elements, with each element separated by the string calling this method. This method is the opposite of [method split]. + [b]Example:[/b] + [codeblocks] + [gdscript] + var fruits = ["Apple", "Orange", "Pear", "Kiwi"] + + print(", ".join(fruits)) # Prints "Apple, Orange, Pear, Kiwi" + print("---".join(fruits)) # Prints "Apple---Orange---Pear---Kiwi" + [/gdscript] + [csharp] + var fruits = new string[] {"Apple", "Orange", "Pear", "Kiwi"}; + + // In C#, this method is static. + GD.Print(string.Join(", ", fruits); // Prints "Apple, Orange, Pear, Kiwi" + GD.Print(string.Join("---", fruits)); // Prints "Apple---Orange---Pear---Kiwi" + [/csharp] + [/codeblocks] + </description> + </method> + <method name="json_escape" qualifiers="const"> + <return type="String" /> + <description> + Returns a copy of the string with special characters escaped using the JSON standard. Because it closely matches the C standard, it is possible to use [method c_unescape] to unescape the string, if necessary. + </description> + </method> + <method name="left" qualifiers="const"> + <return type="String" /> + <param index="0" name="length" type="int" /> + <description> + Returns the first [param length] characters from the beginning of the string. If [param length] is negative, strips the last [param length] characters from the string's end. + [codeblock] + print("Hello World!".left(3)) # Prints "Hel" + print("Hello World!".left(-4)) # Prints "Hello Wo" + [/codeblock] + </description> + </method> + <method name="length" qualifiers="const"> + <return type="int" /> + <description> + Returns the number of characters in the string. Empty strings ([code]""[/code]) always return [code]0[/code]. See also [method is_empty]. + </description> + </method> + <method name="lpad" qualifiers="const"> + <return type="String" /> + <param index="0" name="min_length" type="int" /> + <param index="1" name="character" type="String" default="" "" /> + <description> + Formats the string to be at least [param min_length] long by adding [param character]s to the left of the string, if necessary. See also [method rpad]. + </description> + </method> + <method name="lstrip" qualifiers="const"> + <return type="String" /> + <param index="0" name="chars" type="String" /> + <description> + Removes a set of characters defined in [param chars] from the string's beginning. See also [method rstrip]. + [b]Note:[/b] [param chars] is not a prefix. Use [method trim_prefix] to remove a single prefix, rather than a set of characters. + </description> + </method> + <method name="match" qualifiers="const"> + <return type="bool" /> + <param index="0" name="expr" type="String" /> + <description> + Does a simple expression match, where [code]*[/code] matches zero or more arbitrary characters and [code]?[/code] matches any single character except a period ([code].[/code]). An empty string or empty expression always evaluates to [code]false[/code]. + </description> + </method> + <method name="matchn" qualifiers="const"> + <return type="bool" /> + <param index="0" name="expr" type="String" /> + <description> + Does a simple [b]case-insensitive[/b] expression match, where [code]*[/code] matches zero or more arbitrary characters and [code]?[/code] matches any single character except a period ([code].[/code]). An empty string or empty expression always evaluates to [code]false[/code]. + </description> + </method> + <method name="md5_buffer" qualifiers="const"> + <return type="PackedByteArray" /> + <description> + Returns the [url=https://en.wikipedia.org/wiki/MD5]MD5 hash[/url] of the string as a [PackedByteArray]. + </description> + </method> + <method name="md5_text" qualifiers="const"> + <return type="String" /> + <description> + Returns the [url=https://en.wikipedia.org/wiki/MD5]MD5 hash[/url] of the string as another [String]. + </description> + </method> + <method name="naturalnocasecmp_to" qualifiers="const"> + <return type="int" /> + <param index="0" name="to" type="String" /> + <description> + Performs a [b]case-insensitive[/b], [i]natural order[/i] comparison to another string. Returns [code]-1[/code] if less than, [code]1[/code] if greater than, or [code]0[/code] if equal. "Less than" or "greater than" are determined by the [url=https://en.wikipedia.org/wiki/List_of_Unicode_characters]Unicode code points[/url] of each string, which roughly matches the alphabetical order. Internally, lowercase characters are converted to uppercase for the comparison. + When used for sorting, natural order comparison orders sequences of numbers by the combined value of each digit as is often expected, instead of the single digit's value. A sorted sequence of numbered strings will be [code]["1", "2", "3", ...][/code], not [code]["1", "10", "2", "3", ...][/code]. + With different string lengths, returns [code]1[/code] if this string is longer than the [param to] string, or [code]-1[/code] if shorter. Note that the length of empty strings is [i]always[/i] [code]0[/code]. + To get a [bool] result from a string comparison, use the [code]==[/code] operator instead. See also [method nocasecmp_to] and [method casecmp_to]. + </description> + </method> + <method name="nocasecmp_to" qualifiers="const"> + <return type="int" /> + <param index="0" name="to" type="String" /> + <description> + Performs a [b]case-insensitive[/b] comparison to another string. Returns [code]-1[/code] if less than, [code]1[/code] if greater than, or [code]0[/code] if equal. "Less than" or "greater than" are determined by the [url=https://en.wikipedia.org/wiki/List_of_Unicode_characters]Unicode code points[/url] of each string, which roughly matches the alphabetical order. Internally, lowercase characters are converted to uppercase for the comparison. + With different string lengths, returns [code]1[/code] if this string is longer than the [param to] string, or [code]-1[/code] if shorter. Note that the length of empty strings is [i]always[/i] [code]0[/code]. + To get a [bool] result from a string comparison, use the [code]==[/code] operator instead. See also [method casecmp_to] and [method naturalnocasecmp_to]. + </description> + </method> + <method name="pad_decimals" qualifiers="const"> + <return type="String" /> + <param index="0" name="digits" type="int" /> + <description> + Formats the string representing a number to have an exact number of [param digits] [i]after[/i] the decimal point. + </description> + </method> + <method name="pad_zeros" qualifiers="const"> + <return type="String" /> + <param index="0" name="digits" type="int" /> + <description> + Formats the string representing a number to have an exact number of [param digits] [i]before[/i] the decimal point. + </description> + </method> + <method name="path_join" qualifiers="const"> + <return type="String" /> + <param index="0" name="file" type="String" /> + <description> + Concatenates [param file] at the end of the string as a subpath, adding [code]/[/code] if necessary. + [b]Example:[/b] [code]"this/is".path_join("path") == "this/is/path"[/code]. + </description> + </method> + <method name="repeat" qualifiers="const"> + <return type="String" /> + <param index="0" name="count" type="int" /> + <description> + Repeats this string a number of times. [param count] needs to be greater than [code]0[/code]. Otherwise, returns an empty string. + </description> + </method> + <method name="replace" qualifiers="const"> + <return type="String" /> + <param index="0" name="what" type="String" /> + <param index="1" name="forwhat" type="String" /> + <description> + Replaces all occurrences of [param what] inside the string with the given [param forwhat]. + </description> + </method> + <method name="replacen" qualifiers="const"> + <return type="String" /> + <param index="0" name="what" type="String" /> + <param index="1" name="forwhat" type="String" /> + <description> + Replaces all [b]case-insensitive[/b] occurrences of [param what] inside the string with the given [param forwhat]. + </description> + </method> + <method name="rfind" qualifiers="const"> + <return type="int" /> + <param index="0" name="what" type="String" /> + <param index="1" name="from" type="int" default="-1" /> + <description> + Returns the index of the [b]last[/b] occurrence of [param what] in this string, or [code]-1[/code] if there are none. The search's start can be specified with [param from], continuing to the beginning of the string. This method is the reverse of [method find]. + </description> + </method> + <method name="rfindn" qualifiers="const"> + <return type="int" /> + <param index="0" name="what" type="String" /> + <param index="1" name="from" type="int" default="-1" /> + <description> + Returns the index of the [b]last[/b] [b]case-insensitive[/b] occurrence of [param what] in this string, or [code]-1[/code] if there are none. The starting search index can be specified with [param from], continuing to the beginning of the string. This method is the reverse of [method findn]. + </description> + </method> + <method name="right" qualifiers="const"> + <return type="String" /> + <param index="0" name="length" type="int" /> + <description> + Returns the last [param length] characters from the end of the string. If [param length] is negative, strips the first [param length] characters from the string's beginning. + [codeblock] + print("Hello World!".right(3)) # Prints "ld!" + print("Hello World!".right(-4)) # Prints "o World!" + [/codeblock] + </description> + </method> + <method name="rpad" qualifiers="const"> + <return type="String" /> + <param index="0" name="min_length" type="int" /> + <param index="1" name="character" type="String" default="" "" /> + <description> + Formats the string to be at least [param min_length] long, by adding [param character]s to the right of the string, if necessary. See also [method lpad]. + </description> + </method> + <method name="rsplit" qualifiers="const"> + <return type="PackedStringArray" /> + <param index="0" name="delimiter" type="String" default="""" /> + <param index="1" name="allow_empty" type="bool" default="true" /> + <param index="2" name="maxsplit" type="int" default="0" /> + <description> + Splits the string using a [param delimiter] and returns an array of the substrings, starting from the end of the string. The splits in the returned array appear in the same order as the original string. If [param delimiter] is an empty string, each substring will be a single character. + If [param allow_empty] is [code]false[/code], empty strings between adjacent delimiters are excluded from the array. + If [param maxsplit] is greater than [code]0[/code], the number of splits may not exceed [param maxsplit]. By default, the entire string is split, which is mostly identical to [method split]. + [b]Example:[/b] + [codeblocks] + [gdscript] + var some_string = "One,Two,Three,Four" + var some_array = some_string.rsplit(",", true, 1) + + print(some_array.size()) # Prints 2 + print(some_array[0]) # Prints "One,Two,Three" + print(some_array[1]) # Prints "Four" + [/gdscript] + [csharp] + // In C#, there is no String.RSplit() method. + [/csharp] + [/codeblocks] + </description> + </method> + <method name="rstrip" qualifiers="const"> + <return type="String" /> + <param index="0" name="chars" type="String" /> + <description> + Removes a set of characters defined in [param chars] from the string's end. See also [method lstrip]. + [b]Note:[/b] [param chars] is not a suffix. Use [method trim_suffix] to remove a single suffix, rather than a set of characters. + </description> + </method> + <method name="sha1_buffer" qualifiers="const"> + <return type="PackedByteArray" /> + <description> + Returns the [url=https://en.wikipedia.org/wiki/SHA-1]SHA-1[/url] hash of the string as a [PackedByteArray]. + </description> + </method> + <method name="sha1_text" qualifiers="const"> + <return type="String" /> + <description> + Returns the [url=https://en.wikipedia.org/wiki/SHA-1]SHA-1[/url] hash of the string as another [String]. + </description> + </method> + <method name="sha256_buffer" qualifiers="const"> + <return type="PackedByteArray" /> + <description> + Returns the [url=https://en.wikipedia.org/wiki/SHA-2]SHA-256[/url] hash of the string as a [PackedByteArray]. + </description> + </method> + <method name="sha256_text" qualifiers="const"> + <return type="String" /> + <description> + Returns the [url=https://en.wikipedia.org/wiki/SHA-2]SHA-256[/url] hash of the string as another [String]. + </description> + </method> + <method name="similarity" qualifiers="const"> + <return type="float" /> + <param index="0" name="text" type="String" /> + <description> + Returns the similarity index ([url=https://en.wikipedia.org/wiki/S%C3%B8rensen%E2%80%93Dice_coefficient]Sorensen-Dice coefficient[/url]) of this string compared to another. A result of [code]1.0[/code] means totally similar, while [code]0.0[/code] means totally dissimilar. + [codeblock] + print("ABC123".similarity("ABC123")) # Prints 1.0 + print("ABC123".similarity("XYZ456")) # Prints 0.0 + print("ABC123".similarity("123ABC")) # Prints 0.8 + print("ABC123".similarity("abc123")) # Prints 0.4 + [/codeblock] + </description> + </method> + <method name="simplify_path" qualifiers="const"> + <return type="String" /> + <description> + If the string is a valid file path, converts the string into a canonical path. This is the shortest possible path, without [code]"./"[/code], and all the unnecessary [code]".."[/code] and [code]"/"[/code]. + [codeblock] + var simple_path = "./path/to///../file".simplify_path() + print(simple_path) # Prints "path/file" + [/codeblock] + </description> + </method> + <method name="split" qualifiers="const"> + <return type="PackedStringArray" /> + <param index="0" name="delimiter" type="String" default="""" /> + <param index="1" name="allow_empty" type="bool" default="true" /> + <param index="2" name="maxsplit" type="int" default="0" /> + <description> + Splits the string using a [param delimiter] and returns an array of the substrings. If [param delimiter] is an empty string, each substring will be a single character. This method is the opposite of [method join]. + If [param allow_empty] is [code]false[/code], empty strings between adjacent delimiters are excluded from the array. + If [param maxsplit] is greater than [code]0[/code], the number of splits may not exceed [param maxsplit]. By default, the entire string is split. + [b]Example:[/b] + [codeblocks] + [gdscript] + var some_array = "One,Two,Three,Four".split(",", true, 2) + + print(some_array.size()) # Prints 3 + print(some_array[0]) # Prints "One" + print(some_array[1]) # Prints "Two" + print(some_array[2]) # Prints "Three,Four" + [/gdscript] + [csharp] + // C#'s `Split()` does not support the `maxsplit` parameter. + var someArray = "One,Two,Three".Split(","); + + GD.Print(someArray[0]); // Prints "One" + GD.Print(someArray[1]); // Prints "Two" + GD.Print(someArray[2]); // Prints "Three" + [/csharp] + [/codeblocks] + [b]Note:[/b] If you only need one substring from the array, consider using [method get_slice] which is faster. If you need to split strings with more complex rules, use the [RegEx] class instead. + </description> + </method> + <method name="split_floats" qualifiers="const"> + <return type="PackedFloat64Array" /> + <param index="0" name="delimiter" type="String" /> + <param index="1" name="allow_empty" type="bool" default="true" /> + <description> + Splits the string into floats by using a [param delimiter] and returns a [PackedFloat64Array]. + If [param allow_empty] is [code]false[/code], empty or invalid [float] conversions between adjacent delimiters are excluded. + [codeblock] + var a = "1,2,4.5".split_floats(",") # a is [1.0, 2.0, 4.5] + var c = "1| ||4.5".split_floats("|") # c is [1.0, 0.0, 0.0, 4.5] + var b = "1| ||4.5".split_floats("|", false) # b is [1.0, 4.5] + [/codeblock] + </description> + </method> + <method name="strip_edges" qualifiers="const"> + <return type="String" /> + <param index="0" name="left" type="bool" default="true" /> + <param index="1" name="right" type="bool" default="true" /> + <description> + Strips all non-printable characters from the beginning and the end of the string. These include spaces, tabulations ([code]\t[/code]), and newlines ([code]\n[/code] [code]\r[/code]). + If [param left] is [code]false[/code], ignores the string's beginning. Likewise, if [param right] is [code]false[/code], ignores the string's end. + </description> + </method> + <method name="strip_escapes" qualifiers="const"> + <return type="String" /> + <description> + Strips all escape characters from the string. These include all non-printable control characters of the first page of the ASCII table (values from 0 to 31), such as tabulation ([code]\t[/code]) and newline ([code]\n[/code], [code]\r[/code]) characters, but [i]not[/i] spaces. + </description> + </method> + <method name="substr" qualifiers="const"> + <return type="String" /> + <param index="0" name="from" type="int" /> + <param index="1" name="len" type="int" default="-1" /> + <description> + Returns part of the string from the position [param from] with length [param len]. If [param len] is [code]-1[/code] (as by default), returns the rest of the string starting from the given position. + </description> + </method> + <method name="to_ascii_buffer" qualifiers="const"> + <return type="PackedByteArray" /> + <description> + Converts the string to an [url=https://en.wikipedia.org/wiki/ASCII]ASCII[/url]/Latin-1 encoded [PackedByteArray]. This method is slightly faster than [method to_utf8_buffer], but replaces all unsupported characters with spaces. + </description> + </method> + <method name="to_camel_case" qualifiers="const"> + <return type="String" /> + <description> + Returns the string converted to [code]camelCase[/code]. + </description> + </method> + <method name="to_float" qualifiers="const"> + <return type="float" /> + <description> + Converts the string representing a decimal number into a [float]. This method stops on the first non-number character, except the first decimal point ([code].[/code]) and the exponent letter ([code]e[/code]). See also [method is_valid_float]. + [codeblock] + var a = "12.35".to_float() # a is 12.35 + var b = "1.2.3".to_float() # b is 1.2 + var c = "12xy3".to_float() # c is 12.0 + var d = "1e3".to_float() # d is 1000.0 + var e = "Hello!".to_int() # e is 0.0 + [/codeblock] + </description> + </method> + <method name="to_int" qualifiers="const"> + <return type="int" /> + <description> + Converts the string representing an integer number into an [int]. This method removes any non-number character and stops at the first decimal point ([code].[/code]). See also [method is_valid_int]. + [codeblock] + var a = "123".to_int() # a is 123 + var b = "x1y2z3".to_int() # b is 123 + var c = "-1.2.3".to_int() # c is -1 + var d = "Hello!".to_int() # d is 0 + [/codeblock] + </description> + </method> + <method name="to_lower" qualifiers="const"> + <return type="String" /> + <description> + Returns the string converted to lowercase. + </description> + </method> + <method name="to_pascal_case" qualifiers="const"> + <return type="String" /> + <description> + Returns the string converted to [code]PascalCase[/code]. + </description> + </method> + <method name="to_snake_case" qualifiers="const"> + <return type="String" /> + <description> + Returns the string converted to [code]snake_case[/code]. + </description> + </method> + <method name="to_upper" qualifiers="const"> + <return type="String" /> + <description> + Returns the string converted to uppercase. + </description> + </method> + <method name="to_utf16_buffer" qualifiers="const"> + <return type="PackedByteArray" /> + <description> + Converts the string to a [url=https://en.wikipedia.org/wiki/UTF-16]UTF-16[/url] encoded [PackedByteArray]. + </description> + </method> + <method name="to_utf32_buffer" qualifiers="const"> + <return type="PackedByteArray" /> + <description> + Converts the string to a [url=https://en.wikipedia.org/wiki/UTF-32]UTF-32[/url] encoded [PackedByteArray]. + </description> + </method> + <method name="to_utf8_buffer" qualifiers="const"> + <return type="PackedByteArray" /> + <description> + Converts the string to a [url=https://en.wikipedia.org/wiki/UTF-8]UTF-8[/url] encoded [PackedByteArray]. This method is slightly slower than [method to_ascii_buffer], but supports all UTF-8 characters. For most cases, prefer using this method. + </description> + </method> + <method name="trim_prefix" qualifiers="const"> + <return type="String" /> + <param index="0" name="prefix" type="String" /> + <description> + Removes the given [param prefix] from the start of the string, or returns the string unchanged. + </description> + </method> + <method name="trim_suffix" qualifiers="const"> + <return type="String" /> + <param index="0" name="suffix" type="String" /> + <description> + Removes the given [param suffix] from the end of the string, or returns the string unchanged. + </description> + </method> + <method name="unicode_at" qualifiers="const"> + <return type="int" /> + <param index="0" name="at" type="int" /> + <description> + Returns the character code at position [param at]. + </description> + </method> + <method name="uri_decode" qualifiers="const"> + <return type="String" /> + <description> + Decodes the string from its URL-encoded format. This method is meant to properly decode the parameters in a URL when receiving an HTTP request. + [codeblocks] + [gdscript] + var url = "$DOCS_URL/?highlight=Godot%20Engine%3%docs" + print(url.uri_decode()) # Prints "$DOCS_URL/?highlight=Godot Engine:docs" + [/gdscript] + [csharp] + var url = "$DOCS_URL/?highlight=Godot%20Engine%3%docs" + GD.Print(url.URIDecode()) // Prints "$DOCS_URL/?highlight=Godot Engine:docs" + [/csharp] + [/codeblocks] + </description> + </method> + <method name="uri_encode" qualifiers="const"> + <return type="String" /> + <description> + Encodes the string to URL-friendly format. This method is meant to properly encode the parameters in a URL when sending an HTTP request. + [codeblocks] + [gdscript] + var prefix = "$DOCS_URL/?highlight=" + var url = prefix + "Godot Engine:docs".uri_encode() + + print(url) # Prints "$DOCS_URL/?highlight=Godot%20Engine%3%docs" + [/gdscript] + [csharp] + var prefix = "$DOCS_URL/?highlight="; + var url = prefix + "Godot Engine:docs".URIEncode(); + + GD.Print(url); // Prints "$DOCS_URL/?highlight=Godot%20Engine%3%docs" + [/csharp] + [/codeblocks] + </description> + </method> + <method name="validate_node_name" qualifiers="const"> + <return type="String" /> + <description> + Removes all characters that are not allowed in [member Node.name] from the string ([code].[/code] [code]:[/code] [code]@[/code] [code]/[/code] [code]"[/code] [code]%[/code]). + </description> + </method> + <method name="xml_escape" qualifiers="const"> + <return type="String" /> + <param index="0" name="escape_quotes" type="bool" default="false" /> + <description> + Returns a copy of the string with special characters escaped using the XML standard. If [param escape_quotes] is [code]true[/code], the single quote ([code]'[/code]) and double quote ([code]"[/code]) characters are also escaped. + </description> + </method> + <method name="xml_unescape" qualifiers="const"> + <return type="String" /> + <description> + Returns a copy of the string with escaped characters replaced by their meanings according to the XML standard. </description> </method> </methods> @@ -55,6 +944,24 @@ Returns [code]true[/code] if the [StringName] and [param right] do not refer to the same name. Comparisons between [StringName]s are much faster than regular [String] comparisons. </description> </operator> + <operator name="operator %"> + <return type="String" /> + <param index="0" name="right" type="Variant" /> + <description> + </description> + </operator> + <operator name="operator +"> + <return type="String" /> + <param index="0" name="right" type="String" /> + <description> + </description> + </operator> + <operator name="operator +"> + <return type="String" /> + <param index="0" name="right" type="StringName" /> + <description> + </description> + </operator> <operator name="operator <"> <return type="bool" /> <param index="0" name="right" type="StringName" /> diff --git a/doc/classes/TabBar.xml b/doc/classes/TabBar.xml index 713c016651..8d56cbda13 100644 --- a/doc/classes/TabBar.xml +++ b/doc/classes/TabBar.xml @@ -319,6 +319,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the tab text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="font" data_type="font" type="Font"> The font used to draw tab names. diff --git a/doc/classes/TabContainer.xml b/doc/classes/TabContainer.xml index e2e7a0c37e..c744c9b439 100644 --- a/doc/classes/TabContainer.xml +++ b/doc/classes/TabContainer.xml @@ -214,6 +214,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the tab text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="side_margin" data_type="constant" type="int" default="8"> The space at the left or right edges of the tab bar, accordingly with the current [member tab_alignment]. diff --git a/doc/classes/TextEdit.xml b/doc/classes/TextEdit.xml index d4f5233438..1efd0f9326 100644 --- a/doc/classes/TextEdit.xml +++ b/doc/classes/TextEdit.xml @@ -1396,6 +1396,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="font" data_type="font" type="Font"> Sets the default [Font]. diff --git a/doc/classes/TextLine.xml b/doc/classes/TextLine.xml index d1dfdecbd2..1ebae9889d 100644 --- a/doc/classes/TextLine.xml +++ b/doc/classes/TextLine.xml @@ -15,6 +15,7 @@ <param index="1" name="size" type="Vector2" /> <param index="2" name="inline_align" type="int" enum="InlineAlignment" default="5" /> <param index="3" name="length" type="int" default="1" /> + <param index="4" name="baseline" type="float" default="0.0" /> <description> Adds inline object to the text buffer, [param key] must be unique. In the text, object is represented as [param length] object replacement characters. </description> @@ -122,6 +123,7 @@ <param index="0" name="key" type="Variant" /> <param index="1" name="size" type="Vector2" /> <param index="2" name="inline_align" type="int" enum="InlineAlignment" default="5" /> + <param index="3" name="baseline" type="float" default="0.0" /> <description> Sets new size and alignment of embedded object. </description> diff --git a/doc/classes/TextParagraph.xml b/doc/classes/TextParagraph.xml index e0729ba844..38afd9b5f8 100644 --- a/doc/classes/TextParagraph.xml +++ b/doc/classes/TextParagraph.xml @@ -15,6 +15,7 @@ <param index="1" name="size" type="Vector2" /> <param index="2" name="inline_align" type="int" enum="InlineAlignment" default="5" /> <param index="3" name="length" type="int" default="1" /> + <param index="4" name="baseline" type="float" default="0.0" /> <description> Adds inline object to the text buffer, [param key] must be unique. In the text, object is represented as [param length] object replacement characters. </description> @@ -228,6 +229,7 @@ <param index="0" name="key" type="Variant" /> <param index="1" name="size" type="Vector2" /> <param index="2" name="inline_align" type="int" enum="InlineAlignment" default="5" /> + <param index="3" name="baseline" type="float" default="0.0" /> <description> Sets new size and alignment of embedded object. </description> diff --git a/doc/classes/TextServer.xml b/doc/classes/TextServer.xml index b3e55b5cd0..d2c6dee373 100644 --- a/doc/classes/TextServer.xml +++ b/doc/classes/TextServer.xml @@ -235,7 +235,7 @@ <param index="1" name="size" type="Vector2i" /> <param index="2" name="glyph" type="int" /> <description> - Returns resource id of the cache texture containing the glyph. + Returns resource ID of the cache texture containing the glyph. [b]Note:[/b] If there are pending glyphs to render, calling this function might trigger the texture cache update. </description> </method> @@ -930,6 +930,7 @@ <param index="1" name="language" type="String" default="""" /> <description> Converts a number from the Western Arabic (0..9) to the numeral systems used in [param language]. + If [param language] is omitted, the active locale will be used. </description> </method> <method name="free_rid"> @@ -1097,6 +1098,7 @@ <param index="2" name="size" type="Vector2" /> <param index="3" name="inline_align" type="int" enum="InlineAlignment" default="5" /> <param index="4" name="length" type="int" default="1" /> + <param index="5" name="baseline" type="float" default="0.0" /> <description> Adds inline object to the text buffer, [param key] must be unique. In the text, object is represented as [param length] object replacement characters. </description> @@ -1438,6 +1440,7 @@ <param index="1" name="key" type="Variant" /> <param index="2" name="size" type="Vector2" /> <param index="3" name="inline_align" type="int" enum="InlineAlignment" default="5" /> + <param index="4" name="baseline" type="float" default="0.0" /> <description> Sets new size and alignment of embedded object. </description> @@ -1546,8 +1549,15 @@ <return type="PackedInt32Array" /> <param index="0" name="string" type="String" /> <param index="1" name="language" type="String" default="""" /> - <description> - Returns array of the word break character offsets. + <param index="2" name="chars_per_line" type="int" default="0" /> + <description> + Returns an array of the word break boundaries. Elements in the returned array are the offsets of the start and end of words. Therefore the length of the array is always even. + When [param chars_per_line] is greater than zero, line break boundaries are returned instead. + [codeblock] + var ts = TextServerManager.get_primary_interface() + print(ts.string_get_word_breaks("Godot Engine")) # Prints [0, 5, 6, 12] + print(ts.string_get_word_breaks("Godot Engine", "en", 5)) # Prints [0, 5, 6, 11, 11, 12] + [/codeblock] </description> </method> <method name="string_to_lower" qualifiers="const"> diff --git a/doc/classes/TextServerExtension.xml b/doc/classes/TextServerExtension.xml index 4c9817fcd4..e144b09eb6 100644 --- a/doc/classes/TextServerExtension.xml +++ b/doc/classes/TextServerExtension.xml @@ -945,6 +945,7 @@ <param index="2" name="size" type="Vector2" /> <param index="3" name="inline_align" type="int" enum="InlineAlignment" /> <param index="4" name="length" type="int" /> + <param index="5" name="baseline" type="float" /> <description> </description> </method> @@ -1242,6 +1243,7 @@ <param index="1" name="key" type="Variant" /> <param index="2" name="size" type="Vector2" /> <param index="3" name="inline_align" type="int" enum="InlineAlignment" /> + <param index="4" name="baseline" type="float" /> <description> </description> </method> @@ -1344,6 +1346,7 @@ <return type="PackedInt32Array" /> <param index="0" name="string" type="String" /> <param index="1" name="language" type="String" /> + <param index="2" name="chars_per_line" type="int" /> <description> </description> </method> diff --git a/doc/classes/TileMap.xml b/doc/classes/TileMap.xml index 01246f0c2e..8b537545bc 100644 --- a/doc/classes/TileMap.xml +++ b/doc/classes/TileMap.xml @@ -174,7 +174,7 @@ Creates a new [TileMapPattern] from the given layer and set of cells. </description> </method> - <method name="get_surrounding_tiles"> + <method name="get_surrounding_cells"> <return type="Vector2i[]" /> <param index="0" name="coords" type="Vector2i" /> <description> @@ -257,8 +257,9 @@ <description> Sets the tile indentifiers for the cell on layer [param layer] at coordinates [param coords]. Each tile of the [TileSet] is identified using three parts: - The source identifier [param source_id] identifies a [TileSetSource] identifier. See [method TileSet.set_source_id], - - The atlas coordinates identifier [param atlas_coords] identifies a tile coordinates in the atlas (if the source is a [TileSetAtlasSource]. For [TileSetScenesCollectionSource] it should be 0), + - The atlas coordinates identifier [param atlas_coords] identifies a tile coordinates in the atlas (if the source is a [TileSetAtlasSource]. For [TileSetScenesCollectionSource] it should always be [code]Vector2i(0, 0)[/code]), - The alternative tile identifier [param alternative_tile] identifies a tile alternative the source is a [TileSetAtlasSource], and the scene for a [TileSetScenesCollectionSource]. + If [param source_id] is set to [code]-1[/code], [param atlas_coords] to [code]Vector2i(-1, -1)[/code] or [param alternative_tile] to [code]-1[/code], the cell will be erased. An erased cell gets [b]all[/b] its identifiers automatically set to their respective invalid values, namely [code]-1[/code], [code]Vector2i(-1, -1)[/code] and [code]-1[/code]. </description> </method> <method name="set_cells_terrain_connect"> diff --git a/doc/classes/TileSet.xml b/doc/classes/TileSet.xml index 5a24483774..7fc6ba8161 100644 --- a/doc/classes/TileSet.xml +++ b/doc/classes/TileSet.xml @@ -616,6 +616,7 @@ </constant> <constant name="TILE_SHAPE_ISOMETRIC" value="1" enum="TileShape"> Diamond tile shape (for isometric look). + [b]Note:[/b] Isometric [TileSet] works best if [TileMap] and all its layers have Y-sort enabled. </constant> <constant name="TILE_SHAPE_HALF_OFFSET_SQUARE" value="2" enum="TileShape"> Rectangular tile shape with one row/column out of two offset by half a tile. diff --git a/doc/classes/Tree.xml b/doc/classes/Tree.xml index 6a016c3ebd..584a2a2a7b 100644 --- a/doc/classes/Tree.xml +++ b/doc/classes/Tree.xml @@ -70,7 +70,7 @@ <return type="int" /> <param index="0" name="position" type="Vector2" /> <description> - Returns the button id at [param position], or -1 if no button is there. + Returns the button ID at [param position], or -1 if no button is there. </description> </method> <method name="get_column_at_position" qualifiers="const"> @@ -522,6 +522,7 @@ </theme_item> <theme_item name="outline_size" data_type="constant" type="int" default="0"> The size of the text outline. + [b]Note:[/b] If using a font with [member FontFile.multichannel_signed_distance_field] enabled, its [member FontFile.msdf_pixel_range] must be set to at least [i]twice[/i] the value of [theme_item outline_size] for outline rendering to look correct. Otherwise, the outline may appear to be cut off earlier than intended. </theme_item> <theme_item name="parent_hl_line_margin" data_type="constant" type="int" default="0"> The space between the parent relationship lines for the selected [TreeItem] and the relationship lines to its siblings that are not selected. diff --git a/doc/classes/TreeItem.xml b/doc/classes/TreeItem.xml index a8ffef427f..ec6b166e57 100644 --- a/doc/classes/TreeItem.xml +++ b/doc/classes/TreeItem.xml @@ -78,7 +78,7 @@ <param index="0" name="column" type="int" /> <param index="1" name="id" type="int" /> <description> - Returns the button index if there is a button with id [param id] in column [param column], otherwise returns -1. + Returns the button index if there is a button with ID [param id] in column [param column], otherwise returns -1. </description> </method> <method name="get_button_count" qualifiers="const"> @@ -93,7 +93,7 @@ <param index="0" name="column" type="int" /> <param index="1" name="button_idx" type="int" /> <description> - Returns the id for the button at index [param button_idx] in column [param column]. + Returns the ID for the button at index [param button_idx] in column [param column]. </description> </method> <method name="get_button_tooltip_text" qualifiers="const"> diff --git a/doc/classes/TubeTrailMesh.xml b/doc/classes/TubeTrailMesh.xml index ddc544dc97..7457aa4050 100644 --- a/doc/classes/TubeTrailMesh.xml +++ b/doc/classes/TubeTrailMesh.xml @@ -7,6 +7,12 @@ <tutorials> </tutorials> <members> + <member name="cap_bottom" type="bool" setter="set_cap_bottom" getter="is_cap_bottom" default="true"> + If [code]true[/code], generates a cap at the bottom of the tube. This can be set to [code]false[/code] to speed up generation and rendering when the cap is never seen by the camera. + </member> + <member name="cap_top" type="bool" setter="set_cap_top" getter="is_cap_top" default="true"> + If [code]true[/code], generates a cap at the top of the tube. This can be set to [code]false[/code] to speed up generation and rendering when the cap is never seen by the camera. + </member> <member name="curve" type="Curve" setter="set_curve" getter="get_curve"> </member> <member name="radial_steps" type="int" setter="set_radial_steps" getter="get_radial_steps" default="8"> diff --git a/doc/classes/Vector2.xml b/doc/classes/Vector2.xml index 1cd73688ee..c47933ccb7 100644 --- a/doc/classes/Vector2.xml +++ b/doc/classes/Vector2.xml @@ -5,7 +5,7 @@ </brief_description> <description> 2-element structure that can be used to represent positions in 2D space or any other pair of numeric values. - It uses floating-point coordinates. By default, these floating-point values use 32-bit precision, unlike [float] which is always 64-bit. If double precision is needed, compile the engine with the option [code]float=64[/code]. + It uses floating-point coordinates. By default, these floating-point values use 32-bit precision, unlike [float] which is always 64-bit. If double precision is needed, compile the engine with the option [code]precision=double[/code]. See [Vector2i] for its integer counterpart. [b]Note:[/b] In a boolean context, a Vector2 will evaluate to [code]false[/code] if it's equal to [code]Vector2(0, 0)[/code]. Otherwise, a Vector2 will always evaluate to [code]true[/code]. </description> diff --git a/doc/classes/Vector3.xml b/doc/classes/Vector3.xml index 1d7eda6bb9..c961825ab3 100644 --- a/doc/classes/Vector3.xml +++ b/doc/classes/Vector3.xml @@ -5,7 +5,7 @@ </brief_description> <description> 3-element structure that can be used to represent positions in 3D space or any other triplet of numeric values. - It uses floating-point coordinates. By default, these floating-point values use 32-bit precision, unlike [float] which is always 64-bit. If double precision is needed, compile the engine with the option [code]float=64[/code]. + It uses floating-point coordinates. By default, these floating-point values use 32-bit precision, unlike [float] which is always 64-bit. If double precision is needed, compile the engine with the option [code]precision=double[/code]. See [Vector3i] for its integer counterpart. [b]Note:[/b] In a boolean context, a Vector3 will evaluate to [code]false[/code] if it's equal to [code]Vector3(0, 0, 0)[/code]. Otherwise, a Vector3 will always evaluate to [code]true[/code]. </description> diff --git a/doc/classes/Vector4.xml b/doc/classes/Vector4.xml index d15ae35b59..c811817bdc 100644 --- a/doc/classes/Vector4.xml +++ b/doc/classes/Vector4.xml @@ -5,7 +5,7 @@ </brief_description> <description> 4-element structure that can be used to represent any quadruplet of numeric values. - It uses floating-point coordinates. By default, these floating-point values use 32-bit precision, unlike [float] which is always 64-bit. If double precision is needed, compile the engine with the option [code]float=64[/code]. + It uses floating-point coordinates. By default, these floating-point values use 32-bit precision, unlike [float] which is always 64-bit. If double precision is needed, compile the engine with the option [code]precision=double[/code]. See [Vector4i] for its integer counterpart. [b]Note:[/b] In a boolean context, a Vector4 will evaluate to [code]false[/code] if it's equal to [code]Vector4(0, 0, 0, 0)[/code]. Otherwise, a Vector4 will always evaluate to [code]true[/code]. </description> diff --git a/doc/classes/Window.xml b/doc/classes/Window.xml index 8707ef003a..16ca486e4a 100644 --- a/doc/classes/Window.xml +++ b/doc/classes/Window.xml @@ -10,6 +10,66 @@ <tutorials> </tutorials> <methods> + <method name="add_theme_color_override"> + <return type="void" /> + <param index="0" name="name" type="StringName" /> + <param index="1" name="color" type="Color" /> + <description> + Creates a local override for a theme [Color] with the specified [param name]. Local overrides always take precedence when fetching theme items for the control. An override can be removed with [method remove_theme_color_override]. + See also [method get_theme_color] and [method Control.add_theme_color_override] for more details. + </description> + </method> + <method name="add_theme_constant_override"> + <return type="void" /> + <param index="0" name="name" type="StringName" /> + <param index="1" name="constant" type="int" /> + <description> + Creates a local override for a theme constant with the specified [param name]. Local overrides always take precedence when fetching theme items for the control. An override can be removed with [method remove_theme_constant_override]. + See also [method get_theme_constant]. + </description> + </method> + <method name="add_theme_font_override"> + <return type="void" /> + <param index="0" name="name" type="StringName" /> + <param index="1" name="font" type="Font" /> + <description> + Creates a local override for a theme [Font] with the specified [param name]. Local overrides always take precedence when fetching theme items for the control. An override can be removed with [method remove_theme_font_override]. + See also [method get_theme_font]. + </description> + </method> + <method name="add_theme_font_size_override"> + <return type="void" /> + <param index="0" name="name" type="StringName" /> + <param index="1" name="font_size" type="int" /> + <description> + Creates a local override for a theme font size with the specified [param name]. Local overrides always take precedence when fetching theme items for the control. An override can be removed with [method remove_theme_font_size_override]. + See also [method get_theme_font_size]. + </description> + </method> + <method name="add_theme_icon_override"> + <return type="void" /> + <param index="0" name="name" type="StringName" /> + <param index="1" name="texture" type="Texture2D" /> + <description> + Creates a local override for a theme icon with the specified [param name]. Local overrides always take precedence when fetching theme items for the control. An override can be removed with [method remove_theme_icon_override]. + See also [method get_theme_icon]. + </description> + </method> + <method name="add_theme_stylebox_override"> + <return type="void" /> + <param index="0" name="name" type="StringName" /> + <param index="1" name="stylebox" type="StyleBox" /> + <description> + Creates a local override for a theme [StyleBox] with the specified [param name]. Local overrides always take precedence when fetching theme items for the control. An override can be removed with [method remove_theme_stylebox_override]. + See also [method get_theme_stylebox] and [method Control.add_theme_stylebox_override] for more details. + </description> + </method> + <method name="begin_bulk_theme_override"> + <return type="void" /> + <description> + Prevents [code]*_theme_*_override[/code] methods from emitting [constant NOTIFICATION_THEME_CHANGED] until [method end_bulk_theme_override] is called. + </description> + </method> <method name="can_draw" qualifiers="const"> <return type="bool" /> <description> @@ -22,6 +82,12 @@ Requests an update of the [Window] size to fit underlying [Control] nodes. </description> </method> + <method name="end_bulk_theme_override"> + <return type="void" /> + <description> + Ends a bulk theme override update. See [method begin_bulk_theme_override]. + </description> + </method> <method name="get_contents_minimum_size" qualifiers="const"> <return type="Vector2" /> <description> @@ -41,7 +107,13 @@ Returns layout direction and text writing direction. </description> </method> - <method name="get_real_size" qualifiers="const"> + <method name="get_position_with_decorations" qualifiers="const"> + <return type="Vector2i" /> + <description> + Returns the window's position including its border. + </description> + </method> + <method name="get_size_with_decorations" qualifiers="const"> <return type="Vector2i" /> <description> Returns the window's size including its border. @@ -52,7 +124,7 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="theme_type" type="StringName" default="""" /> <description> - Returns the [Color] at [param name] if the theme has [param theme_type]. + Returns a [Color] from the first matching [Theme] in the tree if that [Theme] has a color item with the specified [param name] and [param theme_type]. See [method Control.get_theme_color] for more details. </description> </method> @@ -61,29 +133,29 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="theme_type" type="StringName" default="""" /> <description> - Returns the constant at [param name] if the theme has [param theme_type]. + Returns a constant from the first matching [Theme] in the tree if that [Theme] has a constant item with the specified [param name] and [param theme_type]. See [method Control.get_theme_color] for more details. </description> </method> <method name="get_theme_default_base_scale" qualifiers="const"> <return type="float" /> <description> - Returns the default base scale defined in the attached [Theme]. - See [member Theme.default_base_scale] for more details. + Returns the default base scale value from the first matching [Theme] in the tree if that [Theme] has a valid [member Theme.default_base_scale] value. + See [method Control.get_theme_color] for details. </description> </method> <method name="get_theme_default_font" qualifiers="const"> <return type="Font" /> <description> - Returns the default [Font] defined in the attached [Theme]. - See [member Theme.default_font] for more details. + Returns the default font from the first matching [Theme] in the tree if that [Theme] has a valid [member Theme.default_font] value. + See [method Control.get_theme_color] for details. </description> </method> <method name="get_theme_default_font_size" qualifiers="const"> <return type="int" /> <description> - Returns the default font size defined in the attached [Theme]. - See [member Theme.default_font_size] for more details. + Returns the default font size value from the first matching [Theme] in the tree if that [Theme] has a valid [member Theme.default_font_size] value. + See [method Control.get_theme_color] for details. </description> </method> <method name="get_theme_font" qualifiers="const"> @@ -91,8 +163,8 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="theme_type" type="StringName" default="""" /> <description> - Returns the [Font] at [param name] if the theme has [param theme_type]. - See [method Control.get_theme_color] for more details. + Returns a [Font] from the first matching [Theme] in the tree if that [Theme] has a font item with the specified [param name] and [param theme_type]. + See [method Control.get_theme_color] for details. </description> </method> <method name="get_theme_font_size" qualifiers="const"> @@ -100,8 +172,8 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="theme_type" type="StringName" default="""" /> <description> - Returns the font size at [param name] if the theme has [param theme_type]. - See [method Control.get_theme_color] for more details. + Returns a font size from the first matching [Theme] in the tree if that [Theme] has a font size item with the specified [param name] and [param theme_type]. + See [method Control.get_theme_color] for details. </description> </method> <method name="get_theme_icon" qualifiers="const"> @@ -109,8 +181,8 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="theme_type" type="StringName" default="""" /> <description> - Returns the icon at [param name] if the theme has [param theme_type]. - See [method Control.get_theme_color] for more details. + Returns an icon from the first matching [Theme] in the tree if that [Theme] has an icon item with the specified [param name] and [param theme_type]. + See [method Control.get_theme_color] for details. </description> </method> <method name="get_theme_stylebox" qualifiers="const"> @@ -118,8 +190,8 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="theme_type" type="StringName" default="""" /> <description> - Returns the [StyleBox] at [param name] if the theme has [param theme_type]. - See [method Control.get_theme_color] for more details. + Returns a [StyleBox] from the first matching [Theme] in the tree if that [Theme] has a stylebox item with the specified [param name] and [param theme_type]. + See [method Control.get_theme_color] for details. </description> </method> <method name="grab_focus"> @@ -139,7 +211,16 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="theme_type" type="StringName" default="""" /> <description> - Returns [code]true[/code] if [Color] with [param name] is in [param theme_type]. + Returns [code]true[/code] if there is a matching [Theme] in the tree that has a color item with the specified [param name] and [param theme_type]. + See [method Control.get_theme_color] for details. + </description> + </method> + <method name="has_theme_color_override" qualifiers="const"> + <return type="bool" /> + <param index="0" name="name" type="StringName" /> + <description> + Returns [code]true[/code] if there is a local override for a theme [Color] with the specified [param name] in this [Control] node. + See [method add_theme_color_override]. </description> </method> <method name="has_theme_constant" qualifiers="const"> @@ -147,7 +228,16 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="theme_type" type="StringName" default="""" /> <description> - Returns [code]true[/code] if constant with [param name] is in [param theme_type]. + Returns [code]true[/code] if there is a matching [Theme] in the tree that has a constant item with the specified [param name] and [param theme_type]. + See [method Control.get_theme_color] for details. + </description> + </method> + <method name="has_theme_constant_override" qualifiers="const"> + <return type="bool" /> + <param index="0" name="name" type="StringName" /> + <description> + Returns [code]true[/code] if there is a local override for a theme constant with the specified [param name] in this [Control] node. + See [method add_theme_constant_override]. </description> </method> <method name="has_theme_font" qualifiers="const"> @@ -155,7 +245,16 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="theme_type" type="StringName" default="""" /> <description> - Returns [code]true[/code] if [Font] with [param name] is in [param theme_type]. + Returns [code]true[/code] if there is a matching [Theme] in the tree that has a font item with the specified [param name] and [param theme_type]. + See [method Control.get_theme_color] for details. + </description> + </method> + <method name="has_theme_font_override" qualifiers="const"> + <return type="bool" /> + <param index="0" name="name" type="StringName" /> + <description> + Returns [code]true[/code] if there is a local override for a theme [Font] with the specified [param name] in this [Control] node. + See [method add_theme_font_override]. </description> </method> <method name="has_theme_font_size" qualifiers="const"> @@ -163,7 +262,16 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="theme_type" type="StringName" default="""" /> <description> - Returns [code]true[/code] if font size with [param name] is in [param theme_type]. + Returns [code]true[/code] if there is a matching [Theme] in the tree that has a font size item with the specified [param name] and [param theme_type]. + See [method Control.get_theme_color] for details. + </description> + </method> + <method name="has_theme_font_size_override" qualifiers="const"> + <return type="bool" /> + <param index="0" name="name" type="StringName" /> + <description> + Returns [code]true[/code] if there is a local override for a theme font size with the specified [param name] in this [Control] node. + See [method add_theme_font_size_override]. </description> </method> <method name="has_theme_icon" qualifiers="const"> @@ -171,7 +279,16 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="theme_type" type="StringName" default="""" /> <description> - Returns [code]true[/code] if icon with [param name] is in [param theme_type]. + Returns [code]true[/code] if there is a matching [Theme] in the tree that has an icon item with the specified [param name] and [param theme_type]. + See [method Control.get_theme_color] for details. + </description> + </method> + <method name="has_theme_icon_override" qualifiers="const"> + <return type="bool" /> + <param index="0" name="name" type="StringName" /> + <description> + Returns [code]true[/code] if there is a local override for a theme icon with the specified [param name] in this [Control] node. + See [method add_theme_icon_override]. </description> </method> <method name="has_theme_stylebox" qualifiers="const"> @@ -179,7 +296,16 @@ <param index="0" name="name" type="StringName" /> <param index="1" name="theme_type" type="StringName" default="""" /> <description> - Returns [code]true[/code] if [StyleBox] with [param name] is in [param theme_type]. + Returns [code]true[/code] if there is a matching [Theme] in the tree that has a stylebox item with the specified [param name] and [param theme_type]. + See [method Control.get_theme_color] for details. + </description> + </method> + <method name="has_theme_stylebox_override" qualifiers="const"> + <return type="bool" /> + <param index="0" name="name" type="StringName" /> + <description> + Returns [code]true[/code] if there is a local override for a theme [StyleBox] with the specified [param name] in this [Control] node. + See [method add_theme_stylebox_override]. </description> </method> <method name="hide"> @@ -258,6 +384,48 @@ If the [Window] is embedded, has the same effect as [method popup]. </description> </method> + <method name="remove_theme_color_override"> + <return type="void" /> + <param index="0" name="name" type="StringName" /> + <description> + Removes a local override for a theme [Color] with the specified [param name] previously added by [method add_theme_color_override] or via the Inspector dock. + </description> + </method> + <method name="remove_theme_constant_override"> + <return type="void" /> + <param index="0" name="name" type="StringName" /> + <description> + Removes a local override for a theme constant with the specified [param name] previously added by [method add_theme_constant_override] or via the Inspector dock. + </description> + </method> + <method name="remove_theme_font_override"> + <return type="void" /> + <param index="0" name="name" type="StringName" /> + <description> + Removes a local override for a theme [Font] with the specified [param name] previously added by [method add_theme_font_override] or via the Inspector dock. + </description> + </method> + <method name="remove_theme_font_size_override"> + <return type="void" /> + <param index="0" name="name" type="StringName" /> + <description> + Removes a local override for a theme font size with the specified [param name] previously added by [method add_theme_font_size_override] or via the Inspector dock. + </description> + </method> + <method name="remove_theme_icon_override"> + <return type="void" /> + <param index="0" name="name" type="StringName" /> + <description> + Removes a local override for a theme icon with the specified [param name] previously added by [method add_theme_icon_override] or via the Inspector dock. + </description> + </method> + <method name="remove_theme_stylebox_override"> + <return type="void" /> + <param index="0" name="name" type="StringName" /> + <description> + Removes a local override for a theme [StyleBox] with the specified [param name] previously added by [method add_theme_stylebox_override] or via the Inspector dock. + </description> + </method> <method name="request_attention"> <return type="void" /> <description> @@ -367,8 +535,8 @@ The window's size in pixels. </member> <member name="theme" type="Theme" setter="set_theme" getter="get_theme"> - The [Theme] resource that determines the style of the underlying [Control] nodes. - [Window] styles will have no effect unless the window is embedded. + The [Theme] resource this node and all its [Control] and [Window] children use. If a child node has its own [Theme] resource set, theme items are merged with child's definitions having higher priority. + [b]Note:[/b] [Window] styles will have no effect unless the window is embedded. </member> <member name="theme_type_variation" type="StringName" setter="set_theme_type_variation" getter="get_theme_type_variation" default="&"""> The name of a theme type variation used by this [Window] to look up its own theme items. See [member Control.theme_type_variation] for more details. diff --git a/doc/classes/XRInterfaceExtension.xml b/doc/classes/XRInterfaceExtension.xml index 0fe54e947f..5ad67a7ea9 100644 --- a/doc/classes/XRInterfaceExtension.xml +++ b/doc/classes/XRInterfaceExtension.xml @@ -24,7 +24,7 @@ <method name="_get_camera_feed_id" qualifiers="virtual const"> <return type="int" /> <description> - Returns the camera feed id for the [CameraFeed] registered with the [CameraServer] that should be presented as the background on an AR capable device (if applicable). + Returns the camera feed ID for the [CameraFeed] registered with the [CameraServer] that should be presented as the background on an AR capable device (if applicable). </description> </method> <method name="_get_camera_transform" qualifiers="virtual"> diff --git a/doc/classes/float.xml b/doc/classes/float.xml index a196021249..755ce1200d 100644 --- a/doc/classes/float.xml +++ b/doc/classes/float.xml @@ -5,7 +5,7 @@ </brief_description> <description> The [float] built-in type is a 64-bit double-precision floating-point number, equivalent to [code]double[/code] in C++. This type has 14 reliable decimal digits of precision. The [float] type can be stored in [Variant], which is the generic type used by the engine. The maximum value of [float] is approximately [code]1.79769e308[/code], and the minimum is approximately [code]-1.79769e308[/code]. - Many methods and properties in the engine use 32-bit single-precision floating-point numbers instead, equivalent to [code]float[/code] in C++, which have 6 reliable decimal digits of precision. For data structures such as [Vector2] and [Vector3], Godot uses 32-bit floating-point numbers by default, but it can be changed to use 64-bit doubles if Godot is compiled with the [code]float=64[/code] option. + Many methods and properties in the engine use 32-bit single-precision floating-point numbers instead, equivalent to [code]float[/code] in C++, which have 6 reliable decimal digits of precision. For data structures such as [Vector2] and [Vector3], Godot uses 32-bit floating-point numbers by default, but it can be changed to use 64-bit doubles if Godot is compiled with the [code]precision=double[/code] option. Math done using the [float] type is not guaranteed to be exact or deterministic, and will often result in small errors. You should usually use the [method @GlobalScope.is_equal_approx] and [method @GlobalScope.is_zero_approx] methods instead of [code]==[/code] to compare [float] values for equality. </description> <tutorials> diff --git a/doc/translations/ar.po b/doc/translations/ar.po index ae292d4035..751017b573 100644 --- a/doc/translations/ar.po +++ b/doc/translations/ar.po @@ -20,13 +20,14 @@ # ywmaa <ywmaa.personal@gmail.com>, 2022. # TabbyDev <Mandomody25@gmail.com>, 2022. # عبد الرØÙ…Ù† أبو سعدة ||Abd Alrahman abo saada <abdalrahmanabs2005@gmail.com>, 2022. +# NEDAL NNEE <ASEL1234543210@gmail.com>, 2022. +# Abdallah <azzouni2007abd@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-23 03:56+0000\n" -"Last-Translator: عبد الرØÙ…Ù† أبو سعدة ||Abd Alrahman abo saada " -"<abdalrahmanabs2005@gmail.com>\n" +"PO-Revision-Date: 2022-11-03 11:48+0000\n" +"Last-Translator: Abdallah <azzouni2007abd@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/ar/>\n" "Language: ar\n" @@ -35,7 +36,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.2-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -110,10 +111,9 @@ msgid "Getter" msgstr "جالب" #: doc/tools/make_rst.py -#, fuzzy msgid "" "This method should typically be overridden by the user to have any effect." -msgstr "يجب تجاوز هذه الطريقة من المستخدم ليكون لها أي تأثير." +msgstr "عادة يجب تجاوز هذه الدالة من قبل المستخدم ليكون لها أي تأثير." #: doc/tools/make_rst.py msgid "" @@ -198,7 +198,6 @@ msgstr "" "أسماء الألوان المدعومة هي Ù†ÙØ³ الثوابت Ø§Ù„Ù…Ø¹Ø±Ù‘ÙØ© ÙÙŠ [Color]." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the absolute value of parameter [code]s[/code] (i.e. positive " "value).\n" @@ -209,7 +208,7 @@ msgstr "" "لعرض القيمة المطلقة Ù„Ù„Ù…ÙØ¹Ø§Ù…Ù„ [code]s[/code] (القيمة المطلقة أي القيمة " "الموجبة).\n" "[codeblock]\n" -"(a = abs(-1 #القيمة المطلقة لـ(1-) هي 1ØŒ وبالتالي ÙØ¥Ù† قيمة a ستكون 1\n" +"(a = abs(-1 #القيمة المطلقة لـ(1-) هي 1ØŒ وبالتالي ÙØ¥Ù† قيمة a ستكون 1\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -628,7 +627,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -643,7 +643,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1022,12 +1026,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3645,6 +3653,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4329,8 +4357,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7249,7 +7276,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7434,6 +7464,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7453,9 +7486,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10094,10 +10131,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10629,14 +10665,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10646,22 +10682,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19456,6 +19492,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22290,7 +22334,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -33021,7 +33068,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36349,7 +36398,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36599,7 +36651,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37316,6 +37371,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -40126,7 +40184,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40642,11 +40702,11 @@ msgstr "ÙŠÙØ±Ø¬Ø¹ قيمة الجيب العكسية للمَعلم." #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40680,11 +40740,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40706,11 +40766,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -41688,31 +41748,31 @@ msgstr "" #: doc/classes/OS.xml msgid "Sunday." -msgstr "" +msgstr "Ø§Ù„Ø£ØØ¯." #: doc/classes/OS.xml msgid "Monday." -msgstr "" +msgstr "الإثنين." #: doc/classes/OS.xml msgid "Tuesday." -msgstr "" +msgstr "الثلاثاء." #: doc/classes/OS.xml msgid "Wednesday." -msgstr "" +msgstr "الإربعاء." #: doc/classes/OS.xml msgid "Thursday." -msgstr "" +msgstr "الخميس." #: doc/classes/OS.xml msgid "Friday." -msgstr "" +msgstr "الجمعة." #: doc/classes/OS.xml msgid "Saturday." -msgstr "" +msgstr "السبت." #: doc/classes/OS.xml msgid "January." @@ -42573,6 +42633,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -50174,15 +50244,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51779,17 +51856,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51798,8 +51886,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54515,7 +54609,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56352,7 +56450,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57730,7 +57830,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57746,7 +57849,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -67018,10 +67123,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -67032,8 +67142,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -67185,7 +67295,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67717,6 +67829,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" @@ -75277,6 +75405,118 @@ msgid "" "a wider or narrower set of devices and input methods, or to allow more " "advanced interactions with more advanced devices." msgstr "" +"WebXR هو معيار Ù…ÙØªÙˆØ ÙŠØ³Ù…Ø Ø¨Ø¥Ù†Ø´Ø§Ø¡ تطبيقات VR Ùˆ AR تعمل ÙÙŠ Ù…ØªØµÙØ الويب.\n" +"على هذا النØÙˆ ØŒ لا ØªØªÙˆÙØ± هذه الواجهة إلا عند التشغيل ÙÙŠ تصدير HTML5.\n" +"يدعم WebXR مجموعة واسعة من الأجهزة ØŒ من الأجهزة ذات القدرات العالية (مثل " +"Valve Index Ùˆ HTC Vive Ùˆ Oculus Rift Ùˆ Quest) وصولاً إلى الأجهزة الأقل قدرة " +"(مثل Google Cardboard أو Oculus Go أو GearVR أو الهوات٠الذكية العادية).\n" +"نظرًا لأن WebXR يعتمد على Javascript ØŒ ÙØ¥Ù†Ù‡ يستخدم بشكل مكث٠عمليات " +"الاسترجاعات ØŒ مما يعني أن [WebXRInterface] مضطر لاستخدام الإشارات ØŒ ØÙŠØ« " +"تستخدم واجهات AR / VR الأخرى وظائ٠تعيد النتيجة على الÙور. هذا يجعل " +"[WebXRInterface] أكثر تعقيدًا ÙÙŠ التهيئة من واجهات AR / VR الأخرى.\n" +"إليك Ø§Ù„ØØ¯ الأدنى من Ø§Ù„Ø´ÙØ±Ø© المطلوبة لبدء جلسة VR غامرة:\n" +"[كودبلوك]\n" +"يمتد المكاني\n" +"\n" +"var webxr_interface\n" +"var vr_supported = خطأ\n" +"\n" +"func _ready ():\n" +" # Ù†ÙØªØ±Ø¶ أن هذه العقدة بها زر عندما كان Ø·Ùلاً.\n" +" # هذا الزر للمستخدم للمواÙقة على الدخول ÙÙŠ وضع VR الغامر.\n" +" $ Button.connect (\"pressed\"ØŒ selfØŒ \"_on_Button_pressed\")\n" +"\n" +" webxr_interface = ARVRServer.find_interface (\"WebXR\")\n" +" إذا كان webxr_interface:\n" +" # تعيين Ù…Ø¹Ø±Ù‘ÙØ§Øª الزر / المØÙˆØ± القياسي عندما يكون ذلك ممكنًا.\n" +" webxr_interface.xr_standard_mapping = صØÙŠØ\n" +"\n" +" # يستخدم WebXR الكثير من عمليات الاسترجاعات غير المتزامنة ØŒ لذلك " +"نتصل بمختلÙ\n" +" # إشارات لتلقيها.\n" +" webxr_interface.connect (\"session_supported\"ØŒ selfØŒ " +"\"_webxr_session_supported\")\n" +" webxr_interface.connect (\"Session_started\" ØŒ self ØŒ " +"\"_webxr_session_started\")\n" +" webxr_interface.connect (\"session_ended\"ØŒ selfØŒ " +"\"_webxr_session_ended\")\n" +" webxr_interface.connect (\"session_failed\"ØŒ selfØŒ " +"\"_webxr_session_failed\")\n" +"\n" +" # يعود هذا على الÙور - طريقة _webxr_session_supported ()\n" +" # (التي ربطناها بإشارة \"session_supported\" أعلاه) سوÙ\n" +" # يتم الاتصال بنا ÙÙŠ وقت لاØÙ‚ لإعلامنا إذا كان مدعومًا أم لا.\n" +" webxr_interface.is_session_supported (\"الواقع Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ Ø§Ù„ØºØ§Ù…Ø±\")\n" +"\n" +"func _webxr_session_supported (وضع الجلسة ØŒ مدعوم):\n" +" إذا كانت Session_mode == 'immersive-vr':\n" +" vr_supported = مدعوم\n" +"\n" +"func _on_Button_pressed ():\n" +" إذا لم يكن vr_supported:\n" +" OS.alert (\"Ù…ØªØµÙØÙƒ لا يدعم VR\")\n" +" إرجاع\n" +"\n" +" # نريد جلسة VR غامرة ØŒ على عكس AR ('غامرة-ar') أو a\n" +" # عارض 3DoF بسيط (\"عارض\").\n" +" webxr_interface.session_mode = \"الواقع Ø§Ù„Ø§ÙØªØ±Ø§Ø¶ÙŠ Ø§Ù„ØºØ§Ù…Ø±\"\n" +" # \"الأرضية Ø§Ù„Ù…ØØ¯Ø¯Ø©\" عبارة عن مقياس Ù„Ù„ØºØ±ÙØ© ØŒ أما \"الأرضية المØÙ„ية\" " +"Ùهي عبارة عن مكان أو جلوس\n" +" # تجربة (تضعك على Ø§Ø±ØªÙØ§Ø¹ 1.6 متر Ùوق Ø³Ø·Ø Ø§Ù„Ø£Ø±Ø¶ إذا كان لديك سماعة رأس " +"3DoF) ØŒ\n" +" # ÙÙŠ ØÙŠÙ† أن \"Ù…ØÙ„ÙŠ\" يضعك ÙÙŠ موقع ARVROrigin.\n" +" # تعني هذه القائمة أنها Ø³ØªØØ§ÙˆÙ„ أولاً طلب \"أرضية Ù…ØØ¯ÙˆØ¯Ø©\" ØŒ بعد ذلك\n" +" # الرجوع إلى \"local-floor\" ÙˆÙÙŠ النهاية \"المØÙ„ÙŠ\" ØŒ إذا لم يكن هناك " +"شيء آخر\n" +" # أيد.\n" +" webxr_interface.requested_reference_space_types = 'bounded-floorØŒ local-" +"floorØŒ local'\n" +" # من أجل استخدام \"أرضية Ù…ØÙ„ية\" أو \"أرضية Ù…ØØ¯ÙˆØ¯Ø©\" يجب علينا أيضًا\n" +" # ضع علامة على الميزات كما هو مطلوب أو اختياري.\n" +" webxr_interface.required_features = \"local-floor\"\n" +" webxr_interface.optional_features = \"bounded-floor\"\n" +"\n" +" # سيعود هذا خطأ إذا لم نتمكن ØØªÙ‰ من طلب الجلسة ØŒ\n" +" # ومع ذلك ØŒ لا يزال من الممكن أن ØªÙØ´Ù„ بشكل غير متزامن ÙÙŠ وقت لاØÙ‚ من " +"العملية ØŒ لذلك Ù†ØÙ†\n" +" # تعر٠Ùقط ما إذا كان قد Ù†Ø¬Ø ØÙ‚ًا أو ÙØ´Ù„ عندما\n" +" # _webxr_session_started () أو _webxr_session_failed () تسمى.\n" +" إذا لم يكن webxr_interface.initialize ():\n" +" OS.alert (\"ÙØ´Ù„ التهيئة\")\n" +" إرجاع\n" +"\n" +"func _webxr_session_started ():\n" +" $ Button.visible = false\n" +" # هذا يخبر Godot أن يبدأ التقديم إلى سماعة الرأس.\n" +" get_viewport (). arvr = صØÙŠØ\n" +" # سيكون هذا هو نوع Ø§Ù„Ù…Ø³Ø§ØØ© المرجعية التي ØØµÙ„ت عليها ÙÙŠ النهاية ØŒ من\n" +" # أنواع طلبتها أعلاه. هذا Ù…Ùيد إذا كنت تريد اللعبة\n" +" # العمل بشكل مختل٠قليلاً ÙÙŠ \"الأرضية Ø§Ù„Ù…ØØ¯ÙˆØ¯Ø©\" مقابل \"الأرضية " +"المØÙ„ية\".\n" +" طباعة (\"نوع Ø§Ù„Ù…Ø³Ø§ØØ© المرجعية:\" + webxr_interface." +"reference_space_type)\n" +"\n" +"func _webxr_session_ended ():\n" +" $ Button.visible = صØÙŠØ\n" +" # إذا خرج المستخدم من الوضع المجسم ØŒ ÙØ¥Ù†Ù†Ø§ نطلب من Godot عرضه على الويب\n" +" # ØµÙØØ© مرة أخرى.\n" +" get_viewport (). arvr = خطأ\n" +"\n" +"func _webxr_session_failed (رسالة):\n" +" OS.alert (\"ÙØ´Ù„ التهيئة:\" + رسالة)\n" +"[/ codeblock]\n" +"هناك عدة طرق للتعامل مع إدخال \"ÙˆØØ¯Ø© التØÙƒÙ…\":\n" +"- استخدام عقد [ARVRController] وإشارات [إشارة ARVRController.button_pressed] " +"Ùˆ [إشارة ARVRController.button_release]. هذه هي الطريقة التي يتم بها التعامل " +"مع ÙˆØØ¯Ø§Øª التØÙƒÙ… عادةً ÙÙŠ تطبيقات AR / VR ÙÙŠ Godot ØŒ ومع ذلك ØŒ لن يعمل هذا إلا " +"مع ÙˆØØ¯Ø§Øª تØÙƒÙ… VR المتقدمة مثل Oculus Touch أو أجهزة التØÙƒÙ… ÙÙŠ الÙهرس ØŒ على " +"سبيل المثال. يتم ØªØØ¯ÙŠØ¯ رموز الأزرار بواسطة [url = https: //immersive-web." +"github.io/webxr-gamepads-module/#xr-standard-gamepad-mapping] القسم 3.3 من " +"ÙˆØØ¯Ø© WebXR Gamepads Module [/ url].\n" +"- استخدام [method Node._unhandled_input] Ùˆ [InputEventJoypadButton] أو " +"[InputEventJoypadMotion]. يعمل هذا Ø¨Ù†ÙØ³ طريقة عمل Ù„ÙˆØØ§Øª التØÙƒÙ… العادية ØŒ " +"باستثناء أن [العضو InputEvent.device] يبدأ عند 100 ØŒ لذا ÙØ¥Ù† ÙˆØØ¯Ø© التØÙƒÙ… " +"اليسرى هي 100 ÙˆÙ…ÙØªØ§Ø التØÙƒÙ… الأيمن." #: modules/webxr/doc_classes/WebXRInterface.xml msgid "How to make a VR game for WebXR with Godot" diff --git a/doc/translations/ca.po b/doc/translations/ca.po index ff63e7f808..1552c15271 100644 --- a/doc/translations/ca.po +++ b/doc/translations/ca.po @@ -588,7 +588,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -603,7 +604,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -976,12 +981,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3592,6 +3601,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4276,8 +4305,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7194,7 +7222,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7379,6 +7410,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7398,9 +7432,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10038,10 +10076,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10573,14 +10610,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10590,22 +10627,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19385,6 +19422,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22217,7 +22262,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32932,7 +32980,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36230,7 +36280,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36478,7 +36531,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37188,6 +37244,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39994,7 +40053,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40505,11 +40566,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40543,11 +40604,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40569,11 +40630,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42420,6 +42481,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -50012,15 +50083,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51616,17 +51694,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51635,8 +51724,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54351,7 +54446,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56188,7 +56287,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57566,7 +57667,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57582,7 +57686,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66819,10 +66925,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66833,8 +66944,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66986,7 +67097,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67518,6 +67631,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/classes.pot b/doc/translations/classes.pot index 6ee35f0a74..40ab5e3413 100644 --- a/doc/translations/classes.pot +++ b/doc/translations/classes.pot @@ -468,7 +468,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -483,7 +484,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -856,12 +861,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3472,6 +3481,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4156,8 +4185,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7074,7 +7102,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7259,6 +7290,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7278,9 +7312,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9918,10 +9956,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10453,14 +10490,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10470,22 +10507,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19265,6 +19302,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22097,7 +22142,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32809,7 +32857,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36107,7 +36157,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36355,7 +36408,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37065,6 +37121,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39871,7 +39930,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40382,11 +40443,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40420,11 +40481,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40446,11 +40507,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42297,6 +42358,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49889,15 +49960,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51493,17 +51571,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51512,8 +51601,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54228,7 +54323,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56065,7 +56164,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57443,7 +57544,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57459,7 +57563,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66696,10 +66802,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66710,8 +66821,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66863,7 +66974,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67395,6 +67508,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/cs.po b/doc/translations/cs.po index 92e3272798..1bd920e19b 100644 --- a/doc/translations/cs.po +++ b/doc/translations/cs.po @@ -15,12 +15,13 @@ # Tomas Dostal <tomas.dostal.cz@gmail.com>, 2021. # JoeMoos <josephmoose13@gmail.com>, 2022. # Mirinek <mirek.nozicka77@gmail.com>, 2022. +# Dominik Strnad <domi.str@seznam.cz>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-08-28 00:17+0000\n" -"Last-Translator: Mirinek <mirek.nozicka77@gmail.com>\n" +"PO-Revision-Date: 2022-11-13 03:28+0000\n" +"Last-Translator: Dominik Strnad <domi.str@seznam.cz>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot-" "class-reference/cs/>\n" "Language: cs\n" @@ -28,7 +29,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -682,8 +683,10 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -698,7 +701,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" "Vrátà pole slovnÃků, které reprezentujà aktuálnà zásobnÃk volánÃ.\n" "[codeblock]\n" @@ -1248,12 +1255,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3974,6 +3985,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4303,7 +4334,7 @@ msgstr "Vektorová matematika" #: doc/classes/AABB.xml doc/classes/Rect2.xml doc/classes/Vector2.xml #: doc/classes/Vector3.xml msgid "Advanced vector math" -msgstr "" +msgstr "PokroÄilá vektorová matematika" #: doc/classes/AABB.xml msgid "Constructs an [AABB] from a position and size." @@ -4658,8 +4689,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7580,7 +7610,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7765,6 +7798,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7784,9 +7820,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10431,12 +10471,14 @@ msgid "Clears the audio sample data buffer." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml +#, fuzzy msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" +"Vracà [code]true[/code] pokud si jsou [code]a[/code] a [code]b[/code] " +"pÅ™iblÞnÄ› rovny." #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" @@ -10967,14 +11009,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10984,22 +11026,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19828,6 +19870,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22664,7 +22714,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -33412,7 +33465,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36744,7 +36799,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36996,7 +37054,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37716,6 +37777,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -40529,7 +40593,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -41046,11 +41112,11 @@ msgstr "Vrátà tangens parametru." #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -41084,11 +41150,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -41110,11 +41176,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42984,6 +43050,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -50590,15 +50666,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -52199,17 +52282,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -52218,8 +52312,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54939,7 +55039,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56777,7 +56881,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -58155,7 +58261,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -58171,7 +58280,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -67523,10 +67634,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -67537,8 +67653,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -67692,7 +67808,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -68224,6 +68342,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/de.po b/doc/translations/de.po index 0da2ce9bc1..1533aa651d 100644 --- a/doc/translations/de.po +++ b/doc/translations/de.po @@ -53,12 +53,14 @@ # Felix Bitsch <felix.a.bitsch@gmail.com>, 2022. # Coxcopi <master.vogel2015@gmail.com>, 2022. # Harusakii <spieleok@gmail.com>, 2022. +# GadMas <c.vavra@web.de>, 2022. +# JodliDev <jodlidev@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-09-12 01:18+0000\n" -"Last-Translator: Harusakii <spieleok@gmail.com>\n" +"PO-Revision-Date: 2022-11-10 23:27+0000\n" +"Last-Translator: JodliDev <jodlidev@gmail.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/de/>\n" "Language: de\n" @@ -66,7 +68,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -596,7 +598,6 @@ msgstr "" "zurück in eine Instanz. Nützlich für die Deserialisierung." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns an \"eased\" value of [code]x[/code] based on an easing function " "defined with [code]curve[/code]. This easing function is based on an " @@ -616,23 +617,24 @@ msgid "" "See also [method smoothstep]. If you need to perform more advanced " "transitions, use [Tween] or [AnimationPlayer]." msgstr "" -"Gibt einen interpolierten Wert von [code]x[/code] basiert auf einer Funktion " -"die durch [code]curve[/code] definiert wird. Die Funktion basiert auf einem " -"Exponent. Die [code]curve[/code] kann jegliche Gleitkommazahl sein, von " -"welchen diese spezifische Werte zu folgendem Verhalten führen:\n" +"Gibt einen interpolierten Wert von [code]x[/code] basierend auf einer " +"Übergangsfunktion die durch [code]curve[/code] definiert wird. Diese " +"Übergangsfunktion basiert auf einem Exponenten. Die [code]curve[/code] kann " +"eine beliebige Fließkommazahl sein, wobei bestimmte Werte zu folgendem " +"Verhalten führen:\n" "[codeblock]\n" -"- Weniger als -1.0 (exclusiv): Beschleunige in-out\n" +"- Weniger als -1.0 (exklusiv): Ease in-out\n" "- 1.0: Linear\n" -"- Zwischen -1.0 und 0.0 (exclusiv): Beschleunige out-in\n" +"- Zwischen -1.0 und 0.0 (exklusiv): Ease out-in\n" "- 0.0: Konstant\n" -"- Zwischen 0.0 und 1.0 (exclusiv): Beschleunige in\n" +"- Zwischen 0.0 und 1.0 (exklusiv): Ease in\n" "- 1.0: Linear\n" -"- Mehr als 1.0 (exclusive): Beschleunige out\n" +"- Mehr als 1.0 (exklusive): Beschleunige out\n" "[/codeblock]\n" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" "ease_cheatsheet.png]ease() curve values cheatsheet[/url]\n" -"Siehe auch [method smoothstep]. Falls du fortgeschrittene Übergänge " -"erstellen möchtest, benutze [Tween] oder [AnimationPlayer]." +"Siehe auch [method smoothstep]. Wenn du noch komplexere Übergänge erstellen " +"möchtest, benutze [Tween] oder [AnimationPlayer]." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -762,8 +764,10 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -778,7 +782,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" "Gibt ein Array von Wörterbüchern zurück, das den aktuellen Aufrufstapel " "darstellt.\n" @@ -864,7 +872,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -887,24 +894,25 @@ msgid "" "See also [method lerp] which performs the reverse of this operation, and " "[method range_lerp] to map a continuous series of values to another." msgstr "" -"Gibt zurück einen Inter- bzw. Extrapolationsfaktor unter Berücksichtigung " -"des Zahlenraums von [code]from[/code] bis [code]to[/code], und dem " -"interpolierten Wert in [code]weight[/code]. Der Rückgabewert liegt zwischen " -"[code]0.0[/code] und [code]1.0[/code] wenn [code]weight[/code] zwischen " -"[code]from[/code] und [code]to[/code] (einschließlich). Liegt [code]weight[/" -"code] außerhalb dieses Bereichs, wird ein Extrapolationsfaktor zurückgegeben " -"(Rückgabewert kleiner als [code]0.0[/code] oder größer als [code]1.0[/" -"code]).\n" +"Gibt einen Inter- bzw. Extrapolationsfaktor unter Berücksichtigung des " +"Zahlenraums von [code]from[/code] bis [code]to[/code], und dem " +"interpolierten Wert in [code]weight[/code] zurück. Der Rückgabewert liegt " +"zwischen [code]0.0[/code] und [code]1.0[/code] wenn [code]weight[/code] " +"zwischen [code]from[/code] und [code]to[/code] (einschließlich). Liegt " +"[code]weight[/code] außerhalb dieses Bereichs, wird ein Extrapolationsfaktor " +"zurückgegeben (Rückgabewert kleiner als [code]0.0[/code] oder größer als " +"[code]1.0[/code]).\n" "[codeblock]\n" -"# Die Interpolationsratio im `lerp()`-Aufruf unten beträgt 0.75.\n" +"# Der Interpolationsfaktor im `lerp()`-Aufruf unten beträgt 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" "# `middle` beträgt nun 27.5.\n" -"# Angenommen, die ursprüngliche Ratio ist nun nicht mehr bekannt und soll " -"zurückerrechnet werden.\n" +"# Angenommen, der ursprüngliche Faktor ist nun nicht mehr bekannt und soll " +"zurück errechnet werden.\n" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` beträgt nun 0.75.\n" "[/codeblock]\n" -"Siehe auch [method lerp] für die Umkehrung dieser Funktion." +"Siehe auch [method lerp] für die Umkehrung dieser Funktion und [method " +"range_lerp] um Zahlenbereiche aufeinander abzubilden." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -976,7 +984,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " @@ -999,12 +1006,13 @@ msgid "" "continuous series of values to another." msgstr "" "Interpoliert linear zwischen zwei Werten mit dem in [code]weight[/code] " -"definierten Faktor. Um eine Interpolation durchzuführen, sollte " -"[code]Gewicht[/code] zwischen [code]0.0[/code] und [code]1.0[/code] " -"(einschließlich) liegen. Werte außerhalb dieses Bereichs sind jedoch " -"zulässig und können verwendet werden, um [i]Extrapolation[/i] " -"durchzuführen.\n" -"Wenn die Argumente [code]von[/code] und [code]bis[/code] vom Typ [int] oder " +"definierten Faktor. Um eine Interpolation durchzuführen, sollte [code]weigh[/" +"code] zwischen [code]0.0[/code] und [code]1.0[/code] (einschließlich) " +"liegen. Werte außerhalb dieses Bereichs sind jedoch zulässig und können " +"verwendet werden, um [i]Extrapolation[/i] durchzuführen. Falls dies nicht " +"gewünscht ist, kann [method clamp] auf dem Ergebnis von [method lerp] " +"angewendet werden.\n" +"Wenn die Argumente [code]from[/code] und [code]to[/code] vom Typ [int] oder " "[float] sind, ist der Rückgabewert ein [float].\n" "Wenn beide vom gleichen Vektortyp sind ([Vector2], [Vector3] oder [Color]), " "ist der Rückgabewert vom gleichen Typ ([code]lerp[/code] ruft dann die " @@ -1013,9 +1021,10 @@ msgstr "" "lerp(0, 4, 0.75) # Gibt 3.0 zurück\n" "lerp(Vector2(1, 5), Vector2(3, 2), 0.5) # Liefert Vector2(2, 3.5)\n" "[/codeblock]\n" -"Siehe auch [method inverse_lerp], die die Umkehrung dieser Operation " -"durchführt. Um eine Interpolation mit [method lerp] durchzuführen, " -"kombiniere sie mit [method ease] oder [method smoothstep]." +"Siehe auch [method inverse_lerp], welche die Umkehrung dieser Operation " +"durchführt. Um eine \"eased Interpolation\" mit [method lerp] durchzuführen, " +"kombiniere sie mit [method ease] oder [method smoothstep]. Siehe auch " +"[method range_lerp] um eine Serie von Werten ineinander abzubilden." #: modules/gdscript/doc_classes/@GDScript.xml #, fuzzy @@ -1346,7 +1355,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the result of [code]base[/code] raised to the power of [code]exp[/" "code].\n" @@ -1356,7 +1364,7 @@ msgid "" msgstr "" "Liefert das Ergebnis von [code]x[/code] hoch [code]y[/code].\n" "[codeblock]\n" -"pow(2, 5) # liefert 32\n" +"pow(2, 5) # liefert 32.0\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1433,19 +1441,17 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" -"Gibt einen Stacktrace zum Quelltextort aus, funktioniert nur wenn das " -"\"Ausführen mit Debugger\" aktiviert ist.\n" -"Die Ausgabe in der Konsole würde ungefähr so aussehen:\n" -"[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -4656,6 +4662,26 @@ msgstr "" "wurde." #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" "Die Eigenschaft wird serialisiert und in der Szenendatei gespeichert " @@ -5519,8 +5545,7 @@ msgstr "2D Sprite Animation" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "2D „Dodge The Creeps“ Demo" @@ -9635,6 +9660,7 @@ msgstr "" "neu indiziert werden müssen." #: doc/classes/Array.xml +#, fuzzy msgid "" "Assigns the given value to all elements in the array. This can typically be " "used together with [method resize] to create an array with a given size and " @@ -9643,7 +9669,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" "Weist allen Elementen des Arrays den angegebenen Wert zu. Dies kann " "normalerweise zusammen mit [method resize] verwendet werden, um ein Array " @@ -9935,8 +9964,12 @@ msgstr "" "beschreibt." #: doc/classes/Array.xml +#, fuzzy msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -9958,6 +9991,7 @@ msgstr "" "[/codeblock]" #: doc/classes/Array.xml +#, fuzzy msgid "" "Sorts the array using a custom method. The arguments are an object that " "holds the method and the name of such method. The custom method receives two " @@ -9966,9 +10000,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -13374,12 +13412,14 @@ msgid "Clears the audio sample data buffer." msgstr "Enthält die Audio Daten in Bytes." #: doc/classes/AudioStreamGeneratorPlayback.xml +#, fuzzy msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" +"Gibt [code]true[/code] zurück wenn Einstellung welche durch [code]name[/" +"code]angegeben ist, existiert, ansonsten [code]false[/code]." #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" @@ -13914,14 +13954,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -13931,22 +13971,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -22941,6 +22981,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -25784,7 +25832,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -36673,7 +36724,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -40028,7 +40081,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -40284,7 +40340,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -41016,6 +41075,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -43838,7 +43900,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -44358,11 +44422,11 @@ msgstr "Gibt das AnimationNode mit dem gegebenen Namen zurück." #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -44396,11 +44460,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -44422,11 +44486,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -46320,6 +46384,17 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +#, fuzzy +msgid "2D Particles Demo" +msgstr "2D Platformer Demo" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -53998,15 +54073,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -55641,17 +55723,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -55660,8 +55753,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -58401,7 +58500,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -60251,7 +60354,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -61650,7 +61755,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -61666,7 +61774,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -71268,10 +71378,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -71282,8 +71397,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -71442,7 +71557,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -71985,6 +72102,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/el.po b/doc/translations/el.po index 2044a45e60..13c4fbfe68 100644 --- a/doc/translations/el.po +++ b/doc/translations/el.po @@ -483,7 +483,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -498,7 +499,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -871,12 +876,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3487,6 +3496,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4171,8 +4200,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7091,7 +7119,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7276,6 +7307,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7295,9 +7329,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9936,10 +9974,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10471,14 +10508,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10488,22 +10525,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19299,6 +19336,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22133,7 +22178,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32864,7 +32912,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36186,7 +36236,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36436,7 +36489,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37153,6 +37209,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39963,7 +40022,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40479,11 +40540,11 @@ msgstr "ΕπιστÏÎφει το τόξο ημιτόνου της παÏαμÎÏ #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40517,11 +40578,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40543,11 +40604,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42397,6 +42458,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49998,15 +50069,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51603,17 +51681,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51622,8 +51711,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54339,7 +54434,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56176,7 +56275,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57554,7 +57655,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57570,7 +57674,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66842,10 +66948,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66856,8 +66967,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -67009,7 +67120,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67541,6 +67654,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/es.po b/doc/translations/es.po index 12a03991b8..8ed223238d 100644 --- a/doc/translations/es.po +++ b/doc/translations/es.po @@ -37,12 +37,14 @@ # emnrx <emanuelermancia@gmail.com>, 2022. # BlackNoizE404 <blacknoize404@gmail.com>, 2022. # Keyla Arroyos <keylaarroyos@protonmail.com>, 2022. +# Victor Stancioiu <victorstancioiu@gmail.com>, 2022. +# yohanger <yohangerariel@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-09-26 05:24+0000\n" -"Last-Translator: Keyla Arroyos <keylaarroyos@protonmail.com>\n" +"PO-Revision-Date: 2022-11-29 20:23+0000\n" +"Last-Translator: yohanger <yohangerariel@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/es/>\n" "Language: es\n" @@ -50,7 +52,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -749,8 +751,10 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -765,7 +769,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" "Devuelve un conjunto de diccionarios que representan la pila de llamadas " "actual.\n" @@ -852,7 +860,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -886,7 +893,7 @@ msgstr "" "# La razón de interpolación en la llamada a `lerp()` de más abajo es 0.75.\n" "var middle = lerp(20, 30, 0.75)\n" "# `middle` ahora es 27.5.\n" -"# Ahora, suponemos haber olvidado la razón original y queremos obtererla de " +"# Ahora, suponemos haber olvidado la razón original y queremos obtenerla de " "vuelta.\n" "var ratio = inverse_lerp(20, 30, 27.5)\n" "# `ratio` ahora es 0.75.\n" @@ -1382,7 +1389,6 @@ msgstr "" "mientras muestra un trazo de cuando un error o advertencia se muestra." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Like [method print], but includes the current stack frame when running with " "the debugger turned on.\n" @@ -1392,7 +1398,7 @@ msgid "" " At: res://test.gd:15:_process()\n" "[/codeblock]" msgstr "" -"Imprime una registro de la pila en la ubicación del código, sólo funciona " +"Imprime una registro de la pila en la ubicación del código, solo funciona " "cuando se ejecuta con el depurador activado.\n" "La salida en la consola se verÃa algo asÃ:\n" "[codeblock]\n" @@ -1401,19 +1407,17 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" -"Imprime una registro de la pila en la ubicación del código, sólo funciona " -"cuando se ejecuta con el depurador activado.\n" -"La salida en la consola se verÃa algo asÃ:\n" -"[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1533,7 +1537,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns a random floating point value between [code]from[/code] and " "[code]to[/code] (both endpoints inclusive).\n" @@ -1542,10 +1545,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] This is equivalent to [code]randf() * (to - from) + from[/code]." msgstr "" -"Rango aleatorio de cualquier numero real entre [code]from[/code] y [code]to[/" +"Rango aleatorio de cualquier número real entre [code]from[/code] y [code]to[/" "code].\n" "[codeblock]\n" -"prints(rand_range(0, 1), rand_range(0, 1)) # Imprime dos numeros aleatorios\n" +"prints(rand_range(0, 1), rand_range(0, 1)) # Imprime dos números aleatorios\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -4570,6 +4573,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "Sugiere que una imagen se comprime usando una compresión sin pérdidas." #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" "La propiedad se serializa y se guarda en el archivo de la escena (por " @@ -5406,8 +5429,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -9212,7 +9234,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -9448,8 +9473,12 @@ msgstr "" "cambio entre indices mientras se trocean." #: doc/classes/Array.xml +#, fuzzy msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -9480,9 +9509,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -13080,12 +13113,14 @@ msgid "Clears the audio sample data buffer." msgstr "Contiene los datos de audio en bytes." #: doc/classes/AudioStreamGeneratorPlayback.xml +#, fuzzy msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" +"Devuelve [code]true[/code] si el [code]layer[/code] dado en el [member " +"cull_mask] está activado, [code]false[/code] en caso contrario." #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" @@ -13699,14 +13734,14 @@ msgstr "" #, fuzzy msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" "Nodo para hacer un back-buffer en la pantalla que se muestra actualmente. La " @@ -13725,27 +13760,31 @@ msgid "Buffer mode. See [enum CopyMode] constants." msgstr "Modo de búfer. Ver las constantes de [enum CopyMode]." #: doc/classes/BackBufferCopy.xml +#, fuzzy msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" "El área cubierta por el BackBufferCopy. Sólo se usa si [member copy_mode] es " "[constant COPY_MODE_RECT]." #: doc/classes/BackBufferCopy.xml +#, fuzzy msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" "Deshabilita el modo de almacenamiento intermedio. Esto significa que el nodo " "BackBufferCopy utilizará directamente la parte de la pantalla que cubre." #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +#, fuzzy +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "BackBufferCopy almacena una región rectangular." #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +#, fuzzy +msgid "[BackBufferCopy] buffers the entire screen." msgstr "BackBufferCopy almacena toda la pantalla." #: doc/classes/BakedLightmap.xml @@ -25237,6 +25276,14 @@ msgid "Cylinder shape for collisions." msgstr "Forma de cilindro para colisiones." #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "La altura del cilindro." @@ -29140,7 +29187,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" "Los scripts que extienden esta clase e implementan su método [method _run] " "pueden ser ejecutados desde la opción de menú [b]File > Run[/b] del editor " @@ -43439,7 +43489,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" "El tamaño de la luz en unidades Godot. Sólo disponible para [OmniLight] y " "[SpotLight]. Aumentar este valor hará que la luz se desvanezca más " @@ -47664,7 +47716,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -47924,7 +47979,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -48736,6 +48794,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -50988,7 +51049,6 @@ msgstr "" "será renombrado automáticamente." #: doc/classes/Node.xml -#, fuzzy msgid "" "The node owner. A node can have any other node as owner (as long as it is a " "valid parent, grandparent, etc. ascending in the tree). When saving a node " @@ -51016,7 +51076,7 @@ msgstr "" "ejemplo:\n" "[codeblock]\n" "if child_node.get_parent():\n" -" child_node.get_parent().remove_child(child_node)\n" +" child_node.get_parent().remove_child(child_node)\n" "add_child(child_node)\n" "[/codeblock]\n" "Si necesita que el nodo hijo se añada debajo de un nodo especÃfico en la " @@ -52769,11 +52829,14 @@ msgstr "" "curva." #: doc/classes/OmniLight.xml +#, fuzzy msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" "El radio de la luz. Tenga en cuenta que el área efectivamente iluminada " "puede parecer más pequeña dependiendo del [member omni_attenuation] en uso. " @@ -53445,11 +53508,11 @@ msgstr "Devuelve el vértice en un Ãndice determinado." #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -53505,11 +53568,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -53538,11 +53601,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -55970,6 +56033,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" "Devuelve un rectángulo que contiene las posiciones de todas las partÃculas " @@ -65727,15 +65800,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -67818,36 +67898,45 @@ msgstr "Devuelve si este objeto tiene asignado un patrón de búsqueda válido." #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" -"Busca en el texto el patrón compilado. Devuelve un contenedor [RegExMatch] " -"del primer resultado coincidente si se encuentra, de lo contrario " -"[code]null[/code]. La región en la que se debe buscar puede especificarse " -"sin modificar el lugar en el que se encuentra el anclaje de inicio y fin." #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" -"Busca en el texto el patrón compilado. Devuelve un array de contenedores " -"[RegExMatch] para cada resultado no superpuesto. Si no se encuentran " -"resultados, se devuelve un array vacÃo. La región en la que se debe buscar " -"puede ser especificada sin modificar el lugar donde se encuentran el ancla " -"de inicio y el ancla de fin." #: modules/regex/doc_classes/RegEx.xml +#, fuzzy msgid "" "Searches the text for the compiled pattern and replaces it with the " "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" "Busca en el texto el patrón compilado y lo reemplaza con la string " "especificada. Escapadas y retro-referencias como [code]$1[/code] y " @@ -71417,9 +71506,12 @@ msgstr "" "reposo)." #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" -"Llama a un grupo sólo una vez aunque la llamada se ejecute muchas veces." #: doc/classes/SceneTree.xml #, fuzzy @@ -73637,7 +73729,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -75379,8 +75473,11 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." -msgstr "El ángulo del foco en grados." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." +msgstr "" #: doc/classes/SpotLight.xml msgid "The spotlight's angular attenuation curve." @@ -75391,11 +75488,14 @@ msgid "The spotlight's light energy attenuation curve." msgstr "La curva de atenuación de la energÃa de la luz del foco." #: doc/classes/SpotLight.xml +#, fuzzy msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" "El máximo rango que puede ser alcanzado por el foco. Tenga en cuenta que el " "área efectivamente iluminada puede parecer más pequeña dependiendo del " @@ -87445,10 +87545,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -87462,8 +87567,8 @@ msgstr "" #: doc/classes/Viewport.xml #, fuzzy msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" "Si [code]true[/code], la etiqueta subraya las metaetiquetas como [code][url]" "{text}[/url][/code]." @@ -87654,7 +87759,9 @@ msgstr "Si [code]true[/code], el viewport deberÃa hacer su fondo transparente." #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -88350,6 +88457,22 @@ msgstr "" "Este objeto sólo será visible para [Camera] cuya máscara de selección " "incluya el objeto renderizado que este [VisualInstance] tiene configurado." +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "Un script implementado en el entorno de programación de Visual Script." diff --git a/doc/translations/et.po b/doc/translations/et.po index 40bf471522..7f92671d8f 100644 --- a/doc/translations/et.po +++ b/doc/translations/et.po @@ -481,7 +481,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -496,7 +497,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -869,12 +874,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3485,6 +3494,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4169,8 +4198,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7087,7 +7115,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7272,6 +7303,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7291,9 +7325,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9931,10 +9969,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10466,14 +10503,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10483,22 +10520,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19278,6 +19315,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22110,7 +22155,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32822,7 +32870,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36120,7 +36170,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36368,7 +36421,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37078,6 +37134,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39884,7 +39943,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40395,11 +40456,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40433,11 +40494,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40459,11 +40520,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42310,6 +42371,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49902,15 +49973,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51506,17 +51584,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51525,8 +51614,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54241,7 +54336,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56078,7 +56177,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57456,7 +57557,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57472,7 +57576,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66709,10 +66815,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66723,8 +66834,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66876,7 +66987,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67408,6 +67521,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/fa.po b/doc/translations/fa.po index 31077d1e54..787c7ff937 100644 --- a/doc/translations/fa.po +++ b/doc/translations/fa.po @@ -698,8 +698,10 @@ msgstr "" "[/ codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -714,7 +716,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" "آرایه ای از ÙØ±Ù‡Ù†Ú¯ لغت ها را نشان Ù…ÛŒ دهد Ú©Ù‡ پشته تماس ÙØ¹Ù„ÛŒ را نشان Ù…ÛŒ دهد.\n" "[codeblock]\n" @@ -1292,12 +1298,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3920,6 +3930,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4604,8 +4634,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7522,7 +7551,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7707,6 +7739,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7726,9 +7761,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10366,10 +10405,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10901,14 +10939,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10918,22 +10956,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19713,6 +19751,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22545,7 +22591,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -33260,7 +33309,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36564,7 +36615,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36812,7 +36866,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37522,6 +37579,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -40328,7 +40388,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40839,11 +40901,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40877,11 +40939,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40903,11 +40965,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42766,6 +42828,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -50358,15 +50430,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51966,17 +52045,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51985,8 +52075,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54701,7 +54797,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56538,7 +56638,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57916,7 +58018,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57932,7 +58037,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -67169,10 +67276,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -67183,8 +67295,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -67336,7 +67448,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67868,6 +67982,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/fi.po b/doc/translations/fi.po index 811d77f710..fc517a6ff5 100644 --- a/doc/translations/fi.po +++ b/doc/translations/fi.po @@ -550,7 +550,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -565,7 +566,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -938,12 +943,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3554,6 +3563,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4238,8 +4267,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7164,7 +7192,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7349,6 +7380,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7368,9 +7402,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10009,10 +10047,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10544,14 +10581,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10561,22 +10598,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19375,6 +19412,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22209,7 +22254,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32948,7 +32996,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36271,7 +36321,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36521,7 +36574,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37238,6 +37294,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -40048,7 +40107,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40564,11 +40625,11 @@ msgstr "Palauttaa kahden vektorin jäännöksen." #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40602,11 +40663,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40628,11 +40689,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42482,6 +42543,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -50083,15 +50154,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51688,17 +51766,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51707,8 +51796,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54424,7 +54519,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56262,7 +56361,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57640,7 +57741,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57656,7 +57760,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66944,10 +67050,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66958,8 +67069,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -67111,7 +67222,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67643,6 +67756,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/fil.po b/doc/translations/fil.po index 2bbab40941..749fea9ef9 100644 --- a/doc/translations/fil.po +++ b/doc/translations/fil.po @@ -484,7 +484,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -499,7 +500,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -872,12 +877,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3488,6 +3497,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4172,8 +4201,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7090,7 +7118,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7275,6 +7306,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7294,9 +7328,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9934,10 +9972,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10469,14 +10506,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10486,22 +10523,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19281,6 +19318,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22113,7 +22158,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32828,7 +32876,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36126,7 +36176,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36374,7 +36427,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37084,6 +37140,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39890,7 +39949,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40401,11 +40462,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40439,11 +40500,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40465,11 +40526,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42316,6 +42377,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49908,15 +49979,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51512,17 +51590,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51531,8 +51620,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54247,7 +54342,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56084,7 +56183,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57462,7 +57563,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57478,7 +57582,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66715,10 +66821,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66729,8 +66840,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66882,7 +66993,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67414,6 +67527,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/fr.po b/doc/translations/fr.po index e22ff9db67..2898e9ec19 100644 --- a/doc/translations/fr.po +++ b/doc/translations/fr.po @@ -56,13 +56,17 @@ # KikooDX <kikoodx@paranoici.org>, 2022. # Kevin Bouancheau <kevin.bouancheau@gmail.com>, 2022. # Maxim Lopez <maxim.lopez.02@gmail.com>, 2022. +# Philippe Lamare <ph.lamare@free.fr>, 2022. +# Augustin Ambiehl <ambiehlaugustin@gmail.com>, 2022. +# Landry Simo <landrysimo99@gmail.com>, 2022. +# Alexis Coudert <coudert.alex@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-08-19 12:56+0000\n" -"Last-Translator: Maxime Leroy <lisacintosh@gmail.com>\n" +"PO-Revision-Date: 2022-12-03 00:47+0000\n" +"Last-Translator: Alexis Coudert <coudert.alex@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/fr/>\n" "Language: fr\n" @@ -70,7 +74,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -133,6 +137,7 @@ msgid "Default" msgstr "Défaut" #: doc/tools/make_rst.py +#, fuzzy msgid "Setter" msgstr "Setter" @@ -774,8 +779,10 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -790,7 +797,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" "Renvoie un tableau de dictionnaires représentant la pile d'appels en cours.\n" "[codeblock]\n" @@ -876,7 +887,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -899,24 +909,26 @@ msgid "" "See also [method lerp] which performs the reverse of this operation, and " "[method range_lerp] to map a continuous series of values to another." msgstr "" -"Retourne le facteur d'interpolation ou d'extrapolation suivant l'intervalle " -"spécifié dans [code]from[/code] et [code]to[/code], et la valeur interpolée " -"spécifiée par [code]weight[/code]. La valeur retournée sera entre [code]0.0[/" -"code] et [code]1.0[/code] si [code]weight[/code] est entre [code]from[/code] " -"et [code]to[/code] (inclus). Si [code]weight[/code] est en dehors de cet " +"Retourne un facteur d'interpolation ou d'extrapolation suivant l'intervalle " +"spécifié dans [code]de[/code] et [code]à [/code], et la valeur interpolée " +"spécifiée par [code]poids[/code]. La valeur retournée sera entre [code]0.0[/" +"code] et [code]1.0[/code] si [code]poids[/code] est entre [code]de[/code] et " +"[code]à [/code] (inclus). Si [code]poids[/code] se trouve en dehors de cet " "intervalle, un facteur d'extrapolation sera retourné (une valeur inférieure " -"à [code]0.0[/code] ou supérieure à [code]1.0[/code]).\n" +"à [code]0.0[/code] ou supérieure à [code]1.0[/code]). Utilisez [method " +"clamp] sur le resultat de [method inverse_lerp] si cela n'est pas souhaité.\n" "[codeblock]\n" -"# Le facteur d'interpolation de cet appel à `lerp()` ci-dessous est le " +"# Le facteur d'interpolation de cet appel à `lerp()` ci-dessous est de " "0.75.\n" "var middle = lerp(20, 30, 0.75)\n" -"# `middle` est maintenant 27.5.\n" -"# Maintenant, on fait comme si on avait oublié le facteur d'interpolation " -"original et qu'on veut le calculer.\n" +"# `middle` vaut maintenant 27.5.\n" +"# Admettons maintenant que l'on ait oublié le facteur d'interpolation " +"original et que l'on veut le calculer.\n" "var ratio = inverse_lerp(20, 30, 27.5)\n" -"# `ratio` est maintenant 0.75.\n" +"# `ratio` vaut maintenant 0.75.\n" "[/codeblock]\n" -"Voir aussi [method lerp] qui fait l'opération inverse." +"Voir aussi [method lerp] qui fait l'opération inverse et [method range_lerp] " +"qui fait correspondre une série de valeurs continues à une autre." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -988,7 +1000,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " @@ -1010,12 +1021,13 @@ msgid "" "ease] or [method smoothstep]. See also [method range_lerp] to map a " "continuous series of values to another." msgstr "" -"L'interpolation linéaire entre deux valeurs avec un facteur défini par " -"[code]weight[/code]. Pour faire une interpolation, [code]weight[/code] doit " -"être entre [code]0.0[/code] et [code]1.0[/code] (inclus). Pour autant, des " -"valeurs en dehors de cet intervalle sont autorisés pour faire une " -"[i]extrapolation[/i].\n" -"Si les arguments [code]from[/code] et [code]to[/code] sont de type [int] ou " +"Effectue une interpolation linéaire entre deux valeurs par un facteur défini " +"dans [code]poids[/code]. Pour effectuer l'interpolation, [code]poids[/code] " +"se situer entre [code]0.0[/code] et [code]1.0[/code] (inclus). Pour autant, " +"des valeurs en dehors de cet intervalle sont autorisés pour effectuer une " +"[i]extrapolation[/i]. Utilisez [method clamp] sur le résultat de [method " +"lerp] si cela n'est pas souhaité.\n" +"Si les arguments [code]de[/code] et [code]à [/code] sont de type [int] ou " "[float], la valeur retournée est un [float].\n" "Si les deux sont du même type de vecteur ([Vector2], [Vector3] ou [Color]), " "la valeur de retour sera du même type (puisque [code]lerp[/code] appelle " @@ -1024,9 +1036,10 @@ msgstr "" "lerp(0, 4, 0.75) # Retourne 3.0\n" "lerp(Vector2(1, 5), Vector2(3, 2), 0.5) # Retourne Vector2(2, 3.5)\n" "[/codeblock]\n" -"Voir aussi [method inverse_lerp] qui fait l'opération inverse. Pour fait une " -"interpolation plus douce avec [method lerp], combinez l'appel avec [method " -"ease] ou [method smoothstep]." +"Voir aussi [method inverse_lerp] qui effectue l'opération inverse. Pour " +"effectuer une interpolation adoucie avec [method lerp], combinez l'appel " +"avec [method ease] ou [method smoothstep]. Voir aussi [method range_lerp] " +"pour faire correspondre une série de valeurs continues à une autre." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1448,19 +1461,17 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" -"Affiche la trace d'appels à l'emplacement du code, ne fonctionne que lorsque " -"le débogueur est activé.\n" -"La sortie dans la console ressemblerait à ceci :\n" -"[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1749,6 +1760,17 @@ msgid "" "For complex use cases where you need multiple ranges, consider using [Curve] " "or [Gradient] instead." msgstr "" +"Fait correspondre une [code]valeur[/code] de l'intervalle [code][idebut, " +"ifin][/code] à [code][odebut, ofin][/code]. Voir aussi [method lerp] et " +"[method inverse_lerp]. Si la [code]valeur[/code] est en dehors de [code]" +"[idebut, ifin][/code], la valeur résultante sera aussi en dehors de [code]" +"[odebut, ofin][/code]. Utilisez [method clamp] sur le résultat de [method " +"range_lerp] si cela n'est pas souhaité.\n" +"[codeblock]\n" +"range_lerp(75, 0, 100, -1, 1) # Retourne 0.5\n" +"[/codeblock]\n" +"Pour les cas d'utilisation plus complexes avec plusieurs intervalles, " +"favorisez plutôt [Curve] ou [Gradient]." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -4162,10 +4184,13 @@ msgid "MIDI stop message. Stop the current sequence." msgstr "Le message d'arrêt en MIDI. Arrête la séquence actuelle." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "" "MIDI active sensing message. This message is intended to be sent repeatedly " "to tell the receiver that a connection is alive." msgstr "" +"Message de détection d'activité MIDI. Ce message est destiné à être envoyé à " +"plusieurs reprises pour indiquer au récepteur qu'une connexion est active." #: doc/classes/@GlobalScope.xml msgid "" @@ -4638,6 +4663,26 @@ msgstr "" "Indique qu'une image est comprimé en utlisant la compression sans perte." #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" "Le propriété est sérialisé et sauvegardé dans le fichier de la scène(défaut)." @@ -5489,8 +5534,7 @@ msgstr "Animation Sprite 2D" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "Démo 2D « Dodge The Creeps »" @@ -6427,18 +6471,25 @@ msgid "" "When inheriting from [AnimationRootNode], implement this virtual method to " "override the text caption for this node." msgstr "" +"Lorsque vous héritez d'[AnimationRootNode], implémentez cette méthode " +"virtuelle pour remplacer le texte de légende de ce nÅ“ud." #: doc/classes/AnimationNode.xml msgid "" "When inheriting from [AnimationRootNode], implement this virtual method to " "return a child node by its [code]name[/code]." msgstr "" +"Lorsque vous héritez d'[AnimationRootNode], implémentez cette méthode " +"virtuelle pour retourner un nÅ“ud enfant par [code]nom[/code]." #: doc/classes/AnimationNode.xml msgid "" "When inheriting from [AnimationRootNode], implement this virtual method to " "return all children nodes in order as a [code]name: node[/code] dictionary." msgstr "" +"Lorsque vous héritez d'[AnimationRootNode], implémentez cette méthode " +"virtuelle pour retourner tous les nÅ“uds enfants en tant que dictionnaire " +"[code]nom : nÅ“ud[/code]." #: doc/classes/AnimationNode.xml msgid "" @@ -6462,16 +6513,17 @@ msgstr "" "réutilisé dans plusieurs arbres de nÅ“uds." #: doc/classes/AnimationNode.xml -#, fuzzy msgid "" "When inheriting from [AnimationRootNode], implement this virtual method to " "return the default value of parameter \"[code]name[/code]\". Parameters are " "custom local memory used for your nodes, given a resource can be reused in " "multiple trees." msgstr "" -"Obtient la valeur par défaut d'un paramètre. Les paramètres sont la mémoire " -"locale personnalisé utilisé pour vos nÅ“uds, étant donné qu'une ressource " -"peut être réutilisé dans plusieurs arbres de nÅ“uds." +"Lors de l'héritage de [AnimationRootNode], implémente cette méthode " +"virtuelle pour obtenirla valeur par défaut du paramètre \"[code]name[/" +"code]\". Les paramètres sont de la mémoire locale personnalisée utilisée " +"pour vos nÅ“uds, étant donné qu'une ressource peut être réutilisée dans " +"plusieurs arbres." #: doc/classes/AnimationNode.xml #, fuzzy @@ -9430,6 +9482,7 @@ msgstr "" "les éléments placés après devront tous être décalés." #: doc/classes/Array.xml +#, fuzzy msgid "" "Assigns the given value to all elements in the array. This can typically be " "used together with [method resize] to create an array with a given size and " @@ -9438,7 +9491,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" "Assigne la valeur donnée à tous les éléments du tableau. C'est souvent " "utilisé avec [method resize] pour créer un tableau d'une taille donnée avec " @@ -9725,8 +9781,12 @@ msgstr "" "découpage." #: doc/classes/Array.xml +#, fuzzy msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -9749,6 +9809,7 @@ msgstr "" "[/codeblock]" #: doc/classes/Array.xml +#, fuzzy msgid "" "Sorts the array using a custom method. The arguments are an object that " "holds the method and the name of such method. The custom method receives two " @@ -9757,9 +9818,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9894,13 +9959,23 @@ msgstr "" "deviendra l'index [code]surf_idx[/code] pour cette nouvelle surface.\n" "L'argument [code]arrays[/code] est un tableau de tableaux. Voir [enum " "ArrayType] pour les valeurs utilisées dans ce tableau. Par exemple, " -"l'argument [code]arrays[/code] est le tableau des sommets. Ce premier sous-" -"tableau de sommets est nécessaire ; les autres sont facultatifs. L'ajout " -"d'un tableau d'indices met cette fonction en \"mode index\" où les sommets " -"et d'autres tableaux deviennent les sources de données et le tableau d'index " -"définit l'ordre des vertex. Tous les sous-tableau doivent avoir la même " -"longueur que le tableau des sommets, ou être vides, sauf pour [constant " -"ARRAY_INDEX] s'il est utilisé." +"l'argument [code]arrays[0]/code] est le tableau des sommets. Ce premier sous-" +"tableau de sommets est toujours requis ; les autres sont facultatifs. " +"L'ajout d'un tableau d'indices met cette fonction en \"mode index\" où les " +"sommets et d'autres tableaux deviennent les sources de données et le tableau " +"d'index définit l'ordre des vertex. Tous les sous-tableau doivent avoir la " +"même longueur que le tableau des sommets, ou être vides, sauf pour [constant " +"ARRAY_INDEX] s'il est utilisé.\n" +"[code]compress_flags[/code] est un champ de bits fait de valeurs [enum Mesh." +"ArrayFormat]. Il prend par défaut la valeur de [constant Mesh." +"ARRAY_COMPRESS_DEFAULT].\n" +"[b]Note:[/b] Le [code]compress_flags[/code] par défaut valide [constant Mesh." +"ARRAY_COMPRESS_COLOR], qui rend les couleurs de sommet stockées sous forme " +"d'entiers non signés 8 bits. Cela bloquera les couleurs de sommet trop " +"lumineuses à [code]Color(1, 1, 1, 1)[/code] et réduira leur précision. Pour " +"stocker des couleurs de sommet HDR, enlever le flag de compression de " +"couleur de sommet en passant [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ Mesh." +"ARRAY_COMPRESS_COLOR[/code] comme la valeur de [code]compress_flags[/code]." #: doc/classes/ArrayMesh.xml msgid "Removes all blend shapes from this [ArrayMesh]." @@ -13145,12 +13220,16 @@ msgid "" "settings." msgstr "" "Le nom du périphérique actuel pour l'entrée audio (voir [method " -"get_device_list)]. Sur les systèmes avec plusieurs entrées audio (comme " -"l'analogique, l'USB et l'audio par HDMI), cela peut être utilisé pour " -"sélectionner le périphérique d'entrée pour l'audio. La valeur " -"[code]\"Defaut\"[/code] enregistrera l'audio sur l'entrée audio par défaut " -"du système. Si un nom de périphérique invalide est défini, la valeur sera " -"retournée à [code]\"Defaut\"[/code]." +"capture_get_device_list]. Sur les systèmes avec plusieurs entrées audio " +"(comme l'analogique, l'USB et l'audio par HDMI), ceci peut être utilisé pour " +"sélectionner le périphérique d'entrée audio. La valeur [code]\"Default\"[/" +"code] enregistrera l'audio sur l'entrée audio par défaut du système. Si un " +"nom de périphérique invalide est défini, la valeur sera retournée à " +"[code]\"Default\"[/code].\n" +"[b]Note:[/b] [member ProjectSettings.audio/enable_audio_input] doit être " +"[code]true[/code] pour que l'entrée audio fonctionne. Voir aussi la " +"description de ce paramètre pour les avertissements liés aux autorisations " +"et aux paramètres de confidentialité du système d'exploitation." #: doc/classes/AudioServer.xml msgid "" @@ -13317,16 +13396,10 @@ msgstr "Efface la mémoire tampon des échantillons audio." #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" -"Retourne le nombre de frames de données audio restantes à jouer. Si ce " -"nombre atteint [code]0[/code], l'audio cessera de jouer jusqu'à ce que de " -"nouvelles frames soient ajoutés. Par conséquent, assurez-vous que votre " -"script peut toujours générer et pousser de nouveaux frames audio assez " -"rapidement pour éviter les craquements audio." #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" @@ -13999,14 +14072,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -14015,23 +14088,28 @@ msgid "Buffer mode. See [enum CopyMode] constants." msgstr "Le mode de mémoire tampon. Voir les constantes [enum CopyMode]." #: doc/classes/BackBufferCopy.xml +#, fuzzy msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" +"Le type de base à utiliser lorsque [member call_mode] est défini à [constant " +"CALL_MODE_INSTANCE]." #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +#, fuzzy +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "BackBufferCopy met en tampon une région rectangulaire." #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +#, fuzzy +msgid "[BackBufferCopy] buffers the entire screen." msgstr "BackBufferCopy met en mémoire tampon tout l'écran." #: doc/classes/BakedLightmap.xml @@ -16719,17 +16797,20 @@ msgid "" "antialiasing. 2D batching is also still supported with those antialiased " "lines." msgstr "" -"Dessine des segments de ligne interconnectés avec une [code]width[/code] " -"uniforme et une coloration segment par segment. Les couleurs attribuées aux " -"segments de ligne correspondent par index entre [code]points[/code] et " -"[code]colors[/code].\n" -"[b]Note :[/b] Le fonctionnement interne peut provoquer des problèmes de " -"rendu de l'anti-crénelage lors de l'affichage de polygones transparents voir " -"peut ne pas fonctionner sur certaines plateformes. Pour corriger cela, " +"Dessine des lignes déconnectées avec une [code]width[/code] uniforme et une " +"coloration segment par segment. Les couleurs attribuées aux segments de " +"ligne correspondent par index entre [code]points[/code] et [code]colors[/" +"code]. Lorsque vous dessinez de grandes quantités de lignes, cela est plus " +"rapide que d'utiliser des appels individuels[method draw_line]. Pour tracer " +"des lignes interconnectées, utiliser [method draw_polyline_colors] à la " +"place.\n" +"[b]Note :[/b] [code]width[/code] et [code]antialiased[/code] ne sont pas " +"actuellement implémentés et ne produisent aucun effet. Comme contournement, " "installez le greffon [url=https://github.com/godot-extended-libraries/godot-" "antialiased-line2d]Antialiased Line2D[/url] et créez un nÅ“ud " "AntialiasedPolygon2D. Ce nÅ“ud utilise une texture avec différents niveaux de " -"mipmap pour l'anti-crénelage." +"mipmap pour l'anti-crénelage. Le traitement par lots 2D est également " +"supporté avec ces lignes anti-crénelage." #: doc/classes/CanvasItem.xml msgid "" @@ -25852,6 +25933,14 @@ msgid "Cylinder shape for collisions." msgstr "Une forme cylindrique pour les collisions." #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "La hauteur du cylindre." @@ -30031,6 +30120,7 @@ msgid "Base script that can be used to add extension functions to the editor." msgstr "Script de base qui permet d'étendre les fonctionnalités de l'éditeur." #: doc/classes/EditorScript.xml +#, fuzzy msgid "" "Scripts extending this class and implementing its [method _run] method can " "be executed from the Script Editor's [b]File > Run[/b] menu option (or by " @@ -30048,7 +30138,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" "Les scripts héritant de cette classe et implémentant la méthode [method " "_run] peuvent être exécutés depuis l'éditeur de script avec l'option de menu " @@ -42766,7 +42859,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -47014,6 +47109,7 @@ msgid "3D agent used in navigation for collision avoidance." msgstr "Un agent 3D utilisé dans les navigations pour esquiver les collisions." #: doc/classes/NavigationAgent.xml +#, fuzzy msgid "" "3D agent that is used in navigation to reach a location while avoiding " "static and dynamic obstacles. The dynamic obstacles are avoided using RVO " @@ -47027,7 +47123,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" "Agent 3D utilisé dans la navigation pour atteindre un emplacement tout en " "évitant les obstacles statiques et dynamiques. Les obstacles dynamiques sont " @@ -47386,6 +47485,7 @@ msgid "2D agent used in navigation for collision avoidance." msgstr "Un agent 2D utilisé en navigation pour éviter les collisions." #: doc/classes/NavigationAgent2D.xml +#, fuzzy msgid "" "2D agent that is used in navigation to reach a location while avoiding " "static and dynamic obstacles. The dynamic obstacles are avoided using RVO " @@ -47399,7 +47499,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" "L'agent 2D utilisé dans la navigation pour atteindre un emplacement tout en " "évitant les obstacles statiques et dynamiques. Les obstacles dynamiques sont " @@ -48399,6 +48502,7 @@ msgid "Server interface for low-level 3D navigation access." msgstr "Interface serveur pour un accès de navigation 3D de bas niveau." #: doc/classes/NavigationServer.xml +#, fuzzy msgid "" "NavigationServer is the server responsible for all 3D navigation. It handles " "several objects, namely maps, regions and agents.\n" @@ -48419,6 +48523,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -52507,7 +52614,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -53164,11 +53273,11 @@ msgstr "Retourne le nom du pilote audio à l'index donné." #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -53202,11 +53311,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -53234,11 +53343,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -55600,6 +55709,17 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +#, fuzzy +msgid "2D Particles Demo" +msgstr "Démo 2D isométrique" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" "Retourne un rectangle contenant la position de toutes les particules " @@ -64195,15 +64315,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -66153,17 +66280,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -66172,8 +66310,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -69059,9 +69203,12 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "Appelle un groupe immédiatement (au lieu de le faire durant le repos)." #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" -"Appelle un groupe une seule fois même si l'appel a était fait plusieurs fois." #: doc/classes/SceneTree.xml msgid "No stretching." @@ -69139,8 +69286,8 @@ msgstr "" " yield(get_tree().create_timer(1.0), \"timeout\")\n" " print(\"Minuteur terminé.\")\n" "[/codeblock]\n" -"Le minuteur sera automatiquement une fois terminé. Pour garder le minuteur, " -"vous pouvez maintenir une référence vers lui. Voir [Reference]." +"Le minuteur sera automatiquement déréférencé une fois terminé. Pour garder " +"le minuteur, vous pouvez maintenir une référence vers lui. Voir [Reference]." #: doc/classes/SceneTreeTimer.xml msgid "The time remaining (in seconds)." @@ -71188,7 +71335,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -72764,8 +72913,11 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." -msgstr "L’angle du projecteur en degrés." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." +msgstr "" #: doc/classes/SpotLight.xml msgid "The spotlight's angular attenuation curve." @@ -72780,7 +72932,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -74278,7 +74432,7 @@ msgid "" "[/codeblock]" msgstr "" "Échappe (code) une chaine de caractères dans un format compatible avec les " -"URL. Est aussi référé au 'codage de URL' ('URL encode').\n" +"URL. Aussi appelé 'encodage d'URL' ('URL encode').\n" "[codeblock]\n" "print(\"https://example.org/?escaped=\" + \"Le Moteur Godot:'docs'\"." "http_escape())\n" @@ -83997,10 +84151,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -84012,9 +84171,10 @@ msgstr "" "débogage." #: doc/classes/Viewport.xml +#, fuzzy msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" "Si [code]true[/code], le viewport désactivera le rendu 3D. Pour le " "désactiver réellement, utilisez [code]usage[/code]." @@ -84198,7 +84358,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -84784,6 +84946,22 @@ msgstr "" "Cet objet ne sera visible que pour les [Camera] où le masque de cull inclut " "l'objet de rendu auquel [VisualInstance] est défini." +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/gl.po b/doc/translations/gl.po index 4ad17bba17..67bd7d902f 100644 --- a/doc/translations/gl.po +++ b/doc/translations/gl.po @@ -476,7 +476,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -491,7 +492,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -864,12 +869,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3480,6 +3489,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4164,8 +4193,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7082,7 +7110,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7267,6 +7298,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7286,9 +7320,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9926,10 +9964,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10461,14 +10498,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10478,22 +10515,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19273,6 +19310,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22105,7 +22150,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32817,7 +32865,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36115,7 +36165,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36363,7 +36416,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37073,6 +37129,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39879,7 +39938,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40390,11 +40451,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40428,11 +40489,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40454,11 +40515,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42305,6 +42366,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49897,15 +49968,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51501,17 +51579,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51520,8 +51609,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54236,7 +54331,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56073,7 +56172,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57451,7 +57552,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57467,7 +57571,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66704,10 +66810,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66718,8 +66829,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66871,7 +66982,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67403,6 +67516,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/hi.po b/doc/translations/hi.po index 945befe58b..75318a4554 100644 --- a/doc/translations/hi.po +++ b/doc/translations/hi.po @@ -475,7 +475,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -490,7 +491,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -863,12 +868,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3479,6 +3488,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4163,8 +4192,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7081,7 +7109,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7266,6 +7297,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7285,9 +7319,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9925,10 +9963,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10460,14 +10497,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10477,22 +10514,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19272,6 +19309,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22104,7 +22149,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32816,7 +32864,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36114,7 +36164,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36362,7 +36415,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37072,6 +37128,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39878,7 +39937,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40389,11 +40450,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40427,11 +40488,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40453,11 +40514,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42304,6 +42365,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49896,15 +49967,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51500,17 +51578,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51519,8 +51608,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54235,7 +54330,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56072,7 +56171,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57450,7 +57551,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57466,7 +57570,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66703,10 +66809,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66717,8 +66828,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66870,7 +66981,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67402,6 +67515,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/hu.po b/doc/translations/hu.po index a962de15e5..e99babd548 100644 --- a/doc/translations/hu.po +++ b/doc/translations/hu.po @@ -495,7 +495,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -510,7 +511,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -883,12 +888,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3499,6 +3508,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4183,8 +4212,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7101,7 +7129,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7286,6 +7317,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7305,9 +7339,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9945,10 +9983,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10480,14 +10517,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10497,22 +10534,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19292,6 +19329,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22124,7 +22169,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32836,7 +32884,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36134,7 +36184,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36382,7 +36435,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37092,6 +37148,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39898,7 +39957,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40409,11 +40470,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40447,11 +40508,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40473,11 +40534,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42324,6 +42385,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49916,15 +49987,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51520,17 +51598,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51539,8 +51628,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54255,7 +54350,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56092,7 +56191,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57470,7 +57571,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57486,7 +57590,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66723,10 +66829,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66737,8 +66848,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66890,7 +67001,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67422,6 +67535,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/id.po b/doc/translations/id.po index 249ed80079..ad63a828e5 100644 --- a/doc/translations/id.po +++ b/doc/translations/id.po @@ -695,7 +695,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -710,7 +711,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1220,21 +1225,18 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" -"Mencetak trek tumpukan di lokasi kode, hanya berfungsi saat dijalankan " -"dengan debugger dihidupkan.\n" -"Output di konsol akan terlihat seperti ini:\n" -"[codeblock]\n" -"Frame 0 - res://test.gd:16 dalam fungsi '_process'\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml #, fuzzy @@ -3889,6 +3891,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4573,8 +4595,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7492,7 +7513,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7677,6 +7701,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7696,9 +7723,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10336,10 +10367,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10871,14 +10901,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10888,22 +10918,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19685,6 +19715,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22517,7 +22555,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -33240,7 +33281,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36561,7 +36604,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36810,7 +36856,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37521,6 +37570,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -40329,7 +40381,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40842,11 +40896,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40880,11 +40934,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40906,11 +40960,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42770,6 +42824,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -50367,15 +50431,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51971,17 +52042,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51990,8 +52072,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54707,7 +54795,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56544,7 +56636,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57922,7 +58016,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57938,7 +58035,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -67192,10 +67291,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -67206,8 +67310,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -67359,7 +67463,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67891,6 +67997,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/is.po b/doc/translations/is.po index 2facd468d9..6bf49858f4 100644 --- a/doc/translations/is.po +++ b/doc/translations/is.po @@ -475,7 +475,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -490,7 +491,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -863,12 +868,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3479,6 +3488,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4163,8 +4192,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7081,7 +7109,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7266,6 +7297,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7285,9 +7319,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9925,10 +9963,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10460,14 +10497,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10477,22 +10514,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19272,6 +19309,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22104,7 +22149,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32816,7 +32864,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36114,7 +36164,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36362,7 +36415,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37072,6 +37128,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39878,7 +39937,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40389,11 +40450,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40427,11 +40488,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40453,11 +40514,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42304,6 +42365,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49896,15 +49967,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51500,17 +51578,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51519,8 +51608,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54235,7 +54330,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56072,7 +56171,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57450,7 +57551,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57466,7 +57570,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66703,10 +66809,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66717,8 +66828,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66870,7 +66981,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67402,6 +67515,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/it.po b/doc/translations/it.po index ed4ec9ddc7..37488c9ebd 100644 --- a/doc/translations/it.po +++ b/doc/translations/it.po @@ -20,18 +20,19 @@ # Daniele Basso <tiziodcaio@gmail.com>, 2021. # Jacopo Farina <jacopo1.farina@gmail.com>, 2021. # Riteo Siuga <riteo@posteo.net>, 2021. -# ZeroKun265 <davidegiambirtone265@gmail.com>, 2021. +# ZeroKun265 <davidegiambirtone265@gmail.com>, 2021, 2022. # Andrea Montagna <fullmontis@gmail.com>, 2021. # Andrea Leganza <neogene@gmail.com>, 2021. # Federico Caprini <caprinifede@gmail.com>, 2022. # Alessandro Casalino <alessandro.casalino93@gmail.com>, 2022. # AndreWharn <andrewharnofficial@gmail.com>, 2022. +# Silvia Scaglione <sissisoad@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-09-14 18:45+0000\n" -"Last-Translator: Federico Caprini <caprinifede@gmail.com>\n" +"PO-Revision-Date: 2022-10-16 11:17+0000\n" +"Last-Translator: Silvia Scaglione <sissisoad@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/it/>\n" "Language: it\n" @@ -39,7 +40,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -47,7 +48,7 @@ msgstr "Descrizione" #: doc/tools/make_rst.py msgid "Tutorials" -msgstr "Guide" +msgstr "Tutorials" #: doc/tools/make_rst.py msgid "Properties" @@ -253,8 +254,8 @@ msgid "" "s = asin(0.5)\n" "[/codeblock]" msgstr "" -"Ritorna l'arcoseno di [code]s[/code] in radianti. Usato per prendere " -"l'angolo del seno [code]s[/code]. [code]s[/code] deve essere compreso tra " +"Ritorna l'arcoseno di [code]s[/code] in radianti. Utilizza [code]s[/code] " +"per prendere l'angolo del seno. [code]s[/code] deve essere compreso tra " "[code]-1.0[/code] e [code]1.0[/code] (inclusi), altrimenti, [method asin] " "ritornerà [constant NAN].\n" "[codeblock]\n" @@ -288,20 +289,20 @@ msgid "" "a message with clarifying details\n" "[/codeblock]" msgstr "" -"Controlla che [code]condition[/code] sia [code]true[/code]. Se " -"[code]condition[/code] è [code]false[/code], un errore è generato. Mentre si " -"sta eseguendo dall'editor, il progetto corrente verrà interrotto finché non " -"lo riprenderai. Questo può essere usato come una forma più forte di [method " -"push_error] per riportare gli errori allo sviluppatore del progetto o agli " -"utilizzatori di add-on.\n" -"[b]Note:[/b] Per ragioni di performance, il codice dentro [method assert] " -"viene eseguito sono nelle versione di debug o mentre si sta eseguendo il " -"progetto dall'editor. Non includere codice che ha effetti collaterali mentre " -"[method assert] viene chiamato. Altrimenti il progetto si comporterà " -"diversamente quando viene esportato nella modalità di rilascio.\n" -"Il parametro [code]message[/code] opzionale, se passato, è mostrato insieme " -"al messaggio generico \"Assertion failed\". Puoi usarlo per dare dettagli " -"addizionali sul perché l'asserzione sia fallita.\n" +"Controlla che [code]condizion[/code] sia [code]true[/code](vero). Se " +"[code]condition[/code] è [code]false[/code](falso), un errore è generato." +"Quando eseguito all'interno dell'editor, il progetto verrà anche messo in " +"pausa, finchè non lo farai ripartire. Ciò può essere usato come un migliore " +"sistema di [method push_error] per riportare errori agli sviluppatori del " +"progetto o ulteriori utenti.\n" +"[b]Nota bene:[/b] Per motivi di prestazioni, il codice all'interno di " +"[method assert] è eseguito solo nelle build di debug o quando il progetto è " +"eseguito dall'editor. Non scrivere codice che dovrà avere effetti " +"collaterali in una chiamata [method assert]. Altrimenti il progetto si " +"comporterà in modo diverso quando esportato in modalità release.\n" +"L'argomento opzionale [code]message[/code], se dato, è mostrato in aggiunta " +"al generico messaggio \"Assertion failed\" (Asserzione fallita). Può essere " +"usato per fornire più dettagli sul motivo per cui un asserzione ha fallito.\n" "[codeblock]\n" "# Immaginati di voler sempre avere una velocità (speed nel caso nostro) " "sempre tra 0 e 20\n" @@ -734,8 +735,10 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -750,7 +753,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" "Restituisce un vettore di dizionari rappresentanti il call stack corrente.\n" "[codeblock]\n" @@ -947,7 +954,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " @@ -971,7 +977,10 @@ msgid "" msgstr "" "Interpola linearmente tra due valori mediante un valore definito in " "[code]weight[/code]. Per interpolare, [code]weight[/code] dovrebbe rimanere " -"tra [code]0.0[/code] e [code]1.0[/code] (inclusi).\n" +"tra [code]0.0[/code] e [code]1.0[/code] (inclusi). Tuttavia, i valori fuori " +"da questo range sono permessi e possono essere utilizzati per eseguire " +"[i]extrapolation[/i]. Utilizza [method clamp] sul risultato di [method lerp] " +"se non lo si desidera.\n" "Se gli argomenti [code]from[/code] e [code]to[/code] sono di tipo [int] o " "[float], il valore di ritorno è un [float].\n" "Se entrambi sono dello stesso tipo di vettore ([Vector2], [Vector3] o " @@ -987,7 +996,6 @@ msgstr "" "combinalo con [method ease] o [method smoothstep]." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Linearly interpolates between two angles (in radians) by a normalized " "value.\n" @@ -1012,18 +1020,25 @@ msgid "" msgstr "" "Interpola linearmente tra due angoli (in radianti) con un valore " "normalizzato.\n" -"Simile a [metodo lerp], ma interpola correttamente quando gli angoli sono " +"Simile a [method lerp], ma interpola correttamente quando gli angoli sono " "attorno [costante @GDScript.TAU]. Per eseguire un'interpolazione alleggerita " "con [method lerp_angle], combinalo con [method ease] o [method smoothstep].\n" "[codeblock]\n" "extends Sprite\n" "var elapsed = 0.0\n" "func _process(delta):\n" -" var min_angle = deg2rad(0.0)\n" -" var max_angle = deg2rad(90.0)\n" -" rotation = lerp_angle(min_angle, max_angle, elapsed)\n" -" elapsed += delta\n" -"[/codeblock]" +" var min_angle = deg2rad(0.0)\n" +" var max_angle = deg2rad(90.0)\n" +" rotation = lerp_angle(min_angle, max_angle, elapsed)\n" +" elapsed += delta\n" +"[/codeblock]\n" +"[b]Nota:[/b] Questo metodo interpola linearmente tra [code]da[/code] e " +"[code]a[/code]. Tuttavia, quando questi due angoli sono approssimativamente " +"[code]PI + k * TAU[/code] distanti per qualsiasi numero intero [code]k[/" +"code], non è ovvio in quale modo si interpolano a causa di errori di " +"precisione a virgola mobile. Per esempio, [code]lerp_angle(0, PI, weight)[/" +"code] interpola in senso anti-orario, mentre [code]lerp_angle(0, PI + 5 * " +"TAU, weight)[/code] interpola in senso orario." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1272,7 +1287,6 @@ msgstr "" "coordinate cartesiane (assi X e Y)." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the integer modulus of [code]a/b[/code] that wraps equally in " "positive and negative.\n" @@ -1297,7 +1311,7 @@ msgstr "" "for i in range(-3, 4):\n" " print(\"%2d %2d %2d\" % [i, i % 3, posmod(i, 3)])\n" "[/codeblock]\n" -"Produces:\n" +"Produce:\n" "[codeblock]\n" "-3 0 0\n" "-2 -2 1\n" @@ -1375,7 +1389,6 @@ msgstr "" "messaggi di debug ed errore che vengono mostrati con la stack trace." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Like [method print], but includes the current stack frame when running with " "the debugger turned on.\n" @@ -1385,28 +1398,27 @@ msgid "" " At: res://test.gd:15:_process()\n" "[/codeblock]" msgstr "" -"Stampa un stack trace nella posizione del codice, funziona solo quando il " -"debugger è attivato.\n" +"Come [method print], ma include l'attuale stack frame quando si avvia con il " +"debugger attivato.\n" "L'output nella console apparirà come:\n" "[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" +"Test print\n" +" At: res://test.gd:15:_process()\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" -"Stampa un stack trace nella posizione del codice, funziona solo quando il " -"debugger è attivato.\n" -"L'output nella console apparirà come:\n" -"[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1524,7 +1536,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns a random floating point value between [code]from[/code] and " "[code]to[/code] (both endpoints inclusive).\n" @@ -1533,11 +1544,12 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] This is equivalent to [code]randf() * (to - from) + from[/code]." msgstr "" -"Un range casuale, un qualsiasi numero in virgola mobile tra [code]from[/" -"code] e [code]to[/code]\n" +"Ritorna in modo casuale un numero a virgola mobile tra [code]from[/code] e " +"[code]to[/code] (incluse entrambe le estremità ).\n" "[codeblock]\n" "prints(rand_range(0, 1), rand_range(0, 1)) # Stampa 0.135591 0.405263\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Nota:[/b] Ciò equivale a [code]randf() * (to - from) + from[/code]." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1559,8 +1571,8 @@ msgid "" "randf() # Returns e.g. 0.375671\n" "[/codeblock]" msgstr "" -"Restituisce un numero casuale in virgola mobile nell'intervallo [code][0, 1]" -"[/code].\n" +"Restituisce un numero casuale a virgola mobile nell'intervallo [code][0, 1][/" +"code].\n" "[codeblock]\n" "randf() # Restituisce ad esempio 0.375671\n" "[/codeblock]" @@ -1695,6 +1707,17 @@ msgid "" "For complex use cases where you need multiple ranges, consider using [Curve] " "or [Gradient] instead." msgstr "" +"Mostra un [code]value[/code] da [code][istart, istop][/code] a [code]" +"[ostart, ostop][/code]. Vedi anche [methop lerp] e [method inverse_lerp]. Se " +"[code]value[/code] è fuori da [code][istart, istop][/code], allora il numero " +"che risulterà sarà anche esso fuori da [code][ostart, ostop][/code]. " +"Utilizza [method clamp] sul risultato di [method range_lerp] se non lo si " +"desidera.\n" +"[codeblock]\n" +"range_lerp(75, 0, 100, -1, 1) # Returns 0.5\n" +"[/codeblock]\n" +"Per utilizzi complessi in cui ti servono molteplici range, considera " +"piuttosto l'utilizzo di [Curve] o [Gradient]." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1799,6 +1822,29 @@ msgid "" "smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " "-1.6521) return values[/url]" msgstr "" +"Ritorna il risultato della regolare interpolazione del valore di [code]s[/" +"code] tra [code]0[/code] e [code]1[/code], basata sulla posizione di " +"[code]s[/code] rispetto agli angoli [code]from[/code] e [code]to[/code].\n" +"Il valore di ritorno è [code]0[/code] if [code]s <= from[/code], e [code]1[/" +"code] if [code]s >= to[/code]. Se [code]s[/code] è posizionato tra " +"[code]from[/code] e [code]to[/code], il valore di ritorno seguirà una curva " +"a forma di S che mostrerà [code]s[/code] tra [code]0[/code] e [code]1[/" +"code].\n" +"La curva a forma di S è l'interpolatore cubico Hermite, dato da [code]f(y) = " +"3*y^2 - 2*y^3[/code] dove [code]y = (x-from) / (to-from)[/code].\n" +"[codeblock]\n" +"smoothstep(0, 2, -5.0) # Returns 0.0\n" +"smoothstep(0, 2, 0.5) # Returns 0.15625\n" +"smoothstep(0, 2, 1.0) # Returns 0.5\n" +"smoothstep(0, 2, 2.0) # Returns 1.0\n" +"[/codeblock]\n" +"Rispetto a [method ease] con un valore di curva di [code]-1.6521[/code], " +"[method smoothstep] ritorna la curva più regolare possibile senza improvvisi " +"cambiamenti sulla derivata. Se hai bisogno di effettuare transizioni più " +"avanzate, usa [Tween] o [AnimationPlayer].\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" +"smoothstep_ease_comparison.png] Confronto tra smoothstep() e ease(x, " +"-1.6521) fa tornare i valori[/url]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1840,7 +1886,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Snaps float value [code]s[/code] to a given [code]step[/code]. This can also " "be used to round a floating point number to an arbitrary number of " @@ -1851,12 +1896,12 @@ msgid "" "[/codeblock]\n" "See also [method ceil], [method floor], [method round], and [int]." msgstr "" -"Arrotonda un valore float [code]s[/code] ad un valore [code]step[/code] su " -"una scala. Questo può essere anche utilizzato per arrotondare un valore " -"float ad un numero arbitrario di cifre decimali.\n" +"Scatta un valore float [code]s[/code] ad un valore [code]step[/code]. Questo " +"può essere anche utilizzato per arrotondare un valore float ad un numero " +"arbitrario di cifre decimali.\n" "[codeblock]\n" "stepify(100, 32) # Ritorna 96.0\n" -"stepify(3.14159, 0.01) # Ritorna3.14\n" +"stepify(3.14159, 0.01) # Ritorna 3.14\n" "[/codeblock]\n" "Guarda anche [method ceil], [method floor], [method round] e [int]." @@ -1985,6 +2030,15 @@ msgid "" " print(\"unexpected results\")\n" "[/codeblock]" msgstr "" +"Ritorna l'internal type della Variant dell'oggetto, utilizzando i valori " +"[enum Variant.Type].\n" +"[codeblock]\n" +"p = parse_json('[\"a\", \"b\", \"c\"]')\n" +"if typeof(p) == TYPE_ARRAY:\n" +" print(p[0]) # Prints a\n" +"oppure:\n" +" print(\"unexpected results\")\n" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -2088,6 +2142,26 @@ msgid "" "[code]wrapf[/code] is more flexible than using the [method fposmod] approach " "by giving the user control over the minimum value." msgstr "" +"Avvolge il float [code]value[/code] tra [code]min[/code] e [code]max[/" +"code].\n" +"Utilizzabile per creare dei funzionamenti simili a loop o infinite " +"superfici.\n" +"[codeblock]\n" +"# Infinite loop between 5.0 and 9.9\n" +"value = wrapf(value + 0.1, 5.0, 10.0)\n" +"[/codeblock]\n" +"[codeblock]\n" +"# Infinite rotation (in radians)\n" +"angle = wrapf(angle + 0.1, 0.0, TAU)\n" +"[/codeblock]\n" +"[codeblock]\n" +"# Infinite rotation (in radians)\n" +"angle = wrapf(angle + 0.1, -PI, PI)\n" +"[/codeblock]\n" +"[b]Nota:[/b] Se [code]min[/code] è [code]0[/code], ciò è equivalente a " +"[method fposmod], quindi utilizza quello preferibilmente.\n" +"[code]wrapf[/code] è più flessibile rispetto all'approccio [method fposmod] " +"dando l'user control sopra il valore minimo." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -2238,6 +2312,16 @@ msgid "" "code] will not result in [constant INF] and will result in a run-time error " "instead." msgstr "" +"L'infinità positiva della virgola mobile. Questo è il risultato della " +"divisione in virgola mobile quando il divisore è [code]0.0[/code]. Per " +"infinità negativa, utilizza [code]-INF[/code]. Dividere per [code]-0.0[/" +"code] risulterà in infinità negativa se è il numeratore è positivo, quindi " +"dividere per [code]0.0[/code] non è lo stesso di dividere per [code]-0.0[/" +"code] (nonostante [code]0.0 == -0.0[/code] ritorni [code]true[/code]).\n" +"[b]Nota:[/b] L'infinità numerica è solo un concetto per numeri a virgola " +"mobile, e non ha equivalenti per numeri interi. Dividere un numero intero " +"per [code]0[/code] non risulterà in [constant INF] e risulterà , invece, in " +"un errore di avviamento." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -2263,7 +2347,7 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "Global scope constants and variables." -msgstr "" +msgstr "Costanti e variabili degli ambiti globali." #: doc/classes/@GlobalScope.xml msgid "" @@ -2272,6 +2356,11 @@ msgid "" "Singletons are also documented here, since they can be accessed from " "anywhere." msgstr "" +"Costanti e varianti degli ambiti globali. Questo è ciò che risiede nei " +"globali, le costanti riguardano gli errori di codice, scancodes, property " +"hints, ecc...\n" +"I Singletons sono documentati anche qui, dato che sono accessibili da " +"qualsiasi parte." #: doc/classes/@GlobalScope.xml msgid "The [ARVRServer] singleton." @@ -2334,19 +2423,16 @@ msgid "The [Marshalls] singleton." msgstr "Il singleton [Marshalls]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [Navigation2DServer] singleton." -msgstr "Il singleton [TranslationServer]." +msgstr "Il singleton [Navigation2DServer]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [NavigationMeshGenerator] singleton." -msgstr "Il singleton [EditorNavigationMeshGenerator]." +msgstr "Il singleton [NavigationMeshGenerator]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [NavigationServer] singleton." -msgstr "Il singleton [TranslationServer]." +msgstr "Il singleton [NavigationServer]." #: doc/classes/@GlobalScope.xml msgid "The [OS] singleton." @@ -2377,9 +2463,8 @@ msgid "The [ResourceSaver] singleton." msgstr "Il singleton [ResourceSaver]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "The [Time] singleton." -msgstr "Il singleton [Engine]." +msgstr "Il singleton [Time]." #: doc/classes/@GlobalScope.xml msgid "The [TranslationServer] singleton." @@ -2439,16 +2524,22 @@ msgid "" "General vertical alignment, usually used for [Separator], [ScrollBar], " "[Slider], etc." msgstr "" +"L'allineamento generale verticale, solitamente utilizzato per [Separator], " +"[Scrollbar], [Slider], ecc." #: doc/classes/@GlobalScope.xml msgid "" "General horizontal alignment, usually used for [Separator], [ScrollBar], " "[Slider], etc." msgstr "" +"L'allineamento orizzontale generale, solitamente utilizzato per [Separator], " +"[Scrollbar], [Slider], etc." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "Horizontal left alignment, usually for text-derived classes." msgstr "" +"L'allineamento orizzontale sinistro, solitamente per text-derived classes." #: doc/classes/@GlobalScope.xml msgid "Horizontal center alignment, usually for text-derived classes." @@ -2721,26 +2812,24 @@ msgid "Context menu key." msgstr "Tasto menu contestuale." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Left Hyper key." msgstr "Tasto Hyper sinistro." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Right Hyper key." msgstr "Tasto Hyper destro." #: doc/classes/@GlobalScope.xml msgid "Help key." -msgstr "" +msgstr "Tasto help." #: doc/classes/@GlobalScope.xml msgid "Left Direction key." -msgstr "" +msgstr "Il tasto direzionale sinistro." #: doc/classes/@GlobalScope.xml msgid "Right Direction key." -msgstr "" +msgstr "Il tasto direzionale destro." #: doc/classes/@GlobalScope.xml msgid "" @@ -2776,7 +2865,7 @@ msgstr "Tasto del volume su." #: doc/classes/@GlobalScope.xml msgid "Bass Boost key." -msgstr "" +msgstr "Il tasto Bass Boost." #: doc/classes/@GlobalScope.xml msgid "Bass up key." @@ -2810,7 +2899,7 @@ msgstr "Tasto brano successivo." #: doc/classes/@GlobalScope.xml msgid "Media record key." -msgstr "" +msgstr "Tasto di registrazione." #: doc/classes/@GlobalScope.xml #, fuzzy @@ -2818,98 +2907,96 @@ msgid "Home page key." msgstr "Tasto pagina iniziale." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Favorites key." msgstr "Tasto Preferiti." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Search key." msgstr "Tasto Ricerca." #: doc/classes/@GlobalScope.xml msgid "Standby key." -msgstr "" +msgstr "Tasto Modalità Riposo." #: doc/classes/@GlobalScope.xml msgid "Open URL / Launch Browser key." -msgstr "" +msgstr "Tasto Apri URL / Avvia Browser." #: doc/classes/@GlobalScope.xml msgid "Launch Mail key." -msgstr "" +msgstr "Tasto Avvia Mail." #: doc/classes/@GlobalScope.xml msgid "Launch Media key." -msgstr "" +msgstr "Tasto Avvia Media." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 0 key." -msgstr "" +msgstr "Tasto Avvia Shortcut 0." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 1 key." -msgstr "" +msgstr "Tasto Avvia Shortcut 1." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 2 key." -msgstr "" +msgstr "Tasto Avvia Shortcut 2." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 3 key." -msgstr "" +msgstr "Tasto Avvia Shortcut 3." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 4 key." -msgstr "" +msgstr "Tasto Avvia Shortcut 4." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 5 key." -msgstr "" +msgstr "Tasto Avvia Shortcut 5." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 6 key." -msgstr "" +msgstr "Tasto Avvia Shortcut 6." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 7 key." -msgstr "" +msgstr "Tasto Avvia Shortcut 7." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 8 key." -msgstr "" +msgstr "Tasto Avvia Shortcut 8." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut 9 key." -msgstr "" +msgstr "Tasto Avvia Shortcut 9." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut A key." -msgstr "" +msgstr "Tasto Avvia Shortcut A." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut B key." -msgstr "" +msgstr "Tasto Avvia Shortcut B." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut C key." -msgstr "" +msgstr "Tasto Avvia Shortcut C." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut D key." -msgstr "" +msgstr "Tasto Avvia Shortcut D." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut E key." -msgstr "" +msgstr "Tasto Avvia Shortcut E." #: doc/classes/@GlobalScope.xml msgid "Launch Shortcut F key." -msgstr "" +msgstr "Tasto Avvia Shortcut F." #: doc/classes/@GlobalScope.xml msgid "Unknown key." -msgstr "" +msgstr "Tasto Sconosciuto." #: doc/classes/@GlobalScope.xml #, fuzzy @@ -2927,117 +3014,94 @@ msgid "\" key." msgstr "Tasto \"." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "# key." msgstr "Tasto #." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "$ key." msgstr "Tasto $." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "% key." msgstr "Tasto %." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "& key." msgstr "Tasto &." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "' key." msgstr "Tasto '." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "( key." msgstr "Tasto (." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid ") key." msgstr "Tasto )." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "* key." msgstr "Tasto *." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "+ key." msgstr "Tasto +." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid ", key." msgstr "Tasto ,." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "- key." msgstr "Tasto -." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid ". key." msgstr "Tasto \".\"." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "/ key." msgstr "Tasto /." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Number 0." msgstr "Numero 0." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Number 1." msgstr "Numero 1." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Number 2." msgstr "Numero 2." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Number 3." msgstr "Numero 3." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Number 4." msgstr "Numero 4." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Number 5." msgstr "Numero 5." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Number 6." msgstr "Numero 6." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Number 7." msgstr "Numero 7." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Number 8." msgstr "Numero 8." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Number 9." msgstr "Numero 9." @@ -3047,127 +3111,102 @@ msgid ": key." msgstr "Tasto :." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "; key." msgstr "Tasto ;." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "< key." msgstr "Tasto <." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "= key." msgstr "Tasto =." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "> key." msgstr "Tasto >." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "? key." msgstr "Tasto ?." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "@ key." msgstr "Tasto @." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "A key." msgstr "Tasto A." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "B key." msgstr "Tasto B." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "C key." msgstr "Tasto C." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "D key." msgstr "Tasto D." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "E key." msgstr "Tasto E." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "F key." msgstr "Tasto F." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "G key." msgstr "Tasto G." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "H key." msgstr "Tasto H." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "I key." msgstr "Tasto I." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "J key." msgstr "Tasto J." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "K key." msgstr "Tasto K." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "L key." msgstr "Tasto L." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "M key." msgstr "Tasto M." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "N key." msgstr "Tasto N." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "O key." msgstr "Tasto O." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "P key." msgstr "Tasto P." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Q key." msgstr "Tasto Q." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "R key." msgstr "Tasto R." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "S key." msgstr "Tasto S." @@ -3177,88 +3216,72 @@ msgid "T key." msgstr "Tasto T." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "U key." msgstr "Tasto U." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "V key." msgstr "Tasto V." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "W key." msgstr "Tasto W." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "X key." msgstr "Tasto X." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Y key." msgstr "Tasto Y." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Z key." msgstr "Tasto Z." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "[ key." msgstr "Tasto [." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "\\ key." msgstr "Tasto \\." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "] key." msgstr "Tasto ]." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "^ key." msgstr "Tasto ^." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "_ key." msgstr "Tasto _." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "` key." msgstr "Tasto '." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "{ key." msgstr "Tasto {." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "| key." msgstr "Tasto |." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "} key." msgstr "Tasto }." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "~ key." msgstr "Tasto ~." #: doc/classes/@GlobalScope.xml msgid "Non-breakable space key." -msgstr "" +msgstr "Tasto spazio Non-breakable." #: doc/classes/@GlobalScope.xml #, fuzzy @@ -3286,307 +3309,248 @@ msgid "Â¥ key." msgstr "Tasto Â¥." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "¦ key." msgstr "Tasto ¦." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "§ key." msgstr "Tasto §." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "¨ key." msgstr "Tasto ¨." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "© key." msgstr "Tasto ©." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "ª key." msgstr "Tasto ª." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "« key." msgstr "Tasto «." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "¬ key." msgstr "Tasto ¬." #: doc/classes/@GlobalScope.xml msgid "Soft hyphen key." -msgstr "" +msgstr "Tasto trattino morbido." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "® key." msgstr "Tasto ®." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "¯ key." msgstr "Tasto ¯." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "° key." msgstr "Tasto °." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "± key." msgstr "Tasto ±." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "² key." msgstr "Tasto ²." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "³ key." msgstr "Tasto ³." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "´ key." msgstr "Tasto ´." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "µ key." msgstr "Tasto µ." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "¶ key." msgstr "Tasto ¶." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "· key." msgstr "Tasto ·." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "¸ key." msgstr "Tasto ¸." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "¹ key." msgstr "Tasto ¹." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "º key." msgstr "Tasto º." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "» key." msgstr "Tasto »." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "¼ key." msgstr "Tasto ¼." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "½ key." msgstr "Tasto ½." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "¾ key." msgstr "Tasto ¾." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "¿ key." msgstr "Tasto ¿." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "À key." msgstr "Tasto À." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "à key." msgstr "Tasto Ã." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid " key." msgstr "Tasto Â." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "à key." msgstr "Tasto Ã." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Ä key." msgstr "Tasto Ä." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Ã… key." msgstr "Tasto Ã…." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Æ key." msgstr "Tasto Æ." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Ç key." msgstr "Tasto Ç." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "È key." msgstr "Tasto È." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "É key." msgstr "Tasto É." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Ê key." msgstr "Tasto Ê." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Ë key." msgstr "Tasto Ë." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "ÃŒ key." msgstr "Tasto ÃŒ." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "à key." msgstr "Tasto Ã." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "ÃŽ key." msgstr "Tasto ÃŽ." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "à key." msgstr "Tasto Ã." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "à key." msgstr "Tasto Ã." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Ñ key." msgstr "Tasto Ñ." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Ã’ key." msgstr "Tasto Ã’." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Ó key." msgstr "Tasto Ó." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Ô key." msgstr "Tasto Ô." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Õ key." msgstr "Tasto Õ." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Ö key." msgstr "Tasto Ö." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "× key." msgstr "Tasto ×." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Ø key." msgstr "Tasto Ø." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Ù key." msgstr "Tasto Ù." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Ú key." msgstr "Tasto Ú." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Û key." msgstr "Tasto Û." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Ü key." msgstr "Tasto Ü." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "à key." msgstr "Tasto Ã." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Þ key." msgstr "Tasto Þ." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "ß key." msgstr "Tasto ß." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "÷ key." msgstr "Tasto ÷." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "ÿ key." msgstr "Tasto ÿ." #: doc/classes/@GlobalScope.xml msgid "Key Code mask." -msgstr "" +msgstr "Tasto Code mask." #: doc/classes/@GlobalScope.xml msgid "Modifier key mask." @@ -3594,11 +3558,11 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "Shift key mask." -msgstr "" +msgstr "Tasto Shift." #: doc/classes/@GlobalScope.xml msgid "Alt key mask." -msgstr "" +msgstr "Tasto Alt." #: doc/classes/@GlobalScope.xml msgid "Meta key mask." @@ -3606,7 +3570,7 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "Ctrl key mask." -msgstr "" +msgstr "Tasto Ctrl." #: doc/classes/@GlobalScope.xml msgid "" @@ -3615,61 +3579,62 @@ msgid "" "mask should be preferred to [constant KEY_MASK_META] or [constant " "KEY_MASK_CTRL] for system shortcuts as it handles all platforms correctly." msgstr "" +"Tasto Comandi. Su macOS, ciò equivale a [constant KEY_MASK_META]. Su altre " +"piattaforme, ciò equivale a [constant KEY_MASK_CTRL]. Questo tasto dovrebbe " +"essere preferito a [constant KEY_MASK_META] o [constant KEY_MASK_CTRL] per " +"sistemi di shortcut in quanto gestito correttamente da tutte le piattaforme." #: doc/classes/@GlobalScope.xml msgid "Keypad key mask." -msgstr "" +msgstr "Tasto Keypad." #: doc/classes/@GlobalScope.xml msgid "Group Switch key mask." -msgstr "" +msgstr "Tasto Group Switch." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Left mouse button." msgstr "Tasto sinistro del mouse." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Right mouse button." msgstr "Tasto destro del mouse." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Middle mouse button." msgstr "Tasto centrale del mouse." #: doc/classes/@GlobalScope.xml msgid "Extra mouse button 1 (only present on some mice)." -msgstr "" +msgstr "Tasto Mouse Extra 1 (presente solo su alcuni mouse)." #: doc/classes/@GlobalScope.xml msgid "Extra mouse button 2 (only present on some mice)." -msgstr "" +msgstr "Tasto Mouse Extra 1 (presente solo su alcuni mouse)." #: doc/classes/@GlobalScope.xml msgid "Mouse wheel up." -msgstr "" +msgstr "Rotella del Mouse in su'." #: doc/classes/@GlobalScope.xml msgid "Mouse wheel down." -msgstr "" +msgstr "Rotella del mouse in giu'." #: doc/classes/@GlobalScope.xml msgid "Mouse wheel left button (only present on some mice)." -msgstr "" +msgstr "Tasto rotella sinistra del mouse (presente solo su alcuni mouse)." #: doc/classes/@GlobalScope.xml msgid "Mouse wheel right button (only present on some mice)." -msgstr "" +msgstr "Tasto rotella del mouse destra (presente solo su alcuni mouse)." #: doc/classes/@GlobalScope.xml msgid "Left mouse button mask." -msgstr "" +msgstr "Tasto sinistro del mouse." #: doc/classes/@GlobalScope.xml msgid "Right mouse button mask." -msgstr "" +msgstr "Tasto destro del mouse." #: doc/classes/@GlobalScope.xml msgid "Middle mouse button mask." @@ -3689,95 +3654,95 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "Gamepad button 0." -msgstr "" +msgstr "Tasto 0 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 1." -msgstr "" +msgstr "Tasto 1 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 2." -msgstr "" +msgstr "Tasto 2 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 3." -msgstr "" +msgstr "Tasto 3 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 4." -msgstr "" +msgstr "Tasto 4 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 5." -msgstr "" +msgstr "Tasto 5 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 6." -msgstr "" +msgstr "Tasto 6 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 7." -msgstr "" +msgstr "Tasto 7 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 8." -msgstr "" +msgstr "Tasto 8 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 9." -msgstr "" +msgstr "Tasto 9 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 10." -msgstr "" +msgstr "Tasto 10 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 11." -msgstr "" +msgstr "Tasto 11 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 12." -msgstr "" +msgstr "Tasto 12 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 13." -msgstr "" +msgstr "Tasto 13 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 14." -msgstr "" +msgstr "Tasto 14 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 15." -msgstr "" +msgstr "Tasto 15 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 16." -msgstr "" +msgstr "Tasto 16 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 17." -msgstr "" +msgstr "Tasto 17 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 18." -msgstr "" +msgstr "Tasto 18 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 19." -msgstr "" +msgstr "Tasto 19 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 20." -msgstr "" +msgstr "Tasto 20 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 21." -msgstr "" +msgstr "Tasto 21 Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button 22." -msgstr "" +msgstr "Tasto 22 Gamepad." #: doc/classes/@GlobalScope.xml msgid "" @@ -3787,114 +3752,125 @@ msgid "" "- Linux: Up to 80 buttons.\n" "- Windows and macOS: Up to 128 buttons." msgstr "" +"Il numero massimo di tasti di controller di gioco supportati dal motore. Il " +"reale limite potrebbe essere inferiore su piattaforme specifiche:\n" +"- Android: Fino a 36 tasti.\n" +"- Linux: Fino a 80 tasti.\n" +"- Windows e macOS: Fino a 128 tasti." #: doc/classes/@GlobalScope.xml msgid "DualShock circle button." -msgstr "" +msgstr "Tasto Cerchio del DualShock." #: doc/classes/@GlobalScope.xml msgid "DualShock X button." -msgstr "" +msgstr "Tasto X del DualShock." #: doc/classes/@GlobalScope.xml msgid "DualShock square button." -msgstr "" +msgstr "Tasto Quadrato del DualShock." #: doc/classes/@GlobalScope.xml msgid "DualShock triangle button." -msgstr "" +msgstr "Tasto Triangolo del DualShock." #: doc/classes/@GlobalScope.xml msgid "Xbox controller B button." -msgstr "" +msgstr "Tasto B del controller Xbox." #: doc/classes/@GlobalScope.xml msgid "Xbox controller A button." -msgstr "" +msgstr "Tasto A del controller Xbox." #: doc/classes/@GlobalScope.xml msgid "Xbox controller X button." -msgstr "" +msgstr "Tasto X del controller Xbox." #: doc/classes/@GlobalScope.xml msgid "Xbox controller Y button." -msgstr "" +msgstr "Tasto Y del controller Xbox." #: doc/classes/@GlobalScope.xml msgid "Nintendo controller A button." -msgstr "" +msgstr "Tasto A del controller Nintendo." #: doc/classes/@GlobalScope.xml msgid "Nintendo controller B button." -msgstr "" +msgstr "Tasto B del controller Nintendo." #: doc/classes/@GlobalScope.xml msgid "Nintendo controller X button." -msgstr "" +msgstr "Tasto X del controller Nintendo." #: doc/classes/@GlobalScope.xml msgid "Nintendo controller Y button." -msgstr "" +msgstr "Tasto Y del controller Nintendo." #: doc/classes/@GlobalScope.xml msgid "Grip (side) buttons on a VR controller." -msgstr "" +msgstr "Tasti Grip (di lato) su un controller VR." #: doc/classes/@GlobalScope.xml msgid "Push down on the touchpad or main joystick on a VR controller." -msgstr "" +msgstr "Premi giù sul touchpad o il joystick principale su un controller VR." #: doc/classes/@GlobalScope.xml msgid "Trigger on a VR controller." -msgstr "" +msgstr "Trigger su un controller VR." #: doc/classes/@GlobalScope.xml msgid "" "A button on the right Oculus Touch controller, X button on the left " "controller (also when used in OpenVR)." msgstr "" +"Tasto A sul controller destro Oculus Touch, tasto X sul controller sinistro " +"(anche quando utilizzato in OpenVR)." #: doc/classes/@GlobalScope.xml msgid "" "B button on the right Oculus Touch controller, Y button on the left " "controller (also when used in OpenVR)." msgstr "" +"Tasto B sul controller destro Oculus Touch, tasto Y sul controller sinistro " +"(anche quando utilizzando in OpenVR)." #: doc/classes/@GlobalScope.xml msgid "Menu button on either Oculus Touch controller." -msgstr "" +msgstr "Tasto Menu su entrambi i controller Oculus Touch." #: doc/classes/@GlobalScope.xml msgid "Menu button in OpenVR (Except when Oculus Touch controllers are used)." msgstr "" +"Tasto Menu in OpenVR (tranne quando sono in utilizzo i controller Oculus " +"Touch)." #: doc/classes/@GlobalScope.xml msgid "Gamepad button Select." -msgstr "" +msgstr "Tasto Select del Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad button Start." -msgstr "" +msgstr "Tasto Start del Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad DPad up." -msgstr "" +msgstr "Tasto in su' DPad del Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad DPad down." -msgstr "" +msgstr "Tasto in giu' DPad del Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad DPad left." -msgstr "" +msgstr "Tasto sinistro DPad del Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad DPad right." -msgstr "" +msgstr "Tasto destro DPad del Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL guide button." -msgstr "" +msgstr "Tasto Guida SDL del Gamepad." #: doc/classes/@GlobalScope.xml msgid "Gamepad SDL miscellaneous button." @@ -4122,6 +4098,7 @@ msgid "" msgstr "" #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "" "Methods that return [enum Error] return [constant OK] when no error " "occurred. Note that many functions don't return an error code but will print " @@ -4137,30 +4114,39 @@ msgid "" " print(\"Still failing!\")\n" "[/codeblock]" msgstr "" +"Metodi che ritornano [enum Error] ritornano [constant OK] quando non risulta " +"alcun errore. Nota che molte funzioni non ritornano un errore di codice ma " +"stampano messaggi di errore come standard output.\n" +"Dato che [constant OK] ha valore 0, e tutti gli altri codici mancati sono " +"interi positivi, può essere utilizzato anche nei controlli booleani, e.g.:\n" +"[codeblock]\n" +"var err = method_that_returns_error()\n" +"if err != OK:\n" +" print(\"Failure!\")\n" +"# O, equivalente:\n" +"if err:\n" +" print(\"Still failing!\")\n" +"[/codeblock]" #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Generic error." msgstr "Errore generico." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Unavailable error." msgstr "Errore non disponibile." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Unconfigured error." msgstr "Errore non configurato." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Unauthorized error." msgstr "Errore non autorizzato." #: doc/classes/@GlobalScope.xml msgid "Parameter range error." -msgstr "" +msgstr "Errore di parametro del range." #: doc/classes/@GlobalScope.xml msgid "Out of memory (OOM) error." @@ -4180,11 +4166,11 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "File: No permission error." -msgstr "" +msgstr "File: Errore nessun permesso." #: doc/classes/@GlobalScope.xml msgid "File: Already in use error." -msgstr "" +msgstr "File: Errore già in uso." #: doc/classes/@GlobalScope.xml msgid "File: Can't open error." @@ -4199,13 +4185,12 @@ msgid "File: Can't read error." msgstr "" #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "File: Unrecognized error." msgstr "File: Errore non riconosciuto." #: doc/classes/@GlobalScope.xml msgid "File: Corrupt error." -msgstr "" +msgstr "File: Errore corrotto." #: doc/classes/@GlobalScope.xml msgid "File: Missing dependencies error." @@ -4216,14 +4201,12 @@ msgid "File: End of file (EOF) error." msgstr "" #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Can't open error." -msgstr "Impossibile aprire l'errore." +msgstr "Impossibile aprire errore." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Can't create error." -msgstr "Impossibile creare l'errore." +msgstr "Impossibile creare errore." #: doc/classes/@GlobalScope.xml msgid "Query failed error." @@ -4231,35 +4214,31 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "Already in use error." -msgstr "" +msgstr "Errore già in uso." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Locked error." msgstr "Errore bloccato." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Timeout error." msgstr "Errore di timeout." #: doc/classes/@GlobalScope.xml msgid "Can't connect error." -msgstr "" +msgstr "Errore impossibile connettersi." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Can't resolve error." msgstr "Impossibile risolvere l'errore." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Connection error." msgstr "Errore di connessione." #: doc/classes/@GlobalScope.xml msgid "Can't acquire resource error." -msgstr "" +msgstr "Impossibile acquisire fonte dell'errore." #: doc/classes/@GlobalScope.xml msgid "Can't fork process error." @@ -4270,36 +4249,32 @@ msgid "Invalid data error." msgstr "" #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Invalid parameter error." msgstr "Errore di parametro non valido." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Already exists error." -msgstr "Esiste già l'errore." +msgstr "Errore già esistente." #: doc/classes/@GlobalScope.xml msgid "Does not exist error." -msgstr "" +msgstr "Errore inesistente." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Database: Read error." msgstr "Database: Errore di lettura." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Database: Write error." msgstr "Database: Errore di scrittura." #: doc/classes/@GlobalScope.xml msgid "Compilation failed error." -msgstr "" +msgstr "Errore compilazione fallita." #: doc/classes/@GlobalScope.xml msgid "Method not found error." -msgstr "" +msgstr "Errore metodo non trovato." #: doc/classes/@GlobalScope.xml msgid "Linking failed error." @@ -4307,24 +4282,23 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "Script failed error." -msgstr "" +msgstr "Errore script fallito." #: doc/classes/@GlobalScope.xml msgid "Cycling link (import cycle) error." msgstr "" #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Invalid declaration error." msgstr "Errore di dichiarazione non valida." #: doc/classes/@GlobalScope.xml msgid "Duplicate symbol error." -msgstr "" +msgstr "Errore simbolo duplicato." #: doc/classes/@GlobalScope.xml msgid "Parse error." -msgstr "" +msgstr "Errore di analizzazione." #: doc/classes/@GlobalScope.xml msgid "Busy error." @@ -4336,21 +4310,23 @@ msgstr "" #: doc/classes/@GlobalScope.xml msgid "Help error." -msgstr "" +msgstr "Errore aiuto." #: doc/classes/@GlobalScope.xml msgid "Bug error." -msgstr "" +msgstr "Errore bug." #: doc/classes/@GlobalScope.xml msgid "" "Printer on fire error. (This is an easter egg, no engine methods return this " "error code.)" msgstr "" +"Errore stampante a fuoco. (E' un easter egg, nessun motore di metodi riporta " +"questo codice di errore.)" #: doc/classes/@GlobalScope.xml msgid "No hint for the edited property." -msgstr "" +msgstr "Nessun indizio sulle proprietà modificate." #: doc/classes/@GlobalScope.xml msgid "" @@ -4361,6 +4337,13 @@ msgid "" "above the max or below the min values. Example: [code]\"-360,360,1," "or_greater,or_lesser\"[/code]." msgstr "" +"Indica che un numero intero o proprietà mobile dovrebbe essere in un range " +"specifico tramite la stringa indicativa [code]\"min,max\"[/code] o " +"[code]\"min,max,step\"[/code]. La stringa indicativa può, opzionalmente, " +"includere [code]\"or_greater\"[/code] e/o [code]\"or_lesser\"[/code] per " +"permettere un input manuale che vada rispettivamente sopra il massimo o " +"sotto il minimo dei valori. Esempio: [code]\"-360,360,1,or_greater," +"or_lesser\"[/code]." #: doc/classes/@GlobalScope.xml msgid "" @@ -4371,6 +4354,13 @@ msgid "" "above the max or below the min values. Example: [code]\"0.01,100,0.01," "or_greater\"[/code]." msgstr "" +"Indica che una proprietà mobile dovrebbe essere in un range esponenziale " +"specificato tramite la stringa indicativa [code]\"min,max\"[/code] " +"o[code]\"min,max,step\"[/code]. La stringa indicativa può, opzionalmente, " +"includere [code]\"or_greater\"[/code] e/o [code]\"or_lesser\"[/code] per " +"permettere un input manuale di andare rispettivamente sopra il massimo o " +"sotto il minimo dei valori. Esempio: [code]\"0.01,100,0.01,or_greater\"[/" +"code]." #: doc/classes/@GlobalScope.xml msgid "" @@ -4382,6 +4372,13 @@ msgid "" "specified by appending [code]:integer[/code] to the name, e.g. [code]\"Zero," "One,Three:3,Four,Six:6\"[/code]." msgstr "" +"Indica che una proprietà intera, mobile o stringa sia un valore innumerato " +"da scegliere tramite una specifica stringa indicativa.\n" +"La stringa indicativa è un elenco di nomi come [code]\"Hello,Something," +"Else\"[/code]. Per proprietà intere o mobili, il primo nome sulla lista ha " +"valore 0, il successivo 1, e così via. I valori espliciti possono anche " +"essere specificati aggiungendo [code]:integer[/code] al nome, p.e. " +"[code]\"Zero,One,Three:3,Four,Six:6\"[/code]." #: doc/classes/@GlobalScope.xml msgid "" @@ -4509,6 +4506,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -5194,8 +5211,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7160,13 +7176,12 @@ msgid "" msgstr "" #: doc/classes/AnimationTreePlayer.xml -#, fuzzy msgid "" "Returns whether node [code]id[/code] and [code]dst_id[/code] are connected " "at the specified slot." msgstr "" -"Restituisce [code]true[/code] se [code]a[/code] e [code]b[/code] sono " -"approssimativamente uguali tra di loro." +"Restituisce se nodo [code]id[/code] e [code]dst_id[/code] sono connessi " +"nella specifica casella." #: doc/classes/AnimationTreePlayer.xml msgid "Returns the blend amount of a Blend2 node given its name." @@ -8132,7 +8147,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -8317,6 +8335,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -8336,9 +8357,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -8756,12 +8781,14 @@ msgid "" msgstr "" #: doc/classes/ARVRController.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the button at index [code]button[/code] is " "pressed. See [enum JoystickList], in particular the [code]JOY_VR_*[/code] " "constants." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Ritorna [code]true[/code]se il tasto sull'indice [code]button[/code] è stato " +"premuto. Vedi [enum JoystickList], in particolare i [code]JOY_VR_*[/code] " +"costanti." #: doc/classes/ARVRController.xml msgid "" @@ -9305,9 +9332,8 @@ msgstr "" #: doc/classes/PanelContainer.xml doc/classes/ScrollContainer.xml #: doc/classes/SplitContainer.xml doc/classes/TabContainer.xml #: doc/classes/VBoxContainer.xml doc/classes/VSplitContainer.xml -#, fuzzy msgid "GUI containers" -msgstr "Contenitore a schede." +msgstr "Contenitore a schede" #: doc/classes/AspectRatioContainer.xml msgid "Specifies the horizontal relative position of child controls." @@ -9894,13 +9920,12 @@ msgid "Audio buses" msgstr "" #: doc/classes/AudioEffectCapture.xml -#, fuzzy msgid "" "Returns [code]true[/code] if at least [code]frames[/code] audio frames are " "available to read in the internal ring buffer." msgstr "" -"Restituisce [code]true[/code] se [code]a[/code] e [code]b[/code] sono " -"approssimativamente uguali tra di loro." +"Restituisce [code]true[/code] se almeno [code]frames[/code] frame audio sono " +"disponibili per la lettura nell'internal ring buffer." #: doc/classes/AudioEffectCapture.xml msgid "Clears the internal ring buffer." @@ -10986,12 +11011,14 @@ msgid "Clears the audio sample data buffer." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml +#, fuzzy msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" +"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " +"esiste, [code]false[/code] altrimenti." #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" @@ -11522,14 +11549,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -11539,22 +11566,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -13261,9 +13288,9 @@ msgid "The camera's process callback. See [enum Camera2DProcessMode]." msgstr "" #: doc/classes/Camera2D.xml -#, fuzzy msgid "If [code]true[/code], the camera view rotates with the target." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Se [code]true[/code], la visuale della telecamera ruota insieme al target." #: doc/classes/Camera2D.xml msgid "" @@ -13401,11 +13428,12 @@ msgid "Returns an array of [CameraFeed]s." msgstr "" #: doc/classes/CameraServer.xml -#, fuzzy msgid "" "Returns the [CameraFeed] corresponding to the camera with the given " "[code]index[/code]." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce il [CameraFeed] corrispondente alla telecamera con il dato " +"[code]index[/code]." #: doc/classes/CameraServer.xml msgid "Returns the number of [CameraFeed]s registered." @@ -14740,9 +14768,8 @@ msgid "" msgstr "" #: doc/classes/ClippedCamera.xml -#, fuzzy msgid "If [code]true[/code], the camera stops on contact with [Area]s." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "Se [code]true[/code], la telecamera si ferma al contatto con [Area]s." #: doc/classes/ClippedCamera.xml msgid "If [code]true[/code], the camera stops on contact with [PhysicsBody]s." @@ -15160,9 +15187,8 @@ msgstr "" #: doc/classes/Physics2DDirectSpaceState.xml #: doc/classes/PhysicsDirectBodyState.xml #: doc/classes/PhysicsDirectSpaceState.xml doc/classes/RigidBody.xml -#, fuzzy msgid "Physics introduction" -msgstr "Interpolazione cubica." +msgstr "Introduzione fisica" #: doc/classes/CollisionShape.xml msgid "" @@ -16792,7 +16818,7 @@ msgstr "" #: doc/classes/Control.xml #, fuzzy msgid "Control node gallery" -msgstr "Tasto Control/CTRL." +msgstr "Galleria controllo nodo" #: doc/classes/Control.xml msgid "All GUI Demos" @@ -16902,15 +16928,16 @@ msgid "" msgstr "" #: doc/classes/Control.xml -#, fuzzy msgid "" "Creates a local override for a theme constant with the specified [code]name[/" "code]. Local overrides always take precedence when fetching theme items for " "the control.\n" "See also [method get_constant], [method remove_constant_override]." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Crea un override locale per un tema costante con lo specifico [code]name[/" +"code]. I local overrides hanno sempre la precedenza quando si recuperano " +"elementi del tema per il controllo.\n" +"Vedi anche [method get_constant], [method remove_constant_override]." #: doc/classes/Control.xml msgid "" @@ -17210,14 +17237,14 @@ msgid "" msgstr "" #: doc/classes/Control.xml -#, fuzzy msgid "" "Returns [code]true[/code] if there is a local override for a theme [Color] " "with the specified [code]name[/code] in this [Control] node.\n" "See [method add_color_override]." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce [code]true[/code] se è presente un locale override per un tema " +"[Color] con lo specifico [code]name[/code] in questo [Control] nodo.\n" +"Vedi [method add_color_override]." #: doc/classes/Control.xml msgid "" @@ -17228,14 +17255,14 @@ msgid "" msgstr "" #: doc/classes/Control.xml -#, fuzzy msgid "" "Returns [code]true[/code] if there is a local override for a theme constant " "with the specified [code]name[/code] in this [Control] node.\n" "See [method add_constant_override]." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce [code]true[/code] se c'è un override locale per un tema costante " +"nello specifico [code]name[/code] in questo [Control] nodo.\n" +"Vedi [method add_constant_override]." #: doc/classes/Control.xml msgid "" @@ -17255,14 +17282,14 @@ msgstr "" "esiste, [code]false[/code] altrimenti." #: doc/classes/Control.xml -#, fuzzy msgid "" "Returns [code]true[/code] if there is a local override for a theme [Font] " "with the specified [code]name[/code] in this [Control] node.\n" "See [method add_font_override]." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce [code]true[/code] se è presente un override locale per un tema " +"[Font] con lo specifico [code]name[/code] in questo [Control] nodo.\n" +"Vedi [method add_font_override]." #: doc/classes/Control.xml #, fuzzy @@ -17276,14 +17303,14 @@ msgstr "" "esiste, [code]false[/code] altrimenti." #: doc/classes/Control.xml -#, fuzzy msgid "" "Returns [code]true[/code] if there is a local override for a theme icon with " "the specified [code]name[/code] in this [Control] node.\n" "See [method add_icon_override]." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce [code]true[/code] se è presente un override locale per un'icona " +"a tema con lo specifico [code]name[/code] in questo [Control] nodo.\n" +"Vedi [method add_icon_override]." #: doc/classes/Control.xml msgid "" @@ -17296,14 +17323,15 @@ msgid "" msgstr "" #: doc/classes/Control.xml -#, fuzzy msgid "" "Returns [code]true[/code] if there is a local override for a theme shader " "with the specified [code]name[/code] in this [Control] node.\n" "See [method add_shader_override]." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce [code]true[/code] se è un presente un override locale per un " +"ombreggiatore di tema con lo specifico [code]name[/code] in questo [Control] " +"nodo.\n" +"Vedi [method add_shader_override]." #: doc/classes/Control.xml msgid "" @@ -17314,14 +17342,14 @@ msgid "" msgstr "" #: doc/classes/Control.xml -#, fuzzy msgid "" "Returns [code]true[/code] if there is a local override for a theme " "[StyleBox] with the specified [code]name[/code] in this [Control] node.\n" "See [method add_stylebox_override]." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce [code]true[/code] se è presente un override locale per un tema " +"[StyleBox] con lo specifico [code]name[/code] in questo [Control] nodo.\n" +"Vedi [method add_stylebox_override]." #: doc/classes/Control.xml msgid "" @@ -20445,6 +20473,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -23285,7 +23321,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -28290,11 +28329,12 @@ msgid "" msgstr "" #: modules/gridmap/doc_classes/GridMap.xml -#, fuzzy msgid "" "Returns an array of all cells with the given item index specified in " "[code]item[/code]." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce un vettore di tutte le celle con il dato elemento indice " +"specificato in [code]item[/code]." #: modules/gridmap/doc_classes/GridMap.xml msgid "" @@ -28326,11 +28366,12 @@ msgid "" msgstr "" #: modules/gridmap/doc_classes/GridMap.xml -#, fuzzy msgid "" "If [code]true[/code], this GridMap uses cell navmesh resources to create " "navigation regions." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Se [code]true[/code], questa GridMap utilizza celle navmesh come fonti per " +"creare regioni di navigazione." #: modules/gridmap/doc_classes/GridMap.xml msgid "If [code]true[/code], grid items are centered on the X axis." @@ -30986,11 +31027,12 @@ msgid "" msgstr "" #: doc/classes/Input.xml -#, fuzzy msgid "" "Returns [code]true[/code] if you are pressing the joypad button (see [enum " "JoystickList])." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce [code]true[/code] se premi un tasto del joypad (vedi [enum " +"JoystickList])." #: doc/classes/Input.xml msgid "" @@ -31774,11 +31816,13 @@ msgid "Mouse and input coordinates" msgstr "" #: doc/classes/InputEventMouseMotion.xml -#, fuzzy msgid "" "Returns [code]true[/code] when using the eraser end of a stylus pen.\n" "[b]Note:[/b] This property is implemented on Linux, macOS and Windows." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce [code]true[/code] quando è in utilizzo la gomma di una penna " +"stilo.\n" +"[b]Nota:[/b] Questa proprietà è implementata su Linux, macOS e Windows." #: doc/classes/InputEventMouseMotion.xml msgid "" @@ -33974,9 +34018,8 @@ msgid "Returns the offset of the piece with the index [code]idx[/code]." msgstr "" #: doc/classes/LargeTexture.xml -#, fuzzy msgid "Returns the [Texture] of the piece with the index [code]idx[/code]." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "Restituisce la [Texture] del pezzo con l'indice [code]idx[/code]." #: doc/classes/LargeTexture.xml msgid "" @@ -34063,7 +34106,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -37223,9 +37268,10 @@ msgid "" msgstr "" #: doc/classes/Navigation2DServer.xml -#, fuzzy msgid "Returns the map cell height. [b]Note:[/b] Currently not implemented." -msgstr "Prende la linea corrente nel file analizzato (non ancora implementato)" +msgstr "" +"Prende la linea corrente nel file analizzato. [b]Note:[/b] Attualmente non " +"implementato." #: doc/classes/Navigation2DServer.xml doc/classes/NavigationServer.xml #, fuzzy @@ -37399,7 +37445,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -37652,7 +37701,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37733,13 +37785,12 @@ msgid "" msgstr "" #: doc/classes/NavigationMesh.xml -#, fuzzy msgid "" "Returns whether the specified [code]bit[/code] of the [member " "geometry_collision_mask] is set." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce se lo specifico [code]bit[/code] del [member " +"geometry_collision_mask] è impostato." #: doc/classes/NavigationMesh.xml doc/classes/NavigationPolygon.xml msgid "" @@ -38377,6 +38428,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -40866,13 +40920,12 @@ msgid "" msgstr "" #: doc/classes/Object.xml -#, fuzzy msgid "" "Returns [code]true[/code] if a connection exists for a given [code]signal[/" "code], [code]target[/code], and [code]method[/code]." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce [code]true[/code] se la connessione esiste per un dato " +"[code]signal[/code], [code]target[/code], e [code]method[/code]." #: doc/classes/Object.xml msgid "" @@ -41195,7 +41248,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -41712,11 +41767,11 @@ msgstr "Restituisce l'angolo al vettore dato, in radianti." #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -41750,11 +41805,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -41776,11 +41831,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42304,11 +42359,12 @@ msgid "" msgstr "" #: doc/classes/OS.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the [b]OK[/b] button should appear on the left " "and [b]Cancel[/b] on the right." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce [code]true[/code] se il tasto [b]OK[/b] debba apparire a " +"sinistra e [b]Cancel[/b] a destra." #: doc/classes/OS.xml msgid "" @@ -42320,11 +42376,12 @@ msgid "" msgstr "" #: doc/classes/OS.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the input scancode corresponds to a Unicode " "character." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce [code]true[/code] se l'input scancode corrisponde a un carattere " +"Unicode." #: doc/classes/OS.xml msgid "" @@ -43140,7 +43197,6 @@ msgid "" msgstr "" #: doc/classes/PacketPeer.xml -#, fuzzy msgid "" "[i]Deprecated.[/i] Use [code]get_var[/code] and [code]put_var[/code] " "parameters instead.\n" @@ -43150,12 +43206,14 @@ msgid "" "Do not use this option if the serialized object comes from untrusted sources " "to avoid potential security threats such as remote code execution." msgstr "" -"Decodifica un byte array in un valore. Quando [code]allow_objects[/code] è " -"[code]true[/code], decodificare gli oggetti è permesso.\n" -"[b]ATTENZIONE:[/b] Deserializzare un oggetto può contenere codice che verrà " +"[i]Deprecated.[/i] Usa i parametri [code]get_var[/code] e [code]put_var[/" +"code] piuttosto.\n" +"Se [code]true[/code], il PacketPeer consentirà la codifica e decodifica di " +"oggetti tramite [method get_var] and [method put_var].\n" +"[b]Attenzione:[/b] Oggetti deserializzati possono contenere codice che verrà " "eseguito. Non usare questa opzione se l'oggetto serializzato arriva da fonti " -"sconosciute per evitare potenziali pericoli di sicurezza (remote code " -"execution, esecuzione di codice remoto)." +"inaffidabili per evitare potenziali minacce di sicurezza come esecuzione di " +"codice remoto." #: doc/classes/PacketPeer.xml msgid "" @@ -43659,6 +43717,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -46826,11 +46894,12 @@ msgstr "" #: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml #: doc/classes/PoolStringArray.xml doc/classes/PoolVector2Array.xml #: doc/classes/PoolVector3Array.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the array contains the given value.\n" "[b]Note:[/b] This is equivalent to using the [code]in[/code] operator." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Ritorna [code]true[/code] se il vettore contiene il dato valore.\n" +"[b]Nota:[/b] Ciò equivale ad utilizzare il [code]in[/code] operatore." #: doc/classes/PoolByteArray.xml msgid "" @@ -47084,11 +47153,12 @@ msgid "Appends a [PoolStringArray] at the end of this array." msgstr "" #: doc/classes/PoolStringArray.xml -#, fuzzy msgid "" "Returns a [String] with each element of the array joined with the given " "[code]delimiter[/code]." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce una [String] con cui ogni elemento del vettore aderì con il dato " +"[code]delimiter[/code]." #: doc/classes/PoolStringArray.xml msgid "Appends a string element at end of the array." @@ -47570,11 +47640,13 @@ msgid "" msgstr "" #: doc/classes/PopupMenu.xml -#, fuzzy msgid "" "Sets the currently focused item as the given [code]index[/code].\n" "Passing [code]-1[/code] as the index makes so that no item is focused." -msgstr "Calcola il prodotto vettoriale di questo vettore e [code]with[/code]." +msgstr "" +"Imposta l'attuale elemento focalizzato come il dato [code]index[/code].\n" +"Passando [code]-1[/code] come indice fa in modo che nessun elemento venga " +"focalizzato." #: doc/classes/PopupMenu.xml msgid "Hides the [PopupMenu] when the window loses focus." @@ -51264,15 +51336,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51911,14 +51990,14 @@ msgid "Returns the inverse of the quaternion." msgstr "" #: doc/classes/Quat.xml -#, fuzzy msgid "" "Returns [code]true[/code] if this quaternion and [code]quat[/code] are " "approximately equal, by running [method @GDScript.is_equal_approx] on each " "component." msgstr "" -"Restituisce [code]true[/code] se [code]a[/code] e [code]b[/code] sono " -"approssimativamente uguali tra di loro." +"Restituisce [code]true[/code] se questo quaternione e [code]quat[/code] " +"sono approssimativament eguali, avviando [method @GDScript.is_equal_approx] " +"su ogni componente." #: doc/classes/Quat.xml msgid "Returns whether the quaternion is normalized or not." @@ -52875,17 +52954,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -52894,8 +52984,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -53299,11 +53395,12 @@ msgid "" msgstr "" #: doc/classes/ResourceInteractiveLoader.xml -#, fuzzy msgid "" "Returns the loaded resource if the load operation completed successfully, " "[code]null[/code] otherwise." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce la fonte caricata se l'operazione caricata è stata completata " +"con successo, [code]null[/code] altrimenti." #: doc/classes/ResourceInteractiveLoader.xml msgid "" @@ -55614,7 +55711,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -57453,7 +57554,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -58835,7 +58938,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -58851,7 +58957,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -61956,20 +62064,20 @@ msgid "" msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/TextEdit.xml -#, fuzzy msgid "" "Returns [code]true[/code] when the specified [code]line[/code] has a " "breakpoint." -msgstr "Ritorna [code]true[/code] se [Rect2i] contiene un punto." +msgstr "" +"Restituisce [code]true[/code] quando lo specificato [code]line[/code] ha un " +"breakpoint." #: doc/classes/TextEdit.xml -#, fuzzy msgid "" "Returns [code]true[/code] when the specified [code]line[/code] is marked as " "safe." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce [code]true[/code] quando lo specifico [code]line[/code] è " +"marcato come sicuro." #: doc/classes/TextEdit.xml #, fuzzy @@ -61977,13 +62085,12 @@ msgid "Returns if the given line is wrapped." msgstr "Restituisce la tangente del parametro." #: doc/classes/TextEdit.xml -#, fuzzy msgid "" "Returns whether the mouse is over selection. If [code]edges[/code] is " "[code]true[/code], the edges are considered part of the selection." msgstr "" -"Restituisce [code]true[/code] se [code]a[/code] e [code]b[/code] sono " -"approssimativamente uguali tra di loro." +"Restituisce se il mouse è sotto selezione. Se [code]edges[/code] è " +"[code]true[/code], gli angoli sono considerati parte della selezione" #: doc/classes/TextEdit.xml msgid "Returns [code]true[/code] if the selection is active." @@ -63034,11 +63141,12 @@ msgid "" msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " "theme has [code]theme_type[/code]." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Pulisce l'elemento del tema di [code]data_type[/code] a [code]name[/code] se " +"il tema contiene [code]theme_type[/code]." #: doc/classes/Theme.xml msgid "" @@ -63062,12 +63170,14 @@ msgid "" msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " "name, for use in [method get_color], if the theme has [code]theme_type[/" "code]." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce tutto il [Color]s come un [PoolStringArray] riempito di " +"[Color]'s nomi, per utilizzo in [method get_color], se il tema ha " +"[code]theme_type[/code]." #: doc/classes/Theme.xml msgid "" @@ -63083,12 +63193,14 @@ msgid "" msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " "name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce tutte le costanti come [PoolStringArray] carico dei nomi di ogni " +"costante, per utilizzo in [method get_constant], se il tema contiene " +"[code]theme_type[/code]." #: doc/classes/Theme.xml msgid "" @@ -63105,11 +63217,12 @@ msgid "" msgstr "" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " "name, for use in [method get_font], if the theme has [code]theme_type[/code]." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce i [Font]s come [PoolStringArray] carico con ogni [Font]'s nomi, " +"per utilizzo in [method get_font], se il tema ha [code]theme_type[/code]." #: doc/classes/Theme.xml msgid "" @@ -63125,11 +63238,13 @@ msgid "" msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " "name, for use in [method get_icon], if the theme has [code]theme_type[/code]." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce tutte le icona come [PoolStringArray] cariche di ogni " +"[Texture]'s nomi, per utilizzo in [method get_icon], se il tema contiene " +"[code]theme_type[/code]." #: doc/classes/Theme.xml msgid "" @@ -63202,83 +63317,87 @@ msgid "" msgstr "" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns a list of all type variations for the given [code]base_type[/code]." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce una lista di tutti i tipi di variazioni per il dato " +"[code]base_type[/code]." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " "[code]theme_type[/code].\n" "Returns [code]false[/code] if the theme does not have [code]theme_type[/" "code]." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce [code]true[/code] se [Color] con [code]name[/code] è in " +"[code]theme_type[/code].\n" +"Restituisce [code]false[/code] se il tema non ha [code]theme_type[/code]." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " "[code]theme_type[/code].\n" "Returns [code]false[/code] if the theme does not have [code]theme_type[/" "code]." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce [code]true[/code] se costante con [code]name[/code] è in " +"[code]theme_type[/code].\n" +"Restituisce [code]false[/code] se il tema non contiene [code]theme_type[/" +"code]." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if this theme has a valid [member default_font] " "value." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce [code]true[/code] se questo tema ha un valido [member " +"default_font] valore." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " "[code]theme_type[/code].\n" "Returns [code]false[/code] if the theme does not have [code]theme_type[/" "code]." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce [code]true[/code] se [Font] con [code]name[/code] è in " +"[code]theme_type[/code].\n" +"Restituisce [code]false[/code] se il tema non contiene [code]theme_type[/" +"code]." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " "[code]theme_type[/code].\n" "Returns [code]false[/code] if the theme does not have [code]theme_type[/" "code]." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce [code]true[/code] se l'icona [Texture] con [code]name[/code] è " +"in [code]theme_type[/code].\n" +"Restituisce [code]false[/code] se il tema non ha [code]theme_type[/code]." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " "[code]theme_type[/code].\n" "Returns [code]false[/code] if the theme does not have [code]theme_type[/" "code]." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce [code]true[/code] se [StyleBox] con [code]name[/code] è in " +"[code]theme_type[/code].\n" +"Restituisce [code]false[/code] se il tema non ha [code]theme_type[/code]." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " "[code]name[/code] is in [code]theme_type[/code].\n" "Returns [code]false[/code] if the theme does not have [code]theme_type[/" "code]." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Restituisce [code]true[/code] se un elemento del tema di [code]data_type[/" +"code] con [code]name[/code] è in [code]theme_type[/code].\n" +"Restituisce [code]false[/code] se il tema non ha [code]theme_type[/code]." #: doc/classes/Theme.xml #, fuzzy @@ -63306,44 +63425,54 @@ msgid "" msgstr "" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " "theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Rinomina il [Color] da [code]old_name[/code] a [code]name[/code] se il tema " +"ha [code]theme_type[/code]. Se [code]name[/code] è già occupato, questo " +"metodo non può funzionare." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " "theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Rinomina la costante da [code]old_name[/code] a [code]name[/code] se il tema " +"ha [code]theme_type[/code]. Se [code]name[/code] è già occupato, questo " +"metodo non può funzionare." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " "theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Rinomina il [Font] da [code]old_name[/code] a [code]name[/code] se il tema " +"ha [code]theme_type[/code]. Se [code]name[/code] è già occupato, questo " +"metodo non può funzionare." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " "has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Rinomina l'icona da [code]old_name[/code] a [code]name[/code] se il tema ha " +"[code]theme_type[/code]. Se [code]name[/code] è già occupato, questo metodo " +"non può funzionare." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " "theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Rinomina [StyleBox] da [code]old_name[/code] a [code]name[/code] se il tema " +"ha [code]theme_type[/code]. Se [code]name[/code] è già occupato, questo " +"metodo non può funzionare." #: doc/classes/Theme.xml msgid "" @@ -63353,57 +63482,56 @@ msgid "" msgstr "" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " "[code]theme_type[/code].\n" "Creates [code]theme_type[/code] if the theme does not have it." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Imposta il [Color] del tema da [code]color[/code] a [code]name[/code] in " +"[code]theme_type[/code].\n" +"Crea [code]theme_type[/code] se il tema non ce l'ha." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " "[code]theme_type[/code].\n" "Creates [code]theme_type[/code] if the theme does not have it." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Imposta la costante del tema da [code]constant[/code] a [code]name[/code] in " +"[code]theme_type[/code].\n" +"Crea [code]theme_type[/code]se il tema non ce l'ha." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " "[code]theme_type[/code].\n" "Creates [code]theme_type[/code] if the theme does not have it." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Imposta il [Font] del tema da [code]font[/code] a [code]name[/code] in " +"[code]theme_type[/code].\n" +"Crea [code]theme_type[/code] se il tema non ce l'ha." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " "in [code]theme_type[/code].\n" "Creates [code]theme_type[/code] if the theme does not have it." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Imposta l'icona del tema [Texture] da [code]texture[/code] a [code]name[/" +"code] in [code]theme_type[/code].\n" +"Crea [code]theme_type[/code] se il tema non ce l'ha." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " "[code]theme_type[/code].\n" "Creates [code]theme_type[/code] if the theme does not have it." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Imposta lo [StyleBox] del tema da [code]stylebox[/code] a [code]name[/code] " +"in [code]theme_type[/code].\n" +"Crea [code]theme_type[/code] se il tema non ce l'ha." #: doc/classes/Theme.xml -#, fuzzy msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " "[code]name[/code] in [code]theme_type[/code].\n" @@ -63411,8 +63539,11 @@ msgid "" "code].\n" "Creates [code]theme_type[/code] if the theme does not have it." msgstr "" -"Ritorna [code]true[/code] se l'impostazione specificata da [code]name[/code] " -"esiste, [code]false[/code] altrimenti." +"Imposta l'elemento del tema di [code]data_type[/code] da [code]value[/code] " +"a [code]name[/code] in [code]theme_type[/code].\n" +"Non funziona se il modello [code]value[/code] non combacia con " +"[code]data_type[/code].\n" +"Crea [code]theme_type[/code] se il tema non ce l'ha." #: doc/classes/Theme.xml msgid "" @@ -65695,9 +65826,8 @@ msgid "" msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." #: doc/classes/TreeItem.xml -#, fuzzy msgid "Returns the number of buttons in column [code]column[/code]." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "Restituisce il numero dei tasti in colonna [code]column[/code]." #: doc/classes/TreeItem.xml #, fuzzy @@ -67300,12 +67430,12 @@ msgid "" msgstr "" #: doc/classes/Vector2.xml doc/classes/Vector3.xml -#, fuzzy msgid "" "Returns [code]true[/code] if the vector is normalized, [code]false[/code] " "otherwise." msgstr "" -"Ritorna [code]true[/code] se il vettore è normalizzato, o falso altrimenti." +"Restituisce [code]true[/code] se il vettore è normalizzato, [code]false[/" +"code] altrimenti." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "Returns the length (magnitude) of this vector." @@ -67332,13 +67462,12 @@ msgid "" msgstr "" #: doc/classes/Vector2.xml doc/classes/Vector3.xml -#, fuzzy msgid "" "Returns a new vector moved toward [code]to[/code] by the fixed [code]delta[/" "code] amount. Will not go past the final value." msgstr "" -"Restituisce [code]true[/code] se [code]a[/code] e [code]b[/code] sono " -"approssimativamente uguali tra di loro." +"Restituisce un nuovo vettore mosso verso [code]to[/code] da una quantità " +"fissa [code]delta[/code]. Non va oltre il valore finale." #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -68226,10 +68355,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -68240,8 +68374,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -68305,11 +68439,12 @@ msgid "" msgstr "" #: doc/classes/Viewport.xml -#, fuzzy msgid "" "If [code]true[/code], the viewport will use a unique copy of the [World] " "defined in [member world]." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Se [code]true[/code], il viewport utilizzerà una copia unica del [World] " +"definito in [member world]." #: doc/classes/Viewport.xml msgid "" @@ -68399,7 +68534,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -68931,6 +69068,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" @@ -70125,7 +70278,6 @@ msgid "Pi divided by two: [code]1.570796[/code]." msgstr "" #: modules/visual_script/doc_classes/VisualScriptMathConstant.xml -#, fuzzy msgid "Tau: [code]6.283185[/code]." msgstr "Tau: [code]6.283185[/code]." @@ -70140,9 +70292,8 @@ msgid "Square root of two: [code]1.414214[/code]." msgstr "" #: modules/visual_script/doc_classes/VisualScriptMathConstant.xml -#, fuzzy msgid "Infinity: [code]inf[/code]." -msgstr "Infinito: [code]inf[/code]." +msgstr "Infinità : [code]inf[/code]." #: modules/visual_script/doc_classes/VisualScriptMathConstant.xml msgid "Not a number: [code]nan[/code]." @@ -71887,11 +72038,12 @@ msgid "Returns the value of a certain material's parameter." msgstr "" #: doc/classes/VisualServer.xml -#, fuzzy msgid "" "Returns the default value for the param if available. Returns [code]null[/" "code] otherwise." -msgstr "Ritorna [code]true[/code] se [code]s[/code] è zero o quasi zero." +msgstr "" +"Restituisce il valore predefinito per il parametro, se disponibile. " +"Altrimenti restituisce [code]null[/code]." #: doc/classes/VisualServer.xml msgid "" @@ -76974,19 +77126,21 @@ msgid "" "Gets the value of the attribute specified by the index in [code]idx[/code] " "argument." msgstr "" -"Prende il nome dell'attributo specificato dall'indice nell'argomento " +"Prende il valore dell'attributo specificato dall'indice nell'argomento " "[code]idx[/code]." #: doc/classes/XMLParser.xml -#, fuzzy msgid "Gets the current line in the parsed file (currently not implemented)." -msgstr "Prende la linea corrente nel file analizzato (non ancora implementato)" +msgstr "" +"Prende la linea corrente nel file analizzato (non ancora implementato)." #: doc/classes/XMLParser.xml msgid "" "Gets the value of a certain attribute of the current element by name. This " "will raise an error if the element has no such attribute." msgstr "" +"Prende il valore di un certo attributo dell'elemento corrente usando il " +"nome. Questo darà errore se l'elemento non ha tale attributo." #: doc/classes/XMLParser.xml msgid "" @@ -77061,13 +77215,12 @@ msgstr "" "legge il nodo seguente. Questo ritorna un codice errore." #: doc/classes/XMLParser.xml -#, fuzzy msgid "" "Skips the current section. If the node contains other elements, they will be " "ignored and the cursor will go to the closing of the current element." msgstr "" "Salta la sezione corrente. Se il nodo contiene altri elementi, questi " -"saranno ignorati e il cursore andrà alla chiusura dell'elemento corrente" +"saranno ignorati e il cursore andrà alla chiusura dell'elemento corrente." #: doc/classes/XMLParser.xml #, fuzzy diff --git a/doc/translations/ja.po b/doc/translations/ja.po index f5217e9b83..cabf1da54a 100644 --- a/doc/translations/ja.po +++ b/doc/translations/ja.po @@ -12,12 +12,13 @@ # Tarou Yamada <mizuningyou@yahoo.co.jp>, 2021. # sugusan <sugusan.development@gmail.com>, 2022. # Juto <mvobujd237@gmail.com>, 2022. +# ta ko <neji.cion@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-02-14 22:08+0000\n" -"Last-Translator: Wataru Onuki <bettawat@yahoo.co.jp>\n" +"PO-Revision-Date: 2022-11-21 00:47+0000\n" +"Last-Translator: ta ko <neji.cion@gmail.com>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/ja/>\n" "Language: ja\n" @@ -25,7 +26,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.11-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -713,8 +714,10 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -729,7 +732,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" "ç¾åœ¨ã®ã‚³ãƒ¼ãƒ«ã‚¹ã‚¿ãƒƒã‚¯ã‚’辞書ã®é…列ã¨ã—ã¦è¿”ã—ã¾ã™ã€‚\n" "[codeblock]\n" @@ -1358,19 +1365,17 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" -"コードä½ç½®ã®ã‚¹ã‚¿ãƒƒã‚¯ãƒˆãƒ©ãƒƒã‚¯ã‚’表示ã—ã¾ã™ã€‚デãƒãƒƒã‚¬ã‚’有効ã«ã—ã¦å®Ÿè¡Œã—ãŸæ™‚ã«ã®" -"ã¿å‹•作ã—ã¾ã™ã€‚\n" -"コンソール内ã§ã®å‡ºåŠ›ã¯ã“ã®ã‚ˆã†ã«ãªã‚Šã¾ã™:\n" -"[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1600,6 +1605,41 @@ msgid "" "3\n" "[/codeblock]" msgstr "" +":指定ã•れãŸç¯„囲ã®é…列を返ã—ã¾ã™ã€‚[method range] ã¯3ã¤ã®æ–¹æ³•ã§å‘¼ã³å‡ºã™ã“ã¨ãŒã§" +"ãã¾ã™ã€‚\n" +"[code]range(n: int)[/code]:0ã‹ã‚‰å§‹ã¾ã‚Šã€1ãšã¤å¢—åŠ ã—ã€[code]n[/code]ã®[i]å‰ [/" +"i] ã§åœæ¢ã—ã€å¼•æ•°[code]n[/code]ã¯[b]å«ã¾ã‚Œã¾ã›ã‚“[/b]。[i]\n" +"[code]range(b: int, n: int)[/code]:[code]b[/code]ã‹ã‚‰å§‹ã¾ã‚Šã€1ãšã¤å¢—åŠ ã—ã€" +"[code]n[/code]ã® [i] å‰ [/i] ã§åœæ¢ã—ã¾ã™ã€‚引数 [code]b[/code] 㯠[b] å«ã¾ã‚Œ" +"ã¾ã™[/b] ãŒã€ [code]n[/code] 㯠[b]å«ã¾ã‚Œã¾ã›ã‚“[/b] 。\n" +"[code]range(b: int, n: int, s: int)[/code]:[code]b[/code]ã‹ã‚‰å§‹ã¾ã‚Šã€" +"[code]s[/code]ã®ã‚¹ãƒ†ãƒƒãƒ—ã§å¢—åŠ /減少ã—ã€[code]n[/code]ã®[i]å‰ [/i] ã§åœæ¢ã—ã¾" +"ã™ã€‚引数 [code]b[/code] 㯠[b] å«ã¾ã‚Œã¾ã™[/b] ãŒã€ [code]n[/code] 㯠[b]å«ã¾" +"れã¾ã›ã‚“[/b] 。。引数 [code]s[/code] [b]can[/b] ã¯è² ã®å€¤ã‚’指定ã§ãã¾ã™ãŒã€" +"[code]0[/code] ã¯æŒ‡å®šã§ãã¾ã›ã‚“。[code]s[/code] ㌠[code]0[/code] ã®å ´åˆã€ã‚¨" +"ラーメッセージãŒå‡ºåŠ›ã•れã¾ã™ã€‚\n" +"[method range]ã¯ã€å‡¦ç†å‰ã«ã™ã¹ã¦ã®å¼•æ•°ã‚’[int]ã«å¤‰æ›ã—ã¾ã™\n" +"[b]注:[/b] 値ã®åˆ¶ç´„を満ãŸã™å€¤ãŒãªã„å ´åˆã€ç©ºã®é…列を返ã—ã¾ã™ã€‚(例:" +"[code]range(2, 5, -1)[/code] ã¾ãŸã¯ [code]range(5, 5, 1)[/code])\n" +"Examples:\n" +"[codeblock]\n" +"print(range(4)) # [0, 1, 2, 3]ã¨å‡ºåŠ›ã™ã‚‹\n" +"print(range(2, 5)) # [2, 3, 4]ã¨å‡ºåŠ›ã™ã‚‹\n" +"print(range(0, 6, 2)) # [0, 2, 4]ã¨å‡ºåŠ›ã™ã‚‹\n" +"print(range(4, 1, -1)) # [4, 3, 2]ã¨å‡ºåŠ›ã™ã‚‹\n" +"[/codeblock]\n" +"[Array]を後方ã‹ã‚‰å‚ç…§ã™ã‚‹ã«ã¯\n" +"[codeblock]\n" +"var array = [3, 6, 9]\n" +"for i in range(array.size(), 0, -1):\n" +" print(array[i - 1])\n" +"[/codeblock]\n" +"Output:\n" +"[codeblock]\n" +"9\n" +"6\n" +"3\n" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -4465,6 +4505,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "ç”»åƒã¯ãƒã‚¹ãƒ¬ã‚¹åœ§ç¸®ã«ã‚ˆã‚Šåœ§ç¸®ã•れã¦ã„ã‚‹ã¨ã„ã†ãƒ’ント。" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" "プãƒãƒ‘ティã¯ã‚·ãƒªã‚¢ãƒ©ã‚¤ã‚ºã•れã€ã‚·ãƒ¼ãƒ³ãƒ•ァイルã«ä¿å˜ã•れã¾ã™ (デフォルト) 。" @@ -5298,8 +5358,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -9145,7 +9204,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -9370,8 +9432,12 @@ msgstr "" "[code]step[/code]ã¯ã‚¹ãƒ©ã‚¤ã‚¹ä¸ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹é–“ã®å¤‰åŒ–を表ã—ã¾ã™ã€‚" #: doc/classes/Array.xml +#, fuzzy msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -9401,9 +9467,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -12624,12 +12694,14 @@ msgid "Clears the audio sample data buffer." msgstr "byteã§æ ¼ç´ã•れãŸã‚ªãƒ¼ãƒ‡ã‚£ã‚ªãƒ‡ãƒ¼ã‚¿ã§ã™ã€‚" #: doc/classes/AudioStreamGeneratorPlayback.xml +#, fuzzy msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" +"[code]name[/code] ã¨ã„ã†åå‰ã§æŒ‡å®šã—ãŸè¨å®šãŒå˜åœ¨ã™ã‚‹å ´åˆã¯ [code]true[/" +"code]ã€ãã†ã§ãªã„å ´åˆã¯ [code]false[/code] ã‚’è¿”ã—ã¾ã™ã€‚" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" @@ -13234,14 +13306,14 @@ msgstr "" #, fuzzy msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" "ç¾åœ¨è¡¨ç¤ºã•れã¦ã„ã‚‹ç”»é¢ã‚’ãƒãƒƒã‚¯ãƒãƒƒãƒ•ァリングã™ã‚‹ãŸã‚ã®ãƒŽãƒ¼ãƒ‰ã€‚BackBufferCopy " @@ -13260,27 +13332,31 @@ msgid "Buffer mode. See [enum CopyMode] constants." msgstr "ãƒãƒƒãƒ•ァモード。 [enum CopyMode]定数をå‚ç…§ã—ã¦ãã ã•ã„。" #: doc/classes/BackBufferCopy.xml +#, fuzzy msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" "BackBufferCopyã§ã‚«ãƒãƒ¼ã•ã‚Œã‚‹é ˜åŸŸã€‚ [member copy_mode]ãŒ[constant " "COPY_MODE_RECT]ã®å ´åˆã«ã®ã¿ä½¿ç”¨ã•れã¾ã™ã€‚" #: doc/classes/BackBufferCopy.xml +#, fuzzy msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" "ãƒãƒƒãƒ•ァリング モードを無効ã«ã—ã¾ã™ã€‚ã¤ã¾ã‚Šã€BackBufferCopy ノードã¯ã€ã‚«ãƒãƒ¼" "ã™ã‚‹ç”»é¢ã®éƒ¨åˆ†ã‚’直接使用ã—ã¾ã™ã€‚" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +#, fuzzy +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "BackBufferCopyã¯çŸ©å½¢é ˜åŸŸã‚’ãƒãƒƒãƒ•ァリングã—ã¾ã™ã€‚" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +#, fuzzy +msgid "[BackBufferCopy] buffers the entire screen." msgstr "BackBufferCopy ã¯ç”»é¢å…¨ä½“ã‚’ãƒãƒƒãƒ•ァリングã—ã¾ã™ã€‚" #: doc/classes/BakedLightmap.xml @@ -22403,6 +22479,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -25251,7 +25335,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -36132,7 +36219,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -39500,7 +39589,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -39757,7 +39849,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -40489,6 +40584,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -43312,7 +43410,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -43832,11 +43932,11 @@ msgstr "指定ã•れãŸåå‰ã®ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³ãƒŽãƒ¼ãƒ‰ã‚’è¿”ã—ã¾ã™ã€‚ #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -43870,11 +43970,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -43896,11 +43996,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -45792,6 +45892,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -53439,15 +53549,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -55065,17 +55182,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -55084,8 +55212,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -57829,7 +57963,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -59676,7 +59814,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -61322,7 +61462,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -61338,7 +61481,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -70808,10 +70953,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -70822,8 +70972,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -70980,7 +71130,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -71521,6 +71673,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/ko.po b/doc/translations/ko.po index a744804896..72a7780a4c 100644 --- a/doc/translations/ko.po +++ b/doc/translations/ko.po @@ -18,12 +18,13 @@ # 김태우 <ogosengi3@gmail.com>, 2022. # ì´ì§€ë¯¼ <jiminaleejung@gmail.com>, 2022. # nulltable <un5450@naver.com>, 2022. +# Godoto <aicompose@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-09-26 05:24+0000\n" -"Last-Translator: nulltable <un5450@naver.com>\n" +"PO-Revision-Date: 2022-10-18 18:00+0000\n" +"Last-Translator: Godoto <aicompose@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/ko/>\n" "Language: ko\n" @@ -31,7 +32,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -47,7 +48,7 @@ msgstr "ì†ì„±" #: doc/tools/make_rst.py msgid "Methods" -msgstr "메서드" +msgstr "방법" #: doc/tools/make_rst.py msgid "Theme Properties" @@ -55,11 +56,11 @@ msgstr "테마 ì†ì„±ë“¤" #: doc/tools/make_rst.py msgid "Signals" -msgstr "시그ë„" +msgstr "ì‹ í˜¸" #: doc/tools/make_rst.py msgid "Enumerations" -msgstr "열거형" +msgstr "목ë¡" #: doc/tools/make_rst.py msgid "Constants" @@ -626,7 +627,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -641,7 +643,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1028,12 +1034,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3659,6 +3669,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4343,8 +4373,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7264,7 +7293,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7449,6 +7481,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7468,9 +7503,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10109,10 +10148,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10644,14 +10682,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10661,22 +10699,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19513,6 +19551,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22408,7 +22454,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -33147,7 +33196,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36475,7 +36526,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36725,7 +36779,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37442,6 +37499,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -40378,7 +40438,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40894,11 +40956,11 @@ msgstr "ë§¤ê°œë³€ìˆ˜ì˜ ì•„í¬ì‚¬ì¸ ê°’ì„ ë°˜í™˜í•©ë‹ˆë‹¤." #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40932,11 +40994,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40958,11 +41020,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42824,6 +42886,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -50425,15 +50497,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -52030,17 +52109,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -52049,8 +52139,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54766,7 +54862,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56603,7 +56703,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57981,7 +58083,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57997,7 +58102,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -67281,10 +67388,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -67295,8 +67407,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -67448,7 +67560,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67980,6 +68094,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/lt.po b/doc/translations/lt.po index f744f60e12..1cf0ffef48 100644 --- a/doc/translations/lt.po +++ b/doc/translations/lt.po @@ -485,7 +485,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -500,7 +501,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -873,12 +878,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3489,6 +3498,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4173,8 +4202,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7091,7 +7119,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7276,6 +7307,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7295,9 +7329,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9935,10 +9973,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10470,14 +10507,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10487,22 +10524,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19282,6 +19319,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22114,7 +22159,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32826,7 +32874,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36124,7 +36174,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36372,7 +36425,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37082,6 +37138,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39888,7 +39947,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40399,11 +40460,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40437,11 +40498,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40463,11 +40524,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42314,6 +42375,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49906,15 +49977,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51510,17 +51588,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51529,8 +51618,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54245,7 +54340,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56082,7 +56181,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57460,7 +57561,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57476,7 +57580,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66713,10 +66819,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66727,8 +66838,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66880,7 +66991,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67412,6 +67525,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/lv.po b/doc/translations/lv.po index 1b6d5f9cd5..fd9ddf6f51 100644 --- a/doc/translations/lv.po +++ b/doc/translations/lv.po @@ -490,7 +490,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -505,7 +506,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -878,12 +883,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3494,6 +3503,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4178,8 +4207,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7096,7 +7124,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7281,6 +7312,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7300,9 +7334,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9940,10 +9978,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10475,14 +10512,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10492,22 +10529,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19287,6 +19324,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22119,7 +22164,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32834,7 +32882,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36132,7 +36182,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36380,7 +36433,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37090,6 +37146,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39896,7 +39955,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40407,11 +40468,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40445,11 +40506,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40471,11 +40532,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42322,6 +42383,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49914,15 +49985,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51518,17 +51596,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51537,8 +51626,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54253,7 +54348,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56090,7 +56189,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57468,7 +57569,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57484,7 +57588,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66721,10 +66827,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66735,8 +66846,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66888,7 +66999,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67420,6 +67533,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/mr.po b/doc/translations/mr.po index 3636dbf68f..19db2e5f94 100644 --- a/doc/translations/mr.po +++ b/doc/translations/mr.po @@ -473,7 +473,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -488,7 +489,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -861,12 +866,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3477,6 +3486,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4161,8 +4190,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7079,7 +7107,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7264,6 +7295,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7283,9 +7317,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9923,10 +9961,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10458,14 +10495,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10475,22 +10512,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19270,6 +19307,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22102,7 +22147,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32814,7 +32862,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36112,7 +36162,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36360,7 +36413,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37070,6 +37126,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39876,7 +39935,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40387,11 +40448,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40425,11 +40486,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40451,11 +40512,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42302,6 +42363,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49894,15 +49965,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51498,17 +51576,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51517,8 +51606,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54233,7 +54328,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56070,7 +56169,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57448,7 +57549,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57464,7 +57568,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66701,10 +66807,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66715,8 +66826,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66868,7 +66979,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67400,6 +67513,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/nb.po b/doc/translations/nb.po index 9a861d8287..3b7f482e48 100644 --- a/doc/translations/nb.po +++ b/doc/translations/nb.po @@ -485,7 +485,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -500,7 +501,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -873,12 +878,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3489,6 +3498,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4173,8 +4202,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7091,7 +7119,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7276,6 +7307,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7295,9 +7329,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9935,10 +9973,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10470,14 +10507,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10487,22 +10524,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19282,6 +19319,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22114,7 +22159,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32826,7 +32874,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36124,7 +36174,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36372,7 +36425,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37082,6 +37138,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39888,7 +39947,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40399,11 +40460,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40437,11 +40498,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40463,11 +40524,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42314,6 +42375,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49906,15 +49977,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51510,17 +51588,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51529,8 +51618,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54245,7 +54340,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56082,7 +56181,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57460,7 +57561,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57476,7 +57580,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66713,10 +66819,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66727,8 +66838,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66880,7 +66991,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67412,6 +67525,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/ne.po b/doc/translations/ne.po index 84cf5c569c..c616f7b4e1 100644 --- a/doc/translations/ne.po +++ b/doc/translations/ne.po @@ -473,7 +473,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -488,7 +489,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -861,12 +866,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3477,6 +3486,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4161,8 +4190,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7079,7 +7107,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7264,6 +7295,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7283,9 +7317,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9923,10 +9961,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10458,14 +10495,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10475,22 +10512,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19270,6 +19307,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22102,7 +22147,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32814,7 +32862,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36112,7 +36162,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36360,7 +36413,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37070,6 +37126,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39876,7 +39935,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40387,11 +40448,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40425,11 +40486,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40451,11 +40512,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42302,6 +42363,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49894,15 +49965,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51498,17 +51576,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51517,8 +51606,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54233,7 +54328,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56070,7 +56169,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57448,7 +57549,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57464,7 +57568,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66701,10 +66807,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66715,8 +66826,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66868,7 +66979,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67400,6 +67513,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/nl.po b/doc/translations/nl.po index 6b89702dec..cf40d032cf 100644 --- a/doc/translations/nl.po +++ b/doc/translations/nl.po @@ -535,7 +535,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -550,7 +551,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -923,12 +928,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3547,6 +3556,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4231,8 +4260,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7149,7 +7177,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7334,6 +7365,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7353,9 +7387,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9993,10 +10031,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10528,14 +10565,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10545,22 +10582,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19340,6 +19377,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22172,7 +22217,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32887,7 +32935,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36185,7 +36235,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36433,7 +36486,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37143,6 +37199,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39949,7 +40008,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40460,11 +40521,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40498,11 +40559,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40524,11 +40585,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42375,6 +42436,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49967,15 +50038,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51571,17 +51649,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51590,8 +51679,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54307,7 +54402,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56144,7 +56243,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57522,7 +57623,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57538,7 +57642,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66775,10 +66881,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66789,8 +66900,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66942,7 +67053,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67474,6 +67587,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/pl.po b/doc/translations/pl.po index 0bc778f703..cd2bedd302 100644 --- a/doc/translations/pl.po +++ b/doc/translations/pl.po @@ -23,13 +23,14 @@ # Katarzyna Twardowska <katarina.twardowska@gmail.com>, 2022. # Mateusz ZdrzaÅ‚ek <matjozohd@gmail.com>, 2022. # Pixel Zone - Godot Engine Tutorials <karoltomaszewskimusic@gmail.com>, 2022. +# Filip GliszczyÅ„ski <filipgliszczynski@gmail.com>, 2022. +# Piotr Åšlusarz <piotrekslusarz@outlook.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-05-15 20:00+0000\n" -"Last-Translator: Pixel Zone - Godot Engine Tutorials " -"<karoltomaszewskimusic@gmail.com>\n" +"PO-Revision-Date: 2022-10-30 01:15+0000\n" +"Last-Translator: Piotr Åšlusarz <piotrekslusarz@outlook.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/pl/>\n" "Language: pl\n" @@ -38,7 +39,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14.2-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -500,7 +501,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Compares two values by checking their actual contents, recursing into any " "[Array] or [Dictionary] up to its deepest level.\n" @@ -523,17 +523,17 @@ msgstr "" "Porównuje dwie wartoÅ›ci, sprawdzajÄ…c ich rzeczywistÄ… zawartość, przechodzÄ…c " "do dowolnej „tablicy†lub „sÅ‚ownika†aż do najgłębszego poziomu.\n" "Można to porównać do [code]==[/code] na kilka sposobów:\n" -"— Dla [kod]null[/code], [kod]int[/code], [code]float[/code], [code]String[/" +"— Dla [code]null[/code], [code]int[/code], [code]float[/code], [code]String[/" "code], [code]Object[/code] i [code] RID[/code] zarówno [code]deep_equal[/" "code], jak i [code]==[/code] dziaÅ‚ajÄ… tak samo.\n" "— W przypadku [code]SÅ‚ownik[/code] [code]==[/code] uwzglÄ™dnia równość wtedy " "i tylko wtedy, gdy obie zmienne wskazujÄ… ten sam [code]SÅ‚ownik[/code], bez " "rekurencji lub Å›wiadomoÅ›ci zawartość w ogóle.\n" -"— W przypadku [kod]Tablica[/kod] [kod]==[/kod] uwzglÄ™dnia równość wtedy i " -"tylko wtedy, gdy każdy element w pierwszej [kod]Tablica[/kod] jest równy " -"swojemu odpowiednikowi w drugiej [ kod]Tablica[/kod], jak mówi sam [kod]==[/" -"kod]. Oznacza to, że [code]==[/code] jest rekursywny w [code]Tablicy[/code], " -"ale nie w [code]SÅ‚owniku[/code].\n" +"— W przypadku [code]Tablica[/code] [code]==[/code] uwzglÄ™dnia równość wtedy " +"i tylko wtedy, gdy każdy element w pierwszej [code]Tablica[/code] jest równy " +"swojemu odpowiednikowi w drugiej [code]Tablica[/code], jak mówi sam " +"[code]==[/code]. Oznacza to, że [code]==[/code] jest rekursywny w " +"[code]Tablicy[/code], ale nie w [code]SÅ‚owniku[/code].\n" "Krótko mówiÄ…c, za każdym razem, gdy potencjalnie zaangażowany jest " "[code]SÅ‚ownik[/code], jeÅ›li chcesz prawdziwego porównania uwzglÄ™dniajÄ…cego " "zawartość, musisz użyć [code]deep_equal[/code]." @@ -619,7 +619,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Rounds [code]s[/code] downward (towards negative infinity), returning the " "largest whole number that is not more than [code]s[/code].\n" @@ -633,13 +632,12 @@ msgid "" "[code]s[/code] is a non-negative number, you can use [code]int(s)[/code] " "directly." msgstr "" -"ZaokrÄ…gla [code]s[/code] w dół (do nieskoÅ„czonoÅ›ci ujemnej), zwraca " +"ZaokrÄ…gla [code]s[/code] w dół (do ujemnej nieskoÅ„czonoÅ›ci), zwraca " "najwyższÄ… liczbÄ™ caÅ‚kowitÄ… która jest nie wiÄ™ksza niż [code]s[/code].\n" "[codeblock]\n" -"# a to 2.0\n" -"a = floor(2.99)\n" -"# a to-3.0\n" -"a = floor(-2.99)\n" +"a = floor(2.45) # a to 2.0\n" +"a = floor(2.99) # a to 2.0\n" +"a = floor(-2.99) # a to-3.0\n" "[/codeblock]\n" "[b]Informacja:[/b] Ta metoda zwraca liczbÄ™ zmiennoprzecinkowÄ…, jeżeli chcesz " "liczby caÅ‚kowitej użyj bezpoÅ›rednio metody [code]int(s)[/code]." @@ -725,8 +723,10 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -741,7 +741,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" "Zwraca tablicÄ™ sÅ‚owników reprezentujÄ…cÄ… obecny stos wykonywanych funkcji.\n" "[codeblock]\n" @@ -849,6 +853,26 @@ msgid "" "See also [method lerp] which performs the reverse of this operation, and " "[method range_lerp] to map a continuous series of values to another." msgstr "" +"Zwraca współczynnik interpolacji lub ekstrapolacji w zależnoÅ›ci od zakresu " +"zdefiniowanego w [code]from[/code] i [code]to[/code] oraz wartość " +"interopolowanÄ… zdefiniowanÄ… w [code]weight[/code]. Zwrócona wartość znajduje " +"siÄ™ pomiÄ™dzy [code]0.0[/code] i [code]1.0[/code] jeÅ›li [code]weight[/code] " +"jest pomiÄ™dzy [code]from[/code] i [code]to[/code] (włącznie). JeÅ›li " +"[code]weight[/code] znajduje siÄ™ poza zakresem, współczynnik ekstrapolacji " +"zostanie zwrócony (zwraca wartość mniejszÄ… od [code]0.0[/code] lub wiÄ™kszÄ… " +"od [code]1.0[/code]). Użyj [method clamp] na wyniku [method inverse_lerp] " +"jeÅ›li chcesz tego uniknąć. \n" +"[codeblock] \n" +"# Stosunek interpolacji w zawoÅ‚aniu `lerp()` poniżej to 0.75. \n" +"var middle = lerp(20, 30, 0.75) \n" +"# `middle` ma teraz wartość 27.5. \n" +"# Teraz udajemy że zapomnieliÅ›my oryginalnego stosunku i chcemy go " +"spowrotem. \n" +"var ratio = inverse_lerp(20,30,27.5) \n" +"# `ratio` ma teraz wartość 0.75.\n" +"[/codeblock]\n" +"Zobacz również [method lerp] która powoduje odwrócenie tej operacji i " +"[method range_lerp] aby zmapować ciÄ…głą serie wartoÅ›ci do nastÄ™pnej." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1150,6 +1174,22 @@ msgid "" "[code]0[/code] rather than [code]1[/code] for non-positive values of " "[code]value[/code] (in reality, 1 is the smallest integer power of 2)." msgstr "" +"Zwraca najbliższÄ… wartość caÅ‚kowitÄ… [code]value[/code] równÄ… lub wyższÄ… " +"potÄ™dze dwójki.\n" +"Innymi sÅ‚owy, zwraca najmniejszÄ… wartość [code]a[/code] gdzie [code]a = " +"pow(2, n)[/code] wtedy i tylko wtedy gdy [code]value <= a[/code] dla jakiejÅ› " +"dodatniej liczby caÅ‚kowitej [code]n[/code].\n" +"[codeblock]\n" +"nearest_po2(3) # zwraca 4\n" +"nearest_po2(4) # zwraca 4\n" +"nearest_po2(5) # zwraca 8\n" +"\n" +"nearest_po2(0) # zwraca 0 (niekoniecznie czego byÅ› siÄ™ spodziewaÅ‚)\n" +"nearest_po2(-1) # zwraca 0 (niekoniecznie czego byÅ› siÄ™ spodziewaÅ‚)\n" +"[/codeblock]\n" +"[b]UWAGA:[/b] Z powodu sposobu implementacji, ta funkcja zwraca [code]0[/" +"code] w przeciwieÅ„stwie do [code]1[/code] dla ujemnych wartoÅ›ci [code]value[/" +"code] (w rzeczywistoÅ›ci, 1 jest najmniejszÄ… liczbÄ… caÅ‚kowitÄ… dla potÄ™gi z 2)." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1162,6 +1202,13 @@ msgid "" "[/codeblock]\n" "This is the inverse of [method char]." msgstr "" +"Zwraca liczbÄ™ caÅ‚kowitÄ… reprezentujÄ…cÄ… punkt kodu Unicode danego znaku " +"Unicode [code]char[/code]. [codeblock]\n" +"a = ord(\"A\") # a wynosi 65\n" +"a = ord(\"a\") # a wynosi 97\n" +"a = ord(\"€\") # a wynosi 8364\n" +"[/codeblock]\n" +"To jest odwrotność [metody char]." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1302,19 +1349,17 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" -"Wypisuje zrzut stosu w miejscu kodu, dziaÅ‚a tylko przy uruchamianiu z " -"włączonym debuggerem.\n" -"Wynik w konsoli wyglÄ…dać może tak:\n" -"[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -3981,6 +4026,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4665,8 +4730,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7593,7 +7657,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7778,6 +7845,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7797,9 +7867,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10438,10 +10512,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10973,14 +11046,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10990,22 +11063,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19814,6 +19887,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22656,7 +22737,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -33427,7 +33511,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36767,7 +36853,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -37023,7 +37112,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37745,6 +37837,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -40555,7 +40650,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -41074,11 +41171,11 @@ msgstr "Zwraca kÄ…t w radianach danego wektora." #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -41112,11 +41209,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -41138,11 +41235,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -43021,6 +43118,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -50624,15 +50731,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -52237,17 +52351,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -52256,8 +52381,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54976,7 +55107,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56814,7 +56949,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -58195,7 +58332,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -58211,7 +58351,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -67513,10 +67655,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -67527,8 +67674,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -67686,7 +67833,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -68218,6 +68367,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/pt.po b/doc/translations/pt.po index fce62b474f..d3d9b9aadf 100644 --- a/doc/translations/pt.po +++ b/doc/translations/pt.po @@ -18,8 +18,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-08-25 13:04+0000\n" -"Last-Translator: Baiterson <baiter160@gmail.com>\n" +"PO-Revision-Date: 2022-11-18 16:48+0000\n" +"Last-Translator: ssantos <ssantos@web.de>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/pt/>\n" "Language: pt\n" @@ -27,7 +27,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -95,7 +95,7 @@ msgstr "Setter" #: doc/tools/make_rst.py msgid "value" -msgstr "valor" +msgstr "Valor" #: doc/tools/make_rst.py msgid "Getter" @@ -721,8 +721,10 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -737,7 +739,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" "Retorna uma list de dicionários representando a pilha de chamada atual.\n" "[codeblock]\n" @@ -1386,19 +1392,17 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" -"Imprime a pilha de chamadas no local do código, só funciona com o depurador " -"ativado.\n" -"SaÃda no console vai parecer assim:\n" -"[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -4471,6 +4475,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -5159,8 +5183,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -8090,7 +8113,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -8275,6 +8301,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -8294,9 +8323,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10934,10 +10967,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -11469,14 +11501,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -11486,22 +11518,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -20332,6 +20364,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "A altura do cilindro." @@ -23167,7 +23207,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -24995,7 +25038,7 @@ msgstr "" #: doc/classes/File.xml msgid "File system" -msgstr "" +msgstr "Sistema de arquivos" #: doc/classes/File.xml msgid "" @@ -33909,7 +33952,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -37237,7 +37282,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -37488,7 +37536,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -38205,6 +38256,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -38878,9 +38932,8 @@ msgid "" msgstr "" #: doc/classes/Node.xml -#, fuzzy msgid "Nodes and Scenes" -msgstr "Nós e Cenas" +msgstr "Nós e cenas" #: doc/classes/Node.xml msgid "All Demos" @@ -41015,7 +41068,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -41528,11 +41583,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -41566,11 +41621,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -41592,11 +41647,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -43446,6 +43501,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -51104,15 +51169,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -52708,17 +52780,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -52727,8 +52810,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -55446,7 +55535,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -57285,7 +57378,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -58681,7 +58776,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -58697,7 +58795,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -67998,10 +68098,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -68012,8 +68117,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -68165,7 +68270,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -68697,6 +68804,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/pt_BR.po b/doc/translations/pt_BR.po index f6705f5e4c..463bc9c957 100644 --- a/doc/translations/pt_BR.po +++ b/doc/translations/pt_BR.po @@ -43,12 +43,14 @@ # lucas rossy brasil coelho <lucasrossy270@gmail.com>, 2022. # Felipe Kinoshita <kinofhek@gmail.com>, 2022. # Mr.Albino <ricmorsoleto@gmail.com>, 2022. +# Zer0-Zer0 <dankmemerson@tutanota.com>, 2022. +# Julio Yagami <juliohenrique31501234@hotmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-08-21 06:02+0000\n" -"Last-Translator: Jaide Alonso Ambrosio <jaide.sp@gmail.com>\n" +"PO-Revision-Date: 2022-12-09 19:48+0000\n" +"Last-Translator: Julio Yagami <juliohenrique31501234@hotmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/pt_BR/>\n" "Language: pt_BR\n" @@ -56,7 +58,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -527,7 +529,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Compares two values by checking their actual contents, recursing into any " "[Array] or [Dictionary] up to its deepest level.\n" @@ -548,13 +549,13 @@ msgid "" "code]." msgstr "" "Compara dois valores, verificando seu conteúdo real, recorrendo a qualquer " -"`Array` ou `Dicionário` até o seu nÃvel mais profundo.\n" +"[Array] ou [Dictionary] até o seu nÃvel mais profundo.\n" "Isso se compara a [code]==[/code] de várias maneiras:\n" "- Para [code]null[/code], [code]int[/code], [code]float[/code], " "[code]String[/code], [code]Object[/code] e [code]RID[/code] tanto " "[code]deep_equal[/code] quanto [code]==[/code] funcionam da mesma maneira.\n" "- Para [code]Dictionary[/code], [code]==[code] considera igualdade se, e " -"somente se, ambas as variáveis apontarem para o mesmo [code]Dictionary[/" +"somente se, ambas as variáveis apontaram para o mesmo [code]Dictionary[/" "code], sem nenhuma recorrência ou consciência do conteúdo.\n" "- Para [code]Array[/code], [code]==[/code] considera igualdade se, e somente " "se, cada item no primeiro [code]Array[/code] for igual a sua contraparte no " @@ -586,7 +587,6 @@ msgstr "" "inst2dict]), de volta em uma instância. Útil para desserialização." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns an \"eased\" value of [code]x[/code] based on an easing function " "defined with [code]curve[/code]. This easing function is based on an " @@ -615,7 +615,7 @@ msgstr "" "- Menor que -1.0 (exclusivo): Ease in-out\n" "- 1.0: Linear\n" "- Entre -1.0 e 0.0 (exclusivo): Ease out-in\n" -"- 0.0: Constant\n" +"- 0.0: Constante\n" "- Entre 0.0 e 1.0 (exclusivo): Ease in\n" "- 1.0: Linear\n" "- Maior que 1.0 (exclusivo): Ease out\n" @@ -752,8 +752,10 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -768,7 +770,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" "Retorna uma list de dicionários representando a pilha de chamada atual.\n" "[codeblock]\n" @@ -949,7 +955,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " @@ -973,24 +978,25 @@ msgid "" msgstr "" "Interpola linearmente entre dois valores pelo fator definido em " "[code]weight[/code]. Para realizar a interpolação, [code]weight[/code] deve " -"estar entre [code]0.0[/code] e [code]1.0[/code] (inclusive). No entanto, " +"estar entre [code]0.0[/code] e [code]1.0[/code] (inclusivo). No entanto, " "valores fora desse intervalo são permitidos e podem ser usados para realizar " -"[i]extrapolação[/i].\n" +"[i]extrapolação[/i]. Use [method clamp] no resultado de [method lerp] se " +"isso não é desejado.\n" "Se os argumentos [code]from[/code] e [code]to[/code] forem do tipo [int] ou " "[float], o valor de retorno será um [float].\n" "Se ambos forem do mesmo tipo de vetor ([Vector2], [Vector3] ou [Color]), o " "valor de retorno será do mesmo tipo([code]lerp[/code] então chama o método " "[code]linear_interpolate[/code] do tipo de vetor).\n" "[codeblock]\n" -"lerp(0, 4, 0,75) # Retorna 3,0\n" +"lerp(0, 4, 0,75) # Retorna 3.0\n" "lerp(Vetor2(1, 5), Vetor2(3, 2), 0.5) # Retorna Vetor2(2, 3.5)\n" "[/codeblock]\n" "Veja também [method inverse_lerp] que realiza o inverso desta operação. Para " "realizar a interpolação facilitada com [method lerp], combine-o com [method " -"ease] ou [method smoothstep]." +"ease] ou [method smoothstep]. Seja também [method range_lerp] para mapear " +"uma serie contÃnua de valores um para o outro." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Linearly interpolates between two angles (in radians) by a normalized " "value.\n" @@ -1013,19 +1019,30 @@ msgid "" "example, [code]lerp_angle(0, PI, weight)[/code] lerps counter-clockwise, " "while [code]lerp_angle(0, PI + 5 * TAU, weight)[/code] lerps clockwise." msgstr "" -"Faz a interpolação linear entre dois ângulos (em radianos) por um valor " +"Interpola linearmente entre dois ângulos (em radianos) por um valor " "normalizado.\n" "Semelhante à [method lerp], mas faz a interpolação corretamente quando os " -"ângulos passam através de [constant @GDScript.TAU].\n" +"ângulos passam através de [constant @GDScript.TAU]. Para realizar " +"interpolação facilitada com [method lerp_angle], combine com [method ease] " +"ou [method smoothstep].\n" "[codeblock]\n" "extends Sprite\n" -"var elapsed = 0.0\n" +"var tempo_decorrido = 0.0\n" "func _process(delta):\n" -" var min_angle = deg2rad(0.0)\n" -" var max_angle = deg2rad(90.0)\n" -" rotation = lerp_angle(min_angle, max_angle, elapsed)\n" -" elapsed += delta\n" -"[/codeblock]" +" var ângulo_mÃnimo = deg2rad(0.0)\n" +" var ângulo_máximo = deg2rad(90.0)\n" +" rotação = ângulo_interpolação(ângulo_mÃnimo, ângulo_máximo, " +"tempo_decorrido)\n" +" tempo_decorrido += delta\n" +"[/codeblock]\n" +"[b]Nota:[/b] Esse método interpola linearmente através do caminho mais curto " +"entre [code]from[/code] e [code]to[/code]. Entretanto, quando esses dois " +"ângulos estão aproximadamente [code]PI + k * TAU[/code] aparte para qualquer " +"inteiro [code]k[/code], não é óbvio para qual lado eles interpolam devido à " +"erros de precisão de pontos flutuantes. Por exemplo, " +"[code]ângulo_interpolação(0, PI, weight)[/code] interpola no sentido anti-" +"horário, enquanto [code]ângulo_interpolação(0, PI + 5 * TAU, weight)[/code] " +"interpola no sentido horário." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1395,19 +1412,17 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" -"Imprime a pilha de chamadas no local do código, só funciona com o depurador " -"habilitado.\n" -"SaÃda no console vai parecer assim:\n" -"[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1645,8 +1660,46 @@ msgid "" "3\n" "[/codeblock]" msgstr "" +"Retorna um [i]array[/i] com o alcance dado. [method range] pode ser chamado " +"de três maneiras:\n" +"[code]range(n: int)[/code]: Começa do 0, aumenta em passos de 1, e para " +"[i]antes[/i] do [code]n[/code]. O argumento [code]n[/code] é [b]exclusivo[/" +"b].\n" +"[code]range(b: int, n: int)[/code]: Começa do [code]b[/code], aumenta em " +"passos de 1, e para [i]antes[/i] do [code]n[/code]. Os argumentos [code]b[/" +"code] e [code]n[/code] são [b]inclusivo[/b] e [b]exclusivo[/b], " +"respectivamente.\n" +"[code]range(b: int, n: int, s: int)[/code]: Começa do [code]b[/code], " +"aumenta/diminui em passos de [code]s[/code], e para [i]antes[/i] do [code]n[/" +"code]. Os argumentos [code]b[/code] e [code]n[/code] são [b]inclusivo[/b] e " +"[b]exclusivo[/b], respectivamente. O argumento [code]s[/code] [b]pode[/b] " +"ser negativo, mas não [code]0[/code]. Se [code]s[/code] é [code]0[/code], " +"uma mensagem de erro é mostrada.\n" +"[method range] converte todos os argumentos para [int] antes de processar.\n" +"[b]Nota:[/b] Retorna um [i]array[/i] vazio se nenhum valor satisfaz o valor " +"exigido (e.g. [code]range(2, 5, -1)[/code] ou [code]range(5, 5, 1)[/code]).\n" +"Exemplos:\n" +"[codeblock]\n" +"print(range(4)) # Imprime [0, 1, 2, 3]\n" +"print(range(2, 5)) # Imprime [2, 3, 4]\n" +"print(range(0, 6, 2)) # Imprime [0, 2, 4]\n" +"print(range(4, 1, -1)) # Imprime [4, 3, 2]\n" +"[/codeblock]\n" +"Para repetir sobre um [Array] ao contrário, use:\n" +"[codeblock]\n" +"var array = [3, 6, 9]\n" +"for i in range(array.size(), 0, -1):\n" +" print(array[i - 1])\n" +"[/codeblock]\n" +"SaÃda:\n" +"[codeblock]\n" +"9\n" +"6\n" +"3\n" +"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" "Maps a [code]value[/code] from range [code][istart, istop][/code] to [code]" "[ostart, ostop][/code]. See also [method lerp] and [method inverse_lerp]. If " @@ -1659,6 +1712,17 @@ msgid "" "For complex use cases where you need multiple ranges, consider using [Curve] " "or [Gradient] instead." msgstr "" +"Mapeia um [code]value[/code] do intervalo [code][istart, istop][/code] para " +"[code][ostart, ostop][/code]. Veja também [method lerp] e [method " +"inverse_lerp]. Se [code]value[/code] estiver fora de [code][istart, istop][/" +"code], então o valor resultante também será fora de [code][ostart, ostop][/" +"code]. Use [method clamp] no resultado de [method range-lerp] se não for " +"desejado.\n" +"[codeblock]\n" +"range_lerp(75, 0, 100, -1, 1) # Retorna 0.5\n" +"[/codeblock]\n" +"Para casos de uso complexos em que você precise de múltiplos intervalos, " +"considere usar [Curve] ou [Gradient]." #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -3956,34 +4020,49 @@ msgstr "" "Windows MR)." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "" "MIDI note OFF message. See the documentation of [InputEventMIDI] for " "information of how to use MIDI inputs." msgstr "" +"Mensagem de nota MIDI OFF. Veja a documentação sobre [InputEventMIDI] para " +"mais informações sobre como usar entradas MIDI." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "" "MIDI note ON message. See the documentation of [InputEventMIDI] for " "information of how to use MIDI inputs." msgstr "" +"Mensagem ON da nota MIDI. Veja a documentação do [InputEventMIDI] para mais " +"informações sobre como usar entradas MIDI." #: doc/classes/@GlobalScope.xml msgid "" "MIDI aftertouch message. This message is most often sent by pressing down on " "the key after it \"bottoms out\"." msgstr "" +"Mensagem MIDI de toque posterior. Esta mensagem é geralmente enviada ao " +"pressionar a tecla após ela \"ir de fundo pra fora\"." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "" "MIDI control change message. This message is sent when a controller value " "changes. Controllers include devices such as pedals and levers." msgstr "" +"Mensagem de alteração do controlador MIDI. Esta mensagem é enviada quando o " +"valor de um controlador muda. Controladores incluem dispositivos como pedais " +"e alavancas." #: doc/classes/@GlobalScope.xml +#, fuzzy msgid "" "MIDI program change message. This message sent when the program patch number " "changes." msgstr "" +"Mensagem de alteração do programa MIDI. Esta mensagem é enviada quando o " +"número de patch do programa muda." #: doc/classes/@GlobalScope.xml msgid "" @@ -4498,6 +4577,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "A propriedade é serializada e salva no arquivo de cena (padrão)." @@ -5195,8 +5294,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -8144,7 +8242,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -8329,6 +8430,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -8348,9 +8452,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10990,10 +11098,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -11525,14 +11632,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -11542,22 +11649,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -15656,7 +15763,7 @@ msgstr "" #: doc/classes/Color.xml msgid "Chocolate color." -msgstr "Cor chocolate" +msgstr "Cor chocolate." #: doc/classes/Color.xml msgid "Coral color." @@ -20442,6 +20549,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "A altura do cilindro." @@ -23280,7 +23395,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -34072,7 +34190,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -37411,7 +37531,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -37664,7 +37787,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -38389,6 +38515,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -41199,7 +41328,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -41716,11 +41847,11 @@ msgstr "Retorna o ângulo para o vetor dado, em radianos." #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -41754,11 +41885,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -41780,11 +41911,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -43666,6 +43797,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -51274,15 +51415,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -52886,17 +53034,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -52905,8 +53064,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -55625,7 +55790,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -57467,7 +57636,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -58866,7 +59037,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -58882,7 +59056,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -68220,10 +68396,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -68234,8 +68415,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -68393,7 +68574,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -68926,6 +69109,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" @@ -77080,10 +77279,10 @@ msgstr "" "Classifique todos os nós filhos com base em suas posições Y. O nó filho deve " "herdar de [CanvasItem] para ser classificado. Os nós que têm uma posição Y " "mais alta serão desenhados mais tarde, então eles aparecerão no topo dos nós " -"que têm uma posição Y mais baixa. O aninhamento de nós YSort é possÃvel. Os " -"nós YSort filhos serão classificados no mesmo espaço que o YSort pai, " -"permitindo organizar melhor uma cena ou dividi-la em várias outras, mas " -"manter a classificação única." +"que têm uma posição Y mais baixa.\n" +"O aninhamento de nós YSort é possÃvel.Os nós YSort filhos serão " +"classificados no mesmo espaço que o YSort pai, permitindo organizar melhor " +"uma cena ou dividi-la em várias outras, mas manter a classificação única." #: doc/classes/YSort.xml msgid "" diff --git a/doc/translations/ro.po b/doc/translations/ro.po index 04f1a17b66..dd88e8d66b 100644 --- a/doc/translations/ro.po +++ b/doc/translations/ro.po @@ -501,7 +501,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -516,7 +517,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -889,12 +894,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3509,6 +3518,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4193,8 +4222,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7111,7 +7139,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7296,6 +7327,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7315,9 +7349,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9955,10 +9993,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10490,14 +10527,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10507,22 +10544,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19302,6 +19339,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22134,7 +22179,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32849,7 +32897,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36147,7 +36197,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36395,7 +36448,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37106,6 +37162,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39912,7 +39971,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40423,11 +40484,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40461,11 +40522,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40487,11 +40548,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42338,6 +42399,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49930,15 +50001,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51534,17 +51612,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51553,8 +51642,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54269,7 +54364,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56106,7 +56205,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57484,7 +57585,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57500,7 +57604,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66737,10 +66843,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66751,8 +66862,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66904,7 +67015,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67436,6 +67549,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/ru.po b/doc/translations/ru.po index b590ff4014..9d569d7760 100644 --- a/doc/translations/ru.po +++ b/doc/translations/ru.po @@ -24,7 +24,7 @@ # Ð§Ñ‚Ð°Ð±Ñ <chtabs2k19@gmail.com>, 2021. # Nikita Blizniuk <BliznyukNM@gmail.com>, 2021. # Сергей Волков <zerosar4@gmail.com>, 2021. -# Alexander Sinitsyn <almoig747@gmail.com>, 2021. +# Alexander Sinitsyn <almoig747@gmail.com>, 2021, 2022. # Ð¢Ð¾Ð»Ñ Ð‘Ð¾Ð³Ð¾Ð¼Ð¾Ð»Ð¾Ð² <tolya.bogomolov2004@gmail.com>, 2021. # Rustam Alieskerov <rustam.aleskerov7@gmail.com>, 2021, 2022. # Vladimir Svity <development.openworld@gmail.com>, 2021. @@ -54,12 +54,15 @@ # Lost Net <pc.mirkn@gmail.com>, 2022. # Vladimir Kirillovskiy <vladimir.kirillovskiy@gmail.com>, 2022. # motismob <evt.mixail@ya.ru>, 2022. +# Handsless coder <yfintktajy1@gmail.com>, 2022. +# Evgeniy Khramov <thejenjagamertjg@gmail.com>, 2022. +# Григорий <bolon667@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-09-16 07:12+0000\n" -"Last-Translator: Rish Alternative <ii4526668@gmail.com>\n" +"PO-Revision-Date: 2022-12-06 11:48+0000\n" +"Last-Translator: Григорий <bolon667@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/ru/>\n" "Language: ru\n" @@ -68,7 +71,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -598,7 +601,6 @@ msgstr "" "ÑкземплÑÑ€ объекта. Полезно Ð´Ð»Ñ Ð´ÐµÑериализации." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns an \"eased\" value of [code]x[/code] based on an easing function " "defined with [code]curve[/code]. This easing function is based on an " @@ -632,7 +634,7 @@ msgstr "" "- Больше 1,0 (не включаÑ): Облегчение вхождениÑ(только вход)\n" "[/codeblock]\n" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.4/img/" -"ease_cheatsheet.png]ease() Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ ÐºÑ€Ð¸Ð²Ð¾Ð¹ шпаргалка[/url]\n" +"ease_cheatsheet.png]ease() шпаргалка значений кривой[/url]\n" "См. также [метод smoothstep]. ЕÑли вам нужно выполнить более Ñложные " "переходы, иÑпользуйте [Tween] или [AnimationPlayer]." @@ -764,8 +766,10 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -780,7 +784,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" "Возвращает маÑÑив Ñловарей, предÑтавлÑющий текущий Ñтек вызовов.\n" "[codeblock]\n" @@ -866,7 +874,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns an interpolation or extrapolation factor considering the range " "specified in [code]from[/code] and [code]to[/code], and the interpolated " @@ -890,13 +897,13 @@ msgid "" "[method range_lerp] to map a continuous series of values to another." msgstr "" "Возвращает коÑффициент интерполÑции или ÑкÑтраполÑции Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ диапазона, " -"указанного в [code]от[/code] и [code]до[/code], и интерполированное " -"значение, указанное в [code]веÑе[/code]. Возвращаемое значение будет " -"находитьÑÑ Ð² диапазоне [code]0.0[/code] and [code]1.0[/code] еÑли [code]веÑ[/" -"code] находитÑÑ Ð¼ÐµÐ¶Ð´Ñƒ [code]от[/code] и [code]до[/code] (включительно). ЕÑли " -"[code]веÑ[/code] находитÑÑ Ð·Ð° пределами Ñтого диапазона, то будет возвращён " -"коÑффициент ÑкÑтраполÑции (возвращаемое значение меньше [code]0.0[/code] или " -"больше [code]1.0[/code]).\n" +"указанного в [code]from[/code] и [code]to[/code], и интерполированное " +"значение, указанное в [code]weight[/code]. Возвращаемое значение будет " +"находитьÑÑ Ð² диапазоне от [code]0.0[/code] до [code]1.0[/code], еÑли " +"[code]weight[/code] находитÑÑ Ð¼ÐµÐ¶Ð´Ñƒ [code]from[/code] и [code]to[/code] " +"(включительно). ЕÑли [code]weight[/code] находитÑÑ Ð·Ð° пределами Ñтого " +"диапазона, то будет возвращён коÑффициент ÑкÑтраполÑции (возвращаемое " +"значение меньше [code]0.0[/code] или больше [code]1.0[/code]).\n" "[codeblock]\n" "# КоÑффициент интерполÑции в приведённом ниже вызове `lerp()` ÑоÑтавлÑет " "0,75.\n" @@ -979,7 +986,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Linearly interpolates between two values by the factor defined in " "[code]weight[/code]. To perform interpolation, [code]weight[/code] should be " @@ -1002,11 +1008,11 @@ msgid "" "continuous series of values to another." msgstr "" "Линейно интерполирует между Ð´Ð²ÑƒÐ¼Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñми Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ коÑффициента, " -"определенного в [code]weight[/code]. Ð”Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»Ñции [code]веÑ[/" -"code] должен ÑоÑтавлÑть от [code]0.0[/code] до [code]1.0[/code] " +"определенного в [code]weight[/code]. Ð”Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»Ñции " +"[code]weight[/code] должен быть между [code]0.0[/code] и [code]1.0[/code] " "(включительно). Однако Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð° пределами Ñтого диапазона разрешены и " "могут быть иÑпользованы Ð´Ð»Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ [i]ÑкÑтраполÑции[/i].\n" -"ЕÑли аргументы [code]от[/code] и [code]до[/code] имеют тип [int] или " +"ЕÑли аргументы [code]from[/code] и [code]to[/code] имеют тип [int] или " "[float], возвращаемое значение будет [float].\n" "ЕÑли оба Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÑŽÑ‚ одинаковый векторный тип ([Vector2], [Vector3] или " "[Color]), возвращаемое значение будет одного типа ([code]lerp[/code], затем " @@ -1432,18 +1438,17 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" -"Печатает трек Ñтека вызовов, работает только еÑли включён отладчик.\n" -"Вывод в конÑоли будет выглÑдеть примерно так:\n" -"[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -1814,7 +1819,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the result of smoothly interpolating the value of [code]s[/code] " "between [code]0[/code] and [code]1[/code], based on the where [code]s[/code] " @@ -1842,33 +1846,28 @@ msgstr "" "Возвращает результат плавной интерполÑции Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ [code]s[/code] между " "[code]0[/code] и [code]1[/code], в завиÑимоÑти от того, где находитÑÑ " "[code]s[/code] отноÑительно [code]from[/code] и [code]to[/code].\n" -"\n" "Возвращаемое значение равно [code]0[/code], еÑли [code]s <= from[/code] и " "[code]1[/code], еÑли[code]s >= to[/code]. ЕÑли [code]s[/code] находитÑÑ " "между [code]from[/code] и [code]to[/code], то возвращаемое значение Ñледует " "S-образной кривой, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ ÑоответÑтвует значению [code]s[/code] между " "[code]0[/code] и [code]1[/code].\n" -"\n" "S-Ð¾Ð±Ñ€Ð°Ð·Ð½Ð°Ñ ÐºÑ€Ð¸Ð²Ð°Ñ ÑвлÑетÑÑ ÐºÑƒÐ±Ð¸Ñ‡ÐµÑким Ñрмитовым Ñплайном, заданным функцией " "[code]f(s) = 3*s^2 - 2*s^3[/code].\n" -"\n" "[codeblock]\n" -"smoothstep(0, 2, -5.0) # Returns 0.0\n" -"smoothstep(0, 2, 0.5) # Returns 0.15625\n" -"smoothstep(0, 2, 1.0) # Returns 0.5\n" -"smoothstep(0, 2, 2.0) # Returns 1.0\n" +"smoothstep(0, 2, -5.0) # Возвращает 0.0\n" +"smoothstep(0, 2, 0.5) # Возвращает 0.15625\n" +"smoothstep(0, 2, 1.0) # Возвращает 0.5\n" +"smoothstep(0, 2, 2.0) # Возвращает 1.0\n" "[/codeblock]\n" -"\n" -"Compared to [method ease] with a curve value of [code]-1.6521[/code], " -"[method smoothstep] returns the smoothest possible curve with no sudden " -"changes in the derivative. If you need to perform more advanced transitions, " -"use [Tween] or [AnimationPlayer].\n" +"Ð’ Ñравнении Ñ [method ease] Ñо значение кривой [code]-1.6521[/code], [метод " +"smoothstep] возвращает наиболее плавную кривую без внезапных изменений " +"производной. ЕÑли вам нужно выполнить более продвинутые перемещениÑ, " +"иÑпользуйте [Tween] или [AnimationPlayer].\n" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/3.5/img/" -"smoothstep_ease_comparison.png]Comparison between smoothstep() and ease(x, " -"-1.6521) return values[/url]" +"smoothstep_ease_comparison.png]Сравнение возвращаемых значений smoothstep() " +"и ease(x, -1.6521)[/url]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the square root of [code]s[/code], where [code]s[/code] is a non-" "negative number.\n" @@ -1888,7 +1887,6 @@ msgstr "" "Numerics.Complex[/code] в C#." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the position of the first non-zero digit, after the decimal point. " "Note that the maximum return value is 10, which is a design decision in the " @@ -1903,12 +1901,9 @@ msgstr "" "внимание, что макÑимальное возвращаемое значение – Ñто 10, что ÑвлÑетÑÑ " "проектным решением при реализации.\n" "[codeblock]\n" -"# n равно 0\n" -"n = step_decimals(5)\n" -"# n равно 4\n" -"n = step_decimals(1.0005)\n" -"# n равно 9\n" -"n = step_decimals(0.000000005)\n" +"n = step_decimals(5) # n равно 0\n" +"n = step_decimals(1.0005) # n равно 4\n" +"n = step_decimals(0.000000005) # n равно 9\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1952,7 +1947,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Converts a formatted string that was returned by [method var2str] to the " "original value.\n" @@ -1962,8 +1956,8 @@ msgid "" "print(b[\"a\"]) # Prints 1\n" "[/codeblock]" msgstr "" -"Преобразует форматированную Ñтроку, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±Ñ‹Ð»Ð° возвращена [method var2str] " -"в иÑходное значение.\n" +"Преобразует форматированную Ñтроку, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð±Ñ‹Ð»Ð° возвращена [методом " +"var2str] в иÑходное значение.\n" "[codeblock]\n" "a = '{ \"a\": 1, \"b\": 2 }'\n" "b = str2var(a)\n" @@ -1983,7 +1977,6 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns the hyperbolic tangent of [code]s[/code].\n" "[codeblock]\n" @@ -1994,7 +1987,7 @@ msgstr "" "Возвращает гиперболичеÑкий Ñ‚Ð°Ð½Ð³ÐµÐ½Ñ [code]s[/code].\n" "[codeblock]\n" "a = log(2.0) # Возвращает 0.693147\n" -"tanh(a) # Возвращает 0.6\n" +"b = tanh(a) # Возвращает 0.6\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -2031,7 +2024,6 @@ msgstr "" "См. также [JSON] Ð´Ð»Ñ Ð°Ð»ÑŒÑ‚ÐµÑ€Ð½Ð°Ñ‚Ð¸Ð²Ð½Ð¾Ð³Ð¾ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ð½Ð¸Ñ [Variant] в JSON Ñтроку." #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Returns whether the given class exists in [ClassDB].\n" "[codeblock]\n" @@ -2041,7 +2033,7 @@ msgid "" msgstr "" "Возвращает, ÑущеÑтвует ли данный клаÑÑ Ð² [ClassDB].\n" "[codeblock]\n" -"type_exists(\"Sprite2D\") # Возвращает true\n" +"type_exists(\"Sprite\") # Возвращает true\n" "type_exists(\"Variant\") # Возвращает false\n" "[/codeblock]" @@ -2092,13 +2084,12 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml -#, fuzzy msgid "" "Encodes a variable value to a byte array. When [code]full_objects[/code] is " "[code]true[/code] encoding objects is allowed (and can potentially include " "code)." msgstr "" -"Кодирует значение переменной в маÑÑив байт. ЕÑли [code]full_objects[/code] " +"Кодирует значение переменной в маÑÑив байтов. ЕÑли [code]full_objects[/code] " "равен [code]true[/code], кодирование объектов разрешено (и потенциально " "может включать код)." @@ -2859,12 +2850,10 @@ msgid "Help key." msgstr "Клавиша помощи." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Left Direction key." msgstr "Клавиша Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð»ÐµÐ²Ð¾." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Right Direction key." msgstr "Клавиша Ð½Ð°Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð¿Ñ€Ð°Ð²Ð¾." @@ -2876,19 +2865,16 @@ msgstr "" "уÑтройÑтвах Android." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Media forward key." msgstr "Клавиша запиÑи мультимедиа." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Media stop key." msgstr "Клавиша оÑтановки мультимедиа." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Media refresh key." -msgstr "Клавиша запиÑи мультимедиа." +msgstr "Клавиша Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð¼ÑƒÐ»ÑŒÑ‚Ð¸Ð¼ÐµÐ´Ð¸Ð°." #: doc/classes/@GlobalScope.xml msgid "Volume down key." @@ -2907,22 +2893,18 @@ msgid "Bass Boost key." msgstr "Клавиша уÑÐ¸Ð»ÐµÐ½Ð¸Ñ Ð½Ð¸Ð·ÐºÐ¸Ñ… чаÑтот." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Bass up key." msgstr "Клавиша ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð±Ð°Ñов." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Bass down key." msgstr "Клавиша ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð½Ð¸Ð·ÐºÐ¸Ñ… чаÑтот." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Treble up key." msgstr "Клавиша ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹Ñоких чаÑтот." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Treble down key." msgstr "Клавиша ÑƒÐ¼ÐµÐ½ÑŒÑˆÐµÐ½Ð¸Ñ Ð²Ñ‹Ñоких чаÑтот." @@ -2952,12 +2934,10 @@ msgid "Home page key." msgstr "Клавиша домашней Ñтраницы." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Favorites key." -msgstr "Клавиша избранного." +msgstr "Клавиша \"Избранное\"." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Search key." msgstr "Клавиша поиÑка." @@ -4424,7 +4404,6 @@ msgid "Skip error." msgstr "Ошибка \"Пропущено\"." #: doc/classes/@GlobalScope.xml -#, fuzzy msgid "Help error." msgstr "Ошибка Ñправки." @@ -4661,6 +4640,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "Указывает, что изображение иÑпользует Ñжатие без потерь." #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "СвойÑтво ÑериализируетÑÑ Ð¸ ÑохранÑетÑÑ Ð² файле Ñцены (по умолчанию)." @@ -5007,10 +5006,8 @@ msgstr "" #: doc/classes/AABB.xml doc/classes/Rect2.xml doc/classes/Vector2.xml #: doc/classes/Vector3.xml -#, fuzzy msgid "Vector math" -msgstr "" -"Вектор иÑпользуемый Ð´Ð»Ñ 2D математики иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñ†ÐµÐ»Ð¾Ñ‡Ð¸Ñленные координаты." +msgstr "Ð’ÐµÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð¼Ð°Ñ‚ÐµÐ¼Ð°Ñ‚Ð¸ÐºÐ°" #: doc/classes/AABB.xml doc/classes/Rect2.xml doc/classes/Vector2.xml #: doc/classes/Vector3.xml @@ -5516,8 +5513,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -6280,11 +6276,11 @@ msgstr "" #: doc/classes/Animation.xml doc/classes/Gradient.xml msgid "Linear interpolation." -msgstr "" +msgstr "Ð›Ð¸Ð½ÐµÐ¹Ð½Ð°Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»ÑциÑ." #: doc/classes/Animation.xml doc/classes/Gradient.xml msgid "Cubic interpolation." -msgstr "" +msgstr "КубичеÑÐºÐ°Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»ÑциÑ." #: doc/classes/Animation.xml msgid "Update between keyframes." @@ -6510,7 +6506,7 @@ msgstr "" #: doc/classes/AnimationNodeTimeScale.xml #: doc/classes/AnimationNodeTransition.xml msgid "AnimationTree" -msgstr "" +msgstr "Дерево анимации" #: doc/classes/AnimationNodeAdd3.xml doc/classes/AnimationNodeAnimation.xml #: doc/classes/AnimationNodeBlend2.xml @@ -7546,7 +7542,7 @@ msgstr "" #: doc/classes/AnimationTree.xml msgid "Using AnimationTree" -msgstr "" +msgstr "ИÑпользование дерева анимации" #: doc/classes/AnimationTree.xml msgid "Manually advance the animations by the specified time (in seconds)." @@ -7976,43 +7972,43 @@ msgstr "" #: doc/classes/AnimationTreePlayer.xml msgid "Output node." -msgstr "" +msgstr "Выходной узел." #: doc/classes/AnimationTreePlayer.xml msgid "Animation node." -msgstr "" +msgstr "Ðнимационный узел." #: doc/classes/AnimationTreePlayer.xml msgid "OneShot node." -msgstr "" +msgstr "Узел OneShot." #: doc/classes/AnimationTreePlayer.xml msgid "Mix node." -msgstr "" +msgstr "МикÑ-узел." #: doc/classes/AnimationTreePlayer.xml msgid "Blend2 node." -msgstr "" +msgstr "Узел Blend2." #: doc/classes/AnimationTreePlayer.xml msgid "Blend3 node." -msgstr "" +msgstr "Узел Blend3." #: doc/classes/AnimationTreePlayer.xml msgid "Blend4 node." -msgstr "" +msgstr "Узел Blend4." #: doc/classes/AnimationTreePlayer.xml msgid "TimeScale node." -msgstr "" +msgstr "Узел TimeScale." #: doc/classes/AnimationTreePlayer.xml msgid "TimeSeek node." -msgstr "" +msgstr "Узел TimeSeek." #: doc/classes/AnimationTreePlayer.xml msgid "Transition node." -msgstr "" +msgstr "Переходный узел." #: doc/classes/Area.xml msgid "3D area for detection and physics and audio influence." @@ -8702,7 +8698,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -8931,8 +8930,12 @@ msgstr "" "опиÑывает шаг между индекÑами Ñреза." #: doc/classes/Array.xml +#, fuzzy msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -8963,9 +8966,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9357,6 +9364,19 @@ msgid "" "[ARVRServer]. This makes this node ideal to add child nodes to visualize the " "controller." msgstr "" +"Ðто вÑпомогательный проÑтранÑтвенный узел, ÑвÑзанный Ñ Ð¾Ñ‚Ñлеживанием " +"контроллеров. Он также предлагает неÑколько удобных переходов к ÑоÑтоÑнию " +"кнопок и Ñ‚.п. на контроллерах.\n" +"Контроллеры ÑвÑзаны по их ID. Ð’Ñ‹ можете Ñоздавать узлы контроллеров до того, " +"как контроллеры Ñтанут доÑтупны. ЕÑли в вашей игре вÑегда иÑпользуютÑÑ Ð´Ð²Ð° " +"контроллера (по одному Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ руки), вы можете заранее определить " +"контроллеры Ñ ID 1 и 2; они Ñтанут активными, как только контроллеры будут " +"определены. ЕÑли вы ожидаете, что будут иÑпользоватьÑÑ Ð´Ð¾Ð¿Ð¾Ð»Ð½Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ñ‹Ðµ " +"контроллеры, вы должны реагировать на Ñигналы и добавить узлы ARVRController " +"в вашу Ñцену.\n" +"Положение узла контроллера автоматичеÑки обновлÑетÑÑ Ñервером [ARVRServer]. " +"Ðто делает данный узел идеальным Ð´Ð»Ñ Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð´Ð¾Ñ‡ÐµÑ€Ð½Ð¸Ñ… узлов Ð´Ð»Ñ " +"визуализации контроллера." #: doc/classes/ARVRController.xml msgid "" @@ -9634,6 +9654,21 @@ msgid "" "be a child node of this car. Or, if you're implementing a teleport system to " "move your character, you should change the position of this node." msgstr "" +"Ðто Ñпециальный узел в ÑиÑтеме AR/VR, который отображает физичеÑкое " +"меÑтоположение центра нашего проÑтранÑтва отÑÐ»ÐµÐ¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð½Ð° виртуальное " +"меÑтоположение в нашем игровом мире.\n" +"Ð’ вашей Ñцене должен быть только один такой узел, и он обÑзательно должен " +"быть у ваÑ. Ð’Ñе узлы ARVRCamera, ARVRController и ARVRAnchor должны быть " +"прÑмыми дочерними узлами Ñтого узла, чтобы проÑтранÑтвенное отÑлеживание " +"работало правильно.\n" +"Именно положение Ñтого узла вы обновлÑете, когда перÑонажу нужно " +"перемещатьÑÑ Ð¿Ð¾ игровому миру, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº в реальном мире мы не " +"движемÑÑ. Движение в реальном мире вÑегда проиÑходит отноÑительно Ñтой " +"иÑходной точки.\n" +"Ðапример, еÑли ваш перÑонаж управлÑет автомобилем, узел ARVROrigin должен " +"быть дочерним узлом Ñтого автомобилÑ. Или, еÑли вы реализуете ÑиÑтему " +"телепортации Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¿ÐµÑ€Ñонажа, вы должны изменить положение Ñтого " +"узла." #: doc/classes/ARVROrigin.xml msgid "" @@ -10176,6 +10211,26 @@ msgid "" "4, 3][/code] instead, because now even though the distance is longer, it's " "\"easier\" to get through point 4 than through point 2." msgstr "" +"Возвращает маÑÑив Ñ Ð¸Ð´ÐµÐ½Ñ‚Ð¸Ñ„Ð¸ÐºÐ°Ñ‚Ð¾Ñ€Ð°Ð¼Ð¸ точек, которые образуют путь, найденный " +"AStar между заданными точками. МаÑÑив упорÑдочен от начальной точки до " +"конечной точки пути.\n" +"[codeblock].\n" +"var astar = AStar.new()\n" +"astar.add_point(1, Vector3(0, 0, 0, 0))\n" +"astar.add_point(2, Vector3(0, 1, 0), 1) # Ð’ÐµÑ Ð¿Ð¾ умолчанию равен 1\n" +"astar.add_point(3, Vector3(1, 1, 0))\n" +"astar.add_point(4, Vector3(2, 0, 0))\n" +"\n" +"astar.connect_points(1, 2, false)\n" +"astar.connect_points(2, 3, false)\n" +"astar.connect_points(4, 3, false)\n" +"astar.connect_points(1, 4, false)\n" +"\n" +"var res = astar.get_id_path(1, 3) # Возвращает [1, 2, 3]\n" +"[/codeblock].\n" +"ЕÑли изменить Ð²ÐµÑ Ð²Ñ‚Ð¾Ñ€Ð¾Ð¹ точки на 3, то результатом будет [code][1, 4, 3][/" +"code], потому что теперь, неÑÐ¼Ð¾Ñ‚Ñ€Ñ Ð½Ð° то, что раÑÑтоÑние больше, \"легче\" " +"пройти через точку 4, чем через точку 2." #: doc/classes/AStar.xml doc/classes/AStar2D.xml msgid "" @@ -10424,6 +10479,22 @@ msgid "" "FLAG_REPEAT] and [constant Texture.FLAG_MIRRORED_REPEAT] flags are ignored " "when using an AtlasTexture." msgstr "" +"РеÑÑƒÑ€Ñ [Texture], который обрезает одну чаÑть текÑтуры [member atlas], " +"определенной [member region]. ОÑновное применение - вырезание текÑтур из " +"атлаÑа текÑтур, который предÑтавлÑет Ñобой большой файл текÑтуры, Ñодержащий " +"неÑколько текÑтур меньшего размера. СоÑтоит из [Texture] Ð´Ð»Ñ [member atlas], " +"[member region], который определÑет облаÑть [member atlas] Ð´Ð»Ñ " +"иÑпользованиÑ, и [member margin], который определÑет ширину границы.\n" +"[AtlasTexture] не может иÑпользоватьÑÑ Ð² [AnimatedTexture], не может быть " +"плиточным в узлах, таких как [TextureRect], и не работает должным образом, " +"еÑли иÑпользуетÑÑ Ð²Ð½ÑƒÑ‚Ñ€Ð¸ других реÑурÑов [AtlasTexture]. ÐеÑколько реÑурÑов " +"[AtlasTexture] можно иÑпользовать Ð´Ð»Ñ Ð¾Ð±Ñ€ÐµÐ·ÐºÐ¸ неÑкольких текÑтур из атлаÑа. " +"ИÑпользование атлаÑа текÑтур помогает оптимизировать затраты видеопамÑти и " +"вызовы рендеринга по Ñравнению Ñ Ð¸Ñпользованием неÑкольких небольших " +"файлов.\n" +"[b]Примечание:[/b] AtlasTextures не поддерживают повторение. Флаги [constant " +"Texture.FLAG_REPEAT] и [constant Texture.FLAG_MIRRORED_REPEAT] игнорируютÑÑ " +"при иÑпользовании AtlasTexture." #: doc/classes/AtlasTexture.xml msgid "The texture that contains the atlas. Can be any [Texture] subtype." @@ -10654,6 +10725,21 @@ msgid "" "- Accentuates transients by using a wider attack, making effects sound more " "punchy." msgstr "" +"КомпреÑÑор динамичеÑкого диапазона уменьшает уровень звука, когда амплитуда " +"превышает определенный порог в децибелах. Одно из оÑновных назначений " +"компреÑÑора - увеличение динамичеÑкого диапазона за Ñчет минимального " +"ÐºÐ»Ð¸Ð¿Ð¿Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (когда звук превышает 0 дБ).\n" +"КомпреÑÑор имеет множеÑтво применений в микÑе:\n" +"- Ð’ маÑтер-шине Ð´Ð»Ñ ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð²Ñего выхода (Ñ…Ð¾Ñ‚Ñ [AudioEffectLimiter], " +"вероÑтно, лучше).\n" +"- Ð’ голоÑовых каналах Ð´Ð»Ñ Ð¾Ð±ÐµÑÐ¿ÐµÑ‡ÐµÐ½Ð¸Ñ Ð¸Ñ… макÑимально ÑбаланÑированного " +"звучаниÑ.\n" +"- Ð’ Ñайдчейне. Ðто позволÑет Ñнизить уровень звука при боковом подключении к " +"другой аудиошине Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ñ€Ð¾Ð³Ð°. Ðта техника раÑпроÑтранена в " +"микшировании видеоигр Ð´Ð»Ñ ÑÐ½Ð¸Ð¶ÐµÐ½Ð¸Ñ ÑƒÑ€Ð¾Ð²Ð½Ñ Ð¼ÑƒÐ·Ñ‹ÐºÐ¸ и SFX во Ð²Ñ€ÐµÐ¼Ñ Ð·Ð²ÑƒÑ‡Ð°Ð½Ð¸Ñ " +"голоÑов.\n" +"- Подчеркивает переходные процеÑÑÑ‹ за Ñчет более широкой атаки, заÑтавлÑÑ " +"Ñффекты звучать более напориÑто." #: doc/classes/AudioEffectCompressor.xml msgid "" @@ -11632,12 +11718,14 @@ msgid "Clears the audio sample data buffer." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml +#, fuzzy msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" +"Возвращает [code]true[/code] еÑли [code]a[/code] и [code]b[/code] " +"приблизительно равны друг другу." #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" @@ -12168,14 +12256,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -12185,22 +12273,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -12413,7 +12501,7 @@ msgstr "" #: doc/classes/BakedLightmap.xml doc/classes/SpatialMaterial.xml msgid "Currently unused." -msgstr "" +msgstr "Ð’ наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ иÑпользуетÑÑ." #: doc/classes/BakedLightmap.xml #, fuzzy @@ -12874,7 +12962,7 @@ msgstr "" #: doc/classes/BitMap.xml msgid "Boolean matrix." -msgstr "" +msgstr "ЛогичеÑÐºÐ°Ñ Ð¼Ð°Ñ‚Ñ€Ð¸Ñ†Ð°." #: doc/classes/BitMap.xml msgid "" @@ -13237,6 +13325,29 @@ msgid "" "given time. Use [TouchScreenButton] for buttons that trigger gameplay " "movement or actions, as [TouchScreenButton] supports multitouch." msgstr "" +"Кнопка - Ñто ÑÑ‚Ð°Ð½Ð´Ð°Ñ€Ñ‚Ð½Ð°Ñ Ñ‚ÐµÐ¼Ð°Ñ‚Ð¸Ñ‡ÐµÑÐºÐ°Ñ ÐºÐ½Ð¾Ð¿ÐºÐ°. Она может Ñодержать текÑÑ‚ и " +"иконку, и будет отображать их в ÑоответÑтвии Ñ Ñ‚ÐµÐºÑƒÑ‰ÐµÐ¹ темой [Theme].\n" +"[b]Пример ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ ÐºÐ½Ð¾Ð¿ÐºÐ¸ и Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ð¿Ñ€Ð¸ нажатии Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ кода:[/" +"b]\n" +"[codeblock].\n" +"func _ready():\n" +" var button = Button.new()\n" +" button.text = \"Ðажмите на менÑ\"\n" +" button.connect(\"pressed\", self, \"_button_pressed\")\n" +" add_child(button)\n" +"\n" +"func _button_pressed():\n" +" print(\"Hello world!\")\n" +"[/codeblock].\n" +"Кнопки (как и вÑе узлы Control) также могут быть Ñозданы в редакторе, но " +"некоторые Ñитуации могут потребовать их ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¸Ð· кода.\n" +"См. также [BaseButton], который Ñодержит общие ÑвойÑтва и методы, ÑвÑзанные " +"Ñ Ñтим узлом.\n" +"[b]Примечание: Кнопки[/b] не интерпретируют ÑенÑорный ввод и поÑтому не " +"поддерживают мультитач, поÑкольку ÑмулÑÑ†Ð¸Ñ Ð¼Ñ‹ÑˆÐ¸ позволÑет нажимать только " +"одну кнопку в данный момент времени. ИÑпользуйте [TouchScreenButton] Ð´Ð»Ñ " +"кнопок, запуÑкающих движение или дейÑÑ‚Ð²Ð¸Ñ Ð¸Ð³Ñ€Ð¾Ð²Ð¾Ð³Ð¾ процеÑÑа, поÑкольку " +"[TouchScreenButton] поддерживает мультитач." #: doc/classes/Button.xml doc/classes/Dictionary.xml #: doc/classes/GridContainer.xml doc/classes/OS.xml @@ -13712,6 +13823,20 @@ msgid "" "limits. You can use [method get_camera_screen_center] to get the real " "position." msgstr "" +"Узел камеры Ð´Ð»Ñ 2D-Ñцен. Он заÑтавлÑет Ñкран (текущий Ñлой) прокручиватьÑÑ " +"вÑлед за Ñтим узлом. Ðто позволÑет проще (и быÑтрее) программировать " +"прокручиваемые Ñцены, чем вручную изменÑть положение узлов на оÑнове " +"[CanvasItem].\n" +"Ðтот узел задуман как проÑтой помощник Ð´Ð»Ñ Ð±Ñ‹Ñтрого начала работы, но Ð´Ð»Ñ " +"Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ камеры может потребоватьÑÑ Ð±Ð¾Ð»ÐµÐµ ÑˆÐ¸Ñ€Ð¾ÐºÐ°Ñ Ñ„ÑƒÐ½ÐºÑ†Ð¸Ð¾Ð½Ð°Ð»ÑŒÐ½Ð¾Ñть. " +"Чтобы Ñоздать Ñвой ÑобÑтвенный узел камеры, наÑледуйте его от [Node2D] и " +"измените транÑформацию холÑта, уÑтановив [member Viewport.canvas_transform] " +"в [Viewport] (текущий [Viewport] можно получить Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [method Node." +"get_viewport]).\n" +"Обратите внимание, что положение узла [Camera2D] [code][/code] не отражает " +"фактичеÑкое положение Ñкрана, которое может отличатьÑÑ Ð¸Ð·-за примененного " +"ÑÐ³Ð»Ð°Ð¶Ð¸Ð²Ð°Ð½Ð¸Ñ Ð¸Ð»Ð¸ ограничений. Ð”Ð»Ñ Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñ€ÐµÐ°Ð»ÑŒÐ½Ð¾Ð³Ð¾ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶Ð½Ð¾ " +"иÑпользовать [метод get_camera_screen_center]." #: doc/classes/Camera2D.xml doc/classes/TileMap.xml doc/classes/TileSet.xml msgid "2D Isometric Demo" @@ -14028,7 +14153,7 @@ msgstr "" #: doc/classes/CameraFeed.xml msgid "Unspecified position." -msgstr "" +msgstr "ÐÐµÑƒÐºÐ°Ð·Ð°Ð½Ð½Ð°Ñ Ð´Ð¾Ð»Ð¶Ð½Ð¾Ñть." #: doc/classes/CameraFeed.xml msgid "Camera is mounted at the front of the device." @@ -15921,6 +16046,23 @@ msgid "" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" "color_constants.png]Color constants cheatsheet[/url]" msgstr "" +"Цвет, предÑтавленный краÑным, зеленым, Ñиним и альфа-компонентами (RGBA). " +"Компонент альфа чаÑто иÑпользуетÑÑ Ð´Ð»Ñ Ð½ÐµÐ¿Ñ€Ð¾Ð·Ñ€Ð°Ñ‡Ð½Ð¾Ñти. Ð—Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð°Ð´Ð°ÑŽÑ‚ÑÑ Ñ " +"плавающей точкой и обычно находÑÑ‚ÑÑ Ð² диапазоне от 0 до 1. Ðекоторые " +"ÑвойÑтва (например, CanvasItem.modulate) могут принимать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±Ð¾Ð»ÑŒÑˆÐµ 1 " +"(переÑвет или цвета HDR).\n" +"Ð’Ñ‹ также можете Ñоздать цвет из Ñтандартизированных имен цветов Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " +"[метода @GDScript.ColorN] или непоÑредÑтвенно иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð½Ñ‹Ðµ здеÑÑŒ " +"цветовые конÑтанты. Стандартизированный набор цветов оÑнован на [url=https://" +"en.wikipedia.org/wiki/X11_color_names]именах цветов X11[/url].\n" +"ЕÑли вы хотите задать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² диапазоне от 0 до 255, вам Ñледует " +"иÑпользовать [метод @GDScript.Color8].\n" +"[b]Примечание:[/b] Ð’ булевом контекÑте значение Color будет равно " +"[code]false[/code], еÑли оно равно [code]Color(0, 0, 0, 0, 1)[/code] " +"(непрозрачный черный). Ð’ противном Ñлучае значение Color вÑегда будет равно " +"[code]true[/code].\n" +"[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" +"color_constants.png]Шпаргалка по конÑтантам цвета[/url]" #: doc/classes/Color.xml doc/classes/ColorPickerButton.xml msgid "2D GD Paint Demo" @@ -16203,15 +16345,15 @@ msgstr "" #: doc/classes/Color.xml msgid "Aqua color." -msgstr "" +msgstr "Цвет аква." #: doc/classes/Color.xml msgid "Aquamarine color." -msgstr "" +msgstr "Цвет аквамарина." #: doc/classes/Color.xml msgid "Azure color." -msgstr "" +msgstr "Лазурный цвет." #: doc/classes/Color.xml msgid "Beige color." @@ -16219,7 +16361,7 @@ msgstr "Бежевый цвет." #: doc/classes/Color.xml msgid "Bisque color." -msgstr "" +msgstr "Цвет биÑквита." #: doc/classes/Color.xml msgid "Black color." @@ -16251,7 +16393,7 @@ msgstr "" #: doc/classes/Color.xml msgid "Chartreuse color." -msgstr "" +msgstr "Цвет шартрез." #: doc/classes/Color.xml msgid "Chocolate color." @@ -16259,11 +16401,11 @@ msgstr "Шоколадный цвет." #: doc/classes/Color.xml msgid "Coral color." -msgstr "" +msgstr "Коралловый цвет." #: doc/classes/Color.xml msgid "Cornflower color." -msgstr "" +msgstr "ВаÑильковый цвет." #: doc/classes/Color.xml msgid "Corn silk color." @@ -16271,11 +16413,11 @@ msgstr "" #: doc/classes/Color.xml msgid "Crimson color." -msgstr "" +msgstr "Багровый цвет." #: doc/classes/Color.xml msgid "Cyan color." -msgstr "" +msgstr "Голубой цвет." #: doc/classes/Color.xml msgid "Dark blue color." @@ -16363,7 +16505,7 @@ msgstr "" #: doc/classes/Color.xml msgid "Firebrick color." -msgstr "" +msgstr "Кирпичный цвет." #: doc/classes/Color.xml msgid "Floral white color." @@ -16379,7 +16521,7 @@ msgstr "Цвет фукÑии." #: doc/classes/Color.xml msgid "Gainsboro color." -msgstr "" +msgstr "Цвет ГейнÑборо." #: doc/classes/Color.xml msgid "Ghost white color." @@ -16391,7 +16533,7 @@ msgstr "Золотой цвет." #: doc/classes/Color.xml msgid "Goldenrod color." -msgstr "" +msgstr "ЗолотиÑто-рыжий цвет." #: doc/classes/Color.xml msgid "Gray color." @@ -16407,7 +16549,7 @@ msgstr "" #: doc/classes/Color.xml msgid "Honeydew color." -msgstr "" +msgstr "Цвет медовой роÑÑ‹." #: doc/classes/Color.xml msgid "Hot pink color." @@ -16423,15 +16565,15 @@ msgstr "Цвет индиго." #: doc/classes/Color.xml msgid "Ivory color." -msgstr "" +msgstr "Цвет Ñлоновой коÑти." #: doc/classes/Color.xml msgid "Khaki color." -msgstr "" +msgstr "Цвет хаки." #: doc/classes/Color.xml msgid "Lavender color." -msgstr "" +msgstr "Цвет лаванды." #: doc/classes/Color.xml msgid "Lavender blush color." @@ -16499,7 +16641,7 @@ msgstr "" #: doc/classes/Color.xml msgid "Lime color." -msgstr "" +msgstr "Цвет лайма." #: doc/classes/Color.xml msgid "Lime green color." @@ -16507,15 +16649,15 @@ msgstr "" #: doc/classes/Color.xml msgid "Linen color." -msgstr "" +msgstr "Цвет льна." #: doc/classes/Color.xml msgid "Magenta color." -msgstr "" +msgstr "Пурпурный цвет." #: doc/classes/Color.xml msgid "Maroon color." -msgstr "" +msgstr "Бордовый цвет." #: doc/classes/Color.xml msgid "Medium aquamarine color." @@ -16567,7 +16709,7 @@ msgstr "" #: doc/classes/Color.xml msgid "Moccasin color." -msgstr "" +msgstr "Цвет мокаÑин." #: doc/classes/Color.xml msgid "Navajo white color." @@ -16627,7 +16769,7 @@ msgstr "" #: doc/classes/Color.xml msgid "Peru color." -msgstr "" +msgstr "ПеруанÑкий цвет." #: doc/classes/Color.xml msgid "Pink color." @@ -16635,7 +16777,7 @@ msgstr "Розовый цвет." #: doc/classes/Color.xml msgid "Plum color." -msgstr "" +msgstr "Цвет Ñливы." #: doc/classes/Color.xml msgid "Powder blue color." @@ -16667,7 +16809,7 @@ msgstr "" #: doc/classes/Color.xml msgid "Salmon color." -msgstr "" +msgstr "Цвет лоÑоÑÑ." #: doc/classes/Color.xml msgid "Sandy brown color." @@ -16683,11 +16825,11 @@ msgstr "Цвет морÑкой раковины." #: doc/classes/Color.xml msgid "Sienna color." -msgstr "" +msgstr "Цвет Ñиены." #: doc/classes/Color.xml msgid "Silver color." -msgstr "" +msgstr "СеребрÑный цвет." #: doc/classes/Color.xml msgid "Sky blue color." @@ -16703,7 +16845,7 @@ msgstr "" #: doc/classes/Color.xml msgid "Snow color." -msgstr "" +msgstr "Цвет Ñнега." #: doc/classes/Color.xml msgid "Spring green color." @@ -16715,19 +16857,19 @@ msgstr "" #: doc/classes/Color.xml msgid "Tan color." -msgstr "" +msgstr "Цвет загара." #: doc/classes/Color.xml msgid "Teal color." -msgstr "" +msgstr "Цвет тила." #: doc/classes/Color.xml msgid "Thistle color." -msgstr "" +msgstr "Цвет чертополоха." #: doc/classes/Color.xml msgid "Tomato color." -msgstr "" +msgstr "Цвет томатов." #: doc/classes/Color.xml msgid "Transparent color (white with no alpha)." @@ -16735,7 +16877,7 @@ msgstr "" #: doc/classes/Color.xml msgid "Turquoise color." -msgstr "" +msgstr "Бирюзовый цвет." #: doc/classes/Color.xml msgid "Violet color." @@ -16759,11 +16901,11 @@ msgstr "" #: doc/classes/Color.xml msgid "Wheat color." -msgstr "" +msgstr "Цвет пшеницы." #: doc/classes/Color.xml msgid "White color." -msgstr "" +msgstr "Белый цвет." #: doc/classes/Color.xml msgid "White smoke color." @@ -17004,7 +17146,7 @@ msgstr "" #: doc/classes/ColorRect.xml msgid "Colored rectangle." -msgstr "" +msgstr "Цветной прÑмоугольник." #: doc/classes/ColorRect.xml msgid "" @@ -17040,6 +17182,21 @@ msgid "" "Physics the area will not detect any collisions with the concave shape at " "all (this is a known bug)." msgstr "" +"РеÑÑƒÑ€Ñ Ñ„Ð¾Ñ€Ð¼Ñ‹ вогнутого многоугольника, который может быть уÑтановлен в " +"[PhysicsBody] или облаÑть. Ðта форма ÑоздаетÑÑ Ð¿ÑƒÑ‚ÐµÐ¼ подачи ÑпиÑка " +"треугольников.\n" +"[b]Примечание:[/b] При иÑпользовании Ð´Ð»Ñ Ñтолкновений [ConcavePolygonShape] " +"предназначен Ð´Ð»Ñ Ñ€Ð°Ð±Ð¾Ñ‚Ñ‹ Ñо ÑтатичеÑкими узлами [PhysicsBody], такими как " +"[StaticBody], и не будет работать Ñ [KinematicBody] или [RigidBody] Ñ " +"режимом, отличным от Static.\n" +"[b]Предупреждение:[/b] ИÑпользование Ñтой формы Ð´Ð»Ñ [Area] (через узел " +"[CollisionShape], Ñозданный, например. Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ опции [i]Create Trimesh " +"Collision Sibling[/i] в меню [i]Mesh[/i], которое поÑвлÑетÑÑ Ð¿Ñ€Ð¸ выборе узла " +"[MeshInstance]) может привеÑти к неожиданным результатам: при иÑпользовании " +"Godot Physics облаÑть будет обнаруживать ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ Ð³Ñ€Ð°Ð½Ñми " +"треугольника в [ConcavePolygonShape] (а не Ñ Ð»ÑŽÐ±Ð¾Ð¹ \"внутренней\" чаÑтью " +"формы, например), а при иÑпользовании Bullet Physics облаÑть вообще не будет " +"обнаруживать Ñтолкновений Ñ Ð²Ð¾Ð³Ð½ÑƒÑ‚Ð¾Ð¹ формой (Ñто извеÑÑ‚Ð½Ð°Ñ Ð¾ÑˆÐ¸Ð±ÐºÐ°)." #: doc/classes/ConcavePolygonShape.xml msgid "Returns the faces (an array of triangles)." @@ -17070,6 +17227,21 @@ msgid "" "the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " "the shape, for example)." msgstr "" +"РеÑÑƒÑ€Ñ Ð²Ð¾Ð³Ð½ÑƒÑ‚Ð¾Ð¹ многоугольной 2D формы Ð´Ð»Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ¸. Он ÑоÑтоит из Ñегментов и " +"оптимален Ð´Ð»Ñ Ñложных полигональных вогнутых Ñтолкновений. Однако его не " +"рекомендуетÑÑ Ð¸Ñпользовать Ð´Ð»Ñ ÑƒÐ·Ð»Ð¾Ð² [RigidBody2D]. ВмеÑто него " +"рекомендуетÑÑ Ð¸Ñпользовать CollisionPolygon2D в режиме выпуклого Ñ€Ð°Ð·Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ " +"(твердые тела) или неÑколько выпуклых объектов. Ð’ противном Ñлучае Ð´Ð»Ñ " +"ÑтатичеÑких Ñтолкновений лучше иÑпользовать вогнутую полигональную 2D-" +"форму.\n" +"ОÑновное различие между [ConvexPolygonShape2D] и [ConcavePolygonShape2D] " +"заключаетÑÑ Ð² том, что вогнутый полигон предполагает, что он вогнутый и " +"иÑпользует более Ñложный метод Ð¾Ð±Ð½Ð°Ñ€ÑƒÐ¶ÐµÐ½Ð¸Ñ Ñтолкновений, а выпуклый " +"заÑтавлÑет ÑÐµÐ±Ñ Ð±Ñ‹Ñ‚ÑŒ выпуклым, чтобы уÑкорить обнаружение Ñтолкновений.\n" +"[b]Предупреждение:[/b] ИÑпользование Ñтой фигуры Ð´Ð»Ñ [Area2D] (через узел " +"[CollisionShape2D]) может дать неожиданные результаты: облаÑть будет " +"обнаруживать ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ Ñ Ñегментами в [ConcavePolygonShape2D] (а " +"не Ñ Ð»ÑŽÐ±Ð¾Ð¹ \"внутренней\" чаÑтью фигуры, например)." #: doc/classes/ConcavePolygonShape2D.xml msgid "" @@ -17529,6 +17701,27 @@ msgid "" "[member rect_clip_content] or [method _clips_input] enabled.\n" "[b]Note:[/b] Event position is relative to the control origin." msgstr "" +"Виртуальный метод, который должен быть реализован пользователем. ИÑпользуйте " +"Ñтот метод Ð´Ð»Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸ и приема входных данных на Ñлементах " +"пользовательÑкого интерфейÑа. См. [метод accept_event].\n" +"Пример: щелчок по Ñлементу управлениÑ.\n" +"[codeblock].\n" +"func _gui_input(event):\n" +" if event is InputEventMouseButton:\n" +" if event.button_index == BUTTON_LEFT and event.pressed:\n" +" print(\"Ðа Ð¼ÐµÐ½Ñ Ð½Ð°Ð¶Ð°Ð»Ð¸ D:\")\n" +"[/codeblock].\n" +"Событие не Ñработает, еÑли:\n" +"* щелчок вне Ñлемента ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ (Ñм. [метод has_point]);\n" +"* у Ñлемента ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ [member mouse_filter] уÑтановлено значение [constant " +"MOUSE_FILTER_IGNORE];\n" +"* Ñлемент ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ð¾Ñ€Ð¾Ð¶ÐµÐ½ другим [Control] Ñверху, у которого [member " +"mouse_filter] не уÑтановлен на [constant MOUSE_FILTER_IGNORE];\n" +"* родитель Ñлемента ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¸Ð¼ÐµÐµÑ‚ [member mouse_filter], уÑтановленный на " +"[constant MOUSE_FILTER_STOP] или принÑл Ñобытие;\n" +"* Ñобытие проиÑходит вне прÑмоугольника родителÑ, и у Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½ [член " +"rect_clip_content] или [метод _clips_input].\n" +"[b]Примечание:[/b] Положение ÑÐ¾Ð±Ñ‹Ñ‚Ð¸Ñ Ð¾Ñ‚Ð½Ð¾Ñительно начала Ñлемента управлениÑ." #: doc/classes/Control.xml msgid "" @@ -17654,6 +17847,27 @@ msgid "" "$MyButton.add_stylebox_override(\"normal\", null)\n" "[/codeblock]" msgstr "" +"Создает локальное переопределение Ð´Ð»Ñ Ñ‚ÐµÐ¼Ñ‹ [StyleBox] Ñ ÑƒÐºÐ°Ð·Ð°Ð½Ð½Ñ‹Ð¼ " +"[code]именем[/code] . Локальные Ð¿ÐµÑ€ÐµÐ¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð²Ñегда имеют приоритет при " +"получении Ñлементов темы Ð´Ð»Ñ Ñлемента управлениÑ.\n" +"[b]Примечание:[/b] Переопределение можно удалить, приÑвоив ему значение " +"[code]null[/code]. Ðто поведение уÑтарело и будет удалено в верÑии 4.0, " +"иÑпользуйте [метод remove_stylebox_override] вмеÑто Ñтого.\n" +"См. также [метод get_stylebox].\n" +"[b]Пример Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ ÑвойÑтва в StyleBox путем его дублированиÑ:[/b]\n" +"[codeblock]\n" +"# Ð’ приведенном ниже фрагменте предполагаетÑÑ, что дочернему узлу MyButton " +"назначен StyleBoxFlat.\n" +"# РеÑурÑÑ‹ разделÑÑŽÑ‚ÑÑ Ð¼ÐµÐ¶Ð´Ñƒ ÑкземплÑрами, поÑтому нам нужно продублировать " +"его.\n" +"# чтобы избежать Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð½ÐµÑˆÐ½ÐµÐ³Ð¾ вида вÑех оÑтальных кнопок.\n" +"var new_stylebox_normal = $MyButton.get_stylebox(\"normal\").duplicate()\n" +"new_stylebox_normal.border_width_top = 3\n" +"new_stylebox_normal.border_color = Color(0, 1, 0.5)\n" +"$MyButton.add_stylebox_override(\"normal\", new_stylebox_normal)\n" +"# Удалите переопределение Ñтилей.\n" +"$MyButton.add_stylebox_override(\"normal\", null)\n" +"[/codeblock]." #: doc/classes/Control.xml msgid "" @@ -18362,6 +18576,27 @@ msgid "" "theme.set_color(\"font_color\", \"TooltipLabel\", Color(0, 1, 1))\n" "[/codeblock]" msgstr "" +"ИзменÑет текÑÑ‚ вÑплывающей подÑказки. ПодÑказка поÑвлÑетÑÑ, когда курÑор " +"мыши Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»Ñ Ð¿Ñ€Ð¾Ñтаивает над Ñтим Ñлементом ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð² течение " +"неÑкольких мгновений, при уÑловии, что ÑвойÑтво [member mouse_filter] не " +"ÑвлÑетÑÑ [constant MOUSE_FILTER_IGNORE]. Ð’Ñ‹ можете изменить времÑ, " +"необходимое Ð´Ð»Ñ Ð¿Ð¾ÑÐ²Ð»ÐµÐ½Ð¸Ñ Ð²Ñплывающей подÑказки Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ опции [code]gui/" +"timers/tooltip_delay_sec[/code] в ÐаÑтройках проекта.\n" +"Ð’ÑÐ¿Ð»Ñ‹Ð²Ð°ÑŽÑ‰Ð°Ñ Ð¿Ð¾Ð´Ñказка будет иÑпользовать либо реализацию по умолчанию, либо " +"пользовательÑкую, которую вы можете Ñоздать, переопределив [метод " +"_make_custom_tooltip]. Ð’ÑÐ¿Ð»Ñ‹Ð²Ð°ÑŽÑ‰Ð°Ñ Ð¿Ð¾Ð´Ñказка по умолчанию включает " +"[PopupPanel] и [Label], ÑвойÑтва темы которых можно наÑтроить Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " +"методов [Theme] Ñ [code]\"TooltipPanel\"[/code] и [code]\"TooltipLabel\"[/" +"code] ÑоответÑтвенно. Ðапример:\n" +"[codeblock]\n" +"var style_box = StyleBoxFlat.new()\n" +"style_box.set_bg_color(Color(1, 1, 0))\n" +"style_box.set_border_width_all(2)\n" +"# ЗдеÑÑŒ мы предполагаем, что ÑвойÑтву `theme` была предварительно назначена " +"пользовательÑÐºÐ°Ñ Ñ‚ÐµÐ¼Ð°.\n" +"theme.set_stylebox(\"panel\", \"TooltipPanel\", style_box)\n" +"theme.set_color(\"font_color\", \"TooltipLabel\", Color(0, 1, 1))\n" +"[/codeblock]" #: doc/classes/Control.xml msgid "" @@ -18482,6 +18717,22 @@ msgid "" "[code]yield(get_tree(), \"idle_frame\")[/code] then set its [member " "rect_scale] property." msgstr "" +"МаÑштаб узла отноÑительно его [member rect_size]. Измените Ñто ÑвойÑтво, " +"чтобы изменить маÑштаб узла отноÑительно его [член rect_pivot_offset]. " +"МаÑштаб [member hint_tooltip] Ñлемента ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ñ‚Ð°ÐºÐ¶Ðµ будет изменÑтьÑÑ Ð² " +"ÑоответÑтвии Ñ Ñтим значением.\n" +"[b]Примечание:[/b] Ðто ÑвойÑтво в оÑновном предназначено Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð² " +"целÑÑ… анимации. ТекÑÑ‚ внутри Ñлемента ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÐµÑ‚ выглÑдеть " +"пикÑелированным или размытым при маÑштабировании Ñлемента управлениÑ. Ð”Ð»Ñ " +"поддержки неÑкольких разрешений в вашем проекте иÑпользуйте ÑоответÑтвующий " +"режим раÑÑ‚ÑÐ¶ÐµÐ½Ð¸Ñ Ð²Ð¸Ð´Ð¾Ð²Ð¾Ð³Ð¾ Ñкрана, как опиÑано в [url=$DOCS_URL/tutorials/" +"rendering/multiple_resolutions.html]документации[/url] вмеÑто " +"маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ Controls по отдельноÑти.\n" +"[b]Примечание:[/b] ЕÑли узел Control ÑвлÑетÑÑ Ð´Ð¾Ñ‡ÐµÑ€Ð½Ð¸Ð¼ узлом узла " +"[Container], маÑштаб будет Ñброшен на [code]Vector2(1, 1)[/code] при " +"инÑтанÑировании Ñцены. Чтобы уÑтановить маÑштаб Ñлемента ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸ его " +"инÑтанцировании, подождите один кадр, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ [code]yield(get_tree(), " +"\"idle_frame\")[/code], а затем уÑтановите его ÑвойÑтво [member rect_scale]." #: doc/classes/Control.xml msgid "" @@ -19750,6 +20001,43 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] Not available in HTML5 exports." msgstr "" +"КлаÑÑ Crypto позволÑет вам получить доÑтуп к некоторым более продвинутым " +"криптографичеÑким функциÑм в Godot.\n" +"Ðа данный момент Ñто Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ ÐºÑ€Ð¸Ð¿Ñ‚Ð¾Ð³Ñ€Ð°Ñ„Ð¸Ñ‡ÐµÑки безопаÑных Ñлучайных байтов, " +"Ð³ÐµÐ½ÐµÑ€Ð°Ñ†Ð¸Ñ RSA-ключей и ÑамоподпиÑанных Ñертификатов X509, шифрование/" +"дешифрование аÑимметричных ключей, а также подпиÑание/верификациÑ.\n" +"[codeblock].\n" +"раÑширÑет Node\n" +"\n" +"var crypto = Crypto.new()\n" +"var key = CryptoKey.new()\n" +"var cert = X509Certificate.new()\n" +"\n" +"func _ready():\n" +" # Генерируем новый RSA-ключ.\n" +" key = crypto.generate_rsa(4096)\n" +" # Генерируем новый ÑамоподпиÑанный Ñертификат Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ñ‹Ð¼ ключом.\n" +" cert = crypto.generate_self_signed_certificate(key, \"CN=mydomain.com," +"O=My Game Company,C=IT\")\n" +" # Сохраните ключ и Ñертификат в папке пользователÑ.\n" +" key.save(\"user://generated.key\")\n" +" cert.save(\"user://generated.crt\")\n" +" # Шифрование\n" +" var data = \"Ðекоторые данные\"\n" +" var encrypted = crypto.encrypt(key, data.to_utf8())\n" +" # РаÑшифровка\n" +" var decrypted = crypto.decrypt(key, encrypted)\n" +" # ПодпиÑание\n" +" var signature = crypto.sign(HashingContext.HASH_SHA256, data." +"sha256_buffer(), key)\n" +" # Проверка\n" +" verified = crypto.verify(HashingContext.HASH_SHA256, data." +"sha256_buffer(), signature, key)\n" +" # ПроверÑет\n" +" assert(verified)\n" +" assert(data.to_utf8() == decrypted)\n" +"[/codeblock].\n" +"[b]Примечание:[/b] ÐедоÑтупно в ÑкÑпорте HTML5." #: doc/classes/Crypto.xml msgid "" @@ -19936,6 +20224,19 @@ msgid "" "node also has a significant CPU cost, so it should be avoided during " "gameplay." msgstr "" +"Ð”Ð»Ñ Ñложного раÑÐ¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ñ„Ð¸Ð³ÑƒÑ€ иногда требуетÑÑ Ð´Ð¾Ð±Ð°Ð²Ð¸Ñ‚ÑŒ Ñтруктуру в узлы " +"CSG. Узел CSGCombiner позволÑет Ñоздать такую Ñтруктуру. Узел инкапÑулирует " +"результат операций CSG Ñвоих дочерних узлов. Таким образом, можно выполнить " +"операции над одним набором фигур, которые ÑвлÑÑŽÑ‚ÑÑ Ð´Ð¾Ñ‡ÐµÑ€Ð½Ð¸Ð¼Ð¸ Ñлементами " +"одного узла CSGCombiner, и Ñ€Ñд отдельных операций над вторым набором фигур, " +"которые ÑвлÑÑŽÑ‚ÑÑ Ð´Ð¾Ñ‡ÐµÑ€Ð½Ð¸Ð¼Ð¸ Ñлементами второго узла CSGCombiner, а затем " +"выполнить операцию, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¸Ñпользует Ñти два конечных результата в " +"качеÑтве входных данных Ð´Ð»Ñ ÑÐ¾Ð·Ð´Ð°Ð½Ð¸Ñ Ð¾ÐºÐ¾Ð½Ñ‡Ð°Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ð¹ фигуры.\n" +"[b]Примечание:[/b] CSG-узлы предназначены Ð´Ð»Ñ Ð¸ÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ð¿Ñ€Ð¸ Ñоздании " +"прототипов уровней. Создание CSG-узлов требует значительных затрат " +"процеÑÑора по Ñравнению Ñ Ñозданием [MeshInstance] Ñ [PrimitiveMesh]. " +"Перемещение узла CSG внутри другого узла CSG также требует значительных " +"затрат процеÑÑора, поÑтому Ñтого Ñледует избегать во Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð³Ñ€Ð¾Ð²Ð¾Ð³Ð¾ процеÑÑа." #: modules/csg/doc_classes/CSGCylinder.xml msgid "A CSG Cylinder shape." @@ -21139,6 +21440,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "Ð’Ñ‹Ñота цилиндра." @@ -21185,7 +21494,7 @@ msgstr "" #: doc/classes/Dictionary.xml msgid "Dictionary type." -msgstr "" +msgstr "Тип ÑловарÑ." #: doc/classes/Dictionary.xml msgid "" @@ -23357,6 +23666,25 @@ msgid "" " return state\n" "[/codeblock]" msgstr "" +"Переопределите Ñтот метод, чтобы предоÑтавить данные ÑоÑтоÑниÑ, которые вы " +"хотите Ñохранить, например, положение вида, наÑтройки Ñетки, Ñворачивание и " +"Ñ‚.д. Ðти данные иÑпользуютÑÑ Ð¿Ñ€Ð¸ Ñохранении Ñцены (чтобы ÑоÑтоÑние " +"ÑохранÑлоÑÑŒ при ее повторном открытии) и при переключении вкладок (чтобы " +"ÑоÑтоÑние можно было воÑÑтановить при возврате на вкладку). Ðти данные " +"автоматичеÑки ÑохранÑÑŽÑ‚ÑÑ Ð´Ð»Ñ ÐºÐ°Ð¶Ð´Ð¾Ð¹ Ñцены в файле [code]editstate[/code] в " +"папке метаданных редактора. ЕÑли вы хотите Ñохранить глобальные (незавиÑимые " +"от Ñцены) данные редактора Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ плагина, вы можете иÑпользовать [метод " +"get_window_layout] вмеÑто Ñтого.\n" +"ИÑпользуйте [method set_state] Ð´Ð»Ñ Ð²Ð¾ÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ñохраненного ÑоÑтоÑниÑ.\n" +"[b]Примечание:[/b] Ðтот метод не Ñледует иÑпользовать Ð´Ð»Ñ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð²Ð°Ð¶Ð½Ñ‹Ñ… " +"наÑтроек, которые должны ÑохранÑтьÑÑ Ð² проекте.\n" +"[b]Примечание:[/b] Ð”Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð³Ð¾ ÑÐ¾Ñ…Ñ€Ð°Ð½ÐµÐ½Ð¸Ñ Ð¸ воÑÑÑ‚Ð°Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ ÑоÑтоÑÐ½Ð¸Ñ " +"необходимо реализовать [метод get_plugin_name].\n" +"[codeblock].\n" +"func get_state():\n" +" var state = {\"zoom\": zoom, \"preferred_color\": my_color}\n" +" return state\n" +"[/codeblock]" #: doc/classes/EditorPlugin.xml msgid "" @@ -23907,6 +24235,33 @@ msgid "" "- Binary format in FBX 2017\n" "[/codeblock]" msgstr "" +"Ðто импортер 3D-активов FBX Ñ Ð¿Ð¾Ð»Ð½Ð¾Ð¹ поддержкой большинÑтва функций FBX.\n" +"При ÑкÑпорте FBX-Ñцены из Autodesk Maya иÑпользуйте Ñти наÑтройки ÑкÑпорта " +"FBX:\n" +"[codeblock]\n" +"- Группы ÑглаживаниÑ\n" +"- Сгладить Ñетку\n" +"- Triangluate (Ð´Ð»Ñ Ñеток Ñ Ñ„Ð¾Ñ€Ð¼Ð°Ð¼Ð¸ ÑмешениÑ)\n" +"- Запечь анимацию\n" +"- ÐŸÐ¾Ð²Ñ‚Ð¾Ñ€Ð½Ð°Ñ Ð²Ñ‹Ð±Ð¾Ñ€ÐºÐ°\n" +"- Деформированные модели\n" +"- Скины\n" +"- Фигуры наложениÑ\n" +"- Фильтры кривых\n" +"- Уменьшитель поÑтоÑнного ключа\n" +"- Только автоматичеÑкие каÑательные\n" +"- Ðе отмечайте *Ðе отмечайте* Constraints (так как Ñто приведет к поломке " +"файла)\n" +"- Можно уÑтановить флажок Embed Media (вÑтраивает текÑтуры в ÑкÑпортируемый " +"FBX-файл).\n" +" - Обратите внимание, что при импорте вÑтроенной Ñреды текÑтура и Ñетка " +"будут одним неизменÑемым файлом.\n" +" - Вам придетÑÑ Ð¿Ð¾Ð²Ñ‚Ð¾Ñ€Ð½Ð¾ ÑкÑпортировать и повторно импортировать FBX, еÑли " +"текÑтура изменилаÑÑŒ.\n" +"- Единицы измерениÑ: Сантиметры\n" +"- ОÑÑŒ вверх: Y\n" +"- Двоичный формат в FBX 2017\n" +"[/codeblock]." #: modules/gltf/doc_classes/EditorSceneImporterGLTF.xml msgid "" @@ -23985,7 +24340,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -25032,6 +25390,27 @@ msgid "" "Effects\" by default. It improves the performance on mobile devices, but at " "the same time affects the screen display on mobile devices." msgstr "" +"РеÑÑƒÑ€Ñ Ð´Ð»Ñ ÑƒÐ·Ð»Ð¾Ð² Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸Ñ (например, [WorldEnvironment]), которые " +"определÑÑŽÑ‚ неÑколько операций Ñ Ð¾ÐºÑ€ÑƒÐ¶ÐµÐ½Ð¸ÐµÐ¼ (например, фон [Sky] или [Color], " +"окружающий Ñвет, туман, глубина резкоÑти...). Ðти параметры влиÑÑŽÑ‚ на " +"конечный рендеринг Ñцены. ПорÑдок Ñтих операций Ñледующий:\n" +"- Размытие глубины резкоÑти\n" +"- Свечение\n" +"- Ð¢Ð¾Ð½Ð¾Ð²Ð°Ñ ÐºÐ°Ñ€Ñ‚Ð° (автоÑкÑпозициÑ)\n" +"- Корректировки\n" +"ЕÑли Ð´Ð»Ñ Ñ†ÐµÐ»ÐµÐ²Ð¾Ð³Ð¾ [Viewport] уÑтановлено значение \"2D без выборки\", вÑе " +"Ñффекты поÑтобработки будут недоÑтупны. При уÑтановке \"3D без Ñффектов\" " +"Ñледующие опции будут недоÑтупны:\n" +"- Ssao\n" +"- Ss Reflections\n" +"Ðто можно наÑтроить Ð´Ð»Ñ ÐºÐ¾Ñ€Ð½ÐµÐ²Ð¾Ð³Ð¾ вьюпорта Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [member ProjectSettings." +"rendering/quality/intended_usage/framebuffer_allocation] или Ð´Ð»Ñ " +"определенных вьюпортов Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ÑвойÑтва [member Viewport.usage].\n" +"Обратите внимание, что [member ProjectSettings.rendering/quality/" +"intended_usage/framebuffer_allocation] имеет переопределение Ð´Ð»Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ñ‹Ñ… " +"платформ, чтобы иÑпользовать \"3D без Ñффектов\" по умолчанию. Ðто улучшает " +"производительноÑть на мобильных уÑтройÑтвах, но в то же Ð²Ñ€ÐµÐ¼Ñ Ð²Ð»Ð¸Ñет на " +"отображение Ñкрана на мобильных уÑтройÑтвах." #: doc/classes/Environment.xml doc/classes/WorldEnvironment.xml #, fuzzy @@ -26431,6 +26810,22 @@ msgid "" "the [method @GDScript.is_equal_approx] and [method @GDScript.is_zero_approx] " "methods instead of [code]==[/code] to compare [float] values for equality." msgstr "" +"Ð’Ñтроенный тип [float] - Ñто 64-битное чиÑло Ñ Ð¿Ð»Ð°Ð²Ð°ÑŽÑ‰ÐµÐ¹ точкой двойной " +"точноÑти, Ñквивалентное [code]double[/code] в C++. Ðтот тип имеет 14 " +"надежных деÑÑтичных цифр точноÑти. Тип [float] может хранитьÑÑ Ð² [Variant], " +"который ÑвлÑетÑÑ Ð¾Ð±Ñ‰Ð¸Ð¼ типом, иÑпользуемым движком. МакÑимальное значение " +"[float] приблизительно равно [code]1.79769e308[/code], а минимальное - " +"приблизительно [code]-1.79769e308[/code].\n" +"БольшинÑтво методов и ÑвойÑтв в движке иÑпользуют 32-битные чиÑла Ñ " +"плавающей точкой одинарной точноÑти, Ñквивалентные [code]float[/code] в C++, " +"которые имеют 6 надежных деÑÑтичных цифр точноÑти. Ð”Ð»Ñ Ñтруктур данных, " +"таких как [Vector2] и [Vector3], Godot иÑпользует 32-битные чиÑла Ñ " +"плавающей точкой.\n" +"Математика, выполнÑÐµÐ¼Ð°Ñ Ñ Ð¸Ñпользованием типа [float], не гарантирует " +"точноÑти или детерминированноÑти, и чаÑто будет приводить к небольшим " +"ошибкам. Обычно Ð´Ð»Ñ ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ð¹ [float] на равенÑтво Ñледует " +"иÑпользовать методы [method @GDScript.is_equal_approx] и [method @GDScript." +"is_zero_approx] вмеÑто [code]==[/code]." #: doc/classes/float.xml msgid "Wikipedia: Double-precision floating-point format" @@ -26502,6 +26897,22 @@ msgid "" "emoji) are [i]not[/i] supported on Windows. They will display as unknown " "characters instead. This will be resolved in Godot 4.0." msgstr "" +"Шрифт Ñодержит набор Ñимволов, ÑовмеÑтимый Ñ Unicode, а также возможноÑть " +"риÑовать его Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð¾Ð¹ шириной, подъемом, ÑпуÑком и кернингом. О Ñоздании " +"шрифтов из файлов TTF (или других форматов шрифтов) Ñм. раздел \"Поддержка " +"шрифтов редактором\".\n" +"[b]Примечание:[/b] ЕÑли [DynamicFont] не Ñодержит Ñимвол, иÑпользуемый в " +"Ñтроке, то данный Ñимвол будет заменен кодовой точкой [code]0xfffd[/code], " +"еÑли она доÑтупна в [DynamicFont]. ЕÑли Ñтот заменÑющий Ñимвол недоÑтупен в " +"DynamicFont, Ñимвол будет Ñкрыт без Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð¼ÐµÐ½Ñющего Ñимвола в " +"Ñтроке.\n" +"[b]Примечание:[/b] ЕÑли [BitmapFont] не Ñодержит Ñимвол, иÑпользуемый в " +"Ñтроке, то данный Ñимвол будет Ñкрыт без Ð¾Ñ‚Ð¾Ð±Ñ€Ð°Ð¶ÐµÐ½Ð¸Ñ Ð·Ð°Ð¼ÐµÐ½Ñющего Ñимвола в " +"Ñтроке.\n" +"[b]Примечание:[/b] Символы Юникода поÑле [code]0xffff[/code] (например, " +"большинÑтво Ñмодзи) [i]не[/i] поддерживаютÑÑ Ð² Windows. ВмеÑто Ñтого они " +"будут отображатьÑÑ ÐºÐ°Ðº неизвеÑтные Ñимволы. Ðта проблема будет решена в " +"верÑии Godot 4.0." #: doc/classes/Font.xml msgid "" @@ -27432,6 +27843,29 @@ msgid "" "150), Vector2(50, 150)]\n" "[/codeblock]" msgstr "" +"Раздувает или Ñдувает [code]многоугольник[/code] на [code]дельту[/code] " +"единиц (пикÑелей). ЕÑли [code]дельта[/code] положительна, полигон " +"увеличиваетÑÑ Ð½Ð°Ñ€ÑƒÐ¶Ñƒ. ЕÑли [code]дельта[/code] отрицательна, полигон " +"уменьшаетÑÑ Ð²Ð½ÑƒÑ‚Ñ€ÑŒ. Возвращает маÑÑив полигонов, так как при раздувании/" +"Ñжатии может получитьÑÑ Ð½ÐµÑколько диÑкретных полигонов. Возвращает пуÑтой " +"маÑÑив, еÑли [code]delta[/code] отрицательна и ее абÑолютное значение " +"приблизительно превышает минимальные размеры ограничивающего прÑмоугольника " +"многоугольника.\n" +"Вершины каждого многоугольника будут округлены в ÑоответÑтвии Ñ Ñ‚Ð¸Ð¿Ð¾Ð¼ " +"[code]join_type[/code], Ñм. [enum PolyJoinType].\n" +"Ð’ результате операции может быть получен внешний многоугольник (граница) и " +"внутренний многоугольник (отверÑтие), которые можно отличить, вызвав [метод " +"is_polygon_clockwise].\n" +"[b]Примечание:[/b] Ð”Ð»Ñ Ñпециального перевода вершин многоугольника " +"иÑпользуйте метод [method Transform2D.xform]:\n" +"[codeblock].\n" +"var polygon = PoolVector2Array([Vector2(0, 0), Vector2(100, 0), Vector2(100, " +"100), Vector2(0, 100)])\n" +"var offset = Vector2(50, 50)\n" +"polygon = Transform2D(0, offset).xform(polygon)\n" +"print(polygon) # печатает [Vector2(50, 50), Vector2(150, 50), Vector2(150, " +"150), Vector2(50, 150)]\n" +"[/codeblock]" #: doc/classes/Geometry.xml msgid "" @@ -27813,6 +28247,23 @@ msgid "" "[code]call_deferred(\"bake\")[/code] instead of calling [method bake] " "directly." msgstr "" +"Запекает Ñффект из вÑех [GeometryInstance]ов, помеченных [member " +"GeometryInstance.use_in_baked_light] и [Light]ов, помеченных либо [constant " +"Light.BAKE_INDIRECT], либо [constant Light.BAKE_ALL]. ЕÑли " +"[code]create_visual_debug[/code] равен [code]true[/code], то поÑле Ð·Ð°Ð¿ÐµÐºÐ°Ð½Ð¸Ñ " +"Ñвета будет Ñгенерирован [MultiMesh], который имеет куб, предÑтавлÑющий " +"каждую твердую Ñчейку, причем каждый куб окрашен в цвет альбедо Ñчейки. Ðто " +"можно иÑпользовать Ð´Ð»Ñ Ð²Ð¸Ð·ÑƒÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ данных [GIProbe] и отладки любых " +"проблем, которые могут возникнуть.\n" +"[b]Примечание:[/b] [method bake] работает как в редакторе, так и в " +"ÑкÑпортированных проектах. Ðто делает его подходÑщим Ð´Ð»Ñ Ð¿Ñ€Ð¾Ñ†ÐµÐ´ÑƒÑ€Ð½Ð¾ " +"генерируемых или пользовательÑких уровней. Запекание [GIProbe] обычно " +"занимает от 5 до 20 Ñекунд в большинÑтве Ñцен. Уменьшение [member subdiv] " +"может уÑкорить запекание.\n" +"[b]Примечание:[/b] [GeometryInstance]Ñ‹ и [Light]Ñ‹ должны быть полноÑтью " +"готовы до вызова [метода bake]. ЕÑли вы Ñоздаете их процедурно и некоторые " +"Ñетки или оÑвещение отÑутÑтвуют в вашем запекаемом [GIProbe], иÑпользуйте " +"[code]call_deferred(\"bake\")[/code] вмеÑто прÑмого вызова [метода bake]." #: doc/classes/GIProbe.xml msgid "Calls [method bake] with [code]create_visual_debug[/code] enabled." @@ -28180,7 +28631,7 @@ msgstr "" #: doc/classes/GradientTexture.xml msgid "Gradient-filled texture." -msgstr "" +msgstr "ТекÑтура Ñ Ð³Ñ€Ð°Ð´Ð¸ÐµÐ½Ñ‚Ð½Ñ‹Ð¼ заполнением." #: doc/classes/GradientTexture.xml msgid "" @@ -28944,6 +29395,21 @@ msgid "" "light not affect the first layer, the whole GridMap won't be lit by the " "light in question." msgstr "" +"GridMap позволÑет размещать Ñетки на Ñетке в интерактивном режиме. Она " +"работает как из редактора, так и из Ñкриптов, что может помочь вам Ñоздать " +"внутриигровые редакторы уровней.\n" +"GridMap иÑпользует [MeshLibrary], ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ñодержит ÑпиÑок плиток. ÐšÐ°Ð¶Ð´Ð°Ñ " +"плитка - Ñто Ñетка Ñ Ð¼Ð°Ñ‚ÐµÑ€Ð¸Ð°Ð»Ð°Ð¼Ð¸ и дополнительными фигурами Ñтолкновений и " +"навигации.\n" +"GridMap Ñодержит коллекцию Ñчеек. ÐšÐ°Ð¶Ð´Ð°Ñ Ñчейка Ñетки ÑÑылаетÑÑ Ð½Ð° тайл в " +"[MeshLibrary]. Ð’Ñе Ñчейки в карте имеют одинаковые размеры.\n" +"Внутри карта GridMap разбиваетÑÑ Ð½Ð° разреженную коллекцию октантов Ð´Ð»Ñ " +"Ñффективного рендеринга и обработки физики. Каждый октант имеет одинаковые " +"размеры и может Ñодержать неÑколько Ñчеек.\n" +"[b]Примечание:[/b] GridMap не раÑширÑет [VisualInstance] и поÑтому не может " +"быть Ñкрыт или замаÑкирован на оÑнове [member VisualInstance.layers]. ЕÑли " +"Ñделать так, чтобы Ñвет не влиÑл на первый Ñлой, то вÑÑ GridMap не будет " +"оÑвещена данным Ñветом." #: modules/gridmap/doc_classes/GridMap.xml msgid "Using gridmaps" @@ -29168,6 +29634,33 @@ msgid "" " printt(res.hex_encode(), Array(res))\n" "[/codeblock]" msgstr "" +"КлаÑÑ HashingContext предоÑтавлÑет Ð¸Ð½Ñ‚ÐµÑ€Ñ„ÐµÐ¹Ñ Ð´Ð»Ñ Ð²Ñ‹Ñ‡Ð¸ÑÐ»ÐµÐ½Ð¸Ñ " +"криптографичеÑких Ñ…Ñшей за неÑколько итераций. Ðто полезно, например, при " +"вычиÑлении Ñ…Ñшей больших файлов (чтобы не загружать их вÑе в памÑть), " +"Ñетевых потоков и потоков данных в целом (чтобы не держать буферы).\n" +"ПеречиÑление [enum HashType] показывает поддерживаемые алгоритмы " +"Ñ…ÑшированиÑ.\n" +"[codeblock]\n" +"const CHUNK_SIZE = 1024\n" +"\n" +"func hash_file(path):\n" +" var ctx = HashingContext.new()\n" +" var file = File.new()\n" +" # ЗапуÑтите контекÑÑ‚ SHA-256.\n" +" ctx.start(HashingContext.HASH_SHA256)\n" +" # Проверьте, ÑущеÑтвует ли файл.\n" +" if not file.file_exists(path):\n" +" return\n" +" # Открываем файл Ð´Ð»Ñ Ñ…ÑшированиÑ.\n" +" file.open(path, File.READ)\n" +" # ОбновлÑем контекÑÑ‚ поÑле Ñ‡Ñ‚ÐµÐ½Ð¸Ñ ÐºÐ°Ð¶Ð´Ð¾Ð³Ð¾ чанка.\n" +" while not file.eof_reached():\n" +" ctx.update(file.get_buffer(CHUNK_SIZE))\n" +" # Получение вычиÑленного Ñ…Ñша.\n" +" var res = ctx.finish()\n" +" # Выведите результат в виде шеÑтнадцатеричной Ñтроки и маÑÑива.\n" +" printt(res.hex_encode(), Array(res))\n" +"[/codeblock]." #: doc/classes/HashingContext.xml msgid "Closes the current context, and return the computed hash." @@ -29453,7 +29946,7 @@ msgstr "" #: doc/classes/HSeparator.xml msgid "Horizontal separator." -msgstr "" +msgstr "Горизонтальный разделитель." #: doc/classes/HSeparator.xml msgid "" @@ -29473,7 +29966,7 @@ msgstr "" #: doc/classes/HSlider.xml msgid "Horizontal slider." -msgstr "" +msgstr "Горизонтальный Ñлайдер." #: doc/classes/HSlider.xml msgid "" @@ -30405,6 +30898,22 @@ msgid "" "url] for more details). As a workaround, you can send data as a query string " "in the URL. See [method String.http_escape] for an example." msgstr "" +"Создает Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° базовом [HTTPClient]. ЕÑли нет ошибок конфигурации, " +"пытаетÑÑ Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡Ð¸Ñ‚ÑŒÑÑ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ [метод HTTPClient.connect_to_host] и " +"передает параметры в [метод HTTPClient.request].\n" +"Возвращает [constant OK], еÑли Ð·Ð°Ð¿Ñ€Ð¾Ñ ÑƒÑпешно Ñоздан. (Ðто не означает, что " +"Ñервер ответил), [конÑтанта ERR_UNCONFIGURED], еÑли не находитÑÑ Ð² дереве, " +"[конÑтанта ERR_BUSY], еÑли вÑе еще обрабатывает предыдущий запроÑ, " +"[конÑтанта ERR_INVALID_PARAMETER], еÑли Ð·Ð°Ð´Ð°Ð½Ð½Ð°Ñ Ñтрока не ÑвлÑетÑÑ " +"правильным форматом URL, или [конÑтанта ERR_CANT_CONNECT], еÑли не " +"иÑпользуетÑÑ Ð¿Ð¾Ñ‚Ð¾Ðº и [HTTPClient] не может ÑоединитьÑÑ Ñ Ñ…Ð¾Ñтом.\n" +"[b]Примечание:[/b] ЕÑли [code]метод[/code] ÑвлÑетÑÑ [constant HTTPClient." +"METHOD_GET], Ð¿Ð¾Ð»ÐµÐ·Ð½Ð°Ñ Ð½Ð°Ð³Ñ€ÑƒÐ·ÐºÐ°, Ð¾Ñ‚Ð¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð½Ð°Ñ Ñ‡ÐµÑ€ÐµÐ· [code]request_data[/" +"code], может быть проигнорирована Ñервером или даже привеÑти к отклонению " +"запроÑа (подробнее Ñм. [url=https://datatracker.ietf.org/doc/html/" +"rfc7231#section-4.3.1]RFC 7231 раздел 4.3.1[/url]). Ð’ качеÑтве обходного " +"пути вы можете отправить данные в виде Ñтроки запроÑа в URL. Пример Ñм. в " +"[method String.http_escape]." #: doc/classes/HTTPRequest.xml msgid "" @@ -30520,7 +31029,7 @@ msgstr "" #: doc/classes/Image.xml msgid "Image datatype." -msgstr "" +msgstr "Тип данных изображениÑ." #: doc/classes/Image.xml msgid "" @@ -31888,6 +32397,19 @@ msgid "" "recommended to keep it enabled for games which don't require very reactive " "input, as this will decrease CPU usage." msgstr "" +"ЕÑли [code]true[/code], аналогичные входные ÑобытиÑ, поÑылаемые операционной " +"ÑиÑтемой, накапливаютÑÑ. Когда накопление входных данных включено, вÑе " +"входные ÑобытиÑ, генерируемые в течение кадра, будут объединены и выданы " +"поÑле Ð·Ð°Ð²ÐµÑ€ÑˆÐµÐ½Ð¸Ñ Ñ€ÐµÐ½Ð´ÐµÑ€Ð¸Ð½Ð³Ð° кадра. Таким образом, Ñто ограничивает " +"количеÑтво вызовов метода ввода в Ñекунду до FPS рендеринга.\n" +"Ðакопление ввода можно отключить, чтобы получить немного более точный/" +"реактивный ввод ценой ÑƒÐ²ÐµÐ»Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð·Ð°Ð³Ñ€ÑƒÐ·ÐºÐ¸ процеÑÑора. Ð’ приложениÑÑ…, где " +"требуетÑÑ Ñ€Ð¸Ñовать линии от руки, накопление ввода обычно отключаетÑÑ Ð½Ð° " +"Ð²Ñ€ÐµÐ¼Ñ Ñ€Ð¸ÑÐ¾Ð²Ð°Ð½Ð¸Ñ Ð»Ð¸Ð½Ð¸Ð¸ пользователем, чтобы получить результаты, точно " +"ÑоответÑтвующие реальному вводу.\n" +"[b]Примечание:[/b] Ðакопление ввода [i]включено[/i] по умолчанию. " +"РекомендуетÑÑ Ð´ÐµÑ€Ð¶Ð°Ñ‚ÑŒ его включенным в играх, которые не требуют очень " +"реактивного ввода, так как Ñто Ñнизит нагрузку на процеÑÑор." #: doc/classes/Input.xml msgid "Emitted when a joypad device has been connected or disconnected." @@ -32023,7 +32545,7 @@ msgstr "" #: doc/classes/InputEvent.xml msgid "InputEvent" -msgstr "" +msgstr "InputEvent" #: doc/classes/InputEvent.xml msgid "" @@ -32764,6 +33286,25 @@ msgid "" "print(max_int) # -9223372036854775808, we overflowed and wrapped around.\n" "[/codeblock]" msgstr "" +"Знаковый 64-битный целочиÑленный тип.\n" +"Он может принимать Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² интервале [code][-2^63, 2^63 - 1][/code], Ñ‚.е. " +"[code][-9223372036854775808, 9223372036854775807][/code]. Превышение Ñтих " +"границ будет обернуто.\n" +"[int] ÑвлÑетÑÑ Ñ‚Ð¸Ð¿Ð¾Ð¼ [Variant], и поÑтому будет иÑпользоватьÑÑ Ð¿Ñ€Ð¸ " +"приÑвоении целочиÑленного Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ [Variant]. Он также может быть применен Ñ " +"помощью подÑказки типа [code]: int[/code].\n" +"[codeblock].\n" +"var my_variant = 0 # int, значение 0.\n" +"my_variant += 4.2 # float, значение 4.2.\n" +"var my_int: int = 1 # int, значение 1.\n" +"my_int = 4.2 # int, значение 4, правое значение неÑвно приводитÑÑ Ðº int.\n" +"my_int = int(\"6.7\") # int, значение 6, Ñтрока Ñвно приводитÑÑ Ðº int.\n" +"\n" +"var max_int = 9223372036854775807\n" +"print(max_int) # 9223372036854775807, OK.\n" +"max_int += 1\n" +"print(max_int) # -9223372036854775808, мы переполнилиÑÑŒ и обернулиÑÑŒ.\n" +"[/codeblock]" #: doc/classes/int.xml msgid "" @@ -33525,6 +34066,41 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] Only available in the HTML5 platform." msgstr "" +"JavaScriptObject иÑпользуетÑÑ Ð´Ð»Ñ Ð²Ð·Ð°Ð¸Ð¼Ð¾Ð´ÐµÐ¹ÑÑ‚Ð²Ð¸Ñ Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°Ð¼Ð¸ JavaScript, " +"полученными или Ñозданными Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [метода JavaScript.get_interface], " +"[метода JavaScript.create_object] или [метода JavaScript.create_callback].\n" +"Пример:\n" +"[codeblock]\n" +"раÑширÑет Node\n" +"\n" +"var _my_js_callback = JavaScript.create_callback(self, \"myCallback\") # Ðта " +"ÑÑылка должна быть Ñохранена\n" +"var console = JavaScript.get_interface(\"console\")\n" +"\n" +"func _init():\n" +" var buf = JavaScript.create_object(\"ArrayBuffer\", 10) # новый " +"ArrayBuffer(10)\n" +" print(buf) # печатает [JavaScriptObject:OBJECT_ID]\n" +" var uint8arr = JavaScript.create_object(\"Uint8Array\", buf) # новый " +"Uint8Array(buf)\n" +" uint8arr[1] = 255\n" +" prints(uint8arr[1], uint8arr.byteLength) # печатает 255 10\n" +" console.log(uint8arr) # печатает в конÑоли браузера \"Uint8Array(10) " +"[ 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0]\"\n" +"\n" +" # Ðквивалент JavaScript: Array.from(uint8arr).forEach(myCallback)\n" +" JavaScript.get_interface(\"Array\").from(uint8arr)." +"forEach(_my_js_callback)\n" +"\n" +"func myCallback(args):\n" +" # Будет вызван Ñ Ð¿Ð°Ñ€Ð°Ð¼ÐµÑ‚Ñ€Ð°Ð¼Ð¸, переданными в обратный вызов \"forEach\".\n" +" # [0, 0, [JavaScriptObject:1173]]\n" +" # [255, 1, [JavaScriptObject:1173]]\n" +" # ...\n" +" # [0, 9, [JavaScriptObject:1180]]\n" +" print(args)\n" +"[/codeblock].\n" +"[b]Примечание:[/b] ДоÑтупно только в платформе HTML5." #: doc/classes/JNISingleton.xml msgid "" @@ -33714,7 +34290,6 @@ msgid "" msgstr "" #: doc/classes/JSONParseResult.xml -#, fuzzy msgid "" "A [Variant] containing the parsed JSON. Use [method @GDScript.typeof] or the " "[code]is[/code] keyword to check if it is what you expect. For example, if " @@ -33736,25 +34311,25 @@ msgid "" " push_error(\"Unexpected results.\")\n" "[/codeblock]" msgstr "" -"ÐŸÐµÑ€ÐµÐ¼ÐµÐ½Ð½Ð°Ñ ([Variant]), ÑÐ¾Ð´ÐµÑ€Ð¶Ð°Ñ‰Ð°Ñ Ñ€Ð°Ð·Ð¾Ð±Ñ€Ð°Ð½Ð½Ñ‹Ð¹ JSON. ИÑпользуйте [method " -"@GDScript.typeof] или ключевое Ñлово [code]is[/code] чтобы проверить " -"ожидаемый тип. Ðапример, еÑли иÑходный JSON начинаетÑÑ Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð½Ñ‹Ñ… Ñкобок " -"([code]{}[/code]), будет возвращён Ñловарь ([Dictionary]). ЕÑли иÑходный " -"JSON начинаетÑÑ Ñ ÐºÐ²Ð°Ð´Ñ€Ð°Ñ‚Ð½Ñ‹Ñ… Ñкобок ([code][][/code]), будет возвращён " -"маÑÑив ([Array]).\n" -"[b]Примечание:[/b] Ð¡Ð¿ÐµÑ†Ð¸Ñ„Ð¸ÐºÐ°Ñ†Ð¸Ñ JSON не определÑет типы integer и float, " -"только тип[i]number[/i]. Таким образом, при разборе Ñтроки JSON вÑе чиÑловые " -"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ преобразованы в тип [float].\n" -"[b]Примечание:[/b] JSON-объекты не ÑохранÑÑŽÑ‚ порÑдок ключей как Ñловари " -"Godot, поÑтому вы не должны полагатьÑÑ Ð½Ð° порÑдок ÑÐ»ÐµÐ´Ð¾Ð²Ð°Ð½Ð¸Ñ ÐºÐ»ÑŽÑ‡ÐµÐ¹, еÑли " -"Ñловарь получен из JSON. МаÑÑивы JSON, напротив, ÑохранÑÑŽÑ‚ порÑдок Ñвоих " -"Ñлементов:\n" -"[codeblock]\n" +"Вариант [Variant], Ñодержащий разобранный JSON. ИÑпользуйте [method " +"@GDScript.typeof] или ключевое Ñлово [code]is[/code], чтобы проверить, " +"ÑвлÑетÑÑ Ð»Ð¸ Ñто тем, что вы ожидаете. Ðапример, еÑли иÑточник JSON " +"начинаетÑÑ Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð½Ñ‹Ñ… Ñкобок ([code]{}[/code]), будет возвращен [Словарь]. " +"ЕÑли иÑточник JSON начинаетÑÑ Ñо Ñкобок ([code][][/code]), будет возвращен " +"[МаÑÑив].\n" +"[b]Примечание:[/b] Ð’ Ñпецификации JSON не определены типы integer или float, " +"а только тип [i]number[/i]. ПоÑтому при разборе текÑта JSON вÑе чиÑловые " +"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð±ÑƒÐ´ÑƒÑ‚ преобразованы в типы [float].\n" +"[b]Примечание:[/b] Объекты JSON не ÑохранÑÑŽÑ‚ порÑдок ключей, как Ñловари " +"Godot, поÑтому не Ñледует полагатьÑÑ Ð½Ð° то, что ключи будут раÑположены в " +"определенном порÑдке, еÑли Ñловарь поÑтроен из JSON. Ðапротив, маÑÑивы JSON " +"ÑохранÑÑŽÑ‚ порÑдок Ñвоих Ñлементов:\n" +"[codeblock].\n" "var p = JSON.parse('[\"hello\", \"world\", \"!\"]')\n" "if typeof(p.result) == TYPE_ARRAY:\n" -" print(p.result[0]) # Выведет \"hello\"\n" +" print(p.result[0]) # Печатает \"hello\".\n" "else:\n" -" push_error(\"Ðеожиданный результат.\")\n" +" push_error(\"Ðеожиданные результаты.\")\n" "[/codeblock]" #: doc/classes/JSONRPC.xml @@ -33849,6 +34424,21 @@ msgid "" "while performing collision tests. This makes them really useful to implement " "characters that collide against a world, but don't require advanced physics." msgstr "" +"КинематичеÑкие тела - Ñто оÑобые типы тел, которые предназначены Ð´Ð»Ñ " +"ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¼. Ðа них вообще не влиÑет физика; Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… типов " +"тел, таких как перÑонаж или жеÑткое тело, Ñто то же Ñамое, что и ÑтатичеÑкое " +"тело. Однако у них еÑть два оÑновных применениÑ:\n" +"[b]Ð˜Ð¼Ð¸Ñ‚Ð°Ñ†Ð¸Ñ Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ:[/b] Когда Ñти тела перемещаютÑÑ Ð²Ñ€ÑƒÑ‡Ð½ÑƒÑŽ, либо из кода, " +"либо из [AnimationPlayer] (Ñ [member AnimationPlayer.playback_process_mode], " +"уÑтановленным на \"physics\"), физика автоматичеÑки вычиÑлÑет оценку их " +"линейной и угловой ÑкороÑти. Ðто делает их очень полезными Ð´Ð»Ñ Ð´Ð²Ð¸Ð¶ÑƒÑ‰Ð¸Ñ…ÑÑ " +"платформ или других объектов, управлÑемых AnimationPlayer (например, дверь, " +"открывающийÑÑ Ð¼Ð¾ÑÑ‚ и Ñ‚.д.).\n" +"[b]КинематичеÑкие перÑонажи:[/b] KinematicBody также имеет API Ð´Ð»Ñ " +"Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð² (методы [method move_and_collide] и [method " +"move_and_slide]) при выполнении теÑтов на ÑтолкновениÑ. Ðто делает их " +"дейÑтвительно полезными Ð´Ð»Ñ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ перÑонажей, которые ÑталкиваютÑÑ Ñ " +"миром, но не требуют продвинутой физики." #: doc/classes/KinematicBody.xml doc/classes/KinematicBody2D.xml msgid "Kinematic character (2D)" @@ -34102,6 +34692,21 @@ msgid "" "while performing collision tests. This makes them really useful to implement " "characters that collide against a world, but don't require advanced physics." msgstr "" +"КинематичеÑкие тела - Ñто оÑобые типы тел, которые предназначены Ð´Ð»Ñ " +"ÑƒÐ¿Ñ€Ð°Ð²Ð»ÐµÐ½Ð¸Ñ Ð¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ñ‚ÐµÐ»ÐµÐ¼. Ðа них вообще не влиÑет физика; Ð´Ð»Ñ Ð´Ñ€ÑƒÐ³Ð¸Ñ… типов " +"тел, таких как перÑонаж или жеÑткое тело, Ñто то же Ñамое, что и ÑтатичеÑкое " +"тело. Однако у них еÑть два оÑновных применениÑ:\n" +"[b]Ð˜Ð¼Ð¸Ñ‚Ð°Ñ†Ð¸Ñ Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ:[/b] Когда Ñти тела перемещаютÑÑ Ð²Ñ€ÑƒÑ‡Ð½ÑƒÑŽ, либо из кода, " +"либо из [AnimationPlayer] (Ñ [member AnimationPlayer.playback_process_mode], " +"уÑтановленным на \"physics\"), физика автоматичеÑки вычиÑлÑет оценку их " +"линейной и угловой ÑкороÑти. Ðто делает их очень полезными Ð´Ð»Ñ Ð´Ð²Ð¸Ð¶ÑƒÑ‰Ð¸Ñ…ÑÑ " +"платформ или других объектов, управлÑемых AnimationPlayer (например, дверь, " +"открывающийÑÑ Ð¼Ð¾ÑÑ‚ и Ñ‚.д.).\n" +"[b]КинематичеÑкие перÑонажи:[/b] KinematicBody2D также имеет API Ð´Ð»Ñ " +"Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰ÐµÐ½Ð¸Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð¾Ð² (методы [method move_and_collide] и [method " +"move_and_slide]) при выполнении теÑтов на ÑтолкновениÑ. Ðто делает их " +"дейÑтвительно полезными Ð´Ð»Ñ Ñ€ÐµÐ°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸ перÑонажей, которые ÑталкиваютÑÑ Ñ " +"миром, но не требуют продвинутой физики." #: doc/classes/KinematicBody2D.xml msgid "Using KinematicBody2D" @@ -34791,7 +35396,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -38120,6 +38727,7 @@ msgid "3D agent used in navigation for collision avoidance." msgstr "" #: doc/classes/NavigationAgent.xml +#, fuzzy msgid "" "3D agent that is used in navigation to reach a location while avoiding " "static and dynamic obstacles. The dynamic obstacles are avoided using RVO " @@ -38133,8 +38741,26 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." -msgstr "" +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." +msgstr "" +"3D-агент, который иÑпользуетÑÑ Ð² навигации Ð´Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¼ÐµÑтоположениÑ, " +"Ð¸Ð·Ð±ÐµÐ³Ð°Ñ Ð¿Ñ€Ð¸ Ñтом ÑтатичеÑких и динамичеÑких препÑÑ‚Ñтвий. ДинамичеÑкие " +"препÑÑ‚ÑÑ‚Ð²Ð¸Ñ Ð¸Ð·Ð±ÐµÐ³Ð°ÑŽÑ‚ÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ÑиÑтемы Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ñтолкновений RVO " +"(Reciprocal Velocity Obstacles). Ð”Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ работы агенту необходимы " +"навигационные данные. По умолчанию Ñтот узел региÑтрируетÑÑ Ð½Ð° навигационной " +"карте по умолчанию [Мир]. ЕÑли Ñтот узел ÑвлÑетÑÑ Ð´Ð¾Ñ‡ÐµÑ€Ð½Ð¸Ð¼ узлом " +"[Navigation], он будет региÑтрироватьÑÑ Ð½Ð° навигационной карте " +"навигационного узла, или можно иÑпользовать функцию [method set_navigation], " +"чтобы уÑтановить навигационный узел напрÑмую. [NavigationAgent] ÑвлÑетÑÑ " +"физичеÑки безопаÑным.\n" +"[b]Примечание:[/b] ПоÑле иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ [method set_target_location] " +"необходимо иÑпользовать функцию [method get_next_location] раз в каждый кадр " +"физики Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½ÐµÐ¹ логики пути NavigationAgent. Ð’Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÐ¼Ð°Ñ " +"Ð²ÐµÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð¸Ð· Ñтой функции должна иÑпользоватьÑÑ Ð² качеÑтве Ñледующей " +"позиции Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого узла агента." #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml msgid "" @@ -38373,6 +38999,7 @@ msgid "2D agent used in navigation for collision avoidance." msgstr "" #: doc/classes/NavigationAgent2D.xml +#, fuzzy msgid "" "2D agent that is used in navigation to reach a location while avoiding " "static and dynamic obstacles. The dynamic obstacles are avoided using RVO " @@ -38386,8 +39013,26 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." -msgstr "" +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." +msgstr "" +"2D агент, который иÑпользуетÑÑ Ð² навигации Ð´Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¼ÐµÑтоположениÑ, " +"Ð¸Ð·Ð±ÐµÐ³Ð°Ñ Ð¿Ñ€Ð¸ Ñтом ÑтатичеÑких и динамичеÑких препÑÑ‚Ñтвий. ДинамичеÑкие " +"препÑÑ‚ÑÑ‚Ð²Ð¸Ñ Ð¸Ð·Ð±ÐµÐ³Ð°ÑŽÑ‚ÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ ÑиÑтемы Ð¿Ñ€ÐµÐ´Ð¾Ñ‚Ð²Ñ€Ð°Ñ‰ÐµÐ½Ð¸Ñ Ñтолкновений RVO " +"(Reciprocal Velocity Obstacles). Ð”Ð»Ñ ÐºÐ¾Ñ€Ñ€ÐµÐºÑ‚Ð½Ð¾Ð¹ работы агенту необходимы " +"навигационные данные. По умолчанию Ñтот узел региÑтрируетÑÑ Ð½Ð° навигационной " +"карте по умолчанию [World2D]. ЕÑли Ñтот узел ÑвлÑетÑÑ Ð´Ð¾Ñ‡ÐµÑ€Ð½Ð¸Ð¼ Ð´Ð»Ñ ÑƒÐ·Ð»Ð° " +"[Navigation2D], он будет региÑтрироватьÑÑ Ð½Ð° навигационной карте " +"навигационного узла, или Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ [method set_navigation] может быть " +"иÑпользована Ð´Ð»Ñ Ð½ÐµÐ¿Ð¾ÑредÑтвенной уÑтановки навигационного узла. " +"[NavigationAgent2D] ÑвлÑетÑÑ Ñ„Ð¸Ð·Ð¸Ñ‡ÐµÑки безопаÑным.\n" +"[b]Примечание:[/b] ПоÑле иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ [method set_target_location] " +"необходимо иÑпользовать функцию [method get_next_location] один раз в каждый " +"кадр физики Ð´Ð»Ñ Ð¾Ð±Ð½Ð¾Ð²Ð»ÐµÐ½Ð¸Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½ÐµÐ¹ логики пути NavigationAgent. " +"Ð’Ð¾Ð·Ð²Ñ€Ð°Ñ‰Ð°ÐµÐ¼Ð°Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ð½Ð°Ñ Ð¿Ð¾Ð·Ð¸Ñ†Ð¸Ñ Ð¸Ð· Ñтой функции должна иÑпользоватьÑÑ Ð² " +"качеÑтве Ñледующей позиции Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð´Ð»Ñ Ñ€Ð¾Ð´Ð¸Ñ‚ÐµÐ»ÑŒÑкого узла агента." #: doc/classes/NavigationAgent2D.xml #, fuzzy @@ -39113,6 +39758,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39478,6 +40126,21 @@ msgid "" "COMPRESS_NONE]. Nonetheless, mixing engine versions between clients and " "server is not recommended and not officially supported." msgstr "" +"Метод ÑжатиÑ, иÑпользуемый Ð´Ð»Ñ Ñетевых пакетов. Они имеют различные " +"компромиÑÑÑ‹ между ÑкороÑтью ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¸ пропуÑкной ÑпоÑобноÑтью, вам может " +"потребоватьÑÑ Ð¿Ñ€Ð¾Ð²ÐµÑ€Ð¸Ñ‚ÑŒ, какой из них лучше вÑего подходит Ð´Ð»Ñ Ð²Ð°ÑˆÐµÐ³Ð¾ " +"ÑлучаÑ, еÑли вы вообще иÑпользуете Ñжатие.\n" +"[b]Примечание:[/b] Сетевой дизайн большинÑтва игр предполагает чаÑтую " +"отправку множеÑтва небольших пакетов (размером менее 4 КБ каждый). ЕÑли еÑть " +"ÑомнениÑ, рекомендуетÑÑ Ð¾Ñтавить алгоритм ÑÐ¶Ð°Ñ‚Ð¸Ñ Ð¿Ð¾ умолчанию, так как он " +"лучше вÑего работает Ñ Ñ‚Ð°ÐºÐ¸Ð¼Ð¸ маленькими пакетами.\n" +"[b]Примечание:[/b] [member compression_mode] должен быть уÑтановлен на одно " +"и то же значение как на Ñервере, так и на вÑех его клиентах. Клиенты не " +"Ñмогут подключитьÑÑ, еÑли значение [member compression_mode], уÑтановленное " +"на клиенте, отличаетÑÑ Ð¾Ñ‚ уÑтановленного на Ñервере. До Godot 3.4 по " +"умолчанию [member compression_mode] был [constant COMPRESS_NONE]. Тем не " +"менее, Ñмешивать верÑии движка между клиентами и Ñервером не рекомендуетÑÑ Ð¸ " +"официально не поддерживаетÑÑ." #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -39556,7 +40219,7 @@ msgstr "" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "[url=https://facebook.github.io/zstd/]Zstandard[/url] compression." -msgstr "" +msgstr "[url=https://facebook.github.io/zstd/]Zstandard[/url] cжатие." #: doc/classes/NetworkedMultiplayerPeer.xml msgid "A high-level network interface to simplify multiplayer interactions." @@ -39966,6 +40629,20 @@ msgid "" "call with [method request_ready], which may be called anywhere before adding " "the node again." msgstr "" +"ВызываетÑÑ, когда узел \"готов\", Ñ‚.е. когда и узел, и его дочерние Ñлементы " +"вошли в дерево Ñцены. ЕÑли узел имеет дочерние узлы, то Ñначала Ñрабатывают " +"их обратные вызовы [метода _ready], а затем родительÑкий узел получает " +"уведомление о готовноÑти.\n" +"СоответÑтвует уведомлению [constant NOTIFICATION_READY] в [method Object." +"_notification]. См. также ключевое Ñлово [code]onready[/code] Ð´Ð»Ñ " +"переменных.\n" +"Обычно иÑпользуетÑÑ Ð´Ð»Ñ Ð¸Ð½Ð¸Ñ†Ð¸Ð°Ð»Ð¸Ð·Ð°Ñ†Ð¸Ð¸. Ð”Ð»Ñ ÐµÑ‰Ðµ более ранней инициализации " +"можно иÑпользовать [метод Object._init]. См. также [метод _enter_tree].\n" +"[b]Примечание:[/b] [метод _ready] может быть вызван только один раз Ð´Ð»Ñ " +"каждого узла. ПоÑле ÑƒÐ´Ð°Ð»ÐµÐ½Ð¸Ñ ÑƒÐ·Ð»Ð° из дерева Ñцены и Ð´Ð¾Ð±Ð°Ð²Ð»ÐµÐ½Ð¸Ñ ÐµÐ³Ð¾ Ñнова, " +"[code]_ready[/code] не будет вызван второй раз. Ðто можно обойти, запроÑив " +"повторный вызов Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [метода request_ready], который может быть вызван " +"в любом меÑте перед повторным добавлением узла." #: doc/classes/Node.xml msgid "" @@ -40095,6 +40772,21 @@ msgid "" "consider using [method get_node] instead. To avoid using [method find_node] " "too often, consider caching the node reference into a variable." msgstr "" +"Ðаходит потомка Ñтого узла, Ð¸Ð¼Ñ ÐºÐ¾Ñ‚Ð¾Ñ€Ð¾Ð³Ð¾ ÑоответÑтвует [code]маÑке[/code] " +"как в [методе String.match] (Ñ‚.е. чувÑтвительно к региÑтру, но [code]\"*\"[/" +"code] ÑоответÑтвует нулю или более Ñимволов, а [code]\"?\"[/code] " +"ÑоответÑтвует любому одиночному Ñимволу, кроме [code]\".\"[/code]). " +"Возвращает [code]null[/code], еÑли не найдено ни одного подходÑщего [узла].\n" +"[b]Примечание:[/b] Ðе ищет ÑÐ¾Ð²Ð¿Ð°Ð´ÐµÐ½Ð¸Ñ Ð¿Ð¾ полному пути, только по именам " +"отдельных узлов.\n" +"ЕÑли [code]owned[/code] is [code]true[/code], Ñтот метод находит только " +"узлы, владельцем которых ÑвлÑетÑÑ Ñтот узел. Ðто оÑобенно важно Ð´Ð»Ñ Ñцен, " +"Ñозданных через Ñценарий, поÑкольку у таких Ñцен нет владельца.\n" +"[b]Примечание:[/b] ПоÑкольку Ñтот метод проходит по вÑем потомкам узла, Ñто " +"Ñамый медленный ÑпоÑоб получить ÑÑылку на другой узел. По возможноÑти " +"иÑпользуйте вмеÑто него [method get_node]. Чтобы не иÑпользовать [метод " +"find_node] Ñлишком чаÑто, подумайте о кÑшировании ÑÑылки на узел в " +"переменной." #: doc/classes/Node.xml msgid "" @@ -40535,6 +41227,20 @@ msgid "" "like [code]server_disconnected[/code] or by checking [code]SceneTree." "network_peer.get_connection_status() == CONNECTION_CONNECTED[/code]." msgstr "" +"ОтправлÑет Ð·Ð°Ð¿Ñ€Ð¾Ñ Ð½Ð° вызов удаленной процедуры Ð´Ð»Ñ Ð·Ð°Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ [code]метода[/" +"code] равным узлам в Ñети (и локально), по желанию отправлÑÑ Ð²Ñе " +"дополнительные аргументы в качеÑтве аргументов метода, вызываемого RPC. " +"Ð—Ð°Ð¿Ñ€Ð¾Ñ Ð²Ñ‹Ð·Ð¾Ð²Ð° будет получен только узлами Ñ Ð¾Ð´Ð¸Ð½Ð°ÐºÐ¾Ð²Ñ‹Ð¼ [NodePath], Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ " +"точно такое же Ð¸Ð¼Ñ ÑƒÐ·Ð»Ð°. Поведение завиÑит от конфигурации RPC Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð³Ð¾ " +"метода, Ñм. [method rpc_config]. По умолчанию методы не открыты Ð´Ð»Ñ RPC. См. " +"также [method rset] и [method rset_config] Ð´Ð»Ñ ÑвойÑтв. Возвращает " +"[code]null[/code].\n" +"[b]Примечание:[/b] Ð’Ñ‹ можете безопаÑно иÑпользовать RPC на клиентах только " +"поÑле Ð¿Ð¾Ð»ÑƒÑ‡ÐµÐ½Ð¸Ñ Ñигнала [code]connected_to_server[/code] от [SceneTree]. Вам " +"также необходимо отÑлеживать ÑоÑтоÑние ÑоединениÑ, либо по Ñигналам " +"[SceneTree], таким как [code]server_disconnected[/code], либо проверÑÑ " +"[code]SceneTree.network_peer.get_connection_status() == " +"CONNECTION_CONNECTED[/code]." #: doc/classes/Node.xml msgid "" @@ -41079,7 +41785,7 @@ msgstr "Глобальный маÑштаб." #: doc/classes/Node2D.xml msgid "Global [Transform2D]." -msgstr "" +msgstr "Глобальный [Transform2D]." #: doc/classes/Node2D.xml msgid "Position, relative to the node's parent." @@ -41105,7 +41811,7 @@ msgstr "" #: doc/classes/Node2D.xml msgid "Local [Transform2D]." -msgstr "" +msgstr "Локальный [Transform2D]." #: doc/classes/Node2D.xml msgid "" @@ -42011,7 +42717,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -42427,6 +43135,21 @@ msgid "" "the project if it is currently running (since the project is an independent " "child process)." msgstr "" +"Задерживает выполнение текущего потока на [code]мÑек[/code] миллиÑекунд. " +"[code]мÑек[/code] должно быть больше или равно [code]0[/code]. Ð’ противном " +"Ñлучае [метод delay_msec] ничего не Ñделает и выведет Ñообщение об ошибке.\n" +"[b]Примечание:[/b] [method delay_msec] - Ñто [i]блокирующий[/i] ÑпоÑоб " +"задержки Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°. Чтобы задержать выполнение кода неблокирующим " +"ÑпоÑобом, Ñмотрите [method SceneTree.create_timer]. Выдача Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [method " +"SceneTree.create_timer] задержит выполнение кода, размещенного ниже " +"[code]выдачи[/code] без влиÑÐ½Ð¸Ñ Ð½Ð° оÑтальную чаÑть проекта (или редактора, " +"Ð´Ð»Ñ [EditorPlugin]ов и [EditorScript]ов).\n" +"[b]Примечание:[/b] ЕÑли [метод delay_msec] вызываетÑÑ Ð² главном потоке, он " +"замораживает проект и не позволÑет ему перериÑовывать и региÑтрировать ввод, " +"пока не пройдет задержка. При иÑпользовании [method delay_msec] как чаÑти " +"[EditorPlugin] или [EditorScript], он заморозит редактор, но не заморозит " +"проект, еÑли он запущен (поÑкольку проект ÑвлÑетÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимым дочерним " +"процеÑÑом)." #: doc/classes/OS.xml msgid "" @@ -42447,6 +43170,21 @@ msgid "" "the project if it is currently running (since the project is an independent " "child process)." msgstr "" +"Задерживает выполнение текущего потока на [code]usec[/code] микроÑекунд. " +"[code]usec[/code] должно быть больше или равно [code]0[/code]. Ð’ противном " +"Ñлучае [метод delay_usec] ничего не Ñделает и выведет Ñообщение об ошибке.\n" +"[b]Примечание:[/b] [method delay_usec] - Ñто [i]блокирующий[/i] ÑпоÑоб " +"задержки Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ ÐºÐ¾Ð´Ð°. Чтобы задержать выполнение кода неблокирующим " +"ÑпоÑобом, Ñмотрите [method SceneTree.create_timer]. Выдача Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [method " +"SceneTree.create_timer] задержит выполнение кода, размещенного ниже " +"[code]выдачи[/code] без влиÑÐ½Ð¸Ñ Ð½Ð° оÑтальную чаÑть проекта (или редактора, " +"Ð´Ð»Ñ [EditorPlugin]ов и [EditorScript]ов).\n" +"[b]Примечание:[/b] ЕÑли [метод delay_usec] вызываетÑÑ Ð² главном потоке, он " +"замораживает проект и не позволÑет ему перериÑовывать и региÑтрировать ввод, " +"пока не пройдет задержка. При иÑпользовании [method delay_usec] как чаÑти " +"[EditorPlugin] или [EditorScript], он заморозит редактор, но не заморозит " +"проект, еÑли он запущен (поÑкольку проект ÑвлÑетÑÑ Ð½ÐµÐ·Ð°Ð²Ð¸Ñимым дочерним " +"процеÑÑом)." #: doc/classes/OS.xml msgid "" @@ -42535,11 +43273,11 @@ msgstr "Возвращает вектор привÑзанный к Ñетке Ñ #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42569,15 +43307,38 @@ msgid "" " arguments[argument.lstrip(\"--\")] = \"\"\n" "[/codeblock]" msgstr "" +"Возвращает аргументы командной Ñтроки, переданные движку.\n" +"Ðргументы командной Ñтроки могут быть запиÑаны в любой форме, Ð²ÐºÐ»ÑŽÑ‡Ð°Ñ Ñ„Ð¾Ñ€Ð¼Ñ‹ " +"[code]--key value[/code] и [code]--key=value[/code], чтобы они могли быть " +"правильно разобраны, при уÑловии, что пользовательÑкие аргументы командной " +"Ñтроки не конфликтуют Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð°Ð¼Ð¸ движка.\n" +"Ð’Ñ‹ также можете включить переменные окружениÑ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¼ÐµÑ‚Ð¾Ð´ [method " +"get_environment].\n" +"Ð’Ñ‹ можете уÑтановить [member ProjectSettings.editor/main_run_args] Ð´Ð»Ñ " +"Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð² командной Ñтроки, которые будут передаватьÑÑ " +"редактором при запуÑке проекта.\n" +"Вот минимальный пример того, как разобрать аргументы командной Ñтроки в " +"Ñловарь, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñ„Ð¾Ñ€Ð¼Ñƒ [code]--key=value[/code] Ð´Ð»Ñ Ð°Ñ€Ð³ÑƒÐ¼ÐµÐ½Ñ‚Ð¾Ð²:\n" +"[codeblock].\n" +"var arguments = {}\n" +"for argument in OS.get_cmdline_args():\n" +" if argument.find(\"=\") > -1:\n" +" var key_value = argument.split(\"=\")\n" +" arguments[key_value[0].lstrip(\"--\")] = key_value[1]\n" +" else:\n" +" # Опции без аргумента будут приÑутÑтвовать в Ñловаре,\n" +" # Ñо значением, уÑтановленным в пуÑтую Ñтроку.\n" +" arguments[argument.lstrip(\"--\")] = \"\"\n" +"[/codeblock]" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42599,11 +43360,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -43769,9 +44530,8 @@ msgid "Ringtones directory path." msgstr "" #: doc/classes/OS.xml -#, fuzzy msgid "Unknown powerstate." -msgstr "ÐеизвеÑÑ‚Ð½Ð°Ñ ÐºÐ»Ð°Ð²Ð¸ÑˆÐ°." +msgstr "ÐеизвеÑтное ÑоÑтоÑние питаниÑ." #: doc/classes/OS.xml msgid "Unplugged, running on battery." @@ -44485,6 +45245,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -45200,7 +45970,7 @@ msgstr "" #: doc/classes/PHashTranslation.xml msgid "Optimized translation." -msgstr "" +msgstr "Оптимизированный перевод." #: doc/classes/PHashTranslation.xml msgid "" @@ -45231,7 +46001,7 @@ msgstr "" #: doc/classes/PhysicsDirectBodyState.xml #: doc/classes/PhysicsDirectSpaceState.xml doc/classes/RayCast.xml msgid "Ray-casting" -msgstr "" +msgstr "ТраÑÑировка лучей" #: doc/classes/Physics2DDirectBodyState.xml doc/classes/RigidBody2D.xml msgid "Adds a constant directional force without affecting rotation." @@ -45448,6 +46218,23 @@ msgid "" "[code]rid[/code]: The intersecting object's [RID].\n" "[code]shape[/code]: The shape index of the colliding shape." msgstr "" +"ПроверÑет переÑÐµÑ‡ÐµÐ½Ð¸Ñ Ñ„Ð¸Ð³ÑƒÑ€Ñ‹, заданной через объект " +"[Physics2DShapeQueryParameters], Ñ Ð¿Ñ€Ð¾ÑтранÑтвом. ЕÑли она переÑекаетÑÑ Ñ " +"более чем одной фигурой, выбираетÑÑ Ð±Ð»Ð¸Ð¶Ð°Ð¹ÑˆÐ°Ñ. ЕÑли фигура ни Ñ Ñ‡ÐµÐ¼ не " +"переÑекаетÑÑ, то возвращаетÑÑ Ð¿ÑƒÑтой Ñловарь.\n" +"[b]Примечание:[/b] Ðтот метод не учитывает ÑвойÑтво [code]движениÑ[/code] " +"объекта. Возвращаемый объект предÑтавлÑет Ñобой Ñловарь, Ñодержащий " +"Ñледующие полÑ:\n" +"[code]collider_id[/code]: ID ÑталкивающегоÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°.\n" +"[code]linear_velocity[/code]: СкороÑть объекта ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ [Vector2]. ЕÑли " +"объект ÑвлÑетÑÑ [Area2D], то результатом будет [code](0, 0)[/code].\n" +"[code]метаданные[/code]: Метаданные переÑекающейÑÑ Ñ„Ð¸Ð³ÑƒÑ€Ñ‹. Ðти метаданные " +"отличаютÑÑ Ð¾Ñ‚ [метод Object.get_meta], и уÑтанавливаютÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [метод " +"Physics2DServer.shape_set_data].\n" +"[code]normal[/code]: Ðормаль поверхноÑти объекта в точке переÑечениÑ.\n" +"[code]точка[/code]: Точка переÑечениÑ.\n" +"[code]rid[/code]: [RID] переÑекающегоÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°.\n" +"[code]shape[/code]: Ð˜Ð½Ð´ÐµÐºÑ Ñ„Ð¾Ñ€Ð¼Ñ‹ ÑталкивающейÑÑ Ñ„Ð¸Ð³ÑƒÑ€Ñ‹." #: doc/classes/Physics2DDirectSpaceState.xml msgid "" @@ -45472,6 +46259,26 @@ msgid "" "[code]Segments[/code] build mode are not solid shapes. Therefore, they will " "not be detected." msgstr "" +"ПроверÑет, находитÑÑ Ð»Ð¸ точка внутри какой-либо твердой фигуры. Фигуры, " +"внутри которых находитÑÑ Ñ‚Ð¾Ñ‡ÐºÐ°, возвращаютÑÑ Ð² виде маÑÑива, Ñодержащего " +"Ñловари Ñо Ñледующими полÑми:\n" +"[code]collider[/code]: Объект ÑтолкновениÑ.\n" +"[code]collider_id[/code]: ID объекта ÑтолкновениÑ.\n" +"[code]metadata[/code]: Метаданные переÑекающейÑÑ Ñ„Ð¸Ð³ÑƒÑ€Ñ‹. Ðти метаданные " +"отличаютÑÑ Ð¾Ñ‚ [метод Object.get_meta], и уÑтанавливаютÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [метод " +"Physics2DServer.shape_set_data].\n" +"[code]rid[/code]: [RID] переÑекающегоÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°.\n" +"[code]shape[/code]: Ð˜Ð½Ð´ÐµÐºÑ Ñ„Ð¾Ñ€Ð¼Ñ‹ ÑталкивающейÑÑ Ñ„Ð¸Ð³ÑƒÑ€Ñ‹.\n" +"КоличеÑтво переÑечений может быть ограничено Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ параметра " +"[code]max_results[/code], чтобы уменьшить Ð²Ñ€ÐµÐ¼Ñ Ð¾Ð±Ñ€Ð°Ð±Ð¾Ñ‚ÐºÐ¸.\n" +"Кроме того, метод может принимать [code]exclude[/code] маÑÑив объектов или " +"[RID]ов, которые должны быть иÑключены из Ñтолкновений, " +"[code]collision_mask[/code] битовую маÑку, предÑтавлÑющую физичеÑкие Ñлои " +"Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸, или булевы Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð³Ð¾, должен ли луч ÑтолкнутьÑÑ Ñ " +"[PhysicsBody2D]s или [Area2D]s, ÑоответÑтвенно.\n" +"[b]Примечание:[/b] [ConcavePolygonShape2D]s и [CollisionPolygon2D]s в режиме " +"поÑÑ‚Ñ€Ð¾ÐµÐ½Ð¸Ñ [code]Segments[/code] не ÑвлÑÑŽÑ‚ÑÑ Ñ‚Ð²ÐµÑ€Ð´Ñ‹Ð¼Ð¸ фигурами. ПоÑтому они " +"не будут обнаружены." #: doc/classes/Physics2DDirectSpaceState.xml msgid "" @@ -45518,6 +46325,24 @@ msgid "" "determine if the ray should collide with [PhysicsBody2D]s or [Area2D]s, " "respectively." msgstr "" +"ПереÑекает луч в заданном проÑтранÑтве. Возвращаемый объект предÑтавлÑет " +"Ñобой Ñловарь Ñо Ñледующими полÑми:\n" +"[code]collider[/code]: Объект ÑтолкновениÑ.\n" +"[code]collider_id[/code]: Идентификатор объекта ÑтолкновениÑ.\n" +"[code]metadata[/code]: Метаданные переÑекающейÑÑ Ñ„Ð¸Ð³ÑƒÑ€Ñ‹. Ðти метаданные " +"отличаютÑÑ Ð¾Ñ‚ [метод Object.get_meta], и уÑтанавливаютÑÑ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [метод " +"Physics2DServer.shape_set_data].\n" +"[code]normal[/code]: Ðормаль поверхноÑти объекта в точке переÑечениÑ.\n" +"[code]position[/code]: Точка переÑечениÑ.\n" +"[code]rid[/code]: [RID] переÑекающегоÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°.\n" +"[code]shape[/code]: Ð˜Ð½Ð´ÐµÐºÑ Ñ„Ð¾Ñ€Ð¼Ñ‹ переÑекающегоÑÑ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°.\n" +"ЕÑли луч ни Ñ Ñ‡ÐµÐ¼ не переÑекаетÑÑ, то вмеÑто него возвращаетÑÑ Ð¿ÑƒÑтой " +"Ñловарь.\n" +"Кроме того, метод может принимать [code]exclude[/code] маÑÑив объектов или " +"[RID], которые должны быть иÑключены из Ñтолкновений, [code]collision_mask[/" +"code] битовую маÑку, предÑтавлÑющую физичеÑкие Ñлои Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸, или булевы " +"Ð´Ð»Ñ Ð¾Ð¿Ñ€ÐµÐ´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ‚Ð¾Ð³Ð¾, должен ли луч ÑтолкнутьÑÑ Ñ [PhysicsBody2D]s или " +"[Area2D]s, ÑоответÑтвенно." #: doc/classes/Physics2DDirectSpaceState.xml msgid "" @@ -47624,6 +48449,22 @@ msgid "" "will allow for unbounded output. If any positive value is passed, and the " "decompression exceeds that amount in bytes, then an error will be returned." msgstr "" +"Возвращает новый [PoolByteArray] Ñ Ñ€Ð°Ñпакованными данными. УÑтановите режим " +"ÑжатиÑ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ð¾Ð´Ð½Ñƒ из конÑтант [enum File.CompressionMode]. [b]Ðтот " +"метод принимает только режимы ÑÐ¶Ð°Ñ‚Ð¸Ñ gzip и deflate.[/b]\n" +"Ðтот метод потенциально медленнее, чем [code]decompress[/code], так как ему " +"может потребоватьÑÑ Ð¼Ð½Ð¾Ð³Ð¾ÐºÑ€Ð°Ñ‚Ð½Ð¾Ðµ перераÑпределение выходного буфера во Ð²Ñ€ÐµÐ¼Ñ " +"декомпреÑÑии, в то Ð²Ñ€ÐµÐ¼Ñ ÐºÐ°Ðº [code]decompress[/code] знает размер Ñвоего " +"выходного буфера Ñ Ñамого начала.\n" +"\n" +"GZIP имеет макÑимальный коÑффициент ÑÐ¶Ð°Ñ‚Ð¸Ñ 1032:1, что означает, что очень " +"возможно, что Ð½ÐµÐ±Ð¾Ð»ÑŒÑˆÐ°Ñ ÑÐ¶Ð°Ñ‚Ð°Ñ Ð¿Ð¾Ð»ÐµÐ·Ð½Ð°Ñ Ð½Ð°Ð³Ñ€ÑƒÐ·ÐºÐ° раÑпакуетÑÑ Ð² потенциально " +"очень большой выходной файл. Чтобы защититьÑÑ Ð¾Ñ‚ Ñтого, вы можете указать " +"макÑимальный размер, который Ñтой функции разрешено выделÑть в байтах через " +"[code]max_output_size[/code]. ЕÑли передать значение -1, то можно выводить " +"неограниченное количеÑтво данных. ЕÑли передано любое положительное " +"значение, и раÑпаковка превышает Ñтот размер в байтах, то будет возвращена " +"ошибка." #: doc/classes/PoolByteArray.xml doc/classes/PoolColorArray.xml #: doc/classes/PoolIntArray.xml doc/classes/PoolRealArray.xml @@ -48695,6 +49536,19 @@ msgid "" "There is no need to place an opposite portal in an adjacent room, links are " "made two-way automatically." msgstr "" +"[Порталы - Ñто оÑобый тип [MeshInstance], который позволÑет ÑиÑтеме отбора " +"порталов \"видеть\" из одной комнаты в другую. Они чаÑто ÑоответÑтвуют " +"дверÑм и окнам в геометрии уровнÑ. ПозволÑÑ [Camera]s видеть только через " +"порталы, Ñто позволÑет ÑиÑтеме отÑеивать вÑе объекты в комнатах, которые не " +"видны через порталы. Ðто одна из форм окклюзионной выборки [b][/b] , ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ " +"может значительно повыÑить производительноÑть.\n" +"СущеÑтвуют некоторые Ð¾Ð³Ñ€Ð°Ð½Ð¸Ñ‡ÐµÐ½Ð¸Ñ Ð½Ð° форму порталов:\n" +"Они должны быть одноÑторонними выпуклыми многоугольниками, и обычно вы " +"должны ориентировать их передние грани [b]наружу[/b] от [Комнаты], в которой " +"они раÑположены. Вершины должны раÑполагатьÑÑ Ð² одной плоÑкоÑти (Ñ…Ð¾Ñ‚Ñ Ð¸Ñ… " +"раÑположение не обÑзательно должно быть идеальным).\n" +"Ðет необходимоÑти размещать противоположный портал в ÑоÑедней комнате, ÑвÑзи " +"делаютÑÑ Ð´Ð²ÑƒÑторонними автоматичеÑки." #: doc/classes/Portal.xml doc/classes/Room.xml msgid "Sets individual points. Primarily for use by the editor." @@ -49349,6 +50203,21 @@ msgid "" "([code]stderr[/code]) is always flushed when a line is printed to it.\n" "Changes to this setting will only be applied upon restarting the application." msgstr "" +"ЕÑли [code]true[/code], то поток Ñтандартного вывода очищаетÑÑ ÐºÐ°Ð¶Ð´Ñ‹Ð¹ раз, " +"когда печатаетÑÑ Ñтрока. Ðто влиÑет как на ведение журналов в терминале, так " +"и на ведение журналов в файлах.\n" +"При запуÑке проекта Ñтот параметр должен быть включен, еÑли вы хотите, чтобы " +"журналы ÑобиралиÑÑŒ менеджерами Ñлужб, такими как systemd/journalctl. Ðта " +"наÑтройка отключена по умолчанию в Ñборках релизов, поÑкольку промывка " +"каждой напечатанной Ñтроки негативно ÑкажетÑÑ Ð½Ð° производительноÑти, еÑли " +"много Ñтрок печатаетÑÑ Ð² быÑтрой поÑледовательноÑти. Кроме того, еÑли Ñта " +"наÑтройка включена, файлы журналов будут уÑпешно запиÑаны, еÑли приложение " +"аварийно завершено или иным образом убито пользователем (не будучи закрытым " +"\"нормально\").\n" +"[b]Примечание:[/b] ÐезавиÑимо от Ñтой наÑтройки, Ñтандартный поток ошибок " +"([code]stderr[/code]) вÑегда промываетÑÑ, когда в него печатаетÑÑ Ñтрока.\n" +"Ð˜Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð² Ñтой наÑтройке будут применены только поÑле перезапуÑка " +"приложениÑ." #: doc/classes/ProjectSettings.xml msgid "" @@ -51471,6 +52340,23 @@ msgid "" "[b]Note:[/b] This property is only read when the project starts. To change " "the value at runtime, set [member Engine.physics_jitter_fix] instead." msgstr "" +"УправлÑет тем, наÑколько тики физики Ñинхронизированы Ñ Ñ€ÐµÐ°Ð»ÑŒÐ½Ñ‹Ð¼ временем. " +"При значении 0 или меньше тики ÑинхронизируютÑÑ. Такие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ " +"рекомендуютÑÑ Ð´Ð»Ñ Ñетевых игр, где ÑÐ¸Ð½Ñ…Ñ€Ð¾Ð½Ð¸Ð·Ð°Ñ†Ð¸Ñ Ñ‡Ð°Ñов имеет значение. " +"Большие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²Ð¾Ð´ÑÑ‚ к большему отклонению внутриигровых чаÑов от " +"реальных, но позволÑÑŽÑ‚ Ñгладить дрожание кадров. Значение по умолчанию 0,5 " +"должно уÑтраивать большинÑтво; Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð²Ñ‹ÑˆÐµ 2 могут привеÑти к тому, что " +"игра будет реагировать на выпадение кадров Ñ Ð·Ð°Ð¼ÐµÑ‚Ð½Ð¾Ð¹ задержкой, поÑтому не " +"рекомендуетÑÑ.\n" +"[b]Примечание:[/b] Ð”Ð»Ñ Ð´Ð¾ÑÑ‚Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð½Ð°Ð¸Ð»ÑƒÑ‡ÑˆÐ¸Ñ… результатов при иÑпользовании " +"пользовательÑкого Ñ€ÐµÑˆÐµÐ½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»Ñции физики, иÑправление джиттера физики " +"Ñледует отключить, уÑтановив [member physics/common/physics_jitter_fix] на " +"[code]0[/code].\n" +"[b]Примечание:[/b] ФикÑÐ°Ñ†Ð¸Ñ Ð´Ð¶Ð¸Ñ‚Ñ‚ÐµÑ€Ð° автоматичеÑки отключаетÑÑ Ð²Ð¾ Ð²Ñ€ÐµÐ¼Ñ " +"выполнениÑ, еÑли включен [member physics/common/physics_interpolation].\n" +"[b]Примечание:[/b] Ðто ÑвойÑтво ÑчитываетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ при запуÑке проекта. " +"Чтобы изменить значение во Ð²Ñ€ÐµÐ¼Ñ Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ, уÑтановите [member Engine." +"physics_jitter_fix] вмеÑто Ñтого." #: doc/classes/ProjectSettings.xml msgid "" @@ -52110,6 +52996,23 @@ msgid "" "[b]Note:[/b] This property is only read when the project starts. There is " "currently no way to change this setting at run-time." msgstr "" +"МакÑимальный уровень анизотропного фильтра, иÑпользуемый Ð´Ð»Ñ Ñ‚ÐµÐºÑтур Ñ " +"включенной анизотропией. Более выÑокие Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¸Ð²Ð¾Ð´ÑÑ‚ к более четким " +"текÑтурам при проÑмотре под коÑыми углами, но за Ñчет ÑÐ½Ð¸Ð¶ÐµÐ½Ð¸Ñ " +"производительноÑти. За иÑключением [code]1[/code], допуÑтимы только " +"значениÑ, равные двум целым ([code]2[/code], [code]4[/code], [code]8[/code], " +"[code]16[/code]). Значение [code]1[/code] принудительно отключает " +"анизотропную фильтрацию, даже на тех текÑтурах, где она включена.\n" +"[b]Примечание:[/b] По причинам производительноÑти Ð°Ð½Ð¸Ð·Ð¾Ñ‚Ñ€Ð¾Ð¿Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ " +"[i]не включена по умолчанию[/i] на текÑтурах. Чтобы Ñта наÑтройка имела " +"Ñффект, анизотропную фильтрацию текÑтуры можно включить, выбрав текÑтуру в " +"доке FileSystem, Ð¿ÐµÑ€ÐµÐ¹Ð´Ñ Ð² док Import, уÑтановив флажок [b]Anisotropic[/b] и " +"нажав [b]Reimport[/b]. Однако Ð°Ð½Ð¸Ð·Ð¾Ñ‚Ñ€Ð¾Ð¿Ð½Ð°Ñ Ñ„Ð¸Ð»ÑŒÑ‚Ñ€Ð°Ñ†Ð¸Ñ Ñ€ÐµÐ´ÐºÐ¾ бывает полезной " +"в 2D, поÑтому включайте ее Ð´Ð»Ñ Ñ‚ÐµÐºÑтур в 2D, только еÑли Ñто дает значимую " +"визуальную разницу.\n" +"[b]Примечание:[/b] Ðто ÑвойÑтво ÑчитываетÑÑ Ñ‚Ð¾Ð»ÑŒÐºÐ¾ при запуÑке проекта. Ð’ " +"наÑтоÑщее Ð²Ñ€ÐµÐ¼Ñ Ð½Ðµ ÑущеÑтвует ÑпоÑоба изменить Ñтот параметр во Ð²Ñ€ÐµÐ¼Ñ " +"Ð²Ñ‹Ð¿Ð¾Ð»Ð½ÐµÐ½Ð¸Ñ Ð¿Ñ€Ð¾ÐµÐºÑ‚Ð°." #: doc/classes/ProjectSettings.xml msgid "" @@ -52131,15 +53034,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -52709,7 +53619,7 @@ msgstr "" #: doc/classes/Quat.xml msgid "Quaternion." -msgstr "" +msgstr "Кватернион." #: doc/classes/Quat.xml msgid "" @@ -52992,6 +53902,24 @@ msgid "" "state], and not the initial seed value, which is going to be fixed in Godot " "4.0." msgstr "" +"Инициализирует ÑоÑтоÑние генератора Ñлучайных чиÑел на оÑнове заданного " +"Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ seed. Заданное значение Ñемени дает воÑпроизводимую " +"поÑледовательноÑть пÑевдоÑлучайных чиÑел.\n" +"[b]Примечание:[/b] RNG не обладает лавинным Ñффектом и может выдавать " +"похожие Ñлучайные потоки при одинаковых Ñеменах. РаÑÑмотрите возможноÑть " +"иÑÐ¿Ð¾Ð»ÑŒÐ·Ð¾Ð²Ð°Ð½Ð¸Ñ Ñ…Ñш-функции Ð´Ð»Ñ ÑƒÐ»ÑƒÑ‡ÑˆÐµÐ½Ð¸Ñ ÐºÐ°Ñ‡ÐµÑтва ÑемÑн, еÑли они получены " +"извне.\n" +"[b]Примечание:[/b] УÑтановка Ñтого ÑвойÑтва приводит к побочному Ñффекту " +"Ð¸Ð·Ð¼ÐµÐ½ÐµÐ½Ð¸Ñ Ð²Ð½ÑƒÑ‚Ñ€ÐµÐ½Ð½ÐµÐ³Ð¾ [member state], поÑтому убедитеÑÑŒ, что ÑÐµÐ¼Ñ " +"инициализировано [i], прежде чем[/i] изменÑть [member state]:\n" +"[блок кода]\n" +"var rng = RandomNumberGenerator.new()\n" +"rng.seed = hash(\"Godot\")\n" +"rng.state = 100 # ВоÑÑтановление к некоторому ранее Ñохраненному ÑоÑтоÑнию.\n" +"[/codeblock].\n" +"[b]Предупреждение:[/b] геттер Ñтого ÑвойÑтва возвращает предыдущее ÑоÑтоÑние " +"[member state], а не начальное значение seed, что будет иÑправлено в Godot " +"4.0." #: doc/classes/RandomNumberGenerator.xml msgid "" @@ -53131,6 +54059,20 @@ msgid "" "queries are required between physics frames (or during the same frame), use " "[method force_raycast_update] after adjusting the raycast." msgstr "" +"RayCast предÑтавлÑет Ñобой линию от начала координат до меÑта назначениÑ, " +"[code]cast_to[/code]. Он иÑпользуетÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа трехмерного проÑтранÑтва, " +"чтобы найти ближайший объект на пути луча.\n" +"RayCast может игнорировать некоторые объекты, добавлÑÑ Ð¸Ñ… в ÑпиÑок " +"иÑключений через [code]add_exception[/code] или уÑÑ‚Ð°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ Ð½Ð°Ð´Ð»ÐµÐ¶Ð°Ñ‰ÑƒÑŽ " +"фильтрацию Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлоев Ñтолкновений и маÑок.\n" +"RayCast может быть наÑтроен на Ñообщение о ÑтолкновениÑÑ… Ñ [Area]s ([member " +"collide_with_areas]) и/или [PhysicsBody]s ([member collide_with_bodies]).\n" +"Только включенные лучевые передачи Ñмогут запрашивать проÑтранÑтво и " +"Ñообщать о ÑтолкновениÑÑ….\n" +"RayCast вычиÑлÑет переÑечение каждый кадр физики (Ñм. [Node]), и результат " +"кÑшируетÑÑ, чтобы его можно было иÑпользовать позже, до Ñледующего кадра. " +"ЕÑли требуетÑÑ Ð½ÐµÑколько запроÑов между кадрами физики (или в течение одного " +"кадра), иÑпользуйте [метод force_raycast_update] поÑле наÑтройки Ñ€ÑйкаÑта." #: doc/classes/RayCast.xml doc/classes/RayCast2D.xml msgid "" @@ -53281,6 +54223,22 @@ msgid "" "queries are required between physics frames (or during the same frame) use " "[method force_raycast_update] after adjusting the raycast." msgstr "" +"RayCast предÑтавлÑет Ñобой линию от начала координат до меÑта назначениÑ, " +"[code]cast_to[/code]. Он иÑпользуетÑÑ Ð´Ð»Ñ Ð·Ð°Ð¿Ñ€Ð¾Ñа двумерного проÑтранÑтва Ñ " +"целью найти ближайший объект на пути луча.\n" +"RayCast2D может игнорировать некоторые объекты, добавлÑÑ Ð¸Ñ… в ÑпиÑок " +"иÑключений через [code]add_exception[/code], уÑÑ‚Ð°Ð½Ð°Ð²Ð»Ð¸Ð²Ð°Ñ Ð¿Ñ€Ð°Ð²Ð¸Ð»ÑŒÐ½ÑƒÑŽ " +"фильтрацию Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ Ñлоев Ñтолкновений или Ñ„Ð¸Ð»ÑŒÑ‚Ñ€ÑƒÑ Ñ‚Ð¸Ð¿Ñ‹ объектов Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ " +"маÑок типов.\n" +"RayCast2D может быть наÑтроен на Ñообщение о ÑтолкновениÑÑ… Ñ [Area2D]s " +"([member collide_with_areas]) и/или [PhysicsBody2D]s ([member " +"collide_with_bodies]).\n" +"Только включенные лучевые передачи Ñмогут запрашивать проÑтранÑтво и " +"Ñообщать о ÑтолкновениÑÑ….\n" +"RayCast2D вычиÑлÑет переÑечение каждый кадр физики (Ñм. [Node]), и результат " +"кÑшируетÑÑ, чтобы его можно было иÑпользовать позже, до Ñледующего кадра. " +"ЕÑли требуетÑÑ Ð½ÐµÑколько запроÑов между кадрами физики (или в течение одного " +"кадра), иÑпользуйте [метод force_raycast_update] поÑле наÑтройки Ñ€ÑйкаÑта." #: doc/classes/RayCast2D.xml msgid "" @@ -53487,6 +54445,21 @@ msgid "" "free references that are no longer in use. This means that unused references " "will linger on for a while before being removed." msgstr "" +"Базовый клаÑÑ Ð´Ð»Ñ Ð»ÑŽÐ±Ð¾Ð³Ð¾ объекта, который ведет подÑчет ÑÑылок. [Resource] и " +"многие другие вÑпомогательные объекты наÑледуют Ñтот клаÑÑ.\n" +"Ð’ отличие от других типов [Object], ÑÑылки ведут внутренний Ñчетчик ÑÑылок, " +"поÑтому они автоматичеÑки оÑвобождаютÑÑ, когда больше не иÑпользуютÑÑ, и " +"только тогда. ПоÑтому ÑÑылки не нужно оÑвобождать вручную Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [метода " +"Object.free].\n" +"Ð’ подавлÑющем большинÑтве Ñлучаев инÑтанцирование и иÑпользование " +"[Reference]-производных типов - Ñто вÑе, что вам нужно Ñделать. Методы, " +"предоÑтавлÑемые в Ñтом клаÑÑе, предназначены только Ð´Ð»Ñ Ð¾Ð¿Ñ‹Ñ‚Ð½Ñ‹Ñ… " +"пользователей и могут вызвать проблемы при неправильном иÑпользовании.\n" +"[b]Примечание:[/b] Ð’ C# ÑÑылки не оÑвобождаютÑÑ Ð¼Ð³Ð½Ð¾Ð²ÐµÐ½Ð½Ð¾ поÑле того, как " +"они переÑтают иÑпользоватьÑÑ. ВмеÑто Ñтого Ñборка муÑора будет выполнÑтьÑÑ " +"периодичеÑки и оÑвобождать ÑÑылки, которые больше не иÑпользуютÑÑ. Ðто " +"означает, что неиÑпользуемые ÑÑылки будут ÑущеÑтвовать некоторое времÑ, " +"прежде чем будут удалены." #: doc/classes/Reference.xml msgid "" @@ -53789,17 +54762,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -53808,8 +54792,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -53962,10 +54952,24 @@ msgid "" "free resources that are no longer in use. This means that unused resources " "will linger on for a while before being removed." msgstr "" +"Resource - Ñто базовый клаÑÑ Ð´Ð»Ñ Ð²Ñех ÑпецифичеÑких Ð´Ð»Ñ Godot типов " +"реÑурÑов, Ñлужащих в оÑновном в качеÑтве контейнеров данных. ПоÑкольку они " +"наÑледуютÑÑ Ð¾Ñ‚ [Reference], реÑурÑÑ‹ учитываютÑÑ Ð¿Ð¾ ÑÑылкам и оÑвобождаютÑÑ, " +"когда больше не иÑпользуютÑÑ. Они также кÑшируютÑÑ Ð¿Ð¾Ñле загрузки Ñ Ð´Ð¸Ñка, " +"так что вÑе поÑледующие попытки загрузить реÑÑƒÑ€Ñ Ð¿Ð¾ заданному пути будут " +"возвращать ту же ÑÑылку (в отличие от [Node], который не учитываетÑÑ Ð¿Ð¾ " +"ÑÑылкам и может инÑтанцироватьÑÑ Ñ Ð´Ð¸Ñка Ñколько угодно раз). РеÑурÑÑ‹ могут " +"быть Ñохранены на внешнем диÑке или вложены в другой объект, например, " +"[Node] или другой реÑурÑ.\n" +"[b]Примечание:[/b] Ð’ C# реÑурÑÑ‹ не будут оÑвобождатьÑÑ Ð¼Ð³Ð½Ð¾Ð²ÐµÐ½Ð½Ð¾ поÑле того, " +"как они переÑтанут иÑпользоватьÑÑ. ВмеÑто Ñтого Ñборка муÑора будет " +"выполнÑтьÑÑ Ð¿ÐµÑ€Ð¸Ð¾Ð´Ð¸Ñ‡ÐµÑки и оÑвобождать реÑурÑÑ‹, которые больше не " +"иÑпользуютÑÑ. Ðто означает, что неиÑпользуемые реÑурÑÑ‹ будут ÑущеÑтвовать " +"некоторое времÑ, прежде чем будут удалены." #: doc/classes/Resource.xml msgid "Resources" -msgstr "" +msgstr "РеÑурÑÑ‹" #: doc/classes/Resource.xml msgid "" @@ -54322,6 +55326,24 @@ msgid "" "be used in most situations, leaving the use of [ResourceLoader] for more " "advanced scenarios." msgstr "" +"Загружает реÑÑƒÑ€Ñ Ð¿Ð¾ заданному [code]пути[/code] , кÑÑˆÐ¸Ñ€ÑƒÑ Ñ€ÐµÐ·ÑƒÐ»ÑŒÑ‚Ð°Ñ‚ Ð´Ð»Ñ " +"поÑледующего доÑтупа.\n" +"ЗарегиÑтрированные [ResourceFormatLoader]Ñ‹ поÑледовательно запрашиваютÑÑ, " +"чтобы найти первый, который может обрабатывать раÑширение файла, и затем " +"выполнÑетÑÑ Ð¿Ð¾Ð¿Ñ‹Ñ‚ÐºÐ° загрузки. ЕÑли загрузка не удалаÑÑŒ, оÑтальные " +"ResourceFormatLoader'Ñ‹ также будут опрошены.\n" +"ÐеобÑзательный [code]type_hint[/code] может быть иÑпользован Ð´Ð»Ñ Ð´Ð°Ð»ÑŒÐ½ÐµÐ¹ÑˆÐµÐ³Ð¾ " +"ÑƒÐºÐ°Ð·Ð°Ð½Ð¸Ñ Ñ‚Ð¸Ð¿Ð° [Resource], который должен обрабатыватьÑÑ " +"[ResourceFormatLoader]. Ð’ качеÑтве подÑказки типа можно иÑпользовать вÑе, " +"что наÑледуетÑÑ Ð¾Ñ‚ [Resource], например [Image].\n" +"ЕÑли [code]no_cache[/code] is [code]true[/code], кÑш реÑурÑа будет обойден и " +"реÑÑƒÑ€Ñ Ð±ÑƒÐ´ÐµÑ‚ загружен заново. Ð’ противном Ñлучае будет возвращен " +"кÑшированный реÑурÑ, еÑли он ÑущеÑтвует.\n" +"Возвращает пуÑтой реÑурÑ, еÑли ни один [ResourceFormatLoader] не Ñмог " +"обработать файл.\n" +"GDScript имеет упрощенный вÑтроенный метод [method @GDScript.load], который " +"можно иÑпользовать в большинÑтве Ñитуаций, оÑтавлÑÑ Ð¸Ñпользование " +"[ResourceLoader] Ð´Ð»Ñ Ð±Ð¾Ð»ÐµÐµ Ñложных Ñценариев." #: doc/classes/ResourceLoader.xml msgid "" @@ -55237,6 +56259,26 @@ msgid "" "[ConcavePolygonShape]. Don't use multiple [CollisionShape]s when using a " "[ConcavePolygonShape] with Bullet physics if you need shape indices." msgstr "" +"ВыдаетÑÑ Ð¿Ñ€Ð¸ Ñтолкновении одного из [Shape] Ñтого RigidBody Ñ Ð´Ñ€ÑƒÐ³Ð¸Ð¼ " +"[PhysicsBody] или [GridMap] [Shape]. ТребуетÑÑ, чтобы [member " +"contact_monitor] был уÑтановлен в [code]true[/code] и [member " +"contacts_reported] был уÑтановлен доÑтаточно выÑоким, чтобы обнаружить вÑе " +"ÑтолкновениÑ. [GridMap]Ñ‹ обнаруживаютÑÑ, еÑли в [MeshLibrary] еÑть [Shape]Ñ‹ " +"Ñтолкновений.\n" +"[code]body_rid[/code] [RID] другого [PhysicsBody] или [MeshLibrary] " +"[CollisionObject], иÑпользуемого [PhysicsServer].\n" +"[code]body[/code] [Узел], еÑли он ÑущеÑтвует в дереве, другого [PhysicsBody] " +"или [GridMap].\n" +"[code]body_shape_index[/code] Ð¸Ð½Ð´ÐµÐºÑ [Shape] другого [PhysicsBody] или " +"[GridMap], иÑпользуемого [PhysicsServer]. Получите узел [CollisionShape] Ñ " +"помощью [code]body.shape_owner_get_owner(body_shape_index)[/code].\n" +"[code]local_shape_index[/code] Ð¸Ð½Ð´ÐµÐºÑ [Shape] Ñтого RigidBody, иÑпользуемый " +"[PhysicsServer]. Получите узел [CollisionShape] Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [code]self." +"shape_owner_get_owner(local_shape_index)[/code].\n" +"[b]Примечание:[/b] Физика пули не может определить Ð¸Ð½Ð´ÐµÐºÑ Ñ„Ð¾Ñ€Ð¼Ñ‹ при " +"иÑпользовании [ConcavePolygonShape]. Ðе иÑпользуйте неÑколько " +"[CollisionShape] при иÑпользовании [ConcavePolygonShape] Ñ Ñ„Ð¸Ð·Ð¸ÐºÐ¾Ð¹ Bullet, " +"еÑли вам нужны индекÑÑ‹ формы." #: doc/classes/RigidBody.xml msgid "" @@ -55849,6 +56891,19 @@ msgid "" "your room and object sizes, and movement speeds. The default value should " "work reasonably in most circumstances." msgstr "" +"Чтобы уменьшить обработку данных Ð´Ð»Ñ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰Ð°ÐµÐ¼Ñ‹Ñ… объектов, к их AABB " +"применÑетÑÑ Ñ€Ð°Ñширение по мере их перемещениÑ. Ðтот раÑширенный объем " +"иÑпользуетÑÑ Ð´Ð»Ñ Ñ€Ð°Ñчета комнат, в которых находитÑÑ Ð¿ÐµÑ€ÐµÐ¼ÐµÑ‰Ð°ÐµÐ¼Ñ‹Ð¹ объект. " +"ЕÑли точный AABB объекта вÑе еще находитÑÑ Ð² пределах Ñтого раÑширенного " +"объема при Ñледующем перемещении, нет необходимоÑти повторно обрабатывать " +"объект, что может ÑÑкономить значительное количеÑтво CPU.\n" +"ÐедоÑтатком ÑвлÑетÑÑ Ñ‚Ð¾, что еÑли раÑширение Ñлишком велико, объект может " +"неожиданно раÑпроÑтранитьÑÑ Ð² ÑоÑедние комнаты и поÑвитьÑÑ Ñ‚Ð°Ð¼, где в " +"противном Ñлучае он мог бы быть удален.\n" +"Чтобы ÑбаланÑировать производительноÑть роуминга и точноÑть выбраковки, Ñтот " +"Ð·Ð°Ð¿Ð°Ñ Ñ€Ð°ÑÑˆÐ¸Ñ€ÐµÐ½Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ быть наÑтроен пользователем. Обычно он завиÑит от " +"размеров комнат и объектов, а также от ÑкороÑти передвижениÑ. Значение по " +"умолчанию должно работать разумно в большинÑтве Ñлучаев." #: doc/classes/RoomManager.xml msgid "" @@ -55928,6 +56983,19 @@ msgid "" "[code]extends RootMotionView[/code]. Additionally, it must not be a " "[code]tool[/code] script." msgstr "" +"[i]Корневое движение[/i] отноÑитÑÑ Ðº технике анимации, когда Ñкелет Ñетки " +"иÑпользуетÑÑ Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð´Ð°Ð½Ð¸Ñ Ð¸Ð¼Ð¿ÑƒÐ»ÑŒÑа перÑонажу. При работе Ñ 3D-анимацией " +"популÑрной техникой ÑвлÑетÑÑ Ð¸Ñпользование аниматорами корневой коÑти " +"Ñкелета Ð´Ð»Ñ Ð¿Ñ€Ð¸Ð´Ð°Ð½Ð¸Ñ Ð´Ð²Ð¸Ð¶ÐµÐ½Ð¸Ñ Ð¾Ñтальным чаÑÑ‚Ñм Ñкелета. Ðто позволÑет " +"анимировать перÑонажей таким образом, что шаги фактичеÑки ÑоответÑтвуют полу " +"под ними. Ðто также позволÑет точно взаимодейÑтвовать Ñ Ð¾Ð±ÑŠÐµÐºÑ‚Ð°Ð¼Ð¸ во Ð²Ñ€ÐµÐ¼Ñ " +"кинематографа. См. также [AnimationTree].\n" +"[b]Примечание:[/b] [RootMotionView] виден только в редакторе. Он будет " +"автоматичеÑки Ñкрыт в работающем проекте, а также будет преобразован в " +"обычный [Node] в работающем проекте. Ðто означает, что Ñкрипт, прикрепленный " +"к узлу [RootMotionView] [i]должен[/i] иметь [code]extends Node[/code] вмеÑто " +"[code]extends RootMotionView[/code]. Кроме того, он не должен быть Ñкриптом " +"[code]инÑтрумента[/code]." #: doc/classes/RootMotionView.xml msgid "Using AnimationTree - Root motion" @@ -56530,12 +57598,16 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml msgid "No stretching." -msgstr "" +msgstr "Ðе раÑÑ‚Ñгивать." #: doc/classes/SceneTree.xml msgid "Render stretching in higher resolution (interpolated)." @@ -56579,7 +57651,7 @@ msgstr "" #: doc/classes/SceneTreeTimer.xml msgid "One-shot timer." -msgstr "" +msgstr "Таймер на один Ñнимок." #: doc/classes/SceneTreeTimer.xml msgid "" @@ -56769,6 +57841,23 @@ msgid "" "will always return the final value, regardless of [code]elapsed_time[/code] " "provided." msgstr "" +"Ðтот метод можно иÑпользовать Ð´Ð»Ñ Ñ€ÑƒÑ‡Ð½Ð¾Ð¹ интерполÑции значениÑ, когда вы не " +"хотите, чтобы [SceneTreeTween] выполнÑл анимацию за ваÑ. Он похож на [method " +"@GDScript.lerp], но Ñ Ð¿Ð¾Ð´Ð´ÐµÑ€Ð¶ÐºÐ¾Ð¹ пользовательÑкого перехода и ÑмÑгчениÑ.\n" +"[code]initial_value[/code] - начальное значение интерполÑции.\n" +"[code]delta_value[/code] - Ñто изменение Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ Ð² интерполÑции, Ñ‚.е. оно " +"равно [code]final_value - initial_value[/code].\n" +"[code]elapsed_time[/code] - Ñто Ð²Ñ€ÐµÐ¼Ñ Ð² Ñекундах, прошедшее поÑле начала " +"интерполÑции, которое иÑпользуетÑÑ Ð´Ð»Ñ ÐºÐ¾Ð½Ñ‚Ñ€Ð¾Ð»Ñ Ð¿Ð¾Ð»Ð¾Ð¶ÐµÐ½Ð¸Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»Ñции. " +"Ðапример, еÑли оно равно половине длительноÑти [code][/code] , " +"интерполированное значение будет находитьÑÑ Ð½Ð° полпути между начальным и " +"конечным значениÑми. Ðто значение также может быть больше, чем " +"[code]duration[/code] или меньше, чем 0, что приведет к ÑкÑтраполÑции " +"значениÑ.\n" +"[code]duration[/code] - общее Ð²Ñ€ÐµÐ¼Ñ Ð¸Ð½Ñ‚ÐµÑ€Ð¿Ð¾Ð»Ñции.\n" +"[b]Примечание:[/b] ЕÑли [code]duration[/code] равно [code]0[/code], метод " +"вÑегда будет возвращать конечное значение, незавиÑимо от [code]elapsed_time[/" +"code] предоÑтавленного значениÑ." #: doc/classes/SceneTreeTween.xml msgid "" @@ -57543,6 +58632,22 @@ msgid "" "([code]shape_xform[/code]), and the movement to test onto the other object " "([code]shape_motion[/code])." msgstr "" +"Возвращает ÑпиÑок пар точек ÑоприкоÑновениÑ, где Ð´Ð°Ð½Ð½Ð°Ñ Ñ„Ð¸Ð³ÑƒÑ€Ð° могла бы " +"коÑнутьÑÑ Ð´Ñ€ÑƒÐ³Ð¾Ð¹, еÑли бы было применено заданное движение.\n" +"ЕÑли Ñтолкновений не будет, возвращаемый ÑпиÑок пуÑÑ‚. Ð’ противном Ñлучае, " +"возвращаемый ÑпиÑок Ñодержит попарно раÑположенные точки контакта, в которых " +"чередуютÑÑ Ñ‚Ð¾Ñ‡ÐºÐ¸ на границе данной фигуры и точки на границе " +"[code]with_shape[/code].\n" +"Пара Ñтолкновений A, B может быть иÑпользована Ð´Ð»Ñ Ð²Ñ‹Ñ‡Ð¸ÑÐ»ÐµÐ½Ð¸Ñ Ð½Ð¾Ñ€Ð¼Ð°Ð»Ð¸ " +"ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [code](B - A).normalized()[/code], и глубины " +"ÑÑ‚Ð¾Ð»ÐºÐ½Ð¾Ð²ÐµÐ½Ð¸Ñ Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ [code](B - A).length()[/code]. Ðта Ð¸Ð½Ñ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ð¾Ð±Ñ‹Ñ‡Ð½Ð¾ " +"иÑпользуетÑÑ Ð´Ð»Ñ Ñ€Ð°Ð·Ð´ÐµÐ»ÐµÐ½Ð¸Ñ Ñ„Ð¸Ð³ÑƒÑ€, оÑобенно в решателÑÑ… Ñтолкновений.\n" +"Ðтому методу нужна матрица транÑформации Ð´Ð»Ñ Ð´Ð°Ð½Ð½Ð¾Ð¹ фигуры " +"([code]local_xform[/code]), движение Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ Ñтой фигуры " +"([code]local_motion[/code]), фигура Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ Ñтолкновений Ñ Ð½ÐµÐ¹ " +"([code]with_shape[/code]), матрица транÑформации Ñтой фигуры " +"([code]shape_xform[/code]) и движение Ð´Ð»Ñ Ð¿Ñ€Ð¾Ð²ÐµÑ€ÐºÐ¸ на другом объекте " +"([code]shape_motion[/code])." #: doc/classes/Shape2D.xml msgid "" @@ -57614,7 +58719,7 @@ msgstr "" #: doc/classes/Skeleton.xml msgid "[i]Deprecated soon.[/i]" -msgstr "" +msgstr "[i]Скоро будет уÑтаревшим.[/i]" #: doc/classes/Skeleton.xml msgid "Clear all the bones in this skeleton." @@ -58374,7 +59479,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -59756,7 +60863,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -59772,7 +60882,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -60780,6 +61892,21 @@ msgid "" "To get a boolean result from a string comparison, use the [code]==[/code] " "operator instead. See also [method nocasecmp_to]." msgstr "" +"ВыполнÑет Ñравнение Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтрокой Ñ ÑƒÑ‡ÐµÑ‚Ð¾Ð¼ региÑтра. Возвращает [code]-1[/" +"code], еÑли меньше, [code]1[/code], еÑли больше, или [code]0[/code], еÑли " +"равно. \"Меньше\" или \"больше\" определÑÑŽÑ‚ÑÑ [url=https://en.wikipedia.org/" +"wiki/List_of_Unicode_characters]кодовыми точками Unicode[/url] каждой " +"Ñтроки, что примерно ÑоответÑтвует алфавитному порÑдку.\n" +"[b]Поведение при различной длине Ñтроки:[/b] Возвращает [code]1[/code], еÑли " +"\"базоваÑ\" Ñтрока длиннее Ñтрок [code]-[/code] или [code]-1[/code], еÑли " +"\"базоваÑ\" Ñтрока короче Ñтрок [code]-[/code]. Следует помнить, что длина " +"определÑетÑÑ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтвом кодовых точек Юникода, [i]а не[/i] реально видимых " +"Ñимволов.\n" +"[b]Поведение Ñ Ð¿ÑƒÑтыми Ñтроками:[/b] Возвращает [code]-1[/code], еÑли " +"\"базоваÑ\" Ñтрока пуÑта, [code]1[/code], еÑли Ñтроки [code]-[/code] пуÑты, " +"или [code]0[/code], еÑли обе Ñтроки пуÑты.\n" +"Чтобы получить булев результат ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ñтрок, иÑпользуйте вмеÑто Ñтого " +"оператор [code]==[/code]. См. также [метод nocasecmp_to]." #: doc/classes/String.xml msgid "" @@ -61184,6 +62311,22 @@ msgid "" "To get a boolean result from a string comparison, use the [code]==[/code] " "operator instead. See also [method casecmp_to]." msgstr "" +"ВыполнÑет Ñравнение Ñ Ð´Ñ€ÑƒÐ³Ð¾Ð¹ Ñтрокой без учета региÑтра. Возвращает " +"[code]-1[/code], еÑли меньше, [code]1[/code], еÑли больше, или [code]0[/" +"code], еÑли равно. \"Меньше\" или \"больше\" определÑетÑÑ [url=https://en." +"wikipedia.org/wiki/List_of_Unicode_characters]кодовыми точками Unicode[/url] " +"каждой Ñтроки, что примерно ÑоответÑтвует алфавитному порÑдку. При Ñравнении " +"Ñимволы нижнего региÑтра преобразуютÑÑ Ð² верхний региÑтр.\n" +"[b]Поведение при различной длине Ñтроки:[/b] Возвращает [code]1[/code], еÑли " +"\"базоваÑ\" Ñтрока длиннее, чем Ñтроки [code]-[/code] или [code]-1[/code], " +"еÑли \"базоваÑ\" Ñтрока короче, чем Ñтроки [code]-[/code]. Следует помнить, " +"что длина определÑетÑÑ ÐºÐ¾Ð»Ð¸Ñ‡ÐµÑтвом кодовых точек Юникода, [i]а не[/i] " +"реально видимых Ñимволов.\n" +"[b]Поведение Ñ Ð¿ÑƒÑтыми Ñтроками:[/b] Возвращает [code]-1[/code], еÑли " +"\"базоваÑ\" Ñтрока пуÑта, [code]1[/code], еÑли Ñтроки [code]-[/code] пуÑты, " +"или [code]0[/code], еÑли обе Ñтроки пуÑты.\n" +"Чтобы получить булев результат ÑÑ€Ð°Ð²Ð½ÐµÐ½Ð¸Ñ Ñтрок, иÑпользуйте вмеÑто Ñтого " +"оператор [code]==[/code]. См. также [метод casecmp_to]." #: doc/classes/String.xml msgid "Returns the character code at position [code]at[/code]." @@ -61273,6 +62416,24 @@ msgid "" "print(some_array[1]) # Prints \"Four\"\n" "[/codeblock]" msgstr "" +"РазделÑет Ñтроку по [code]разделителю[/code] и возвращает маÑÑив подÑтрок, " +"Ð½Ð°Ñ‡Ð¸Ð½Ð°Ñ Ñправа.\n" +"Разделители в возвращаемом маÑÑиве ÑортируютÑÑ Ð² том же порÑдке, что и " +"иÑÑ…Ð¾Ð´Ð½Ð°Ñ Ñтрока, Ñлева направо.\n" +"ЕÑли [code]allow_empty[/code] равен [code]true[/code], и в Ñтроке еÑть два " +"ÑоÑедних разделителÑ, то в маÑÑив подÑтрок в Ñтой позиции будет добавлена " +"пуÑÑ‚Ð°Ñ Ñтрока.\n" +"ЕÑли указано [code]maxsplit[/code], то Ñто определÑет количеÑтво разбиений " +"Ñправа до [code]maxsplit[/code]. Значение по умолчанию 0 означает, что вÑе " +"Ñлементы разделÑÑŽÑ‚ÑÑ, что дает тот же результат, что и [method split].\n" +"Пример:\n" +"[codeblock].\n" +"var some_string = \"One,Two,Three,Four\"\n" +"var some_array = some_string.rsplit(\",\", true, 1)\n" +"print(some_array.size()) # Печатает 2\n" +"print(some_array[0]) # Печатает \"Один, два, три\"\n" +"print(some_array[1]) # Печатает \"Four\"\n" +"[/codeblock]" #: doc/classes/String.xml msgid "" @@ -61341,6 +62502,26 @@ msgid "" "If you need to split strings with more complex rules, use the [RegEx] class " "instead." msgstr "" +"РазделÑет Ñтроку по разделителю [code][/code] и возвращает маÑÑив подÑтрок. " +"Разделитель [code][/code] может быть любой длины.\n" +"ЕÑли [code]allow_empty[/code] равно [code]true[/code], и в Ñтроке еÑть два " +"ÑоÑедних разделителÑ, то в маÑÑив подÑтрок в Ñтой позиции будет добавлена " +"пуÑÑ‚Ð°Ñ Ñтрока.\n" +"ЕÑли указано [code]maxsplit[/code], то Ñто определÑет количеÑтво разбиений " +"Ñлева до [code]maxsplit[/code]. Значение по умолчанию [code]0[/code] " +"означает, что вÑе Ñлементы разделÑÑŽÑ‚ÑÑ.\n" +"ЕÑли вам нужен только один Ñлемент из маÑÑива по определенному индекÑу, " +"[метод get_slice] ÑвлÑетÑÑ Ð±Ð¾Ð»ÐµÐµ производительным вариантом.\n" +"Пример:\n" +"[codeblock].\n" +"var some_string = \"One,Two,Three,Four\"\n" +"var some_array = some_string.split(\",\", true, 1)\n" +"print(some_array.size()) # Печатает 2\n" +"print(some_array[0]) # Печатает \"Один\"\n" +"print(some_array[1]) # Печатает \"Два, три, четыре\"\n" +"[/codeblock].\n" +"ЕÑли вам нужно разделить Ñтроки по более Ñложным правилам, иÑпользуйте клаÑÑ " +"[RegEx]." #: doc/classes/String.xml msgid "" @@ -62210,7 +63391,7 @@ msgstr "" #: doc/classes/TabContainer.xml msgid "Tabbed container." -msgstr "" +msgstr "Контейнер Ñ Ð²ÐºÐ»Ð°Ð´ÐºÐ°Ð¼Ð¸." #: doc/classes/TabContainer.xml msgid "" @@ -62464,7 +63645,7 @@ msgstr "" #: doc/classes/Tabs.xml msgid "Tabs control." -msgstr "" +msgstr "Управление вкладками." #: doc/classes/Tabs.xml msgid "" @@ -62671,7 +63852,7 @@ msgstr "" #: doc/classes/TCP_Server.xml msgid "Stops listening." -msgstr "" +msgstr "ПереÑтает Ñлушать." #: doc/classes/TCP_Server.xml msgid "" @@ -65704,7 +66885,7 @@ msgstr "" #: doc/classes/TouchScreenButton.xml msgid "Always visible." -msgstr "" +msgstr "Ð’Ñегда видно." #: doc/classes/TouchScreenButton.xml msgid "Visible on touch screens only." @@ -65972,7 +67153,7 @@ msgstr "" #: doc/classes/Translation.xml msgid "Language Translation." -msgstr "" +msgstr "Языковой перевод." #: doc/classes/Translation.xml msgid "" @@ -67797,7 +68978,7 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "Inconsistent parameters." -msgstr "" +msgstr "ÐеÑоответÑтвующие параметры." #: modules/upnp/doc_classes/UPNP.xml msgid "" @@ -67859,39 +69040,39 @@ msgstr "" #: modules/upnp/doc_classes/UPNP.xml msgid "Invalid gateway." -msgstr "" +msgstr "Ðеверный шлюз." #: modules/upnp/doc_classes/UPNP.xml msgid "Invalid port." -msgstr "" +msgstr "Ðеверный порт." #: modules/upnp/doc_classes/UPNP.xml msgid "Invalid protocol." -msgstr "" +msgstr "Ðеверный протокол." #: modules/upnp/doc_classes/UPNP.xml msgid "Invalid duration." -msgstr "" +msgstr "ÐÐµÐ²ÐµÑ€Ð½Ð°Ñ Ð¿Ñ€Ð¾Ð´Ð¾Ð»Ð¶Ð¸Ñ‚ÐµÐ»ÑŒÐ½Ð¾Ñть." #: modules/upnp/doc_classes/UPNP.xml msgid "Invalid arguments." -msgstr "" +msgstr "ÐедопуÑтимые аргументы." #: modules/upnp/doc_classes/UPNP.xml msgid "Invalid response." -msgstr "" +msgstr "Ðеверный ответ." #: modules/upnp/doc_classes/UPNP.xml msgid "Invalid parameter." -msgstr "" +msgstr "ÐедопуÑтимый параметр." #: modules/upnp/doc_classes/UPNP.xml modules/upnp/doc_classes/UPNPDevice.xml msgid "HTTP error." -msgstr "" +msgstr "Ошибка HTTP." #: modules/upnp/doc_classes/UPNP.xml msgid "Socket error." -msgstr "" +msgstr "Ошибка Ñокета." #: modules/upnp/doc_classes/UPNP.xml msgid "Error allocating memory." @@ -67974,11 +69155,11 @@ msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "Service type." -msgstr "" +msgstr "Тип уÑлуг." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "OK." -msgstr "" +msgstr "OK." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "Empty HTTP response." @@ -67994,15 +69175,15 @@ msgstr "" #: modules/upnp/doc_classes/UPNPDevice.xml msgid "Disconnected." -msgstr "" +msgstr "Отключен." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "Unknown device." -msgstr "" +msgstr "ÐеизвеÑтное уÑтройÑтво." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "Invalid control." -msgstr "" +msgstr "Ðеверный контроль." #: modules/upnp/doc_classes/UPNPDevice.xml msgid "Memory allocation error." @@ -69302,10 +70483,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -69316,8 +70502,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -69472,7 +70658,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -70008,6 +71196,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" @@ -71197,11 +72401,11 @@ msgstr "" #: modules/visual_script/doc_classes/VisualScriptMathConstant.xml msgid "Unity: [code]1[/code]." -msgstr "" +msgstr "ЕдинÑтво: [code]1[/code]." #: modules/visual_script/doc_classes/VisualScriptMathConstant.xml msgid "Pi: [code]3.141593[/code]." -msgstr "" +msgstr "Пи: [code]3.141593[/code]." #: modules/visual_script/doc_classes/VisualScriptMathConstant.xml msgid "Pi divided by two: [code]1.570796[/code]." @@ -71209,7 +72413,7 @@ msgstr "" #: modules/visual_script/doc_classes/VisualScriptMathConstant.xml msgid "Tau: [code]6.283185[/code]." -msgstr "" +msgstr "Тау: [code]6.283185[/code]." #: modules/visual_script/doc_classes/VisualScriptMathConstant.xml msgid "" @@ -71223,7 +72427,7 @@ msgstr "" #: modules/visual_script/doc_classes/VisualScriptMathConstant.xml msgid "Infinity: [code]inf[/code]." -msgstr "" +msgstr "БеÑконечноÑть: [code]inf[/code]." #: modules/visual_script/doc_classes/VisualScriptMathConstant.xml msgid "Not a number: [code]nan[/code]." @@ -71525,7 +72729,7 @@ msgstr "" #: modules/visual_script/doc_classes/VisualScriptSceneNode.xml msgid "Node reference." -msgstr "" +msgstr "СÑылка на узел." #: modules/visual_script/doc_classes/VisualScriptSceneNode.xml msgid "" @@ -71686,7 +72890,7 @@ msgstr "" #: modules/visual_script/doc_classes/VisualScriptWhile.xml msgid "Conditional loop." -msgstr "" +msgstr "УÑловный цикл." #: modules/visual_script/doc_classes/VisualScriptWhile.xml msgid "" @@ -72329,7 +73533,7 @@ msgstr "" #: doc/classes/VisualServer.xml msgid "Synchronizes threads." -msgstr "" +msgstr "Синхронизирует потоки." #: doc/classes/VisualServer.xml msgid "Tries to free an object in the VisualServer." @@ -73807,6 +75011,24 @@ msgid "" "manually. For further optimization, see [method " "viewport_set_render_direct_to_screen]." msgstr "" +"Копирует видовой Ñкран в облаÑть Ñкрана, указанную [code]rect[/code]. ЕÑли " +"[член Viewport.render_direct_to_screen] равен [code]true[/code], то вьюпорт " +"не иÑпользует фреймбуфер и Ñодержимое вьюпорта выводитÑÑ Ð½ÐµÐ¿Ð¾ÑредÑтвенно на " +"Ñкран. Однако обратите внимание, что корневой видовой Ñкран риÑуетÑÑ " +"поÑледним, поÑтому он будет риÑоватьÑÑ Ð¿Ð¾Ð²ÐµÑ€Ñ… Ñкрана. СоответÑтвенно, вы " +"должны уÑтановить корневой видовой Ñкран на облаÑть, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð½Ðµ покрывает " +"облаÑть, к которой вы прикрепили Ñтот видовой Ñкран.\n" +"Ðапример, вы можете уÑтановить корневой видовой Ñкран так, чтобы он вообще " +"не отриÑовывалÑÑ, иÑÐ¿Ð¾Ð»ÑŒÐ·ÑƒÑ Ñледующий код:\n" +"[codeblock].\n" +"func _ready():\n" +" get_viewport().set_attach_to_screen_rect(Rect2())\n" +" $Viewport.set_attach_to_screen_rect(Rect2(0, 0, 600, 600))\n" +"[/codeblock].\n" +"ИÑпользование Ñтого метода может привеÑти к значительной оптимизации, " +"оÑобенно на уÑтройÑтвах низкого клаÑÑа. Однако за Ñто приходитÑÑ " +"раÑплачиватьÑÑ Ð½ÐµÐ¾Ð±Ñ…Ð¾Ð´Ð¸Ð¼Ð¾Ñтью управлÑть видовыми Ñкранами вручную. Ð”Ð»Ñ " +"дальнейшей оптимизации Ñмотрите [метод viewport_set_render_direct_to_screen]." #: doc/classes/VisualServer.xml msgid "" @@ -73914,6 +75136,19 @@ msgid "" "will be drawn, no automatic scaling is possible, even if your game scene is " "significantly larger than the window size." msgstr "" +"ЕÑли [code]true[/code], выведите Ñодержимое видового Ñкрана непоÑредÑтвенно " +"на Ñкран. Ðто позволÑет выполнить низкоуровневую оптимизацию, при которой " +"можно пропуÑтить отриÑовку видового Ñкрана в корневой видовой Ñкран. Ð¥Ð¾Ñ‚Ñ " +"Ñта Ð¾Ð¿Ñ‚Ð¸Ð¼Ð¸Ð·Ð°Ñ†Ð¸Ñ Ð¼Ð¾Ð¶ÐµÑ‚ привеÑти к значительному увеличению ÑкороÑти (оÑобенно " +"на Ñтарых уÑтройÑтвах), она обходитÑÑ Ð½ÐµÐ´ÐµÑˆÐµÐ²Ð¾. Когда Ñта Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ Ð²ÐºÐ»ÑŽÑ‡ÐµÐ½Ð°, " +"вы не можете читать из облаÑти проÑмотра или из [code]SCREEN_TEXTURE[/code]. " +"Ð’Ñ‹ также терÑете преимущеÑтва некоторых наÑтроек окна, таких как различные " +"режимы раÑÑ‚ÑжениÑ. Еще одно поÑледÑтвие, о котором Ñледует знать, Ñто то, " +"что в 2D рендеринг проиÑходит в координатах окна, поÑтому еÑли у Ð²Ð°Ñ ÐµÑть " +"облаÑть проÑмотра, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð² два раза больше окна, и вы уÑтановите Ñто, то " +"будет отриÑована только та чаÑть, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð¿Ð¾Ð¼ÐµÑ‰Ð°ÐµÑ‚ÑÑ Ð² окно, автоматичеÑкое " +"маÑштабирование невозможно, даже еÑли ваша Ð¸Ð³Ñ€Ð¾Ð²Ð°Ñ Ñцена значительно больше, " +"чем размер окна." #: doc/classes/VisualServer.xml msgid "" @@ -76384,7 +77619,7 @@ msgstr "Возвращает значение, противоположное п #: doc/classes/VisualShaderNodeVectorFunc.xml msgid "Returns [code]1/vector[/code]." -msgstr "" +msgstr "Возвращает [code]1/вектор[/code]." #: doc/classes/VisualShaderNodeVectorFunc.xml msgid "Converts RGB vector to HSV equivalent." @@ -76719,7 +77954,7 @@ msgstr "" #: doc/classes/VSlider.xml msgid "Vertical slider." -msgstr "" +msgstr "Вертикальный Ñлайдер." #: doc/classes/VSlider.xml msgid "" diff --git a/doc/translations/sk.po b/doc/translations/sk.po index e5562df057..3a58e3f2a9 100644 --- a/doc/translations/sk.po +++ b/doc/translations/sk.po @@ -476,7 +476,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -491,7 +492,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -864,12 +869,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3480,6 +3489,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4164,8 +4193,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7082,7 +7110,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7267,6 +7298,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7286,9 +7320,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9926,10 +9964,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10461,14 +10498,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10478,22 +10515,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19273,6 +19310,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22105,7 +22150,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32820,7 +32868,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36118,7 +36168,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36366,7 +36419,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37076,6 +37132,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39882,7 +39941,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40393,11 +40454,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40431,11 +40492,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40457,11 +40518,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42308,6 +42369,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49900,15 +49971,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51504,17 +51582,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51523,8 +51612,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54239,7 +54334,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56076,7 +56175,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57454,7 +57555,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57470,7 +57574,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66707,10 +66813,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66721,8 +66832,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66874,7 +66985,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67406,6 +67519,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/sr_Cyrl.po b/doc/translations/sr_Cyrl.po index e202b72696..2846de07bb 100644 --- a/doc/translations/sr_Cyrl.po +++ b/doc/translations/sr_Cyrl.po @@ -487,7 +487,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -502,7 +503,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -875,12 +880,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3491,6 +3500,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4175,8 +4204,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7093,7 +7121,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7278,6 +7309,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7297,9 +7331,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9937,10 +9975,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10472,14 +10509,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10489,22 +10526,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19284,6 +19321,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22116,7 +22161,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32831,7 +32879,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36129,7 +36179,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36377,7 +36430,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37087,6 +37143,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39893,7 +39952,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40404,11 +40465,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40442,11 +40503,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40468,11 +40529,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42319,6 +42380,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49911,15 +49982,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51515,17 +51593,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51534,8 +51623,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54250,7 +54345,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56087,7 +56186,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57465,7 +57566,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57481,7 +57585,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66718,10 +66824,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66732,8 +66843,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66885,7 +66996,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67417,6 +67530,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/sv.po b/doc/translations/sv.po index 1bd56a7518..65cad9bf8a 100644 --- a/doc/translations/sv.po +++ b/doc/translations/sv.po @@ -477,7 +477,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -492,7 +493,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -865,12 +870,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3481,6 +3490,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4165,8 +4194,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7083,7 +7111,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7268,6 +7299,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7287,9 +7321,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9927,10 +9965,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10462,14 +10499,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10479,22 +10516,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19274,6 +19311,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22106,7 +22151,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32818,7 +32866,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36116,7 +36166,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36364,7 +36417,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37074,6 +37130,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39880,7 +39939,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40391,11 +40452,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40429,11 +40490,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40455,11 +40516,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42306,6 +42367,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -49898,15 +49969,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51502,17 +51580,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51521,8 +51610,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54237,7 +54332,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56074,7 +56173,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57452,7 +57553,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57468,7 +57572,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66705,10 +66811,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66719,8 +66830,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -66872,7 +66983,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67404,6 +67517,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/th.po b/doc/translations/th.po index 6253763623..54fbdbfe27 100644 --- a/doc/translations/th.po +++ b/doc/translations/th.po @@ -554,7 +554,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -569,7 +570,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -949,12 +954,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3574,6 +3583,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4265,8 +4294,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7187,7 +7215,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7372,6 +7403,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7391,9 +7425,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10032,10 +10070,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10567,14 +10604,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10584,22 +10621,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19383,6 +19420,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22215,7 +22260,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32990,7 +33038,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36306,7 +36356,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36555,7 +36608,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37266,6 +37322,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -40125,7 +40184,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40638,11 +40699,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40676,11 +40737,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40702,11 +40763,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42556,6 +42617,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -50159,15 +50230,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51765,17 +51843,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51784,8 +51873,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54501,7 +54596,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56338,7 +56437,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57716,7 +57817,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57732,7 +57836,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66999,10 +67105,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -67013,8 +67124,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -67166,7 +67277,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67698,6 +67811,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/tl.po b/doc/translations/tl.po index 0dae96a014..a9b6a9e2a9 100644 --- a/doc/translations/tl.po +++ b/doc/translations/tl.po @@ -548,7 +548,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -563,7 +564,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -940,12 +945,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3556,6 +3565,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4240,8 +4269,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7158,7 +7186,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7343,6 +7374,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7362,9 +7396,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10006,10 +10044,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10541,14 +10578,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10558,22 +10595,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19356,6 +19393,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22191,7 +22236,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32915,7 +32963,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36231,7 +36281,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36479,7 +36532,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37189,6 +37245,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -39995,7 +40054,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40506,11 +40567,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40544,11 +40605,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40570,11 +40631,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42424,6 +42485,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -50016,15 +50087,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51620,17 +51698,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51639,8 +51728,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54355,7 +54450,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56192,7 +56291,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57570,7 +57671,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57586,7 +57690,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66859,10 +66965,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -66873,8 +66984,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -67026,7 +67137,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67558,6 +67671,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/tr.po b/doc/translations/tr.po index 4e6f4096d5..5d8f2afe29 100644 --- a/doc/translations/tr.po +++ b/doc/translations/tr.po @@ -701,8 +701,10 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -717,7 +719,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" "iÅŸlev yığınını temsil eden sözlük dizisi döndürür.\n" "[codeblock]\n" @@ -1338,19 +1344,17 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" -"Kod içindeki istiflenme konumunu yazdırır ve yanlızca hata ayıklayıcı " -"(debugger) açıkken çalışır.\n" -"Konsoldaki çıktı aÅŸağıdaki gibi bir ÅŸey olacaktır.\n" -"[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -4262,6 +4266,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4946,8 +4970,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7866,7 +7889,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -8051,6 +8077,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -8070,9 +8099,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10711,10 +10744,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -11246,14 +11278,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -11263,22 +11295,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -20083,6 +20115,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22920,7 +22960,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -33670,7 +33713,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -37004,7 +37049,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -37254,7 +37302,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37975,6 +38026,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -40785,7 +40839,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -41301,11 +41357,11 @@ msgstr "Verilen bir deÄŸerin ark-sinüsünü döndürür." #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -41339,11 +41395,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -41365,11 +41421,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -43240,6 +43296,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -50843,15 +50909,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -52455,17 +52528,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -52474,8 +52558,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -55191,7 +55281,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -57028,7 +57122,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -58408,7 +58504,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -58424,7 +58523,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -67701,10 +67802,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -67715,8 +67821,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -67872,7 +67978,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -68404,6 +68512,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/uk.po b/doc/translations/uk.po index 613cc32ed3..3714c11d88 100644 --- a/doc/translations/uk.po +++ b/doc/translations/uk.po @@ -15,12 +15,13 @@ # Гліб Соколов <ramithes@i.ua>, 2022. # Yan Chen <cyan97087@gmail.com>, 2022. # Богдан Матвіїв <bomtvv@gmail.com>, 2022. +# Лев ДворÑкий <ne3r0n@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-08-23 03:39+0000\n" -"Last-Translator: Богдан Матвіїв <bomtvv@gmail.com>\n" +"PO-Revision-Date: 2022-11-25 12:13+0000\n" +"Last-Translator: Лев ДворÑкий <ne3r0n@gmail.com>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot-class-reference/uk/>\n" "Language: uk\n" @@ -29,7 +30,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -85,7 +86,6 @@ msgid "Inherited By:" msgstr "УÑпадковано:" #: doc/tools/make_rst.py -#, fuzzy msgid "(overrides %s)" msgstr "(перевизначає %s)" @@ -94,17 +94,14 @@ msgid "Default" msgstr "Типовий" #: doc/tools/make_rst.py -#, fuzzy msgid "Setter" msgstr "Ð’Ñтановлювач" #: doc/tools/make_rst.py -#, fuzzy msgid "value" msgstr "значеннÑ" #: doc/tools/make_rst.py -#, fuzzy msgid "Getter" msgstr "Отримувач" @@ -609,7 +606,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -624,7 +622,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1001,12 +1003,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3624,6 +3630,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4308,8 +4334,7 @@ msgstr "ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ 2D Ñпрайтів" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7234,7 +7259,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7419,6 +7447,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7438,9 +7469,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10079,10 +10114,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10614,14 +10648,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10631,22 +10665,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19445,6 +19479,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22279,7 +22321,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -33015,7 +33060,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36345,7 +36392,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36595,7 +36645,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37312,6 +37365,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -40122,7 +40178,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40638,11 +40696,11 @@ msgstr "Повертає кут до заданого вектора у раді #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40676,11 +40734,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40702,11 +40760,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42571,6 +42629,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -50172,15 +50240,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51777,17 +51852,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51796,8 +51882,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54513,7 +54605,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56351,7 +56447,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57729,7 +57827,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57745,7 +57846,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -67031,10 +67134,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -67045,8 +67153,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -67198,7 +67306,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67730,6 +67840,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/vi.po b/doc/translations/vi.po index 3e74e52436..962440bfab 100644 --- a/doc/translations/vi.po +++ b/doc/translations/vi.po @@ -689,8 +689,10 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -705,7 +707,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" "Trả vá» má»™t mảng từ Ä‘iển đại diện cho chồng đệ quy hiện tại.\n" "[codeblock]\n" @@ -1219,12 +1225,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3908,6 +3918,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4601,8 +4631,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7539,7 +7568,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7724,6 +7756,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7743,9 +7778,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10384,10 +10423,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10919,14 +10957,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10936,22 +10974,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19754,6 +19792,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22589,7 +22635,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -33325,7 +33374,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36655,7 +36706,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36906,7 +36960,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37626,6 +37683,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -40436,7 +40496,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40952,11 +41014,11 @@ msgstr "Trả vá» sin nghịch đảo cá»§a tham số." #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40990,11 +41052,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -41016,11 +41078,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42888,6 +42950,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -50497,15 +50569,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -52107,17 +52186,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -52126,8 +52216,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54843,7 +54939,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56682,7 +56782,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -58062,7 +58164,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -58078,7 +58183,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -67357,10 +67464,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -67371,8 +67483,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -67527,7 +67639,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -68063,6 +68177,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/doc/translations/zh_CN.po b/doc/translations/zh_CN.po index cf0267429a..966ec9b0f9 100644 --- a/doc/translations/zh_CN.po +++ b/doc/translations/zh_CN.po @@ -59,11 +59,12 @@ # ErrorDreemurr <diandaokui@qq.com>, 2021. # 烧风 <hk-shao@foxmail.com>, 2022. # Yan Chen <cyan97087@gmail.com>, 2022. +# Caten <catenhu@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-09-26 05:24+0000\n" +"PO-Revision-Date: 2022-12-12 06:48+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/zh_Hans/>\n" @@ -72,7 +73,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=(n != 1);\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -685,7 +686,8 @@ msgid "" " 1.5 0.0 0.0\n" "[/codeblock]" msgstr "" -"返回 [code]a/b[/code] 的浮点模数,对æ£è´Ÿæ•°è¿›è¡Œä¸€è‡´çš„循环。\n" +",对æ£è´Ÿæ•°è¿›è¡Œä¸€è‡´çš„循环返回 [code]a/b[/code] 的浮点模数,对æ£è´Ÿæ•°è¿›è¡Œä¸€è‡´çš„" +"循环。\n" "[codeblock]\n" "for i in 7:\n" " var x = 0.5 * i - 1.5\n" @@ -696,10 +698,10 @@ msgstr "" "-1.5 -0.0 0.0\n" "-1.0 -1.0 0.5\n" "-0.5 -0.5 1.0\n" -" 0.0 0.0 0.0\n" -" 0.5 0.5 0.5\n" -" 1.0 1.0 1.0\n" -" 1.5 0.0 0.0\n" +" 0.0 0.0 0.0\n" +" 0.5 0.5 0.5\n" +" 1.0 1.0 1.0\n" +" 1.5 0.0 0.0\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -717,8 +719,8 @@ msgid "" "[/codeblock]" msgstr "" "返回对 [code]instance[/code] èŠ‚ç‚¹ä¸æŒ‡å®šå‡½æ•° [code]funcname[/code] 的引用。由" -"于函数在GDScriptä¸ä¸æ˜¯ä¸€çº§å¯¹è±¡ï¼Œå› æ¤è¯·ä½¿ç”¨ [code]funcref[/code] å°† [FuncRef] " -"å˜å‚¨åœ¨å˜é‡ä¸ï¼Œç„¶åŽå†è°ƒç”¨å®ƒã€‚\n" +"于函数在 GDScript ä¸ä¸æ˜¯ä¸€çº§å¯¹è±¡ï¼Œå› æ¤è¯·ä½¿ç”¨ [code]funcref[/code] å°† " +"[FuncRef] å˜å‚¨åœ¨å˜é‡ä¸ï¼Œç„¶åŽå†è¿›è¡Œè°ƒç”¨ã€‚\n" "[codeblock]\n" "func foo():\n" " return(\"bar\")\n" @@ -728,8 +730,10 @@ msgstr "" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml +#, fuzzy msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -744,7 +748,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" "返回一个表示当å‰è°ƒç”¨å †æ ˆçš„å—典数组。\n" "[codeblock]\n" @@ -1262,10 +1270,10 @@ msgstr "" "-3 0 0\n" "-2 -2 1\n" "-1 -1 2\n" -" 0 0 0\n" -" 1 1 1\n" -" 2 2 2\n" -" 3 0 0\n" +" 0 0 0\n" +" 1 1 1\n" +" 2 2 2\n" +" 3 0 0\n" "[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml @@ -1348,18 +1356,17 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" -"在代ç ä½ç½®æ‰“å°å †æ ˆè½¨è¿¹ï¼Œä»…在打开调试器的情况下è¿è¡Œã€‚\n" -"控制å°ä¸çš„输出如下所示:\n" -"[codeblock]\n" -"Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" @@ -4382,6 +4389,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "æç¤ºä¸€ä¸ªå›¾ç‰‡ä½¿ç”¨äº†æ— æŸåŽ‹ç¼©è¿›è¡ŒåŽ‹ç¼©ã€‚" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "将属性åºåˆ—化并ä¿å˜åˆ°åœºæ™¯æ–‡ä»¶ä¸ï¼ˆé»˜è®¤ï¼‰ã€‚" @@ -4979,8 +5006,8 @@ msgstr "" "confirmed] ä¿¡å·æ—¶æ‰§è¡Œç±»ä¼¼è¾“入验è¯çš„æ“ä½œï¼Œåˆ™å¯ä»¥å°†å…¶è®¾ç½®ä¸º [code]false[/" "code],然åŽåœ¨è‡ªå·±çš„逻辑ä¸å¤„ç†å¯¹è¯æ¡†çš„éšè—。\n" "[b]注æ„:[/b]从æ¤ç±»æ´¾ç”Ÿçš„æŸäº›èŠ‚ç‚¹å¯ä»¥å…·æœ‰ä¸åŒçš„默认值,并且å¯èƒ½æœ‰è‡ªå·±çš„内置逻" -"辑会覆盖æ¤è®¾ç½®ã€‚例如,[FileDialog] 默认其为 [code]false[/code],并在按下确定" -"时实现了自己的输入验è¯ä»£ç ,如果输入有效,最终将éšè—å¯¹è¯æ¡†ã€‚å› æ¤ï¼Œä¸èƒ½åœ¨ " +"辑会覆盖æ¤è®¾ç½®ã€‚例如 [FileDialog] 默认其为 [code]false[/code],并在按下确定时" +"实现了自己的输入验è¯ä»£ç ,如果输入有效,最终将éšè—å¯¹è¯æ¡†ã€‚å› æ¤ï¼Œä¸èƒ½åœ¨ " "[FileDialog] ä¸ä½¿ç”¨æ¤å±žæ€§æ¥ç¦æ¢åœ¨æŒ‰ç¡®å®šæ—¶éšè—å¯¹è¯æ¡†ã€‚" #: doc/classes/AcceptDialog.xml @@ -5169,8 +5196,7 @@ msgstr "2D ç²¾çµåŠ¨ç”»" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "2D Dodge The Creeps 演示" @@ -5577,16 +5603,16 @@ msgid "" "Returns the in handle of the key identified by [code]key_idx[/code]. The " "[code]track_idx[/code] must be the index of a Bezier Track." msgstr "" -"返回由 [code]key_idx[/code] è¯†åˆ«çš„é”®çš„è¾“å…¥å¥æŸ„,[code]track_idx[/code] 必须是" -"è´å¡žå°”轨é“的索引。" +"返回由 [code]key_idx[/code] 识别的键的入点手柄,[code]track_idx[/code] 必须是" +"è´èµ›å°”曲线轨é“的索引。" #: doc/classes/Animation.xml msgid "" "Returns the out handle of the key identified by [code]key_idx[/code]. The " "[code]track_idx[/code] must be the index of a Bezier Track." msgstr "" -"返回由 [code]key_idx[/code] è¯†åˆ«çš„é”®çš„è¾“å‡ºå¥æŸ„,[code]track_idx[/code] 必须是" -"è´å¡žå°”轨é“的索引。" +"返回由 [code]key_idx[/code] 识别的键的出点手柄,[code]track_idx[/code] 必须是" +"è´èµ›å°”曲线轨é“的索引。" #: doc/classes/Animation.xml msgid "" @@ -7910,6 +7936,12 @@ msgid "" "[b]Warning:[/b] See [ConcavePolygonShape] (also called \"trimesh\") for a " "warning about possibly unexpected behavior when using that shape for an area." msgstr "" +"3D 区域å¯ä»¥æ£€æµ‹åˆ° [CollisionObject] 节点间的é‡å ã€è¿›å…¥åŠé€€å‡ºã€‚也å¯ä»¥ä¿®æ”¹æˆ–覆" +"盖局部的物ç†å‚数(é‡åŠ›ã€é˜»å°¼ï¼‰ã€å°†éŸ³é¢‘导æµè‡³è‡ªå®šä¹‰çš„音频总线。\n" +"è¦ä¸ºåŒºåŸŸè®¾ç½®å½¢çŠ¶ï¼Œè¯·å°†ä¸€ä¸ª [CollisionShape] 或 [CollisionPolygon] èŠ‚ç‚¹æ·»åŠ ä¸º" +"该区域的[i]直接[/i]åèŠ‚ç‚¹ï¼ˆæˆ–è€…æ·»åŠ å¤šä¸ªè¿™ç§èŠ‚ç‚¹ä½œä¸ºç›´æŽ¥å节点)。\n" +"[b]è¦å‘Šï¼š[/b]使用凹多边形(也å«â€œä¸‰è§’å½¢ç½‘æ ¼â€ï¼‰ä½œä¸ºåŒºåŸŸçš„形状时,å¯èƒ½äº§ç”Ÿå‡ºä¹Žé¢„" +"æ–™çš„è¡Œä¸ºï¼Œè§ [ConcavePolygonShape]。" #: doc/classes/Area.xml doc/classes/QuadMesh.xml doc/classes/Viewport.xml #: doc/classes/ViewportTexture.xml @@ -7999,8 +8031,8 @@ msgid "" "multiplies the gravity vector. This is useful to alter the force of gravity " "without altering its direction." msgstr "" -"该区域内的é‡åŠ›å¼ºåº¦ï¼ˆå•ä½ï¼šm/s^2)。这个值是é‡åŠ›å‘é‡çš„倿•°ã€‚这个é‡åœ¨æ”¹å˜å¼•力大" -"å°è€Œä¸æ”¹å˜å…¶æ–¹å‘很有用。" +"该区域内的é‡åŠ›å¼ºåº¦ï¼ˆå•ä½ä¸ºç±³æ¯ç§’的平方)。这个值是é‡åŠ›å‘é‡çš„倿•°ã€‚这个é‡åœ¨æ”¹" +"å˜å¼•力大å°è€Œä¸æ”¹å˜å…¶æ–¹å‘很有用。" #: doc/classes/Area.xml doc/classes/Area2D.xml msgid "" @@ -8233,6 +8265,12 @@ msgid "" "[b]Warning:[/b] See [ConcavePolygonShape2D] for a warning about possibly " "unexpected behavior when using that shape for an area." msgstr "" +"2D 区域å¯ä»¥æ£€æµ‹åˆ° [CollisionObject2D] 节点间的é‡å ã€è¿›å…¥åŠé€€å‡ºã€‚也å¯ä»¥ä¿®æ”¹æˆ–" +"覆盖局部的物ç†å‚数(é‡åŠ›ã€é˜»å°¼ï¼‰ã€å°†éŸ³é¢‘导æµè‡³è‡ªå®šä¹‰çš„音频总线。\n" +"è¦ä¸ºåŒºåŸŸè®¾ç½®å½¢çŠ¶ï¼Œè¯·å°†ä¸€ä¸ª [CollisionShape2D] 或 [CollisionPolygon2D] 节点添" +"åŠ ä¸ºè¯¥åŒºåŸŸçš„[i]直接[/i]åèŠ‚ç‚¹ï¼ˆæˆ–è€…æ·»åŠ å¤šä¸ªè¿™ç§èŠ‚ç‚¹ä½œä¸ºç›´æŽ¥å节点)。\n" +"[b]è¦å‘Šï¼š[/b]使用凹多边形(也å«â€œä¸‰è§’å½¢ç½‘æ ¼â€ï¼‰ä½œä¸ºåŒºåŸŸçš„形状时,å¯èƒ½äº§ç”Ÿå‡ºä¹Žé¢„" +"æ–™çš„è¡Œä¸ºï¼Œè§ [ConcavePolygonShape2D]。" #: doc/classes/Area2D.xml msgid "Using Area2D" @@ -8323,7 +8361,7 @@ msgid "" "multiplies the gravity vector. This is useful to alter the force of gravity " "without altering its direction." msgstr "" -"该区域的é‡åŠ›å¼ºåº¦ï¼ˆä»¥åƒç´ /秒的平方为å•ä½ï¼‰ã€‚这个值是é‡åŠ›å‘é‡çš„倿•°ã€‚这对改å˜å¼•" +"该区域的é‡åŠ›å¼ºåº¦ï¼ˆå•ä½ä¸ºåƒç´ æ¯ç§’的平方)。这个值是é‡åŠ›å‘é‡çš„倿•°ã€‚这对改å˜å¼•" "力大å°è€Œä¸æ”¹å˜å…¶æ–¹å‘很有用。" #: doc/classes/Area2D.xml @@ -8770,6 +8808,7 @@ msgstr "" "è¾ƒæ…¢ã€‚è¿™æ˜¯å› ä¸ºæ‰€æœ‰æ”¾ç½®åœ¨åˆ é™¤å…ƒç´ ä¹‹åŽçš„å…ƒç´ éƒ½å¿…é¡»é‡æ–°ç´¢å¼•。" #: doc/classes/Array.xml +#, fuzzy msgid "" "Assigns the given value to all elements in the array. This can typically be " "used together with [method resize] to create an array with a given size and " @@ -8778,7 +8817,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" "将该数组ä¸çš„æ‰€æœ‰å…ƒç´ 都设置为给定的值。通常与 [method resize] 一起使用,用于创" "å»ºç»™å®šå¤§å°æ•°ç»„å¹¶å¯¹å…¶å…ƒç´ è¿›è¡Œåˆå§‹åŒ–:\n" @@ -9034,8 +9076,12 @@ msgstr "" "索引之间的å˜åŒ–。" #: doc/classes/Array.xml +#, fuzzy msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -9055,6 +9101,7 @@ msgstr "" "[/codeblock]" #: doc/classes/Array.xml +#, fuzzy msgid "" "Sorts the array using a custom method. The arguments are an object that " "holds the method and the name of such method. The custom method receives two " @@ -9063,9 +9110,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -9161,7 +9212,6 @@ msgstr "" "åŠ æ›²é¢ä¹‹å‰è°ƒç”¨ã€‚" #: doc/classes/ArrayMesh.xml -#, fuzzy msgid "" "Creates a new surface.\n" "Surfaces are created to be rendered using a [code]primitive[/code], which " @@ -9195,7 +9245,14 @@ msgstr "" "ArrayType]。例如,[code]arrays[0][/code] 是顶点的数组。总是需è¦ç¬¬ä¸€ä¸ªé¡¶ç‚¹åæ•°" "组,其他的å¯é€‰ã€‚æ·»åŠ ä¸€ä¸ªç´¢å¼•æ•°ç»„ä½¿è¿™ä¸ªå‡½æ•°è¿›å…¥â€œç´¢å¼•æ¨¡å¼â€ï¼Œé¡¶ç‚¹å’Œå…¶ä»–数组作为" "æ•°æ®æ¥æºï¼Œç´¢å¼•数组定义其顶点顺åºã€‚æ‰€æœ‰çš„åæ•°ç»„必须与顶点数组具有相åŒçš„长度," -"或者为空,如果使用了 [constant ARRAY_INDEX] 时除外。" +"或者为空,如果使用了 [constant ARRAY_INDEX] 时除外。\n" +"[code]compress_flags[/code] 是由 [enum Mesh.ArrayFormat] 枚举值组æˆçš„ä½åŸŸï¼Œé»˜" +"认为 [constant Mesh.ARRAY_COMPRESS_DEFAULT]。\n" +"[b]注æ„:[/b][code]compress_flags[/code] 默认会å¯ç”¨ [constant Mesh." +"ARRAY_COMPRESS_COLOR],所以顶点颜色会作为 8 使— ç¬¦å·æ•´æ•°å˜å‚¨ã€‚这会导致过亮颜" +"色被钳制到 [code]Color(1, 1, 1, 1)[/code],é™ä½Žé¢œè‰²çš„精度。è¦å˜å‚¨ HDR 顶点颜" +"色,请将 [code]Mesh.ARRAY_COMPRESS_DEFAULT ^ Mesh.ARRAY_COMPRESS_COLOR[/" +"code] ä¼ å…¥ [code]compress_flags[/code]ï¼Œç§»é™¤é¡¶ç‚¹é¢œè‰²åŽ‹ç¼©æ ‡å¿—ã€‚" #: doc/classes/ArrayMesh.xml msgid "Removes all blend shapes from this [ArrayMesh]." @@ -9731,10 +9788,10 @@ msgid "" msgstr "" "调用这个æ¥åˆå§‹åŒ–这个接å£ã€‚第一个被åˆå§‹åŒ–的接å£ç¡®å®šä¸ºä¸»æŽ¥å£ï¼Œç”¨äºŽæ¸²æŸ“输出。\n" "在åˆå§‹åŒ–了接å£ä¹‹åŽï¼Œéœ€è¦å¯ç”¨è§†çª—çš„ AR/VR 模å¼ï¼Œå°†å¼€å§‹æ¸²æŸ“。\n" -"[b]注æ„:[/b]对于任何使用 Godot 主输出的设备,如移动 VRï¼Œä½ å¿…é¡»åœ¨ä¸»è§†çª—ä¸Šå¯" +"[b]注æ„:[/b]对于任何使用 Godot 主输出的设备,如移动 VRï¼Œä½ å¿…é¡»åœ¨ä¸»è§†å£ä¸Šå¯" "用 AR/VR 模å¼ã€‚\n" "å¦‚æžœä½ ä¸ºä¸€ä¸ªå¤„ç†è‡ªå·±è¾“出的平å°è¿™æ ·åšï¼ˆå¦‚ OpenVR),Godot 就会在å±å¹•ä¸Šåªæ˜¾ç¤ºä¸€" -"åªçœ¼ç›è€Œä¸å¤±çœŸã€‚å¦å¤–ï¼Œä½ å¯ä»¥åœ¨åœºæ™¯ä¸æ·»åŠ ä¸€ä¸ªå•独的视窗节点,在该视窗上å¯ç”¨ " +"åªçœ¼ç›è€Œä¸å¤±çœŸã€‚å¦å¤–ï¼Œä½ å¯ä»¥åœ¨åœºæ™¯ä¸æ·»åŠ ä¸€ä¸ªå•独的视å£èŠ‚ç‚¹ï¼Œåœ¨è¯¥è§†å£ä¸Šå¯ç”¨ " "AR/VR。它将被用æ¥è¾“出到 HMDï¼Œè®©ä½ åœ¨ä¸»çª—å£ä¸åšä½ 喜欢的事情,比如用一个å•独的相" "机作为æ—观者相机,或者渲染一些完全ä¸åŒçš„东西。\n" "è™½ç„¶ç›®å‰æ²¡æœ‰ä½¿ç”¨ï¼Œä½†ä½ å¯ä»¥æ¿€æ´»å…¶ä»–接å£ã€‚å¦‚æžœä½ æƒ³è·Ÿè¸ªå…¶ä»–å¹³å°çš„æŽ§åˆ¶å™¨ï¼Œå¯èƒ½å¸Œ" @@ -12345,15 +12402,14 @@ msgid "Clears the audio sample data buffer." msgstr "æ¸…é™¤éŸ³é¢‘æ ·æœ¬æ•°æ®ç¼“冲区。" #: doc/classes/AudioStreamGeneratorPlayback.xml +#, fuzzy msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" -"è¿”å›žè¦æ’放的音频数æ®å¸§æ•°ã€‚如果返回的数å—达到 [code]0[/code]ï¼ŒéŸ³é¢‘å°†åœæ¢æ’放," -"ç›´åˆ°å†æ¬¡æ·»åŠ å¸§ã€‚å› æ¤ï¼Œè¯·ç¡®ä¿ä½ 的脚本始终能够以足够快的速度生æˆå’ŒæŽ¨é€æ–°çš„音频" -"帧,以é¿å…éŸ³é¢‘ç ´è£‚ã€‚" +"如果å¯ä»¥å°†å¤§å°ä¸º [code]amount[/code] 的缓冲区推é€åˆ°éŸ³é¢‘é‡‡æ ·æ•°æ®ç¼“冲区而ä¸ä½¿å…¶" +"溢出,则返回 [code]true[/code],å¦åˆ™è¿”回 [code]false[/code]。" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" @@ -12877,8 +12933,8 @@ msgid "" "PCM8 to signed PCM8, subtract 128 from each byte." msgstr "" "包å«ä»¥å—节为å•ä½çš„音频数æ®ã€‚\n" -"[b]注æ„:[/b]æ¤å±žæ€§éœ€è¦æœ‰ç¬¦å·çš„ PCM8æ•°æ®ã€‚è¦å°†æ— 符å·çš„ PCM8转æ¢ä¸ºæœ‰ç¬¦å·çš„ " -"PCM8,需è¦ä»Žæ¯ä¸ªå—节ä¸å‡åŽ»128。" +"[b]注æ„:[/b]æ¤å±žæ€§éœ€è¦æœ‰ç¬¦å·çš„ PCM8 æ•°æ®ã€‚è¦å°†æ— 符å·çš„ PCM8 转æ¢ä¸ºæœ‰ç¬¦å·çš„ " +"PCM8,需è¦ä»Žæ¯ä¸ªå—节ä¸å‡åŽ» 128。" #: doc/classes/AudioStreamSample.xml msgid "Audio format. See [enum Format] constants for values." @@ -12986,16 +13042,17 @@ msgstr "" "[code]texture(SCREEN_TEXTURE, ...)[/code] 函数在ç€è‰²å™¨è„šæœ¬ä¸å¯¹å…¶è¿›è¡Œè®¿é—®ã€‚" #: doc/classes/BackBufferCopy.xml +#, fuzzy msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" "用于对当å‰å±å¹•显示进行åŽå°ç¼“冲的节点。BackBufferCopy 节点ä¸å®šä¹‰çš„区域与其覆盖" @@ -13011,26 +13068,30 @@ msgid "Buffer mode. See [enum CopyMode] constants." msgstr "缓冲区模å¼ã€‚è§ [enum CopyMode] 常é‡ã€‚" #: doc/classes/BackBufferCopy.xml +#, fuzzy msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" "BackBufferCopy è¦†ç›–çš„åŒºåŸŸã€‚åªæœ‰å½“ [member copy_mode] 是 [constant " "COPY_MODE_RECT] æ—¶æ‰ä½¿ç”¨ã€‚" #: doc/classes/BackBufferCopy.xml +#, fuzzy msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" "ç¦ç”¨ç¼“冲模å¼ã€‚è¿™æ„å‘³ç€ BackBufferCopy 节点将直接使用它所覆盖的å±å¹•部分。" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +#, fuzzy +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "BackBufferCopy 缓冲一个矩形区域。" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +#, fuzzy +msgid "[BackBufferCopy] buffers the entire screen." msgstr "BackBufferCopy 缓冲整个å±å¹•。" #: doc/classes/BakedLightmap.xml @@ -13419,7 +13480,7 @@ msgid "" "group]." msgstr "" "æ”¹å˜æŒ‰é’®çš„ [member pressed] 状æ€ï¼Œä¸è§¦å‘ [signal toggled]ã€‚å½“ä½ åªæƒ³æ”¹å˜æŒ‰é’®çš„" -"状æ€è€Œä¸å‘逿Œ‰ä¸‹äº‹ä»¶æ—¶ä½¿ç”¨ï¼ˆä¾‹å¦‚,在åˆå§‹åŒ–åœºæ™¯æ—¶ï¼‰ã€‚åªæœ‰å½“ [member " +"状æ€è€Œä¸å‘逿Œ‰ä¸‹äº‹ä»¶æ—¶ä½¿ç”¨ï¼ˆä¾‹å¦‚在åˆå§‹åŒ–åœºæ™¯æ—¶ï¼‰ã€‚åªæœ‰å½“ [member " "toggle_mode] 是 [code]true[/code] æ—¶æ‰æœ‰æ•ˆã€‚\n" "[b]注æ„:[/b]这个方法ä¸ä¼šé‡Šæ”¾å…¶æŒ‰é’® [member group] ä¸çš„其他按钮。" @@ -14028,7 +14089,7 @@ msgstr "" #: doc/classes/Bone2D.xml msgid "" "Length of the bone's representation drawn in the editor's viewport in pixels." -msgstr "在编辑器的视窗ä¸ç»˜åˆ¶çš„骨骼的长度,å•ä½ä¸ºåƒç´ 。" +msgstr "在编辑器的视å£ä¸ç»˜åˆ¶çš„骨骼的长度,å•ä½ä¸ºåƒç´ 。" #: doc/classes/Bone2D.xml msgid "" @@ -14735,10 +14796,10 @@ msgstr "" "相机的视野角度,以度为å•ä½ã€‚仅适用于é€è§†æ¨¡å¼ã€‚由于 [member keep_aspect] é”定" "ä¸€ä¸ªè½´ï¼Œå› æ¤ [code]fov[/code] 设置å¦ä¸€ä¸ªè½´çš„视角。\n" "作为å‚考,默认的垂直视野值([code]70.0[/code])相当于以下水平 FOV:\n" -"- 在 4:3 视窗ä¸çº¦86.07 度\n" -"- 在 16:10 视窗ä¸çº¦ 96.50 度\n" -"- 在 16:9 视窗ä¸çº¦102.45 度\n" -"- 在 21:9 视窗ä¸çº¦117.06 度" +"- 在 4:3 视å£ä¸çº¦86.07 度\n" +"- 在 16:10 视å£ä¸çº¦ 96.50 度\n" +"- 在 16:9 视å£ä¸çº¦102.45 度\n" +"- 在 21:9 视å£ä¸çº¦117.06 度" #: doc/classes/Camera.xml msgid "" @@ -15169,9 +15230,9 @@ msgid "" "example, use [code]Vector2(0.5, 0.5)[/code] for a 2× zoom-in, and " "[code]Vector2(4, 4)[/code] for a 4× zoom-out." msgstr "" -"相机相对于视窗的缩放比例。大于 [code]Vector2(1, 1)[/code] 的值会缩å°å†…容,而" -"较å°çš„值会起到放大镜的作用。例如,将 [code]Vector2(0.5, 0.5)[/code] 放大 2 " -"å€ï¼Œç„¶åŽå°† [code]Vector2(4, 4)[/code] 用于 4 å€ç¼©å°ã€‚" +"相机相对于视å£çš„缩放比例。大于 [code]Vector2(1, 1)[/code] 的值会缩å°å†…容,而" +"较å°çš„值会起到放大的作用。例如,将 [code]Vector2(0.5, 0.5)[/code] 放大 2 å€ï¼Œ" +"ç„¶åŽå°† [code]Vector2(4, 4)[/code] 用于 4 å€ç¼©å°ã€‚" #: doc/classes/Camera2D.xml msgid "" @@ -15308,11 +15369,11 @@ msgstr "ç§»é™¤æŒ‡å®šçš„ç›¸æœºæº [code]feed[/code]。" #: doc/classes/CameraServer.xml msgid "Emitted when a [CameraFeed] is added (e.g. a webcam is plugged in)." -msgstr "å½“æ·»åŠ [CameraFeed] 时触å‘(例如,æ’入网络摄åƒå¤´ï¼‰ã€‚" +msgstr "å½“æ·»åŠ [CameraFeed] 时触å‘(例如æ’入网络摄åƒå¤´æ—¶ï¼‰ã€‚" #: doc/classes/CameraServer.xml msgid "Emitted when a [CameraFeed] is removed (e.g. a webcam is unplugged)." -msgstr "当移除 [CameraFeed] 时触å‘(例如,拔掉网络摄åƒå¤´ï¼‰ã€‚" +msgstr "当移除 [CameraFeed] 时触å‘(例如拔掉网络摄åƒå¤´æ—¶ï¼‰ã€‚" #: doc/classes/CameraServer.xml msgid "The RGBA camera image." @@ -16592,7 +16653,7 @@ msgstr "" "外观ä¸åŒã€‚为了éµå¾ªç”¨æˆ·ä½“验,建议在切æ¢å®ƒå¯¹æŸäº›ä¸œè¥¿æœ‰[b]直接[/b]影哿—¶ä½¿ç”¨" "CheckButton。例如,如果切æ¢å®ƒå¯ä»¥å¯ç”¨æˆ–ç¦ç”¨è®¾ç½®è€Œä¸éœ€è¦ç”¨æˆ·æŒ‰ä¸‹ç¡®è®¤æŒ‰é’®æ—¶ï¼Œä½¿" "用它。\n" -"å‚阅[BaseButton],它包å«äº†ä¸Žè¯¥èŠ‚ç‚¹ç›¸å…³çš„å¸¸è§„å±žæ€§å’Œæ–¹æ³•ã€‚" +"å¦è¯·å‚阅 [BaseButton],它包å«äº†ä¸Žè¯¥èŠ‚ç‚¹ç›¸å…³çš„å¸¸è§„å±žæ€§å’Œæ–¹æ³•ã€‚" #: doc/classes/CheckButton.xml msgid "The [CheckButton] text's font color." @@ -17030,7 +17091,6 @@ msgid "Removes the given shape owner." msgstr "移除给定形状的所有者。" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml -#, fuzzy msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" "code] in the [member collision_layer].\n" @@ -17039,11 +17099,10 @@ msgid "" msgstr "" "如果 [code]value[/code] 为 [code]true[/code],则设置 [member " "collision_layer] 䏿Œ‡å®šçš„ [code]bit[/code] ä½ã€‚\n" -"如果 [code]value[/code] 为 [code]false[/code],清除 [member collision_layer] " -"䏿Œ‡å®šçš„ [code]bit[/code] ä½ã€‚" +"如果 [code]value[/code] 为 [code]false[/code],则清除 [member " +"collision_layer] 䏿Œ‡å®šçš„ [code]bit[/code] ä½ã€‚" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml -#, fuzzy msgid "" "If [code]value[/code] is [code]true[/code], sets the specified [code]bit[/" "code] in the [member collision_mask].\n" @@ -17052,8 +17111,8 @@ msgid "" msgstr "" "如果 [code]value[/code] 为 [code]true[/code],则设置 [member collision_mask] " "䏿Œ‡å®šçš„ [code]bit[/code] ä½ã€‚\n" -"如果 [code]value[/code] 为 [code]false[/code],清除 [member collision_mask] " -"䏿Œ‡å®šçš„ [code]bit[/code] ä½ã€‚" +"如果 [code]value[/code] 为 [code]false[/code],则清除 [member " +"collision_mask] 䏿Œ‡å®šçš„ [code]bit[/code] ä½ã€‚" #: doc/classes/CollisionObject.xml doc/classes/CollisionObject2D.xml msgid "Returns the [code]owner_id[/code] of the given shape." @@ -17427,7 +17486,6 @@ msgid "Node that represents collision shape data in 3D space." msgstr "表示 3D 空间ä¸çš„碰撞形状数æ®çš„节点。" #: doc/classes/CollisionShape.xml -#, fuzzy msgid "" "Editor facility for creating and editing collision shapes in 3D space. Set " "the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " @@ -17437,10 +17495,11 @@ msgid "" "example, add this to an [Area] to give it a detection shape, or add it to a " "[PhysicsBody] to create a solid object." msgstr "" -"用于在 3D 空间ä¸åˆ›å»ºå’Œç¼–辑碰撞形状的编辑工具。您å¯ä»¥ä½¿ç”¨æ¤èŠ‚ç‚¹è¡¨ç¤ºå„ç§ç¢°æ’žå½¢" -"çŠ¶ï¼Œä¾‹å¦‚ï¼Œå°†å…¶æ·»åŠ åˆ° [Area] ä»¥ä½¿å…¶å…·æœ‰æ£€æµ‹å½¢çŠ¶ï¼Œæˆ–å°†å…¶æ·»åŠ åˆ°ç‰©ç†ä½“ " -"[PhysicsBody] 以创建实体对象。[b]é‡è¦[/b]:这是一个编辑器专用的创建形状的助" -"手,使用 [method CollisionObject.shape_owner_get_shape] 获å–实际形状。" +"用于在 3D 空间ä¸åˆ›å»ºå’Œç¼–辑碰撞形状的编辑工具。请使用 [member shape] 属性é…ç½®" +"形状。[b]é‡è¦[/b]:这是专为编辑器æä¾›çš„形状创建工具,è¦èŽ·å–实际形状,请使用 " +"[method CollisionObject.shape_owner_get_shape]。\n" +"ä½ å¯ä»¥ä½¿ç”¨è¿™ä¸ªèŠ‚ç‚¹è¡¨ç¤ºå„ç§ç¢°æ’žå½¢çŠ¶ï¼Œä¾‹å¦‚ï¼Œå°†å…¶æ·»åŠ åˆ° [Area] 以使其具有检测形" +"çŠ¶ï¼Œæˆ–å°†å…¶æ·»åŠ åˆ°ç‰©ç†ä½“ [PhysicsBody] 以创建实体对象。" #: doc/classes/CollisionShape.xml doc/classes/CollisionShape2D.xml #: doc/classes/Physics2DDirectBodyState.xml @@ -17475,7 +17534,6 @@ msgid "Node that represents collision shape data in 2D space." msgstr "表示2D空间ä¸çš„碰撞形状数æ®çš„节点。" #: doc/classes/CollisionShape2D.xml -#, fuzzy msgid "" "Editor facility for creating and editing collision shapes in 2D space. Set " "the [member shape] property to configure the shape. [b]IMPORTANT[/b]: this " @@ -17485,10 +17543,11 @@ msgid "" "example, add this to an [Area2D] to give it a detection shape, or add it to " "a [PhysicsBody2D] to create a solid object." msgstr "" -"编辑器功能,用于在2D空间ä¸åˆ›å»ºå’Œç¼–辑碰撞形状。您å¯ä»¥ä½¿ç”¨æ¤èŠ‚ç‚¹è¡¨ç¤ºå„ç§ç¢°æ’žå½¢" -"çŠ¶ï¼Œä¾‹å¦‚ï¼Œå°†å…¶æ·»åŠ åˆ° [Area2D] 以æä¾›æ£€æµ‹å½¢çŠ¶ï¼Œæˆ–å°†å…¶æ·»åŠ åˆ° [PhysicsBody2D] 以" -"创建实体。[b]é‡è¦äº‹é¡¹[/b]:这是创建形状的仅编辑器助手,请使用 [method " -"CollisionObject2D.shape_owner_get_shape] 获å–实际形状。" +"用于在 2D 空间ä¸åˆ›å»ºå’Œç¼–辑碰撞形状的编辑工具。请使用 [member shape] 属性é…ç½®" +"形状。[b]é‡è¦[/b]:这是专为编辑器æä¾›çš„形状创建工具,è¦èŽ·å–实际形状,请使用 " +"[method CollisionObject2D.shape_owner_get_shape]。\n" +"ä½ å¯ä»¥ä½¿ç”¨è¿™ä¸ªèŠ‚ç‚¹è¡¨ç¤ºå„ç§ç¢°æ’žå½¢çŠ¶ï¼Œä¾‹å¦‚ï¼Œå°†å…¶æ·»åŠ åˆ° [Area2D] 以使其具有检测" +"å½¢çŠ¶ï¼Œæˆ–å°†å…¶æ·»åŠ åˆ°ç‰©ç†ä½“ [PhysicsBody2D] 以创建实体对象。" #: doc/classes/CollisionShape2D.xml doc/classes/KinematicBody2D.xml #: doc/classes/RectangleShape2D.xml doc/classes/TileMap.xml @@ -18827,6 +18886,17 @@ msgid "" "Physics the area will not detect any collisions with the concave shape at " "all (this is a known bug)." msgstr "" +"凹多边形形状资æºï¼Œå¯ä»¥æ”¾åˆ° [PhysicsBody] 和区域之ä¸ã€‚è¿™ç§å½¢çŠ¶æ˜¯é€šè¿‡è¾“å…¥ä¸€ç»„ä¸‰" +"è§’å½¢æ¥åˆ›å»ºçš„。\n" +"[b]注æ„:[/b]用于碰撞时,[ConcavePolygonShape] 应与 [StaticBody] ç‰é™æ€ " +"[PhysicsBody] 节点一起使用,与 [KinematicBody] å’Œéž Static 模å¼çš„ " +"[RigidBody] ä¸€èµ·ä½¿ç”¨æ˜¯æ— æ³•æ£å¸¸å·¥ä½œçš„。\n" +"[b]è¦å‘Šï¼š[/b]将这ç§å½¢çŠ¶ç”¨äºŽ [Area](通过 [CollisionShape] èŠ‚ç‚¹ï¼Œä¾‹å¦‚é€‰ä¸ " +"[MeshInstance] 节点åŽï¼Œé€šè¿‡å‡ºçŽ°çš„[i]ç½‘æ ¼[/i]èœå•ä¸çš„[i]åˆ›å»ºä¸‰è§’ç½‘æ ¼ç¢°æ’žåŒçº§[/" +"i]æ¥åˆ›å»ºï¼‰å¯èƒ½å¾—到出乎预料的结果:使用 Godot Physics 时,区域åªä¼šæ£€æµ‹ä¸Ž " +"[ConcavePolygonShape] 的三角形é¢äº§ç”Ÿçš„碰撞(ä¸ä¼šæ£€æµ‹è¯¥å½¢çŠ¶çš„â€œå†…éƒ¨â€ï¼Œè¿™é‡Œåªæ˜¯" +"举个例å),使用 Bullet Physics æ—¶æ ¹æœ¬ä¸ä¼šæ£€æµ‹åˆ°ä»»ä½•与凹形状的碰撞(这是已知" +"的问题)。" #: doc/classes/ConcavePolygonShape.xml msgid "Returns the faces (an array of triangles)." @@ -18841,7 +18911,6 @@ msgid "Concave polygon 2D shape resource for physics." msgstr "凹é¢å¤šè¾¹å½¢2D形状资æºç”¨äºŽç‰©ç†ã€‚" #: doc/classes/ConcavePolygonShape2D.xml -#, fuzzy msgid "" "Concave polygon 2D shape resource for physics. It is made out of segments " "and is optimal for complex polygonal concave collisions. However, it is not " @@ -18858,12 +18927,16 @@ msgid "" "the segments in the [ConcavePolygonShape2D] (and not with any \"inside\" of " "the shape, for example)." msgstr "" -"凹é¢å¤šè¾¹å½¢2D形状资æºç”¨äºŽç‰©ç†ã€‚它是由线段组æˆçš„ï¼Œæ˜¯å¤æ‚的多边形凹é¢ç¢°æ’žçš„æœ€ä½³" -"选择。但是,建议ä¸è¦å°†å…¶ç”¨äºŽ[RigidBody2D]节点。建议使用凸分解模å¼ï¼ˆå®žä½“)或多" -"个凸对象的CollisionPolygon2D代替。å¦åˆ™ï¼Œå‡¹å¤šè¾¹å½¢2D形状更适åˆé™æ€ç¢°æ’žã€‚\n" -"[ConvexPolygonShape2D]å’Œ[ConcavePolygonShape2D]之间的主è¦åŒºåˆ«åœ¨äºŽï¼Œå‡¹é¢å¤šè¾¹å½¢" -"å‡å®šå…¶ä¸ºå‡¹é¢ï¼Œå¹¶ä½¿ç”¨æ›´å¤æ‚的碰撞检测方法,而凸é¢å¤šè¾¹å½¢åˆ™å°†è‡ªèº«å¼ºåˆ¶å˜ä¸ºå‡¸é¢ï¼Œ" -"ä»¥åŠ å¿«ç¢°æ’žæ£€æµ‹çš„é€Ÿåº¦ã€‚" +"用于物ç†çš„凹多边形 2D 形状资æºã€‚它是由线段组æˆçš„ï¼Œæ˜¯å¤æ‚的多边形凹é¢ç¢°æ’žçš„æœ€" +"佳选择。但是建议ä¸è¦å°†å…¶ç”¨äºŽ [RigidBody2D] 节点。建议使用凸分解模å¼ï¼ˆå®žä½“)或" +"多个凸对象的 CollisionPolygon2D 代替。å¦åˆ™ï¼Œå‡¹å¤šè¾¹å½¢ 2D 形状更适åˆé™æ€ç¢°" +"撞。\n" +"[ConvexPolygonShape2D] å’Œ [ConcavePolygonShape2D] 之间的主è¦åŒºåˆ«åœ¨äºŽï¼Œå‡¹å¤šè¾¹" +"å½¢å‡å®šå…¶ä¸ºå‡¹é¢ï¼Œå¹¶ä½¿ç”¨æ›´å¤æ‚的碰撞检测方法,而凸多边形则将自身强制å˜ä¸ºå‡¸é¢ï¼Œ" +"ä»¥åŠ å¿«ç¢°æ’žæ£€æµ‹çš„é€Ÿåº¦ã€‚\n" +"[b]è¦å‘Šï¼š[/b]将这ç§å½¢çŠ¶ç”¨äºŽ [Area2D](通过 [CollisionShape2D] 节点)å¯èƒ½å¾—到" +"出乎预料的结果:区域åªä¼šæ£€æµ‹ä¸Ž [ConcavePolygonShape2D] 的线段产生的碰撞(ä¸ä¼š" +"检测该形状的“内部â€ï¼Œè¿™é‡Œåªæ˜¯ä¸¾ä¸ªä¾‹å)。" #: doc/classes/ConcavePolygonShape2D.xml msgid "" @@ -19599,7 +19672,7 @@ msgstr "" "时,本地覆盖项始终优先。\n" "[b]注æ„:[/b]为覆盖项设 [code]null[/code] 值å¯å°†å…¶åˆ 除。该行为已废弃,将在 " "4.0 ä¸ç§»é™¤ï¼Œè¯·æ¢æˆ [method remove_stylebox_override]。\n" -"å‚阅 [method get_stylebox]。\n" +"å¦è¯·å‚阅 [method get_stylebox]。\n" "[b]通过å¤åˆ¶æ¥ä¿®æ”¹ StyleBox ä¸çš„属性的示例:[/b]\n" "[codeblock]\n" "# 下é¢çš„代ç 片段å‡è®¾å节点 MyButton 分é…了一个 StyleBoxFlat。\n" @@ -19672,7 +19745,7 @@ msgstr "找到下一个å¯ä»¥æŽ¥å—焦点的 [Control]ï¼Œåœ¨æ ‘çš„ä¸‹æ–¹ã€‚" #: doc/classes/Control.xml msgid "" "Finds the previous (above in the tree) [Control] that can receive the focus." -msgstr "找到å¯ä»¥æŽ¥æ”¶ç„¦ç‚¹çš„上一个 [Control]ï¼Œåœ¨æ ‘çš„ä¸Šæ–¹ã€‚" +msgstr "找到上一个å¯ä»¥æŽ¥å—焦点的 [Control]ï¼Œåœ¨æ ‘çš„ä¸Šæ–¹ã€‚" #: doc/classes/Control.xml msgid "" @@ -19735,11 +19808,11 @@ msgstr "" "code]ï¼Œåˆ™ä½¿ç”¨å½“å‰æŽ§ä»¶çš„ç±»å作为类型,如果定义了 [member " "theme_type_variation] 则也会使用。如果类型是类åï¼Œåˆ™è¿˜ä¼šæŒ‰ç»§æ‰¿é¡ºåºæ£€æŸ¥å…¶çˆ¶" "类。\n" -"å¯¹äºŽå½“å‰æŽ§ä»¶ï¼Œé¦–å…ˆè€ƒè™‘å…¶æœ¬åœ°è¦†ç›–é¡¹ï¼Œå‚阅 [method add_color_override]ï¼Œç„¶åŽæ˜¯" -"其分é…çš„ [member theme]ã€‚åœ¨å½“å‰æŽ§ä»¶ä¹‹åŽï¼Œè€ƒè™‘æ¯ä¸ªçˆ¶æŽ§ä»¶åŠå…¶åˆ†é…çš„ [member " -"theme];未分é…[member theme]çš„æŽ§ä»¶å°†è¢«è·³è¿‡ã€‚å¦‚æžœåœ¨æ ‘ä¸æ‰¾ä¸åˆ°åŒ¹é…çš„ [Theme]," -"则使用自定义项目 [Theme]和默认的 [Theme],å‚阅 [member ProjectSettings.gui/" -"theme/custom]。\n" +"å¯¹äºŽå½“å‰æŽ§ä»¶ï¼Œä¼šé¦–å…ˆè€ƒè™‘å…¶æœ¬åœ°è¦†ç›–é¡¹ï¼ˆè§ [method add_color_override]),然åŽ" +"冿˜¯ä¸ºå…¶åˆ†é…çš„ [member theme]ã€‚åœ¨å½“å‰æŽ§ä»¶ä¹‹åŽï¼Œè€ƒè™‘æ¯ä¸ªçˆ¶æŽ§ä»¶åŠå…¶åˆ†é…çš„ " +"[member theme]ï¼›æœªåˆ†é… [member theme] çš„æŽ§ä»¶å°†è¢«è·³è¿‡ã€‚å¦‚æžœåœ¨æ ‘ä¸æ‰¾ä¸åˆ°åŒ¹é…çš„ " +"[Theme],则使用自定义项目 [Theme]ï¼ˆè§ [member ProjectSettings.gui/theme/" +"custom])和默认的 [Theme]。\n" "[codeblock]\n" "func _ready():\n" " # 获å–ä¸ºå½“å‰æŽ§ä»¶ç±»å®šä¹‰çš„å—体颜色(如果å˜åœ¨ï¼‰ã€‚\n" @@ -19925,12 +19998,11 @@ msgid "" "be clicked instead\n" "[/codeblock]" msgstr "" -"创建一个[InputEventMouseButton],å°è¯•点击控件。如果接收到该事件,控件就会获得" -"焦点。\n" +"创建å°è¯•点击该控件的 [InputEventMouseButton]。如果接收到该事件,该控件就会获" +"得焦点。\n" "[codeblock]\n" "func _process(delta):\n" -" grab_click_focus() #when clicking another Control node, this node will " -"be clicked instead\n" +" grab_click_focus() # 点击其它 Control 节点时,实际会点到这个节点\n" "[/codeblock]" #: doc/classes/Control.xml @@ -19991,7 +20063,7 @@ msgid "" "Returns [code]true[/code] if this is the current focused control. See " "[member focus_mode]." msgstr "" -"如果这是当å‰çš„焦点控件,则返回 [code]true[/code]。å‚阅[member focus_mode]。" +"如果这是当å‰çš„焦点控件,则返回 [code]true[/code]ã€‚è§ [member focus_mode]。" #: doc/classes/Control.xml msgid "" @@ -20057,7 +20129,7 @@ msgid "" msgstr "" "å¦‚æžœæ¤ [Control] 节点ä¸å…·æœ‰æŒ‡å®š [code]name[/code] 的主题ç€è‰²å™¨å˜åœ¨æœ¬åœ°è¦†ç›–" "项,则返回 [code]true[/code]。\n" -"å‚阅[method add_shader_override]。" +"è§ [method add_shader_override]。" #: doc/classes/Control.xml msgid "" @@ -20078,7 +20150,7 @@ msgid "" msgstr "" "å¦‚æžœåœ¨æ¤ [Control] 节点ä¸å…·æœ‰æŒ‡å®š [code]name[/code] 的主题 [StyleBox] 的本地" "覆盖项,则返回 [code]true[/code]。\n" -"å‚阅 [method add_stylebox_override]。" +"è§ [method add_stylebox_override]。" #: doc/classes/Control.xml msgid "" @@ -20148,15 +20220,15 @@ msgid "" "[code]push_opposite_anchor[/code] was [code]false[/code], the left anchor " "would get value 0.5." msgstr "" -"将由[enum Margin]枚举的[code]margin[/code]叏釿 ‡è¯†çš„锚设置为值[code]anchor[/" -"code]。用于[member anchor_bottom],[member anchor_left],[member " -"anchor_right]å’Œ[member anchor_top]çš„setter方法。\n" -"如果[code]keep_margin[/code]为 [code]true[/code]ï¼Œåˆ™åœ¨æ‰§è¡Œæ¤æ“作åŽä¸ä¼šæ›´æ–°è¾¹" -"è·ã€‚\n" -"如果[code]push_opposite_anchor[/code]为 [code]true[/code],并且相对的锚点与该" -"锚点é‡å ,则相对的锚点将覆盖其值。例如,当将左锚点设置为1且å³é”šç‚¹çš„值为0.5" -"时,å³é”šç‚¹çš„值也将为1。如果[code]push_opposite_anchor[/code]为 [code]false[/" -"code],则左锚点将得到值0.5。" +"将由 [code]margin[/code] 叏釿 ‡è¯†çš„锚点设置为值 [code]anchor[/code],å–值为 " +"[enum Margin] 枚举。这是 [member anchor_bottom]ã€[member anchor_left]ã€" +"[member anchor_right]ã€[member anchor_top] çš„ setter 方法。\n" +"如果 [code]keep_margin[/code] 为 [code]true[/code]ï¼Œåˆ™åœ¨æ‰§è¡Œæ¤æ“作åŽä¸ä¼šæ›´æ–°" +"è¾¹è·ã€‚\n" +"如果 [code]push_opposite_anchor[/code] 为 [code]true[/code],并且相对的锚点与" +"该锚点é‡å ,则相对的锚点将覆盖其值。例如,当将左锚点设置为 1 且å³é”šç‚¹çš„值为 " +"0.5 时,å³é”šç‚¹çš„值也将为 1。如果 [code]push_opposite_anchor[/code] 为 " +"[code]false[/code],则左锚点将得到值 0.5。" #: doc/classes/Control.xml msgid "" @@ -20165,15 +20237,14 @@ msgid "" "offset yourself (see [method set_margin])." msgstr "" "与 [method set_anchor] 的工作原ç†ç›¸åŒï¼Œä½†æ˜¯å®ƒä»£æ›¿ [code]keep_margin[/code] å‚" -"数和边è·çš„自动更新,它å…许您自己设置边è·åç§»é‡ï¼ˆè¯·å‚阅 [method " -"set_margin])。" +"数和边è·çš„自动更新,它å…许您自己设置边è·åç§»é‡ï¼ˆè§ [method set_margin])。" #: doc/classes/Control.xml msgid "" "Sets both anchor preset and margin preset. See [method set_anchors_preset] " "and [method set_margins_preset]." msgstr "" -"设置锚点预设和边è·é¢„设。请å‚阅 [method set_anchors_preset] å’Œ [method " +"设置锚点预设和边è·é¢„è®¾ã€‚è§ [method set_anchors_preset] å’Œ [method " "set_margins_preset]。" #: doc/classes/Control.xml @@ -20193,7 +20264,7 @@ msgid "" "Sets [member margin_left] and [member margin_top] at the same time. " "Equivalent of changing [member rect_position]." msgstr "" -"åŒæ—¶è®¾ç½®[member margin_left]å’Œ[member margin_top]ã€‚ç‰æ•ˆäºŽæ›´æ”¹[member " +"åŒæ—¶è®¾ç½® [member margin_left] å’Œ [member margin_top]ã€‚ç‰æ•ˆäºŽæ›´æ”¹ [member " "rect_position]。" #: doc/classes/Control.xml @@ -20285,7 +20356,7 @@ msgstr "" #: doc/classes/Control.xml msgid "Sets [member margin_right] and [member margin_bottom] at the same time." -msgstr "åŒæ—¶è®¾ç½®[member margin_right]å’Œ[member margin_bottom]。" +msgstr "åŒæ—¶è®¾ç½® [member margin_right] å’Œ [member margin_bottom]。" #: doc/classes/Control.xml msgid "" @@ -20305,9 +20376,9 @@ msgid "" "If [code]keep_margins[/code] is [code]true[/code], control's anchors will be " "updated instead of margins." msgstr "" -"å°†[member rect_global_position]设置为给定的[code]position[/code]。\n" -"如果[code]keep_margins[/code]为 [code]true[/code],则控件的锚点将被更新,而ä¸" -"是边è·ã€‚" +"å°† [member rect_global_position] 设置为给定的 [code]position[/code]。\n" +"如果 [code]keep_margins[/code] 为 [code]true[/code],则更新的是控件的锚点,而" +"䏿˜¯è¾¹è·ã€‚" #: doc/classes/Control.xml msgid "" @@ -20345,9 +20416,9 @@ msgid "" "If [code]keep_margins[/code] is [code]true[/code], control's anchors will be " "updated instead of margins." msgstr "" -"å°†[member rect_position]设置为给定的[code]position[/code]。\n" -"如果[code]keep_margins[/code]为 [code]true[/code],则控件的锚点将被更新,而ä¸" -"是边è·ã€‚" +"å°† [member rect_position] 设置为给定的 [code]position[/code]。\n" +"如果 [code]keep_margins[/code] 为 [code]true[/code],则更新的是控件的锚点,而" +"䏿˜¯è¾¹è·ã€‚" #: doc/classes/Control.xml msgid "Sets the rotation (in radians)." @@ -20431,8 +20502,8 @@ msgid "" "The focus access mode for the control (None, Click or All). Only one Control " "can be focused at the same time, and it will receive keyboard signals." msgstr "" -"控件的焦点访问模å¼ï¼ˆâ€œæ— â€ï¼Œâ€œå•å‡»â€æˆ–“全部â€ï¼‰ã€‚åªèƒ½åŒæ—¶é›†ä¸ä¸€ä¸ªæŽ§ä»¶ï¼Œå®ƒå°†æŽ¥æ”¶é”®" -"盘信å·ã€‚" +"控件的焦点访问模å¼ï¼ˆâ€œæ— â€â€œå•å‡»â€æˆ–“全部â€ï¼‰ã€‚åªèƒ½åŒæ—¶èšç„¦ä¸€ä¸ªæŽ§ä»¶ï¼Œè¯¥æŽ§ä»¶ä¼šæ”¶åˆ°" +"键盘信å·ã€‚" #: doc/classes/Control.xml msgid "" @@ -20740,7 +20811,7 @@ msgstr "" msgid "" "The size of the node's bounding rectangle, in pixels. [Container] nodes " "update this property automatically." -msgstr "节点边界矩形的大å°ï¼Œä»¥åƒç´ 为å•ä½ã€‚[Container]节点会自动更新æ¤å±žæ€§ã€‚" +msgstr "节点边界矩形的大å°ï¼Œä»¥åƒç´ 为å•ä½ã€‚[Container] 节点会自动更新æ¤å±žæ€§ã€‚" #: doc/classes/Control.xml msgid "" @@ -20907,11 +20978,11 @@ msgstr "å½“èŠ‚ç‚¹æ›´æ”¹å¤§å°æ—¶å‘é€ã€‚使用 [member rect_size] èŽ·å–æ–°å¤§å #: doc/classes/Control.xml msgid "Sent when the mouse pointer enters the node." -msgstr "å½“é¼ æ ‡æŒ‡é’ˆè¿›å…¥èŠ‚ç‚¹æ—¶å‘é€ã€‚" +msgstr "å½“é¼ æ ‡æŒ‡é’ˆè¿›å…¥è¯¥èŠ‚ç‚¹æ—¶å‘é€ã€‚" #: doc/classes/Control.xml msgid "Sent when the mouse pointer exits the node." -msgstr "å½“é¼ æ ‡æŒ‡é’ˆé€€å‡ºèŠ‚ç‚¹æ—¶å‘é€ã€‚" +msgstr "å½“é¼ æ ‡æŒ‡é’ˆé€€å‡ºè¯¥èŠ‚ç‚¹æ—¶å‘é€ã€‚" #: doc/classes/Control.xml msgid "Sent when the node grabs focus." @@ -20927,8 +20998,8 @@ msgid "" "control. Happens when you call one of the [code]add_*_override[/code] " "methods." msgstr "" -"当节点的 [member theme] æ”¹å˜æ—¶ï¼Œå°±åœ¨Godoté‡ç»˜æŽ§ä»¶ä¹‹å‰å‘é€ã€‚å½“ä½ è°ƒç”¨" -"[code]add_*_override[/code]方法之一时å‘生。" +"当节点的 [member theme] æ”¹å˜æ—¶ï¼Œå°±åœ¨ Godot é‡ç»˜æŽ§ä»¶ä¹‹å‰å‘é€ã€‚å½“ä½ è°ƒç”¨ " +"[code]add_*_override[/code] 方法之一时å‘生。" #: doc/classes/Control.xml msgid "Sent when an open modal dialog closes. See [method show_modal]." @@ -20960,8 +21031,8 @@ msgid "" "beam pointer has a shape similar to \"I\". It tells the user they can " "highlight or insert text." msgstr "" -"å½“ç”¨æˆ·å°†èŠ‚ç‚¹æ‚¬åœæ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçš„I型光æŸé¼ æ ‡å…‰æ ‡ã€‚å·¥å—æ¢æŒ‡é’ˆçš„形状类似于“Iâ€ã€‚它" -"告诉用户他们å¯ä»¥çªå‡ºæ˜¾ç¤ºæˆ–æ’入文本。" +"å½“ç”¨æˆ·å°†èŠ‚ç‚¹æ‚¬åœæ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçš„ I 型光æŸé¼ æ ‡å…‰æ ‡ã€‚å·¥å—æ¢æŒ‡é’ˆçš„形状类似于“Iâ€ã€‚" +"它告诉用户他们å¯ä»¥çªå‡ºæ˜¾ç¤ºæˆ–æ’入文本。" #: doc/classes/Control.xml msgid "" @@ -21000,7 +21071,7 @@ msgid "" "grabbing, like a node in the Scene dock." msgstr "" "当用户悬åœèŠ‚ç‚¹æ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçš„è½åœ°é¼ æ ‡å…‰æ ‡ã€‚å®ƒå¯ä»¥æ˜¯ä¸€ä¸ªå¼ 开的手。它告诉用户å¯" -"ä»¥æ”¾ä¸‹ä¸€ä¸ªä»–ä»¬å½“å‰æ£åœ¨æŠ“å–的物å“,比如场景dockä¸çš„一个节点。" +"ä»¥æ”¾ä¸‹ä¸€ä¸ªä»–ä»¬å½“å‰æ£åœ¨æŠ“å–的物å“ï¼Œæ¯”å¦‚åœºæ™¯é¢æ¿ä¸çš„一个节点。" #: doc/classes/Control.xml msgid "" @@ -21053,8 +21124,8 @@ msgid "" "2 double-headed arrows at a 90 degree angle. It tells the user they can move " "a UI element freely." msgstr "" -"å½“ç”¨æˆ·å°†èŠ‚ç‚¹æ‚¬åœæ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçš„ç§»åŠ¨é¼ æ ‡å…‰æ ‡ã€‚å®ƒä»¥90度角显示2个åŒå‘ç®å¤´ã€‚它告诉" -"用户他们å¯ä»¥è‡ªç”±ç§»åЍ UI å…ƒç´ ã€‚" +"å½“ç”¨æˆ·å°†èŠ‚ç‚¹æ‚¬åœæ—¶ï¼Œæ˜¾ç¤ºç³»ç»Ÿçš„ç§»åŠ¨é¼ æ ‡å…‰æ ‡ã€‚å®ƒä»¥ 90 度角显示 2 个åŒå‘ç®å¤´ã€‚它" +"告诉用户他们å¯ä»¥è‡ªç”±ç§»åЍ UI å…ƒç´ ã€‚" #: doc/classes/Control.xml msgid "" @@ -21240,8 +21311,8 @@ msgid "" "the available space without pushing any other node. Use with [member " "size_flags_horizontal] and [member size_flags_vertical]." msgstr "" -"告诉父[Container]扩展æ¤èŠ‚ç‚¹çš„è¾¹ç•Œï¼Œä»¥åœ¨ä¸æŽ¨å…¶ä»–èŠ‚ç‚¹çš„æƒ…å†µä¸‹å¡«å……æ‰€æœ‰å¯ç”¨ç©ºé—´ã€‚" -"使用[member size_flags_horizontal]å’Œ[member size_flags_vertical]。" +"告诉父 [Container] 扩展æ¤èŠ‚ç‚¹çš„è¾¹ç•Œï¼Œä»¥åœ¨ä¸æŽ¨å…¶ä»–èŠ‚ç‚¹çš„æƒ…å†µä¸‹å¡«å……æ‰€æœ‰å¯ç”¨ç©º" +"间。用于 [member size_flags_horizontal] å’Œ [member size_flags_vertical]。" #: doc/classes/Control.xml msgid "" @@ -21251,17 +21322,17 @@ msgid "" "size_flags_stretch_ratio]. Use with [member size_flags_horizontal] and " "[member size_flags_vertical]." msgstr "" -"告诉父级[Container]让该节点å ç”¨æ‚¨æ ‡è®°çš„è½´ä¸Šçš„æ‰€æœ‰å¯ç”¨ç©ºé—´ã€‚如果将多个相邻节点" -"è®¾ç½®ä¸ºæ‰©å±•ï¼Œå®ƒä»¬å°†æ ¹æ®å…¶æ‹‰ä¼¸æ¯”共享空间。å‚阅[member " -"size_flags_stretch_ratio]。与[member size_flags_horizontal]å’Œ[member " -"size_flags_vertical]一起使用。" +"告诉父级 [Container] 让该节点å ç”¨æ‚¨æ ‡è®°çš„è½´ä¸Šçš„æ‰€æœ‰å¯ç”¨ç©ºé—´ã€‚如果将多个相邻节" +"ç‚¹è®¾ç½®ä¸ºæ‰©å±•ï¼Œå®ƒä»¬å°†æ ¹æ®å…¶æ‹‰ä¼¸æ¯”å…±äº«ç©ºé—´ã€‚è§ [member " +"size_flags_stretch_ratio]。用于 [member size_flags_horizontal] å’Œ [member " +"size_flags_vertical]。" #: doc/classes/Control.xml msgid "" "Sets the node's size flags to both fill and expand. See the 2 constants " "above for more information." msgstr "" -"å°†èŠ‚ç‚¹çš„å¤§å°æ ‡å¿—è®¾ç½®ä¸ºåŒæ—¶å¡«å……和扩展。有关更多信æ¯ï¼Œè¯·å‚阅上é¢çš„2个常é‡ã€‚" +"å°†èŠ‚ç‚¹çš„å¤§å°æ ‡å¿—è®¾ç½®ä¸ºåŒæ—¶å¡«å……和扩展。有关更多信æ¯ï¼Œè¯·å‚阅上é¢çš„ 2 个常é‡ã€‚" #: doc/classes/Control.xml msgid "" @@ -21271,8 +21342,8 @@ msgid "" "size_flags_vertical]." msgstr "" "告诉父级 [Container] 使节点本身居ä¸ã€‚它基于控件的包围框居ä¸ï¼Œå› æ¤å®ƒä¸é€‚用于 " -"fill 或 expand å°ºå¯¸æ ‡å¿—ã€‚ä¸Ž [member size_flags_horizontal] å’Œ [member " -"size_flags_vertical] 一起使用。" +"fill 或 expand å°ºå¯¸æ ‡å¿—ã€‚ç”¨äºŽ [member size_flags_horizontal] å’Œ [member " +"size_flags_vertical]。" #: doc/classes/Control.xml msgid "" @@ -21282,8 +21353,8 @@ msgid "" "size_flags_vertical]." msgstr "" "告诉父级 [Container] 将节点与其末端(底部或å³ä¾§ï¼‰å¯¹é½ã€‚它ä¸é€‚用于 fill 或 " -"expand size æ ‡å¿—ã€‚ä¸Ž [member size_flags_horizontal] å’Œ [member " -"size_flags_vertical] 一起使用。" +"expand size æ ‡å¿—ã€‚ç”¨äºŽ [member size_flags_horizontal] å’Œ [member " +"size_flags_vertical]。" #: doc/classes/Control.xml msgid "" @@ -21440,7 +21511,8 @@ msgid "" "and doesn't need to be configured by the user." msgstr "" "基于 CPU çš„ 3D ç²’å节点,用于创建å„ç§ç²’å系统和效果。\n" -"å‚阅 [Particles]ï¼Œå®ƒæ˜¯ä»¥ç¡¬ä»¶åŠ é€Ÿæä¾›ç›¸åŒçš„功能,但å¯èƒ½æ— 法在旧设备上è¿è¡Œã€‚\n" +"å¦è¯·å‚阅 [Particles]ï¼Œå®ƒæ˜¯ä»¥ç¡¬ä»¶åŠ é€Ÿæä¾›ç›¸åŒçš„功能,但å¯èƒ½æ— 法在旧设备上è¿" +"行。\n" "[b]注æ„:[/b]与 [Particles] ä¸åŒï¼Œå…¶å¯è§æ€§çŸ©å½¢æ˜¯å³æ—¶ç”Ÿæˆçš„,ä¸éœ€è¦ç”¨æˆ·é…置。" #: doc/classes/CPUParticles.xml @@ -21703,7 +21775,7 @@ msgstr "" #: doc/classes/CPUParticles.xml doc/classes/CPUParticles2D.xml #: doc/classes/ParticlesMaterial.xml msgid "Align Y axis of particle with the direction of its velocity." -msgstr "将粒åçš„Y轴与其速度方å‘对é½ã€‚" +msgstr "将粒åçš„ Y 轴与其速度方å‘对é½ã€‚" #: doc/classes/CPUParticles.xml doc/classes/ParticlesMaterial.xml msgid "If [code]true[/code], particles will not move on the z axis." @@ -24007,6 +24079,14 @@ msgid "Cylinder shape for collisions." msgstr "碰撞用的圆柱体形状。" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "圆柱体的高度。" @@ -25459,7 +25539,7 @@ msgstr "AssetLib 选项å¡ã€‚如果ç¦ç”¨æ¤åŠŸèƒ½ï¼Œåˆ™ä¸ä¼šæ˜¾ç¤º AssetLib é€ msgid "" "Scene tree editing. If this feature is disabled, the Scene tree dock will " "still be visible but will be read-only." -msgstr "åœºæ™¯æ ‘ç¼–è¾‘ã€‚å¦‚æžœç¦ç”¨æ¤åŠŸèƒ½ï¼Œåœºæ™¯æ ‘åœé 点ä»å°†å¯è§ï¼Œä½†å°†æ˜¯åªè¯»çš„。" +msgstr "åœºæ™¯æ ‘ç¼–è¾‘ã€‚å¦‚æžœç¦ç”¨æ¤åŠŸèƒ½ï¼Œåœºæ™¯æ ‘é¢æ¿ä»å°†å¯è§ï¼Œä½†å°†æ˜¯åªè¯»çš„。" #: doc/classes/EditorFeatureProfile.xml msgid "" @@ -26049,7 +26129,7 @@ msgstr "" #: doc/classes/EditorInspector.xml msgid "A control used to edit properties of an object." -msgstr "用于编辑所选节点属性的控件。" +msgstr "用于编辑对象属性的控件。" #: doc/classes/EditorInspector.xml msgid "" @@ -26654,9 +26734,9 @@ msgid "" "custom gizmos to the 3D preview viewport for a [Spatial].\n" "See [method add_inspector_plugin] for an example of how to register a plugin." msgstr "" -"注册一个新的空间辅助器æ’ä»¶ [EditorSpatialGizmoPlugin]。Gizmoæ’件用于为 " -"[Spatial] çš„ 3Dé¢„è§ˆè§†çª—æ·»åŠ è‡ªå®šä¹‰çš„ gizmos。\n" -"å‚è§ [method add_inspector_plugin] 以了解如何注册一个æ’件的例å。" +"注册一个新的 [EditorSpatialGizmoPlugin]。å°å·¥å…·æ’ä»¶å¯ä»¥åœ¨ 3D 预览视区ä¸ä¸º " +"[Spatial] æ·»åŠ è‡ªå®šä¹‰çš„å°å·¥å…·ã€‚\n" +"注册æ’ä»¶çš„ç¤ºä¾‹è§ [method add_inspector_plugin]。" #: doc/classes/EditorPlugin.xml msgid "" @@ -27143,7 +27223,7 @@ msgstr "åˆ é™¤ç”± [method add_scene_import_plugin] 注册的场景导入器。" #: doc/classes/EditorPlugin.xml msgid "Removes a gizmo plugin registered by [method add_spatial_gizmo_plugin]." -msgstr "åˆ é™¤ç”± [method add_spatial_gizmo_plugin] 注册的控制器æ’件。" +msgstr "åˆ é™¤ç”± [method add_spatial_gizmo_plugin] 注册的å°å·¥å…·æ’件。" #: doc/classes/EditorPlugin.xml msgid "Removes a menu [code]name[/code] from [b]Project > Tools[/b]." @@ -27810,6 +27890,7 @@ msgid "Base script that can be used to add extension functions to the editor." msgstr "å¯ç”¨äºŽä¸ºç¼–è¾‘å™¨æ·»åŠ æ‰©å±•åŠŸèƒ½çš„åŸºç¡€è„šæœ¬ã€‚" #: doc/classes/EditorScript.xml +#, fuzzy msgid "" "Scripts extending this class and implementing its [method _run] method can " "be executed from the Script Editor's [b]File > Run[/b] menu option (or by " @@ -27827,7 +27908,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" "扩展该类并实现其 [method _run] 方法的脚本å¯ä»¥åœ¨ç¼–辑器è¿è¡Œæ—¶é€šè¿‡è„šæœ¬ç¼–è¾‘å™¨çš„" "[b]文件 > è¿è¡Œ[/b]èœå•选项(或按 [code]Ctrl+Shift+X[/code]ï¼‰æ‰§è¡Œã€‚è¿™å¯¹äºŽå‘ " @@ -28165,7 +28249,7 @@ msgstr "" #: doc/classes/EditorSpatialGizmo.xml msgid "Custom gizmo for editing Spatial objects." -msgstr "用于编辑空间对象的自定义å°å·¥å…·ã€‚" +msgstr "用于编辑 Spatial 对象的自定义å°å·¥å…·ã€‚" #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -28181,7 +28265,7 @@ msgid "" "Adds the specified [code]segments[/code] to the gizmo's collision shape for " "picking. Call this function during [method redraw]." msgstr "" -"将指定的 [code]segments[/code] æ·»åŠ åˆ° gizmo 的碰撞形状ä¸ï¼Œä»¥ä¾¿æŒ‘选。在 " +"将指定的线段 [code]segments[/code] æ·»åŠ åˆ°å°å·¥å…·çš„碰撞形状ä¸ï¼Œç”¨äºŽç‚¹é€‰ã€‚请在 " "[method redraw] 时调用æ¤å‡½æ•°ã€‚" #: doc/classes/EditorSpatialGizmo.xml @@ -28190,8 +28274,8 @@ msgid "" "generated from a regular [Mesh] too. Call this function during [method " "redraw]." msgstr "" -"å°†ç¢°æ’žä¸‰è§’å½¢æ·»åŠ åˆ°å°å·¥å…·ä¸ï¼Œä¾›æŒ‘选。也å¯ä»¥ä»Žæ™®é€šçš„ [Mesh] ç”Ÿæˆ " -"[TriangleMesh]。在 [method redraw] 时调用æ¤å‡½æ•°ã€‚" +"å°†ç¢°æ’žä¸‰è§’å½¢æ·»åŠ åˆ°å°å·¥å…·ä¸ï¼Œç”¨äºŽç‚¹é€‰ã€‚也å¯ä»¥ä»Žæ™®é€šçš„ [Mesh] ç”Ÿæˆ " +"[TriangleMesh]。请在 [method redraw] 时调用æ¤å‡½æ•°ã€‚" #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -28200,8 +28284,8 @@ msgid "" "There are virtual functions which will be called upon editing of these " "handles. Call this function during [method redraw]." msgstr "" -"æ·»åŠ ä¸€ä¸ªå¥æŸ„(点)列表,å¯ä»¥ç”¨æ¥å¯¹ç¼–辑的对象进行å˜å½¢ã€‚\n" -"æœ‰ä¸€äº›è™šå‡½æ•°å°†åœ¨ç¼–è¾‘è¿™äº›å¥æŸ„时被调用。在 [method redraw]时调用这个函数。" +"æ·»åŠ åˆ—è¡¨ä¸çš„æ‰‹æŸ„(点),å¯ä»¥ç”¨æ¥å¯¹ç¼–辑的对象进行å˜å½¢ã€‚\n" +"编辑这些手柄时会调用一些虚函数。请在 [method redraw] 时调用这个函数。" #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -28209,8 +28293,8 @@ msgid "" "lines are used for visualizing the gizmo. Call this function during [method " "redraw]." msgstr "" -"用给定的æè´¨åœ¨å°å·¥å…·ä¸Šæ·»åŠ çº¿æ¡åˆ° gizmo(作为 2 个点的集åˆï¼‰ã€‚线æ¡ç”¨äºŽå¯è§†åŒ– " -"gizmo。在 [method redraw] 时调用æ¤å‡½æ•°ã€‚" +"在å°å·¥å…·ä¸Šæ·»åŠ ä½¿ç”¨ç»™å®šæè´¨çš„线æ¡ï¼ˆå½¢å¼ä¸º 2 个点的集åˆï¼‰ã€‚线æ¡å°†ç”¨äºŽæ˜¾ç¤ºå°å·¥" +"具。请在 [method redraw] 时调用æ¤å‡½æ•°ã€‚" #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -28219,10 +28303,10 @@ msgid "" "is [code]true[/code], the mesh will rotate to always face the camera. Call " "this function during [method redraw]." msgstr "" -"以指定的 [code]billboard[/code] 状æ€ã€[code]skeleton[/code] å’Œ " -"[code]materia[/code] æ·»åŠ ç½‘æ ¼åˆ°å°å·¥å…·ã€‚如果 [code]billboard[/code] 为 " -"[code]true[/code]ï¼Œåˆ™ç½‘æ ¼å°†æ—‹è½¬ä¸ºå§‹ç»ˆé¢å‘相机。在 [method redraw] 时调用æ¤å‡½" -"数。" +"在å°å·¥å…·ä¸Šæ·»åŠ æŒ‡å®šçš„ç½‘æ ¼ï¼Œç½‘æ ¼ä½¿ç”¨çš„æ˜¯æŒ‡å®šçš„ [code]billboard[/code] 状æ€ã€" +"[code]skeleton[/code] å’Œ [code]materia[/code]。如果 [code]billboard[/code] " +"为 [code]true[/code]ï¼Œåˆ™ç½‘æ ¼å°†æ—‹è½¬ä¸ºå§‹ç»ˆé¢å‘相机。请在 [method redraw] 时调用" +"æ¤å‡½æ•°ã€‚" #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -28233,7 +28317,7 @@ msgstr "æ·»åŠ ä¸€ä¸ªæœªç¼©æ”¾çš„å¹¿å‘Šç‰Œä»¥å®žçŽ°å¯è§†åŒ–。在 [method redraw #: doc/classes/EditorSpatialGizmo.xml msgid "" "Removes everything in the gizmo including meshes, collisions and handles." -msgstr "移除å°å·¥å…·ä¸çš„ä¸€åˆ‡ï¼ŒåŒ…æ‹¬ç½‘æ ¼ã€ç¢°æ’žå’Œå¥æŸ„。" +msgstr "移除å°å·¥å…·ä¸çš„ä¸€åˆ‡ï¼ŒåŒ…æ‹¬ç½‘æ ¼ã€ç¢°æ’žå’Œæ‰‹æŸ„。" #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -28242,9 +28326,9 @@ msgid "" "If the [code]cancel[/code] parameter is [code]true[/code], an option to " "restore the edited value to the original is provided." msgstr "" -"æäº¤ä¸€ä¸ªæ£åœ¨ç¼–è¾‘çš„å¥æŸ„ï¼ˆå¥æŸ„必须是之å‰é€šè¿‡[method add_handles]æ·»åŠ çš„ï¼‰ã€‚\n" -"如果[code]cancel[/code]傿•°æ˜¯[code]true[/code],则æä¾›äº†ä¸€ä¸ªå°†ç¼–辑åŽçš„值æ¢å¤" -"到原始值的选项。" +"æäº¤æ£åœ¨ç¼–辑的手柄(手柄必须是之å‰é€šè¿‡ [method add_handles] æ·»åŠ çš„ï¼‰ã€‚\n" +"如果 [code]cancel[/code] 傿•°ä¸º [code]true[/code],则会æä¾›ä¸€ä¸ªå°†ç¼–辑åŽçš„值æ¢" +"å¤åˆ°åŽŸå§‹å€¼çš„é€‰é¡¹ã€‚" #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -28252,16 +28336,16 @@ msgid "" "by [method add_handles]).\n" "Handles can be named for reference to the user when editing." msgstr "" -"获å–å·²ç¼–è¾‘çš„å¥æŸ„çš„åç§°ï¼ˆå¥æŸ„必须是之å‰é€šè¿‡[method add_handles]æ·»åŠ çš„ï¼‰ã€‚\n" -"奿Ÿ„çš„åç§°å¯ä»¥åœ¨ç¼–辑时被命å作为用户å‚考。" +"获å–编辑的手柄的å称(手柄必须是之å‰é€šè¿‡ [method add_handles] æ·»åŠ çš„ï¼‰ã€‚\n" +"手柄的åç§°å¯ä»¥åœ¨ç¼–辑时被命å作为用户å‚考。" #: doc/classes/EditorSpatialGizmo.xml msgid "" "Gets actual value of a handle. This value can be anything and used for " "eventually undoing the motion when calling [method commit_handle]." msgstr "" -"获å–ä¸€ä¸ªå¥æŸ„的实际值,这个值å¯ä»¥æ˜¯ä»»ä½•东西,用于在调用[method commit_handle]" -"时最终撤销动作。这个值å¯ä»¥æ˜¯ä»»ä½•东西,用于在调用[method commit_handle]时最终" +"èŽ·å–æ‰‹æŸ„的实际值。这个值å¯ä»¥æ˜¯ä»»ä½•东西,用于在调用 [method commit_handle] æ—¶" +"最终撤销动作。这个值å¯ä»¥æ˜¯ä»»ä½•东西,用于在调用 [method commit_handle] 时最终" "撤销动作。" #: doc/classes/EditorSpatialGizmo.xml @@ -28281,15 +28365,16 @@ msgid "" "Returns [code]true[/code] if the handle at index [code]index[/code] is " "highlighted by being hovered with the mouse." msgstr "" -"å¦‚æžœé¼ æ ‡æ‚¬åœç´¢å¼•为 [code]index[/code] çš„å¥æŸ„高亮,则返回 [code]true[/code]。" +"å¦‚æžœé¼ æ ‡æ‚¬åœåœ¨ç´¢å¼•为 [code]index[/code] 的手柄上使之高亮,则返回 [code]true[/" +"code]。" #: doc/classes/EditorSpatialGizmo.xml msgid "" "This function is called when the [Spatial] this gizmo refers to changes (the " "[method Spatial.update_gizmo] is called)." msgstr "" -"当这个工具所指 [Spatial] çš„å˜åŒ–时([method Spatial.update_gizmo] 函数被调" -"用)。" +"这个å°å·¥å…·æ‰€å¼•用的 [Spatial] å‘生å˜åŒ–时([method Spatial.update_gizmo] 函数被" +"调用)会调用这个函数。" #: doc/classes/EditorSpatialGizmo.xml msgid "" @@ -28298,8 +28383,8 @@ msgid "" "The [Camera] is also provided so screen coordinates can be converted to " "raycasts." msgstr "" -"当用户在å±å¹•åæ ‡ä¸æ‹–动一个 gizmo 工具手柄时(之å‰ç”¨ [method add_handles] æ·»åŠ " -"的),就会使用这个函数。\n" +"当用户在å±å¹•åæ ‡ä¸æ‹–动å°å·¥å…·æ‰‹æŸ„时(之å‰ç”¨ [method add_handles] æ·»åŠ ï¼‰ï¼Œå°±ä¼š" +"使用这个函数。\n" "还æä¾›äº†ç›¸æœº [Camera],以便将å±å¹•åæ ‡è½¬æ¢ä¸ºå°„线投影。" #: doc/classes/EditorSpatialGizmo.xml @@ -28307,18 +28392,19 @@ msgid "" "Sets the gizmo's hidden state. If [code]true[/code], the gizmo will be " "hidden. If [code]false[/code], it will be shown." msgstr "" -"设置工具的éšè—状æ€ã€‚如果为 [code]true[/code]ï¼Œåˆ™å°æŽ§ä»¶å°†è¢«éšè—。如果为 " -"[code]false[/code],将显示它。" +"设置该å°å·¥å…·çš„éšè—状æ€ã€‚如果为 [code]true[/code],则该å°å·¥å…·å°†è¢«éšè—。如果为 " +"[code]false[/code] 则会显示。" #: doc/classes/EditorSpatialGizmo.xml msgid "" "Sets the reference [Spatial] node for the gizmo. [code]node[/code] must " "inherit from [Spatial]." -msgstr "设置工具的å‚考 [Spatial] 节点。[code]node[/code]必须继承自 [Spatial]。" +msgstr "" +"设置该å°å·¥å…·æ‰€å¼•用的 [Spatial] 节点。[code]node[/code]必须继承自 [Spatial]。" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "Used by the editor to define Spatial gizmo types." -msgstr "由编辑部用于定义空间å°å·¥å…·çš„类型。" +msgstr "由编辑部用于定义 Spatial å°å·¥å…·çš„类型。" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" @@ -28329,8 +28415,8 @@ msgid "" "To use [EditorSpatialGizmoPlugin], register it using the [method " "EditorPlugin.add_spatial_gizmo_plugin] method first." msgstr "" -"[EditorSpatialGizmoPlugin] å¯ç”¨äºŽå®šä¹‰æ–°çš„æŽ§åˆ¶å™¨ç±»åž‹ã€‚è¿™æ ·åšçš„ä¸»è¦æ–¹æ³•有两ç§ï¼š" -"比较简å•的控制器å¯ä»¥æ‰©å±• [EditorSpatialGizmoPlugin],或者å¯ä»¥åˆ›å»ºæ–°çš„ " +"[EditorSpatialGizmoPlugin] å¯ç”¨äºŽå®šä¹‰æ–°çš„å°å·¥å…·ç±»åž‹ã€‚è¿™æ ·åšçš„ä¸»è¦æ–¹æ³•有两ç§ï¼š" +"比较简å•çš„å°å·¥å…·å¯ä»¥æ‰©å±• [EditorSpatialGizmoPlugin],或者å¯ä»¥åˆ›å»ºæ–°çš„ " "[EditorSpatialGizmo] 类型。有关更多信æ¯ï¼Œè¯·å‚阅文档ä¸çš„æ•™ç¨‹ã€‚\n" "è¦ä½¿ç”¨ [EditorSpatialGizmoPlugin],请先用 [method EditorPlugin." "add_spatial_gizmo_plugin] 注册。" @@ -28348,13 +28434,13 @@ msgid "" "Override this method to define whether the gizmo can be hidden or not. " "Returns [code]true[/code] if not overridden." msgstr "" -"é‡å†™æ¤æ–¹æ³•以定义是å¦å¯ä»¥éšè— Gizmo。如果未覆盖,则返回 [code]true[/code]。" +"é‡å†™æ¤æ–¹æ³•以定义是å¦å¯ä»¥éšè—该å°å·¥å…·ã€‚如果未覆盖,则返回 [code]true[/code]。" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" "Override this method to commit gizmo handles. Called for this plugin's " "active gizmos." -msgstr "é‡å†™æ¤æ–¹æ³•以æäº¤ Gizmo 奿Ÿ„ã€‚è°ƒç”¨æ¤æ’件的活动辅助工具。" +msgstr "é‡å†™æ¤æ–¹æ³•以æäº¤å°å·¥å…·æ‰‹æŸ„。会为这个æ’件的活动å°å·¥å…·è¿›è¡Œè°ƒç”¨ã€‚" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" @@ -28405,13 +28491,13 @@ msgstr "" msgid "" "Override this method to provide gizmo's handle names. Called for this " "plugin's active gizmos." -msgstr "é‡å†™æ¤æ–¹æ³•以æä¾› Gizmo çš„å¥æŸ„åç§°ã€‚è°ƒç”¨æ¤æ’件的活动工具。" +msgstr "é‡å†™æ¤æ–¹æ³•以æä¾›å°å·¥å…·çš„æ‰‹æŸ„å称。会为这个æ’件的活动å°å·¥å…·è¿›è¡Œè°ƒç”¨ã€‚" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" "Gets actual value of a handle from gizmo. Called for this plugin's active " "gizmos." -msgstr "从 Gizmo 获å–奿Ÿ„çš„å®žé™…å€¼ã€‚è°ƒç”¨æ¤æ’件的活动工具。" +msgstr "从å°å·¥å…·èŽ·å–æ‰‹æŸ„的实际值。会为这个æ’件的活动å°å·¥å…·è¿›è¡Œè°ƒç”¨ã€‚" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" @@ -28426,7 +28512,7 @@ msgstr "" msgid "" "Override this method to provide the name that will appear in the gizmo " "visibility menu." -msgstr "é‡å†™æ¤æ–¹æ³•以æä¾›å°†å‡ºçŽ°åœ¨å·¥å…·å¯è§æ€§èœå•ä¸çš„å称。" +msgstr "é‡å†™æ¤æ–¹æ³•以æä¾›å°†å‡ºçŽ°åœ¨å°å·¥å…·å¯è§æ€§èœå•ä¸çš„å称。" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" @@ -28437,10 +28523,10 @@ msgid "" "overridden, this method will return [code]0[/code], which means custom " "gizmos will automatically override built-in gizmos." msgstr "" -"é‡å†™æ¤æ–¹æ³•å¯ä»¥è®¾ç½®å·¥å…·çš„优先级。值越高,优先级越高。如果具有较高优先级的工具" -"与å¦ä¸€ä¸ªå·¥å…·å‘生冲çªï¼Œåˆ™ä»…使用具有较高优先级的工具。\n" -"æ‰€æœ‰å†…ç½®ç¼–è¾‘å™¨å°æŽ§ä»¶å‡è¿”回 [code]-1[/code]优先级。如果未é‡å†™ï¼Œåˆ™æ¤æ–¹æ³•将返回 " -"[code]0[/code],这æ„味ç€è‡ªå®šä¹‰æŽ§ä»¶å°†è‡ªåŠ¨è¦†ç›–å†…ç½®æŽ§ä»¶ã€‚" +"é‡å†™æ¤æ–¹æ³•å¯ä»¥è®¾ç½®å°å·¥å…·çš„优先级。值越高,优先级越高。如果具有较高优先级的å°" +"工具与å¦ä¸€ä¸ªå°å·¥å…·å‘生冲çªï¼Œåˆ™ä»…使用具有较高优先级的å°å·¥å…·ã€‚\n" +"所有内置编辑器å°å·¥å…·å‡è¿”回 [code]-1[/code] 优先级。如果未é‡å†™ï¼Œåˆ™æ¤æ–¹æ³•将返" +"回 [code]0[/code],这æ„味ç€è‡ªå®šä¹‰æŽ§ä»¶å°†è‡ªåŠ¨è¦†ç›–å†…ç½®å°å·¥å…·ã€‚" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" @@ -28449,34 +28535,36 @@ msgid "" "if it returns [code]true[/code] the node gets a generic [EditorSpatialGizmo] " "assigned and is added to this plugin's list of active gizmos." msgstr "" -"覆盖这个方法æ¥å®šä¹‰å“ªäº›ç©ºé—´èŠ‚ç‚¹æœ‰è¿™ä¸ªæ’ä»¶çš„ gizmo。æ¯å½“一个 [Spatial] 节点被添" -"åŠ åˆ°ä¸€ä¸ªåœºæ™¯ä¸æ—¶ï¼Œè¿™ä¸ªæ–¹æ³•就会被调用,如果它返回 [code]true[/code],该节点就" -"会被分é…一个通用的 [EditorSpatialGizmo]ï¼Œå¹¶è¢«æ·»åŠ åˆ°è¿™ä¸ªæ’件的激活 Gizmos列表" -"ä¸ã€‚" +"覆盖这个方法æ¥å®šä¹‰å“ªäº› Spatial 节点有这个æ’ä»¶çš„å°å·¥å…·ã€‚æ¯å½“一个 [Spatial] 节" +"ç‚¹è¢«æ·»åŠ åˆ°ä¸€ä¸ªåœºæ™¯ä¸æ—¶ï¼Œè¿™ä¸ªæ–¹æ³•就会被调用,如果它返回 [code]true[/code],该" +"节点就会被分é…一个通用的 [EditorSpatialGizmo]ï¼Œå¹¶è¢«æ·»åŠ åˆ°è¿™ä¸ªæ’件的激活å°å·¥å…·" +"列表ä¸ã€‚" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" "Gets whether a handle is highlighted or not. Called for this plugin's active " "gizmos." -msgstr "获å–奿Ÿ„是å¦é«˜äº®æ˜¾ç¤ºã€‚è°ƒç”¨æ¤æ’件的活动工具。" +msgstr "èŽ·å–æ‰‹æŸ„是å¦é«˜äº®æ˜¾ç¤ºã€‚会为这个æ’件的活动å°å·¥å…·è¿›è¡Œè°ƒç”¨ã€‚" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" "Override this method to define whether a Spatial with this gizmo should be " "selectable even when the gizmo is hidden." -msgstr "è¦†ç›–æ¤æ–¹æ³•,以定义具有æ¤å·¥å…·çš„空间是å¦åº”该在工具被éšè—时也å¯ä»¥è¢«é€‰æ‹©ã€‚" +msgstr "" +"è¦†ç›–æ¤æ–¹æ³•,以定义具有æ¤å°å·¥å…·çš„ Spatial 是å¦åº”该在å°å·¥å…·è¢«éšè—时也å¯ä»¥è¢«é€‰" +"择。" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" "Callback to redraw the provided gizmo. Called for this plugin's active " "gizmos." -msgstr "å›žè°ƒä»¥é‡æ–°ç»˜åˆ¶æä¾›çš„å·¥å…·ã€‚è°ƒç”¨æ¤æ’件的活动工具。" +msgstr "用以é‡ç»˜ç»™å®šçš„å°å·¥å…·çš„回调。会为这个æ’件的活动å°å·¥å…·è¿›è¡Œè°ƒç”¨ã€‚" #: doc/classes/EditorSpatialGizmoPlugin.xml msgid "" "Update the value of a handle after it has been updated. Called for this " "plugin's active gizmos." -msgstr "æ›´æ–°å¥æŸ„åŽæ›´æ–°å…¶å€¼ã€‚è°ƒç”¨æ¤æ’件的活动工具。" +msgstr "æ›´æ–°æ‰‹æŸ„åŽæ›´æ–°å…¶å€¼ã€‚会为这个æ’件的活动å°å·¥å…·è¿›è¡Œè°ƒç”¨ã€‚" #: doc/classes/EditorSpinSlider.xml msgid "Godot editor's control for editing numeric values." @@ -28902,8 +28990,8 @@ msgid "" "here.\n" "[/codeblock]" msgstr "" -"返回自引擎åˆå§‹åŒ–以æ¥çš„æ€»å¸§æ•°ï¼Œåœ¨æ¯ä¸ª[b]空闲帧[/b]éƒ½ä¼šè¿›è¡Œï¼Œæ— è®ºæ¸²æŸ“å¾ªçŽ¯æ˜¯å¦è¢«" -"å¯ç”¨ã€‚å‚阅 [method get_frames_drawn] å’Œ [method get_physics_frames]。\n" +"返回自引擎åˆå§‹åŒ–以æ¥çš„æ€»å¸§æ•°ï¼Œæ— 论是å¦å¯ç”¨æ¸²æŸ“循环,æ¯ä¸ª[b]空闲帧[/b]都会增" +"长。å¦è¯·å‚阅 [method get_frames_drawn] å’Œ [method get_physics_frames]。\n" "[method get_idle_frames] å¯ä»¥ç”¨æ¥å‡å°‘è¿è¡Œé«˜æ¶ˆè€—逻辑的次数,而ä¸éœ€è¦ä¾é " "[Timer]。\n" "[codeblock]\n" @@ -29143,14 +29231,14 @@ msgstr "" "ä¿¡æ¯å¯èƒ½ä¼šè¢«éšè—,å³ä½¿å®ƒä»¬æ˜¯ç”±å…¶ä»–脚本触å‘。如果在 [code]tool[/code] è„šæœ¬ä¸æŠŠ" "这个设置为 [code]false[/code],这也会影å“到编辑器本身。在确ä¿é”™è¯¯ä¿¡æ¯è¢«å¯ç”¨ä¹‹" "å‰ï¼Œ[i]请勿[/i]æŠ¥å‘Šé”™è¯¯ï¼ˆå› ä¸ºé»˜è®¤æƒ…å†µä¸‹æ˜¯ä¼šçš„ï¼‰ã€‚\n" -"[b]注æ„:[/b]当从编辑器è¿è¡Œä¸€ä¸ªé¡¹ç›®æ—¶ï¼Œè¿™ä¸ªå±žæ€§ä¸å½±å“编辑器的错误选项å¡ã€‚" +"[b]注æ„:[/b]从编辑器è¿è¡Œé¡¹ç›®æ—¶ï¼Œè¿™ä¸ªå±žæ€§ä¸å½±å“编辑器的错误选项å¡ã€‚" #: doc/classes/Engine.xml msgid "" "The desired frames per second. If the hardware cannot keep up, this setting " "may not be respected. A value of 0 means no limit." msgstr "" -"所需的æ¯ç§’å¸§æ•°ã€‚å¦‚æžœç¡¬ä»¶æ— æ³•è·Ÿä¸Šï¼Œåˆ™å¯èƒ½ä¸éµå®ˆæ¤è®¾ç½®ã€‚值为0表示没有é™åˆ¶ã€‚" +"所需的æ¯ç§’å¸§æ•°ã€‚å¦‚æžœç¡¬ä»¶æ— æ³•è·Ÿä¸Šï¼Œåˆ™å¯èƒ½ä¸éµå®ˆæ¤è®¾ç½®ã€‚值为 0 表示没有é™åˆ¶ã€‚" #: doc/classes/Engine.xml msgid "" @@ -29863,7 +29951,7 @@ msgid "" msgstr "" "ä½¿ç”¨è‡ªå®šä¹‰çš„é€æ˜Žé¢œè‰²æ¸…除背景,并å…许定义天空的阴影和åå°„ã€‚è¿™ç§æ¨¡å¼æ¯” " "[constant BG_SKY] ç¨å¿«ï¼Œåº”是在å¯ä»¥çœ‹åˆ°å射,但天空本身ä¸å¯è§çš„场景ä¸çš„首选" -"(例如,自上而下的相机)。" +"(例如俯视角相机)。" #: doc/classes/Environment.xml msgid "Displays a [CanvasLayer] in the background." @@ -30830,7 +30918,7 @@ msgid "" "will change the window title to \"Open a File\")." msgstr "" "如果为 [code]true[/code],更改 [code]Mode[/code] å±žæ€§å°†ç›¸åº”åœ°è®¾ç½®çª—å£æ ‡é¢˜ï¼ˆä¾‹" -"如,将模å¼è®¾ç½®ä¸º [constant MODE_OPEN_FILE] ä¼šå°†çª—å£æ ‡é¢˜æ›´æ”¹ä¸ºâ€œæ‰“开文件â€ï¼‰ã€‚" +"如将模å¼è®¾ç½®ä¸º [constant MODE_OPEN_FILE] ä¼šå°†çª—å£æ ‡é¢˜æ›´æ”¹ä¸ºâ€œæ‰“开文件â€ï¼‰ã€‚" #: doc/classes/FileDialog.xml msgid "If [code]true[/code], the dialog will show hidden files." @@ -36983,7 +37071,7 @@ msgstr "原始纹ç†ï¼ˆåœ¨åŽ‹ç¼©å‰ï¼‰ä½¿ç”¨ sRGB 空间。" msgid "" "Source texture (before compression) is a normal texture (e.g. it can be " "compressed into two channels)." -msgstr "原始纹ç†ï¼ˆåœ¨åŽ‹ç¼©å‰ï¼‰æ˜¯æ³•线纹ç†ï¼ˆä¾‹å¦‚,å¯ä»¥åŽ‹ç¼©ä¸ºä¸¤ä¸ªé€šé“)。" +msgstr "原始纹ç†ï¼ˆåœ¨åŽ‹ç¼©å‰ï¼‰æ˜¯æ³•线纹ç†ï¼ˆä¾‹å¦‚å¯ä»¥åŽ‹ç¼©ä¸ºä¸¤ä¸ªé€šé“)。" #: doc/classes/Image.xml msgid "Source texture (before compression) is a [TextureLayered]." @@ -41441,11 +41529,14 @@ msgstr "" "如果为 [code]true[/code]ï¼Œåˆ™å…‰çº¿çš„æ•ˆæžœä¼šé€†è½¬ï¼Œä½¿åŒºåŸŸå˜æš—并投射明亮的阴影。" #: doc/classes/Light.xml +#, fuzzy msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" "ç¯å…‰çš„大å°ï¼Œä½¿ç”¨ Godot çš„å•ä½ã€‚åªåœ¨çƒ˜ç„™çš„光照贴图ä¸è€ƒè™‘,并且åªåœ¨ [member " "light_bake_mode] 被设置为 [constant BAKE_ALL] æ—¶è€ƒè™‘ã€‚å¢žåŠ è¿™ä¸ªå€¼ä¼šä½¿é˜´å½±çœ‹èµ·" @@ -43128,8 +43219,8 @@ msgstr "" "点击åŽä¼šå¼¹å‡º [PopupMenu] 的特殊按钮。\n" "å¯ä»¥ä½¿ç”¨ [code]get_popup().add_item(\"èœå•项目åç§°\")[/code] 在这个 " "[PopupMenu] ä¸åˆ›å»ºæ–°é¡¹ç›®ã€‚ä½ ä¹Ÿå¯ä»¥ç›´æŽ¥ä»Žç¼–辑器ä¸åˆ›å»ºå®ƒä»¬ã€‚è¦åšåˆ°è¿™ç‚¹ï¼Œé€‰æ‹© " -"[MenuButton] 节点,然åŽåœ¨ 2D 编辑器顶部的工具æ ä¸ï¼Œç‚¹å‡»[b]项目[/b],然åŽç‚¹å‡»" -"弹出窗å£ä¸çš„[b]æ·»åŠ [/b]ã€‚ä½ å°†èƒ½å¤Ÿèµ‹äºˆæ¯ä¸ªé¡¹ç›®æ–°çš„属性。\n" +"[MenuButton] 节点,然åŽåœ¨ 2D 编辑器顶部的工具æ ä¸ï¼Œç‚¹å‡»[b]列表项[/b],然åŽç‚¹" +"击弹出窗å£ä¸çš„[b]æ·»åŠ [/b]ã€‚ä½ å°†èƒ½å¤Ÿèµ‹äºˆæ¯ä¸ªé¡¹ç›®æ–°çš„属性。\n" "与该节点相关的常用属性和方法请å‚阅 [BaseButton]。" #: doc/classes/MenuButton.xml doc/classes/OptionButton.xml @@ -43286,23 +43377,23 @@ msgstr "" msgid "" "Returns all the vertices that make up the faces of the mesh. Each three " "vertices represent one triangle." -msgstr "è¿”å›žæ‰€æœ‰åœ¨è¿™ä¸ªç½‘æ ¼ä¸ï¼Œæž„æˆé¢çš„顶点。æ¯ä¸‰ä¸ªé¡¶ç‚¹ä»£è¡¨ä¸€ä¸ªä¸‰è§’形。" +msgstr "è¿”å›žç½‘æ ¼ä¸æ‰€æœ‰æž„æˆé¢çš„顶点。æ¯ä¸‰ä¸ªé¡¶ç‚¹ä»£è¡¨ä¸€ä¸ªä¸‰è§’形。" #: doc/classes/Mesh.xml msgid "Returns the amount of surfaces that the [Mesh] holds." -msgstr "è¿”å›žè¯¥ç½‘æ ¼çš„é¢æ•°ã€‚" +msgstr "返回该 [Mesh] ä¸è¡¨é¢çš„个数。" #: doc/classes/Mesh.xml msgid "" "Returns the arrays for the vertices, normals, uvs, etc. that make up the " "requested surface (see [method ArrayMesh.add_surface_from_arrays])." msgstr "" -"返回所有组æˆé¢æ‰€éœ€çš„东西构æˆçš„æ•°ç»„的数组,例如顶点,法å‘,UVç‰ã€‚(å‚阅" -"[method ArrayMesh.add_surface_from_arrays])。" +"返回构æˆè¯·æ±‚表é¢çš„é¡¶ç‚¹ã€æ³•线ã€UV ç‰æ•°ç»„ã€‚ï¼ˆè§ [method ArrayMesh." +"add_surface_from_arrays])。" #: doc/classes/Mesh.xml msgid "Returns the blend shape arrays for the requested surface." -msgstr "返回所需é¢çš„æ··åˆå½¢çŠ¶æ•°ç»„ã€‚" +msgstr "返回请求表é¢çš„æ··åˆå½¢çŠ¶æ•°ç»„ã€‚" #: doc/classes/Mesh.xml msgid "" @@ -43326,31 +43417,31 @@ msgstr "" #: doc/classes/Mesh.xml msgid "Render array as points (one vertex equals one point)." -msgstr "将顶点数组渲染为点阵(一个顶点对应一个点阵ä¸çš„点)。" +msgstr "将数组渲染为点(一个顶点对应一个点)。" #: doc/classes/Mesh.xml msgid "Render array as lines (every two vertices a line is created)." -msgstr "将顶点组渲染为线æ¡ï¼ˆæ¯ä¸¤ä¸ªé¡¶ç‚¹ä¹‹é—´åˆ›å»ºä¸€æ¡è¿žçº¿ï¼‰ã€‚" +msgstr "将数组渲染为线(æ¯ä¸¤ä¸ªé¡¶ç‚¹åˆ›å»ºä¸€æ¡è¿žçº¿ï¼‰ã€‚" #: doc/classes/Mesh.xml msgid "Render array as line strip." -msgstr "将顶点组渲染为线æ¡ã€‚" +msgstr "将数组渲染为线æ¡ã€‚" #: doc/classes/Mesh.xml msgid "Render array as line loop (like line strip, but closed)." -msgstr "将数组渲染æˆçº¿çŠ¶çŽ¯ï¼ˆåƒçº¿æ¡ï¼Œä½†æ˜¯å°é—的)。" +msgstr "将数组渲染为线环(类似线æ¡ï¼Œä½†æ˜¯å°é—的)。" #: doc/classes/Mesh.xml msgid "Render array as triangles (every three vertices a triangle is created)." -msgstr "将顶点组渲染为三角形(æ¯ä¸‰ä¸ªç›¸é‚»é¡¶ç‚¹åˆ›å»ºä¸€ä¸ªä¸‰è§’形)。" +msgstr "将数组渲染为三角形(æ¯ä¸‰ä¸ªé¡¶ç‚¹åˆ›å»ºä¸€ä¸ªä¸‰è§’形)。" #: doc/classes/Mesh.xml msgid "Render array as triangle strips." -msgstr "将顶点组渲染为三角形线框。" +msgstr "将数组渲染为三角形æ¡ã€‚" #: doc/classes/Mesh.xml msgid "Render array as triangle fans." -msgstr "将数组渲染æˆä¸‰è§’形扇形。" +msgstr "将数组渲染为三角形扇。" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Blend shapes are normalized." @@ -43358,46 +43449,45 @@ msgstr "æ··åˆå½¢çŠ¶æ˜¯è¢«å½’ä¸€åŒ–äº†çš„ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Blend shapes are relative to base weight." -msgstr "æ··åˆå½¢çŠ¶ç›¸å¯¹äºŽåŸºç¡€çš„æƒé‡ã€‚" +msgstr "æ··åˆå½¢çŠ¶æ˜¯ç›¸å¯¹äºŽåŸºç¡€çš„æƒé‡ã€‚" #: doc/classes/Mesh.xml msgid "" "Mesh array contains vertices. All meshes require a vertex array so this " "should always be present." -msgstr "" -"ç½‘æ ¼ç»„åŒ…å«è®¸å¤šé¡¶ç‚¹ã€‚æ¯ä¸€ä¸ªç½‘æ ¼éƒ½éœ€è¦ä¸€ä¸ªé¡¶ç‚¹æ•°ç»„,所以这应该æŒä¹…化储å˜ã€‚" +msgstr "ç½‘æ ¼æ•°ç»„åŒ…å«é¡¶ç‚¹ã€‚æ‰€æœ‰ç½‘æ ¼éƒ½éœ€è¦æœ‰é¡¶ç‚¹æ•°ç»„,所以这应该始终å˜åœ¨ã€‚" #: doc/classes/Mesh.xml msgid "Mesh array contains normals." -msgstr "ç½‘æ ¼ç»„åŒ…å«æ³•线。" +msgstr "ç½‘æ ¼æ•°ç»„åŒ…å«æ³•线。" #: doc/classes/Mesh.xml msgid "Mesh array contains tangents." -msgstr "ç½‘æ ¼ç»„åŒ…å«åˆ‡å‘。" +msgstr "ç½‘æ ¼æ•°ç»„åŒ…å«åˆ‡çº¿ã€‚" #: doc/classes/Mesh.xml msgid "Mesh array contains colors." -msgstr "ç½‘æ ¼ç»„åŒ…å«é¢œè‰²ã€‚" +msgstr "ç½‘æ ¼æ•°ç»„åŒ…å«é¢œè‰²ã€‚" #: doc/classes/Mesh.xml msgid "Mesh array contains UVs." -msgstr "ç½‘æ ¼ç»„åŒ…å« UV。" +msgstr "ç½‘æ ¼æ•°ç»„åŒ…å« UV。" #: doc/classes/Mesh.xml msgid "Mesh array contains second UV." -msgstr "ç½‘æ ¼ç»„åŒ…å«ç¬¬äºŒå¥— UV。" +msgstr "ç½‘æ ¼æ•°ç»„åŒ…å«ç¬¬äºŒå¥— UV。" #: doc/classes/Mesh.xml msgid "Mesh array contains bones." -msgstr "ç½‘æ ¼ç»„åŒ…å«éª¨éª¼ã€‚" +msgstr "ç½‘æ ¼æ•°ç»„åŒ…å«éª¨éª¼ã€‚" #: doc/classes/Mesh.xml msgid "Mesh array contains bone weights." -msgstr "ç½‘æ ¼ç»„åŒ…å«éª¨éª¼æƒé‡ã€‚" +msgstr "ç½‘æ ¼æ•°ç»„åŒ…å«éª¨éª¼æƒé‡ã€‚" #: doc/classes/Mesh.xml msgid "Mesh array uses indices." -msgstr "ç½‘æ ¼ç»„ä½¿ç”¨ç´¢å¼•ã€‚" +msgstr "ç½‘æ ¼æ•°ç»„ä½¿ç”¨ç´¢å¼•ã€‚" #: doc/classes/Mesh.xml msgid "" @@ -43411,11 +43501,11 @@ msgstr "ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰é¡¶ç‚¹æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) normal array." -msgstr "曾ç»ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰æ³•呿•°ç»„çš„æ ‡å¿—ã€‚" +msgstr "ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰æ³•呿•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) tangent array." -msgstr "曾ç»ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰åˆ‡å‘æ•°ç»„çš„æ ‡å¿—ã€‚" +msgstr "ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰åˆ‡çº¿æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml msgid "" @@ -43424,16 +43514,19 @@ msgid "" "unsigned integers. This will clamp overbright colors to [code]Color(1, 1, 1, " "1)[/code] and reduce colors' precision." msgstr "" +"ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰é¢œè‰²æ•°ç»„çš„æ ‡å¿—ã€‚\n" +"[b]注æ„:[/b]如果å¯ç”¨è¿™ä¸ªæ ‡å¿—,顶点颜色会作为 8 使— ç¬¦å·æ•´æ•°å˜å‚¨ã€‚这会导致过" +"亮颜色被钳制到 [code]Color(1, 1, 1, 1)[/code],é™ä½Žé¢œè‰²çš„精度。" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed (half float) UV coordinates array." -msgstr "æ›¾ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰UV åæ ‡æ•°ç»„çš„æ ‡å¿—ã€‚" +msgstr "ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰UV åæ ‡æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "" "Flag used to mark a compressed (half float) UV coordinates array for the " "second UV coordinates." -msgstr "æ›¾ç”¨äºŽæ ‡è®°ç¬¬äºŒå¥— UV åæ ‡çš„压缩(åŠç²¾åº¦æµ®ç‚¹ï¼‰UV åæ ‡æ•°ç»„çš„æ ‡å¿—ã€‚" +msgstr "ç”¨äºŽæ ‡è®°ç¬¬äºŒå¥— UV åæ ‡çš„压缩(åŠç²¾åº¦æµ®ç‚¹ï¼‰UV åæ ‡æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed bone array." @@ -43445,11 +43538,11 @@ msgstr "ç”¨äºŽæ ‡è®°åŽ‹ç¼©ï¼ˆåŠç²¾åº¦æµ®ç‚¹ï¼‰æƒé‡æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark a compressed index array." -msgstr "æ›¾ç”¨äºŽæ ‡è®°åŽ‹ç¼©ç´¢å¼•æ•°ç»„çš„æ ‡å¿—ã€‚" +msgstr "ç”¨äºŽæ ‡è®°åŽ‹ç¼©ç´¢å¼•æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark that the array contains 2D vertices." -msgstr "æ›¾ç”¨äºŽæ ‡è®°åŒ…å« 2D é¡¶ç‚¹çš„æ•°ç»„çš„æ ‡å¿—ã€‚" +msgstr "ç”¨äºŽæ ‡è®°åŒ…å« 2D é¡¶ç‚¹çš„æ•°ç»„çš„æ ‡å¿—ã€‚" #: doc/classes/Mesh.xml doc/classes/VisualServer.xml msgid "Flag used to mark that the array uses 16-bit bones instead of 8-bit." @@ -43462,7 +43555,6 @@ msgid "" msgstr "æ ‡å¿—ç”¨äºŽæ ‡è®°æ•°ç»„ä½¿ç”¨æ³•çº¿å’Œåˆ‡çº¿å‘é‡çš„å…«é¢è¡¨ç¤ºæ³•ï¼Œè€Œä¸æ˜¯ç¬›å¡å°”å¼ã€‚" #: doc/classes/Mesh.xml -#, fuzzy msgid "" "Used to set flags [constant ARRAY_COMPRESS_VERTEX], [constant " "ARRAY_COMPRESS_NORMAL], [constant ARRAY_COMPRESS_TANGENT], [constant " @@ -43477,7 +43569,10 @@ msgstr "" "ARRAY_COMPRESS_NORMAL]ã€[constant ARRAY_COMPRESS_TANGENT]ã€[constant " "ARRAY_COMPRESS_COLOR]ã€[constant ARRAY_COMPRESS_TEX_UV]ã€[constant " "ARRAY_COMPRESS_TEX_UV2]ã€[constant ARRAY_COMPRESS_WEIGHTS]ã€[constant " -"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] 。" +"ARRAY_FLAG_USE_OCTAHEDRAL_COMPRESSION] 。\n" +"[b]注æ„:[/b]å› ä¸ºè¿™ä¸ªæ ‡å¿—ä¼šå¯ç”¨ [constant ARRAY_COMPRESS_COLOR],所以顶点颜色" +"会作为 8 使— ç¬¦å·æ•´æ•°å˜å‚¨ã€‚这会导致过亮颜色被钳制到 [code]Color(1, 1, 1, 1)[/" +"code],é™ä½Žé¢œè‰²çš„精度。" #: doc/classes/Mesh.xml msgid "Array of vertices." @@ -43489,7 +43584,7 @@ msgstr "法线数组。" #: doc/classes/Mesh.xml msgid "Array of tangents as an array of floats, 4 floats per tangent." -msgstr "åˆ‡å‘æ•°ç»„。æ¯ä¸€ä¸ªåˆ‡å‘æ•°æ®ç”±å››ä¸ª float å˜é‡æè¿°ã€‚" +msgstr "åˆ‡çº¿æ•°ç»„ï¼Œæ˜¯æµ®ç‚¹æ•°æ•°ç»„ï¼Œæ¯ 4 个浮点数表示一æ¡åˆ‡çº¿ã€‚" #: doc/classes/Mesh.xml msgid "Array of colors." @@ -43505,7 +43600,7 @@ msgstr "第二套 UV åæ ‡æ•°ç»„。" #: doc/classes/Mesh.xml msgid "Array of bone data." -msgstr "骨骼数æ®çš„æ•°ç»„。" +msgstr "éª¨éª¼æ•°æ®æ•°ç»„。" #: doc/classes/Mesh.xml msgid "Array of weights." @@ -43517,7 +43612,7 @@ msgstr "索引数组。" #: doc/classes/MeshDataTool.xml msgid "Helper tool to access and edit [Mesh] data." -msgstr "用于帮助编辑和使用 [Mesh] ç½‘æ ¼æ•°æ®çš„工具。" +msgstr "用于访问和编辑 [Mesh] æ•°æ®çš„辅助工具。" #: doc/classes/MeshDataTool.xml msgid "" @@ -43587,7 +43682,7 @@ msgstr "å°†å½“å‰ MeshDataTool 䏿‰€æœ‰çš„æ•°æ®å…¨éƒ¨æ¸…除。" #: doc/classes/MeshDataTool.xml msgid "Adds a new surface to specified [Mesh] with edited data." -msgstr "使用编辑åŽçš„æ•°æ®ï¼Œå‘特定的[Mesh]䏿·»åŠ ä¸€ä¸ªæ–°çš„é¢ã€‚" +msgstr "使用编辑åŽçš„æ•°æ®ï¼Œå‘指定的 [Mesh] 䏿·»åŠ ä¸€ä¸ªæ–°çš„è¡¨é¢ã€‚" #: doc/classes/MeshDataTool.xml msgid "" @@ -43595,11 +43690,11 @@ msgid "" "Requires [Mesh] with primitive type [constant Mesh.PRIMITIVE_TRIANGLES]." msgstr "" "使用给定 [Mesh] çš„æŒ‡å®šè¡¨é¢æ¥å¡«å…… MeshDataTool 的数æ®ã€‚\n" -"è¦æ±‚ [Mesh] 具有基本类型 [constant Mesh.PRIMITIVE_TRIANGLES]。" +"è¦æ±‚ [Mesh] 的图元类型为 [constant Mesh.PRIMITIVE_TRIANGLES]。" #: doc/classes/MeshDataTool.xml msgid "Returns the number of edges in this [Mesh]." -msgstr "返回这个[Mesh]的边数。" +msgstr "返回这个 [Mesh] 的边数。" #: doc/classes/MeshDataTool.xml msgid "Returns array of faces that touch given edge." @@ -43656,15 +43751,15 @@ msgid "" "ARRAY_FORMAT_NORMAL] is [code]2[/code].\n" "See [enum ArrayMesh.ArrayFormat] for a list of format flags." msgstr "" -"返回 [Mesh] çš„æ ¼å¼ï¼Œè¯¥æ ¼å¼æ˜¯ç”± [Mesh] æ ¼å¼æ ‡è¯†ç»„åˆè€Œæˆçš„æ•´æ•°ã€‚ä¾‹å¦‚ï¼Œä¸€ä¸ªåŒæ—¶" -"包å«é¡¶ç‚¹å’Œæ³•çº¿çš„ç½‘æ ¼å°†è¿”å›ž [code]3[/code]æ ¼å¼ï¼Œå› 为 [constant ArrayMesh." -"ARRAY_FORMAT_VERTEX] = [code]1[/code],[constant ArrayMesh." -"ARRAY_FORMAT_NORMAL] = [code]2[/code]。\n" -"å‚阅 [enum ArrayMesh.ArrayFormat] çš„æ ¼å¼æ ‡è¯†åˆ—表。" +"返回该 [Mesh] çš„æ ¼å¼ï¼Œè¯¥æ ¼å¼æ˜¯ç”± [Mesh] æ ¼å¼æ ‡è¯†ç»„åˆè€Œæˆçš„æ•´æ•°ã€‚例如,一个åŒ" +"时包å«é¡¶ç‚¹å’Œæ³•çº¿çš„ç½‘æ ¼è¿”å›žçš„æ ¼å¼æ˜¯ [code]3[/code]ï¼Œå› ä¸º [constant ArrayMesh." +"ARRAY_FORMAT_VERTEX] 是 [code]1[/code] 而 [constant ArrayMesh." +"ARRAY_FORMAT_NORMAL] 是 [code]2[/code]。\n" +"æ ¼å¼æ ‡å¿—åˆ—è¡¨è§ [enum ArrayMesh.ArrayFormat]。" #: doc/classes/MeshDataTool.xml msgid "Returns the material assigned to the [Mesh]." -msgstr "返回分é…ç»™ [Mesh] çš„æè´¨ã€‚" +msgstr "返回分é…给该 [Mesh] çš„æè´¨ã€‚" #: doc/classes/MeshDataTool.xml msgid "Returns the vertex at given index." @@ -43672,7 +43767,7 @@ msgstr "返回给定索引处的顶点。" #: doc/classes/MeshDataTool.xml msgid "Returns the bones of the given vertex." -msgstr "返回给定顶点的骨架。" +msgstr "返回给定顶点的骨骼。" #: doc/classes/MeshDataTool.xml msgid "Returns the color of the given vertex." @@ -43700,7 +43795,7 @@ msgstr "返回给定顶点的法线。" #: doc/classes/MeshDataTool.xml msgid "Returns the tangent of the given vertex." -msgstr "返回给定顶点的æ£åˆ‡å€¼ã€‚" +msgstr "返回给定顶点的切线。" #: doc/classes/MeshDataTool.xml msgid "Returns the UV of the given vertex." @@ -43732,7 +43827,7 @@ msgstr "设置给定顶点的ä½ç½®ã€‚" #: doc/classes/MeshDataTool.xml msgid "Sets the bones of the given vertex." -msgstr "设置给定顶点的骨架。" +msgstr "设置给定顶点的骨骼。" #: doc/classes/MeshDataTool.xml msgid "Sets the color of the given vertex." @@ -43805,7 +43900,7 @@ msgid "" "calculated from the mesh geometry. It's mainly used for testing." msgstr "" "这个辅助工具创建 [MeshInstance] å节点,在æ¯ä¸ªé¡¶ç‚¹éƒ½æœ‰æ ¹æ®ç½‘æ ¼å‡ ä½•å½¢çŠ¶è®¡ç®—çš„" -"辅助线框。其主è¦ç”¨äºŽæµ‹è¯•。" +"å°å·¥å…·ã€‚其主è¦ç”¨äºŽæµ‹è¯•。" #: doc/classes/MeshInstance.xml msgid "" @@ -43954,7 +44049,7 @@ msgstr "" #: doc/classes/MeshInstance2D.xml msgid "The [Mesh] that will be drawn by the [MeshInstance2D]." -msgstr "[Mesh] 将由 [MeshInstance2D] 绘制。" +msgstr "该 [MeshInstance2D] 绘制的 [Mesh]。" #: doc/classes/MeshInstance2D.xml doc/classes/MultiMeshInstance2D.xml msgid "" @@ -44009,15 +44104,15 @@ msgstr "" #: doc/classes/MeshLibrary.xml msgid "Returns the first item with the given name." -msgstr "返回第一个指定åç§°çš„ item。" +msgstr "返回第一个具有指定å称的项。" #: doc/classes/MeshLibrary.xml msgid "Returns the list of item IDs in use." -msgstr "返回æ£åœ¨ä½¿ç”¨çš„ item id 列表。" +msgstr "返回æ£åœ¨ä½¿ç”¨çš„项目 ID 列表。" #: doc/classes/MeshLibrary.xml msgid "Returns the item's mesh." -msgstr "返回该 item çš„ç½‘æ ¼æ¨¡åž‹ã€‚" +msgstr "è¿”å›žè¯¥é¡¹ç›®çš„ç½‘æ ¼ã€‚" #: doc/classes/MeshLibrary.xml msgid "Returns the transform applied to the item's mesh." @@ -44025,7 +44120,7 @@ msgstr "è¿”å›žåº”ç”¨åˆ°é¡¹ç›®ç½‘æ ¼çš„å˜æ¢ã€‚" #: doc/classes/MeshLibrary.xml msgid "Returns the item's name." -msgstr "返回项的å称。" +msgstr "返回该项的å称。" #: doc/classes/MeshLibrary.xml msgid "Returns the item's navigation mesh." @@ -44082,7 +44177,7 @@ msgstr "" #: doc/classes/MeshLibrary.xml msgid "Sets the item's navigation mesh." -msgstr "设置æ¤é¡¹çš„å¯¼èˆªç½‘æ ¼ã€‚" +msgstr "è®¾ç½®è¯¥é¡¹çš„å¯¼èˆªç½‘æ ¼ã€‚" #: doc/classes/MeshLibrary.xml msgid "Sets the transform to apply to the item's navigation mesh." @@ -44117,7 +44212,7 @@ msgstr "" #: doc/classes/MeshTexture.xml msgid "Sets the base texture that the Mesh will use to draw." -msgstr "è®¾ç½®ç½‘æ ¼ç”¨æ¥ç»˜åˆ¶çš„基础纹ç†ã€‚" +msgstr "设置该 Mesh 用æ¥ç»˜åˆ¶çš„基础纹ç†ã€‚" #: doc/classes/MeshTexture.xml msgid "Sets the size of the image, needed for reference." @@ -44211,7 +44306,7 @@ msgstr "显示器与设备内部镜片之间的è·ç¦»ï¼Œå•ä½ä¸ºåŽ˜ç±³ã€‚" #: modules/mobile_vr/doc_classes/MobileVRInterface.xml msgid "The width of the display in centimeters." -msgstr "显示器的宽度,以厘米为å•ä½ã€‚" +msgstr "显示器的宽度,å•ä½ä¸ºåŽ˜ç±³ã€‚" #: modules/mobile_vr/doc_classes/MobileVRInterface.xml msgid "" @@ -44244,7 +44339,7 @@ msgid "" "performance." msgstr "" "è¿‡é‡‡æ ·è®¾ç½®ã€‚ç”±äºŽé•œå¤´å¤±çœŸï¼Œæˆ‘ä»¬å¿…é¡»ä»¥æ¯”å±å¹•è‡ªç„¶åˆ†è¾¨çŽ‡æ›´é«˜çš„è´¨é‡æ¸²æŸ“我们的缓冲" -"区。介于1.5å’Œ2.0之间的值通常å¯ä»¥æä¾›è‰¯å¥½çš„结果,但会牺牲性能。" +"区。介于 1.5 å’Œ 2.0 之间的值通常å¯ä»¥æä¾›è‰¯å¥½çš„结果,但会牺牲性能。" #: doc/classes/MultiMesh.xml msgid "Provides high-performance mesh instancing." @@ -44281,7 +44376,7 @@ msgstr "" #: doc/classes/MultiMesh.xml msgid "Gets a specific instance's color." -msgstr "获å–一个特定实例的颜色。" +msgstr "获å–特定实例的颜色。" #: doc/classes/MultiMesh.xml msgid "Returns the custom data that has been set for a specific instance." @@ -44289,7 +44384,7 @@ msgstr "返回已ç»ä¸ºç‰¹å®šå®žä¾‹è®¾ç½®çš„自定义数æ®ã€‚" #: doc/classes/MultiMesh.xml msgid "Returns the [Transform] of a specific instance." -msgstr "返回一个特定实例的 [Transform]。" +msgstr "返回特定实例的 [Transform]。" #: doc/classes/MultiMesh.xml msgid "Returns the [Transform2D] of a specific instance." @@ -44423,7 +44518,7 @@ msgid "" "Limits the number of instances drawn, -1 draws all instances. Changing this " "does not change the sizes of the buffers." msgstr "" -"é™åˆ¶ç»˜åˆ¶çš„实例数é‡ï¼Œ-1会绘制所有的实例。改å˜è¿™ä¸€ç‚¹å¹¶ä¸æ”¹å˜ç¼“冲区的大å°ã€‚" +"é™åˆ¶ç»˜åˆ¶çš„实例数é‡ï¼Œ-1 会绘制所有的实例。改å˜è¿™ä¸€ç‚¹å¹¶ä¸æ”¹å˜ç¼“冲区的大å°ã€‚" #: doc/classes/MultiMesh.xml msgid "Use this when using 2D transforms." @@ -44501,7 +44596,7 @@ msgid "" msgstr "" "[MultiMeshInstance] 是特有的节点,用于基于 [MultiMesh] 资æºçš„ " "[GeometryInstance] 的实例。\n" -"è¿™å¯¹äºŽä¼˜åŒ–ç»™å®šç½‘æ ¼çš„å¤§é‡å®žä¾‹çš„æ¸²æŸ“是éžå¸¸æœ‰ç”¨çš„(例如,森林ä¸çš„æ ‘木或è‰ä¸›ï¼‰ã€‚" +"è¿™å¯¹äºŽä¼˜åŒ–ç»™å®šç½‘æ ¼çš„å¤§é‡å®žä¾‹çš„æ¸²æŸ“是éžå¸¸æœ‰ç”¨çš„(例如森林ä¸çš„æ ‘木或è‰ä¸›ï¼‰ã€‚" #: doc/classes/MultiMeshInstance.xml msgid "" @@ -45452,6 +45547,7 @@ msgid "3D agent used in navigation for collision avoidance." msgstr "在导航ä¸ç”¨äºŽé˜²æ’žçš„ 3D 代ç†ã€‚" #: doc/classes/NavigationAgent.xml +#, fuzzy msgid "" "3D agent that is used in navigation to reach a location while avoiding " "static and dynamic obstacles. The dynamic obstacles are avoided using RVO " @@ -45465,7 +45561,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" "导航ä¸ä½¿ç”¨çš„ 3D 代ç†ï¼Œå¯ä»¥åœ¨å‰å¾€æŸä¸ªä½ç½®æ—¶èº²é¿é™æ€å’ŒåЍæ€éšœç¢ç‰©ã€‚躲é¿åЍæ€éšœç¢" "物使用的是 RVO(Reciprocal Velocity Obstacles,相对速度障ç¢ç‰©ï¼‰é˜²æ’žç®—法。代ç†" @@ -45768,6 +45867,7 @@ msgid "2D agent used in navigation for collision avoidance." msgstr "在导航ä¸ç”¨äºŽé˜²æ’žçš„ 2D 代ç†ã€‚" #: doc/classes/NavigationAgent2D.xml +#, fuzzy msgid "" "2D agent that is used in navigation to reach a location while avoiding " "static and dynamic obstacles. The dynamic obstacles are avoided using RVO " @@ -45781,7 +45881,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" "导航ä¸ä½¿ç”¨çš„ 2D 代ç†ï¼Œå¯ä»¥åœ¨å‰å¾€æŸä¸ªä½ç½®æ—¶èº²é¿é™æ€å’ŒåЍæ€éšœç¢ç‰©ã€‚躲é¿åЍæ€éšœç¢" "物使用的是 RVO(Reciprocal Velocity Obstacles,相对速度障ç¢ç‰©ï¼‰é˜²æ’žç®—法。代ç†" @@ -46660,6 +46763,7 @@ msgid "Server interface for low-level 3D navigation access." msgstr "访问底层 3D 导航的æœåŠ¡å™¨æŽ¥å£ã€‚" #: doc/classes/NavigationServer.xml +#, fuzzy msgid "" "NavigationServer is the server responsible for all 3D navigation. It handles " "several objects, namely maps, regions and agents.\n" @@ -46680,6 +46784,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -46899,19 +47006,19 @@ msgid "" "code] is specified, the client will also listen to the given port; this is " "useful for some NAT traversal techniques." msgstr "" -"创建客户端,使用指定的[code]端å£[/code]连接到[code]地å€[/code]çš„æœåŠ¡å™¨ä¸Šã€‚ç»™" -"定的地å€éœ€è¦æ˜¯ä¸€ä¸ªå®Œå…¨åˆæ ¼çš„域å(例如,[code]\"www.example.com\"[/code])或" -"一个IPv4或IPv6æ ¼å¼çš„IP地å€ï¼ˆä¾‹å¦‚,[code]\"192.168.1.1\"[/code])。" -"[code]port[/code]是æœåŠ¡å™¨æ‰€ç›‘å¬çš„端å£ã€‚[code]in_bandwidth[/code]å’Œ" -"[code]out_bandwidth[/code]傿•°å¯ç”¨äºŽå°†ä¼ å…¥å’Œä¼ å‡ºçš„å¸¦å®½é™åˆ¶åœ¨ç»™å®šçš„å—节数/秒。" -"默认的0æ„å‘³ç€æ— é™çš„带宽。请注æ„,ENet会在对ç‰ä½“之间连接的特定一侧战略性地丢弃" -"æ•°æ®åŒ…,以确ä¿å¯¹ç‰ä½“的带宽ä¸è¢«æ·¹æ²¡ã€‚另宽傿•°ä¹Ÿå†³å®šäº†è¿žæŽ¥çš„窗å£å¤§å°ï¼Œå®ƒé™åˆ¶äº†" -"在任何给定时间内å¯èƒ½æ£åœ¨ä¼ 输的å¯é æ•°æ®åŒ…的数é‡ã€‚如果创建了一个客户端,返回" -"[constant OK];如果这个NetworkedMultiplayerENetå®žä¾‹å·²ç»æœ‰ä¸€ä¸ªå¼€æ”¾çš„连接(在这" -"ç§æƒ…å†µä¸‹ï¼Œä½ éœ€è¦å…ˆè°ƒç”¨[method close_connection]),返回[constant " -"ERR_CANT_CREATE];如果ä¸èƒ½åˆ›å»ºå®¢æˆ·ç«¯ï¼Œè¿”回[constant ERR_CANT_CREATE]。如果指" -"定了[code]client_port[/code],客户端也将监å¬ç»™å®šçš„端å£ï¼›è¿™å¯¹ä¸€äº›NAT穿越技术很" -"有用。" +"创建客户端,使用指定的 [code]port[/code]连接到[code]address[/code]çš„æœåС噍" +"上。给定的地å€éœ€è¦æ˜¯ä¸€ä¸ªå®Œå…¨åˆæ ¼çš„域å(例如 [code]\"www.example.com\"[/" +"code])或一个 IPv4 或 IPv6 æ ¼å¼çš„ IP 地å€ï¼ˆä¾‹å¦‚ [code]\"192.168.1.1\"[/" +"code])。[code]port[/code] 是æœåŠ¡å™¨æ‰€ç›‘å¬çš„端å£ã€‚[code]in_bandwidth[/code] " +"å’Œ [code]out_bandwidth[/code] 傿•°å¯ç”¨äºŽå°†ä¼ å…¥å’Œä¼ å‡ºçš„å¸¦å®½é™åˆ¶åœ¨ç»™å®šçš„å—节数/" +"秒。默认的 0 æ„å‘³ç€æ— é™çš„带宽。请注æ„,ENet 会在对ç‰ä½“之间连接的特定一侧战略" +"性地丢弃数æ®åŒ…,以确ä¿å¯¹ç‰ä½“的带宽ä¸è¢«æ·¹æ²¡ã€‚另宽傿•°ä¹Ÿå†³å®šäº†è¿žæŽ¥çš„窗å£å¤§å°ï¼Œ" +"它é™åˆ¶äº†åœ¨ä»»ä½•给定时间内å¯èƒ½æ£åœ¨ä¼ 输的å¯é æ•°æ®åŒ…的数é‡ã€‚如果创建了一个客户" +"端,返回 [constant OK];如果这个 NetworkedMultiplayerENet å®žä¾‹å·²ç»æœ‰ä¸€ä¸ªå¼€æ”¾" +"çš„è¿žæŽ¥ï¼ˆåœ¨è¿™ç§æƒ…å†µä¸‹ï¼Œä½ éœ€è¦å…ˆè°ƒç”¨ [method close_connection]),返回 " +"[constant ERR_CANT_CREATE];如果ä¸èƒ½åˆ›å»ºå®¢æˆ·ç«¯ï¼Œåˆ™è¿”回 [constant " +"ERR_CANT_CREATE]。如果指定了 [code]client_port[/code],客户端也将监å¬ç»™å®šçš„端" +"å£ï¼›è¿™å¯¹ä¸€äº› NAT 穿越技术很有用。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -46930,16 +47037,16 @@ msgid "" "case you need to call [method close_connection] first) or [constant " "ERR_CANT_CREATE] if the server could not be created." msgstr "" -"创建æœåŠ¡å™¨ï¼Œé€šè¿‡[code]port[/code]监å¬è¿žæŽ¥ã€‚该端å£éœ€è¦æ˜¯ä¸€ä¸ªå¯ç”¨çš„ã€æœªä½¿ç”¨çš„端" -"å£ï¼Œåœ¨0到65535之间。注æ„,低于1024çš„ç«¯å£æ˜¯ç‰¹æƒç«¯å£ï¼Œæ ¹æ®å¹³å°çš„ä¸åŒå¯èƒ½éœ€è¦æ" -"高æƒé™ã€‚è¦æ”¹å˜æœåŠ¡å™¨ç›‘å¬çš„æŽ¥å£ï¼Œè¯·ä½¿ç”¨[method set_bind_ip]。默认IP是通é…符" -"[code]\"*\"[/code]ï¼Œå®ƒç›‘å¬æ‰€æœ‰å¯ç”¨çš„æŽ¥å£ã€‚[code]max_clients[/code]是å…è®¸åŒæ—¶" -"进行的最大客户数,å¯ä»¥ä½¿ç”¨ä»»ä½•æ•°å—,最高å¯è¾¾4095,尽管å¯å®žçŽ°çš„åŒæ—¶è¿›è¡Œçš„客户" -"æ•°å¯èƒ½è¦ä½Žå¾—多,并且å–å†³äºŽåº”ç”¨ã€‚å…³äºŽå¸¦å®½å‚æ•°çš„其他细节,è§[method " -"create_client]。如果æœåŠ¡å™¨è¢«åˆ›å»ºï¼Œè¿”å›ž[constant OK];如果这个" -"NetworkedMultiplayerENetå®žä¾‹å·²ç»æœ‰ä¸€ä¸ªå¼€æ”¾çš„è¿žæŽ¥ï¼ˆåœ¨è¿™ç§æƒ…å†µä¸‹ï¼Œä½ éœ€è¦å…ˆè°ƒç”¨" -"[method close_connection]),返回[constant ERR_CANT_CREATE];如果æœåС噍ä¸èƒ½è¢«" -"创建,返回[constant ERR_CANT_CREATE]。" +"创建æœåŠ¡å™¨ï¼Œé€šè¿‡ [code]port[/code] 监å¬è¿žæŽ¥ã€‚该端å£éœ€è¦æ˜¯ä¸€ä¸ªå¯ç”¨çš„ã€æœªä½¿ç”¨çš„" +"端å£ï¼Œåœ¨ 0 到 65535 之间。注æ„,低于 1024 çš„ç«¯å£æ˜¯ç‰¹æƒç«¯å£ï¼Œæ ¹æ®å¹³å°çš„ä¸åŒå¯" +"èƒ½éœ€è¦æé«˜æƒé™ã€‚è¦æ”¹å˜æœåŠ¡å™¨ç›‘å¬çš„æŽ¥å£ï¼Œè¯·ä½¿ç”¨ [method set_bind_ip]。默认 IP " +"是通é…符 [code]\"*\"[/code]ï¼Œä¼šç›‘å¬æ‰€æœ‰å¯ç”¨çš„æŽ¥å£ã€‚[code]max_clients[/code] " +"是å…è®¸åŒæ—¶è¿›è¡Œçš„æœ€å¤§å®¢æˆ·æ•°ï¼Œå¯ä»¥ä½¿ç”¨ä»»ä½•æ•°å—,最高å¯è¾¾ 4095,尽管å¯å®žçŽ°çš„åŒæ—¶" +"进行的客户数å¯èƒ½è¦ä½Žå¾—多,并且å–å†³äºŽåº”ç”¨ã€‚å…³äºŽå¸¦å®½å‚æ•°çš„å…¶ä»–ç»†èŠ‚ï¼Œè§ [method " +"create_client]。如果æœåŠ¡å™¨è¢«åˆ›å»ºï¼Œåˆ™è¿”å›ž [constant OK];如果这个 " +"NetworkedMultiplayerENet å®žä¾‹å·²ç»æœ‰ä¸€ä¸ªå¼€æ”¾çš„è¿žæŽ¥ï¼ˆåœ¨è¿™ç§æƒ…å†µä¸‹ï¼Œä½ éœ€è¦å…ˆè°ƒ" +"用 [method close_connection]),则返回 [constant ERR_CANT_CREATE];如果æœåС噍" +"ä¸èƒ½è¢«åˆ›å»ºï¼Œåˆ™è¿”回 [constant ERR_CANT_CREATE]。" #: modules/enet/doc_classes/NetworkedMultiplayerENet.xml msgid "" @@ -50429,7 +50536,7 @@ msgstr "" "[OccluderShape] 是 [Occluder] 节点所使用的资æºï¼Œç”¨äºŽå‡ 何鮿Œ¡å‰”除。\n" "è¯¥å¤šè¾¹å½¢å¿…é¡»æ˜¯å‡¸å¤šè¾¹å½¢ã€‚å¤šè¾¹å½¢é¡¶ç‚¹çš„åˆ›å»ºä¸Žåˆ é™¤å¯ä»¥åœ¨ç¼–辑器的检查器ä¸è¿›è¡Œï¼Œä¹Ÿ" "å¯ä»¥é€šè¿‡è°ƒç”¨ [code]set_polygon_points[/code] 实现。æ¯ä¸€æ¡è¾¹çš„顶点都å¯ä»¥é€šè¿‡åœ¨" -"ç¼–è¾‘å™¨è§†çª—ä¸æ‹–æ‹½å¥æŸ„设置。\n" +"ç¼–è¾‘å™¨è§†çª—ä¸æ‹–拽手柄设置。\n" "å¦å¤–,æ¯ä¸€ä¸ªå¤šè¾¹å½¢é®æŒ¡å™¨éƒ½å¯ä»¥æ”¯æŒå•ä¸ªç©ºæ´žã€‚å¦‚æžœä½ åœ¨ç¼–è¾‘å™¨çš„æ£€æŸ¥å™¨ä¸ä¸ºç©ºæ´žæ·»" "åŠ è‡³å°‘ä¸‰ä¸ªé¡¶ç‚¹ï¼Œå°±å¯ä»¥åœ¨ç¼–è¾‘å™¨è§†çª—ä¸æ‹–æ‹½ç©ºæ´žè¾¹ç¼˜é¡¶ç‚¹çš„å¥æŸ„。\n" "一般而言,多边形以åŠç©ºæ´žçš„边数越少,è¿è¡Œæ—¶ç³»ç»Ÿçš„处ç†é€Ÿåº¦å°±è¶Šå¿«ï¼Œæ‰€ä»¥åœ¨å¤§å¤šæ•°" @@ -50525,11 +50632,14 @@ msgstr "" "光的衰å‡ï¼ˆä¸‹é™ï¼‰æ›²çº¿ã€‚在[b]检查器[/b]ä¸ï¼Œé€šè¿‡å³é”®ç‚¹å‡»æ›²çº¿ï¼Œå¯ä»¥èŽ·å¾—è®¸å¤šé¢„è®¾ã€‚" #: doc/classes/OmniLight.xml +#, fuzzy msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" "光的åŠå¾„。请注æ„,有效的照明区域å¯èƒ½çœ‹èµ·æ¥æ›´å°ï¼Œè¿™å–决于使用的 [member " "omni_attenuation]ã€‚æ— è®ºä½¿ç”¨ä½•ç§ [member omni_attenuation],光线都ä¸ä¼šåˆ°è¾¾è¿™ä¸ª" @@ -51187,13 +51297,14 @@ msgid "Returns the audio driver name for the given index." msgstr "返回给定索引的音频驱动程åºå称。" #: doc/classes/OS.xml +#, fuzzy msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -51251,13 +51362,14 @@ msgstr "" "[/codeblock]" #: doc/classes/OS.xml +#, fuzzy msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -51286,13 +51398,14 @@ msgid "" msgstr "返回当å‰ä½¿ç”¨çš„视频驱动程åºï¼Œä½¿ç”¨[enum VideoDriver]ä¸çš„一个值。" #: doc/classes/OS.xml +#, fuzzy msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -53747,6 +53860,17 @@ msgid "Particle systems (2D)" msgstr "ç²’å系统(2D)" #: doc/classes/Particles2D.xml +#, fuzzy +msgid "2D Particles Demo" +msgstr "2D å¹³å°è·³è·ƒæ¼”示" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "è¿”å›žä¸€ä¸ªåŒ…å«æ‰€æœ‰çްå˜ç²’åä½ç½®çš„矩形。" @@ -58864,7 +58988,7 @@ msgid "" "visual size by using the gizmo in the 2D editor while the node is selected." msgstr "" "用于编辑的通用 2D ä½ç½®æç¤ºã€‚它就åƒä¸€ä¸ªæ™®é€šçš„ [Node2D],但它在 2D 编辑器ä¸å§‹ç»ˆ" -"显示为一个åå—。选择节点时,å¯ä»¥ä½¿ç”¨ 2D 编辑器ä¸çš„尿ާ件æ¥è®¾ç½®åå—的视觉大" +"显示为一个åå—。选ä¸èŠ‚ç‚¹æ—¶ï¼Œå¯ä»¥ä½¿ç”¨ 2D 编辑器ä¸çš„å°å·¥å…·æ¥è®¾ç½®åå—的视觉大" "å°ã€‚" #: doc/classes/Position3D.xml @@ -61824,7 +61948,7 @@ msgid "" "Physics2DServer.AREA_PARAM_GRAVITY, 98)\n" "[/codeblock]" msgstr "" -"2D ä¸é»˜è®¤çš„é‡åŠ›å¼ºåº¦ï¼ˆå•ä½ï¼šæ¯ç§’平方åƒç´ )。\n" +"2D ä¸é»˜è®¤çš„é‡åŠ›å¼ºåº¦ï¼ˆå•ä½ä¸ºåƒç´ æ¯ç§’的平方)。\n" "[b]注æ„:[/b]这个属性åªåœ¨é¡¹ç›®å¯åŠ¨æ—¶è¢«è¯»å–。è¦åœ¨è¿è¡Œæ—¶æ”¹å˜é»˜è®¤çš„é‡åŠ›ï¼Œè¯·ä½¿ç”¨ä»¥" "下代ç 示例:\n" "[codeblock]\n" @@ -61980,7 +62104,7 @@ msgid "" "PhysicsServer.AREA_PARAM_GRAVITY, 9.8)\n" "[/codeblock]" msgstr "" -"3D ä¸çš„默认é‡åŠ›å¼ºåº¦ï¼Œå•ä½ï¼šç±³/秒平方。\n" +"3D ä¸çš„默认é‡åŠ›å¼ºåº¦ï¼ˆå•ä½ä¸ºç±³æ¯ç§’的平方)。\n" "[b]注æ„:[/b]该属性仅在项目å¯åŠ¨æ—¶è¯»å–。è¦åœ¨è¿è¡Œæ—¶æ›´æ”¹é»˜è®¤é‡åŠ›ï¼Œè¯·ä½¿ç”¨ä»¥ä¸‹ä»£ç " "示例:\n" "[codeblock]\n" @@ -63080,17 +63204,25 @@ msgstr "" "的值通常会给出最好的结果。å¦è§ [member rendering/quality/filters/use_fxaa]。" #: doc/classes/ProjectSettings.xml +#, fuzzy msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" "如果为 [code]true[/code],则使用快速åŽå¤„ç†è¿‡æ»¤å™¨ä½¿æ¡å¸¦æ˜Žæ˜¾ä¸é‚£ä¹ˆæ˜Žæ˜¾ã€‚在æŸäº›" "情况下,去带å¯èƒ½ä¼šå¼•å…¥ç¨å¾®æ˜Žæ˜¾çš„æŠ–动模å¼ã€‚å»ºè®®ä»…åœ¨å®žé™…éœ€è¦æ—¶å¯ç”¨åŽ»æ¡å¸¦ï¼Œå› 为" @@ -65231,33 +65363,45 @@ msgstr "返回æ¤å¯¹è±¡æ˜¯å¦åˆ†é…了有效的æœç´¢æ¨¡å¼ã€‚" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" -"åœ¨æ–‡æœ¬ä¸æœç´¢ç¼–译åŽçš„æ¨¡å¼ã€‚如果找到,返回第一个匹é…结果的 [RegExMatch] 容器," -"å¦åˆ™è¿”回 [code]null[/code]。å¯ä»¥æŒ‡å®šè¦æœç´¢çš„区域,而ä¸éœ€è¦ä¿®æ”¹å¼€å§‹å’Œç»“æŸé”šç‚¹" -"çš„ä½ç½®ã€‚" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" -"åœ¨æ–‡æœ¬ä¸æœç´¢ç¼–译过的模å¼ã€‚为æ¯ä¸ªä¸é‡å 的结果返回一个 [RegExMatch] 容器数组。" -"如果没有å‘现任何结果,则返回一个空数组。å¯ä»¥æŒ‡å®šè¦æœç´¢çš„区域,而ä¸éœ€è¦ä¿®æ”¹å¼€" -"始和结æŸé”šç‚¹çš„ä½ç½®ã€‚" #: modules/regex/doc_classes/RegEx.xml +#, fuzzy msgid "" "Searches the text for the compiled pattern and replaces it with the " "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" "æœç´¢æ–‡æœ¬ä¸çš„编译模å¼ï¼Œå¹¶å°†å…¶æ›¿æ¢ä¸ºæŒ‡å®šçš„å—符串。诸如 [code]$1[/code] å’Œ " "[code]$name[/code] ç‰è½¬ä¹‰å’Œåå‘å¼•ç”¨ä¼šè¢«å±•å¼€å’Œè§£å†³ã€‚é»˜è®¤æƒ…å†µä¸‹ï¼Œåªæœ‰ç¬¬ä¸€ä¸ªå®žä¾‹" @@ -67799,7 +67943,6 @@ msgstr "" "以é¿å…混淆。有关 portal 模å¼çš„完整说明,请å‚阅 [CullInstance]。" #: doc/classes/RoomManager.xml -#, fuzzy msgid "" "Switches the portal culling system on and off.\n" "It is important to note that when portal culling is active, it is " @@ -67814,11 +67957,13 @@ msgid "" "[VisualInstance] are expected to show when the system is active." msgstr "" "打开和关é—å…¥å£å‰”除系统。\n" -"éœ€è¦æ³¨æ„的是,当入å£å‰”é™¤å¤„äºŽæ´»åŠ¨çŠ¶æ€æ—¶ï¼Œå®ƒè´Ÿè´£[b]所有[/b] 3d 剔除。æŸäº›ç¼–辑器" -"功能å¯èƒ½æ›´éš¾ä½¿ç”¨ï¼Œå› æ¤åˆ‡æ¢æ´»åŠ¨æ ‡å¿—æ—¨åœ¨ç¡®ä¿æ‚¨çš„ [Room] / [Portal] 布局在编辑器" -"ä¸å·¥ä½œã€‚\n" +"éœ€è¦æ³¨æ„的是,当入å£å‰”é™¤å¤„äºŽæ´»åŠ¨çŠ¶æ€æ—¶ï¼Œå®ƒè´Ÿè´£è¿›è¡Œ[b]所有[/b] 3d 剔除。活动状" +"æ€ä¸‹ï¼Œå¯èƒ½æ— 法使用编辑器ä¸çš„部分å¯è§†åŒ–è°ƒè¯•å·¥å…·ï¼Œå› æ¤æ´»åŠ¨æ ‡å¿—çš„å¼€å…³çš„ç›®çš„åªæ˜¯" +"ç¡®ä¿æ‚¨çš„ [Room] / [Portal] 布局在编辑器ä¸èƒ½å¤Ÿæ£å¸¸å·¥ä½œã€‚\n" "当 [code]room graph[/code] 被å¸è½½ï¼ˆç©ºé—´å°šæœªè½¬æ¢ï¼‰æ—¶ï¼Œåˆ‡æ¢åˆ° [code]active[/" -"code] å°†ä¸èµ·ä½œç”¨ã€‚" +"code] å°†ä¸èµ·ä½œç”¨ã€‚\n" +"[b]注æ„:[/b]出于效率的考虑,入å£ç³»ç»Ÿåœ¨è®¾è®¡æ—¶åªè€ƒè™‘äº†æ ¸å¿ƒå¯è§†å¯¹è±¡ç±»åž‹ã€‚具体æ¥" +"è¯´ï¼Œå°±æ˜¯åªæœ‰ç»§æ‰¿è‡ª [VisualInstance] 的节点æ‰ä¼šåœ¨è¯¥ç³»ç»Ÿå¯ç”¨æ—¶æ˜¾ç¤ºã€‚" #: doc/classes/RoomManager.xml msgid "" @@ -67999,7 +68144,7 @@ msgstr "" #: doc/classes/RoomManager.xml msgid "Shows the [Portal] margins when the portal gizmo is used in the editor." -msgstr "当在编辑器ä¸ä½¿ç”¨å…¥å£å·¥å…·æ—¶ï¼Œæ˜¾ç¤º [Portal] 的边界。" +msgstr "当在编辑器ä¸ä½¿ç”¨å…¥å£å°å·¥å…·æ—¶ï¼Œæ˜¾ç¤º [Portal] 的边界。" #: doc/classes/RoomManager.xml msgid "" @@ -68834,8 +68979,12 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "å¯¹ç»„è¿›è¡Œè°ƒç”¨æ—¶ï¼Œç«‹å³æ‰§è¡Œï¼ˆæ£å¸¸æƒ…况下是在空闲时调用的)。" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." -msgstr "对组进行调用时,å³ä¾¿æ‰§è¡Œäº†å¤šæ¬¡è°ƒç”¨ä¹Ÿåªè°ƒç”¨ä¸€æ¬¡ã€‚" +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." +msgstr "" #: doc/classes/SceneTree.xml msgid "No stretching." @@ -68928,7 +69077,6 @@ msgid "" msgstr "通过脚本进行通用动画的轻é‡çº§å¯¹è±¡ï¼Œä½¿ç”¨ [Tweener]。" #: doc/classes/SceneTreeTween.xml -#, fuzzy msgid "" "[SceneTreeTween] is a tween managed by the scene tree. As opposed to " "[Tween], it does not require the instantiation of a node.\n" @@ -69065,6 +69213,16 @@ msgstr "" " tween.tween_property(sprite, \"position\", Vector2(0, 0), 1)\n" "[/codeblock]\n" "上é¢çš„示例ä¸ï¼Œè¯¥èŠ‚ç‚¹çš„æ‰€æœ‰åèŠ‚ç‚¹éƒ½ä¼šä¾æ¬¡è¢«ç§»åŠ¨åˆ° (0, 0)。\n" +"ä½ åº”è¯¥é¿å…在对象的åŒä¸€ä¸ªå±žæ€§ä¸Šä½¿ç”¨å¤šä¸ª [SceneTreeTween]。如果对æŸä¸ªå±žæ€§åŒæ—¶è¿›" +"行两个或者更多的补间动画,会优先使用最åŽåˆ›å»ºçš„é‚£ä¸ªè®¾ç½®æœ€ç»ˆçš„å€¼ã€‚å¦‚æžœä½ æƒ³è¦ä¸" +"æ–å¹¶é‡å¯åŠ¨ç”»ï¼Œè¯·è€ƒè™‘å°†è¯¥ [SceneTreeTween] 赋给å˜é‡ï¼š\n" +"[codeblock]\n" +"var tween\n" +"func animate():\n" +" if tween:\n" +" tween.kill() # 终æ¢ä¹‹å‰çš„补间动画。\n" +" tween = create_tween()\n" +"[/codeblock]\n" "一些 [Tweener] 会用到过渡和缓动。å‰è€…æŽ¥å— [enum Tween.TransitionType] 常é‡ï¼Œ" "指的是如何处ç†è¯¥åŠ¨ç”»çš„æ—¶é—´ï¼ˆç¤ºä¾‹è§ [url=https://easings.net/]easings.net[/" "url])。第二个接å—的是 [enum Tween.EaseType] 常é‡ï¼ŒæŽ§åˆ¶ [code]trans_type[/" @@ -69074,7 +69232,10 @@ msgstr "" "[url=https://raw.githubusercontent.com/godotengine/godot-docs/master/img/" "tween_cheatsheet.png]补间缓动与过渡类型速查表[/url]\n" "[b]注æ„:[/b]所有 [SceneTreeTween] 都默认会自动å¯åŠ¨ã€‚å¦‚æžœè¦é˜»æ¢æŸä¸ª " -"[SceneTreeTween] 自动å¯åŠ¨ï¼Œä½ å¯ä»¥åœ¨åˆ›å»ºåŽç«‹å³è°ƒç”¨ [method stop]。" +"[SceneTreeTween] 自动å¯åŠ¨ï¼Œä½ å¯ä»¥åœ¨åˆ›å»ºåŽç«‹å³è°ƒç”¨ [method stop]。\n" +"[b]注æ„:[/b][SceneTreeTween] çš„å¤„ç†æ—¶æœºåœ¨å½“å‰å¸§çš„æ‰€æœ‰èŠ‚ç‚¹ä¹‹åŽï¼Œå³åœ¨ [method " +"Node._process] 或 [method Node._physics_process] 之åŽï¼ˆå–决于 [enum Tween." +"TweenProcessMode])。" #: doc/classes/SceneTreeTween.xml msgid "" @@ -70806,9 +70967,9 @@ msgid "" "the optional [code]attachment_path[/code] can define a [Spatial] the pinned " "vertex will be attached to." msgstr "" -"设置表é¢é¡¶ç‚¹çš„固定状æ€ã€‚当设置为 [code]true[/code] 时,å¯é€‰çš„" -"[code]attachment_path[/code]å¯ä»¥å®šä¹‰ä¸€ä¸ªç©ºé—´[Spatial],被固定的顶点将连接到这" -"个空间。" +"设置表é¢é¡¶ç‚¹çš„固定状æ€ã€‚当设置为 [code]true[/code] 时,å¯é€‰çš„ " +"[code]attachment_path[/code] å¯ä»¥å®šä¹‰ä¸€ä¸ª [Spatial],被固定的顶点将连接到这个" +"节点。" #: doc/classes/SoftBody.xml msgid "" @@ -71114,7 +71275,7 @@ msgid "" "editor context and it has a valid gizmo." msgstr "" "设置节点是å¦é€šçŸ¥å…¶å…¨å±€å’Œå±€éƒ¨å˜æ¢çš„å˜åŒ–。[Spatial] 默认情况下ä¸ä¼šä¼ æ’ï¼Œé™¤éžæ˜¯" -"在编辑器上下文ä¸ï¼Œå¹¶ä¸”它有一个有效的控制器。" +"在编辑器上下文ä¸ï¼Œå¹¶ä¸”它有一个有效的å°å·¥å…·ã€‚" #: doc/classes/Spatial.xml msgid "" @@ -71219,12 +71380,15 @@ msgid "" msgstr "æ—‹è½¬éƒ¨åˆ†å±€éƒ¨å˜æ¢ä¸ºåº¦ï¼ŒæŒ‰ YXZ-Euler è§’æ ¼å¼æŒ‡å®šï¼ˆX è§’ã€Y è§’ã€Z 角)。" #: doc/classes/Spatial.xml +#, fuzzy msgid "" "Scale part of the local transformation.\n" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" "å±€éƒ¨å˜æ¢çš„缩放部分。\n" "[b]注æ„:[/b]3D ä¸ï¼Œå˜æ¢çŸ©é˜µæ˜¯æ— 法分解出æ£è´Ÿæ··åˆçš„缩放的。由于 Godot ä¸ä½¿ç”¨å˜" @@ -71273,39 +71437,41 @@ msgid "" "need to ask for it, with [method set_notify_transform]. The notification is " "also sent if the node is in the editor context and it has a valid gizmo." msgstr "" -"å½“ç©ºé—´èŠ‚ç‚¹çš„å…¨å±€å˜æ¢å‘生å˜åŒ–时,空间节点会收到这个通知。这æ„味ç€å½“å‰èŠ‚ç‚¹æˆ–çˆ¶" -"节点改å˜äº†å®ƒçš„å˜æ¢ã€‚\n" +"当 Spatial èŠ‚ç‚¹çš„å…¨å±€å˜æ¢å‘生å˜åŒ–时会收到这个通知。这æ„味ç€å½“å‰èŠ‚ç‚¹æˆ–çˆ¶èŠ‚ç‚¹æ”¹" +"å˜äº†å®ƒçš„å˜æ¢ã€‚\n" "为了使 [constant NOTIFICATION_TRANSFORM_CHANGED] 生效,用户首先需è¦ç”¨ " "[method set_notify_transform] å‘é€è¯·æ±‚。如果节点是在编辑器的上下文ä¸ï¼Œå¹¶ä¸”它" -"有一个有效的控制器(Gizmo),那么该通知也会被å‘é€ã€‚" +"有一个有效的å°å·¥å…·ï¼Œé‚£ä¹ˆè¯¥é€šçŸ¥ä¹Ÿä¼šè¢«å‘é€ã€‚" #: doc/classes/Spatial.xml msgid "" "Spatial nodes receives this notification when they are registered to new " "[World] resource." -msgstr "空间节点在注册到新的 [World] èµ„æºæ—¶ä¼šæ”¶åˆ°æ¤é€šçŸ¥ã€‚" +msgstr "Spatial 节点在注册到新的 [World] èµ„æºæ—¶ä¼šæ”¶åˆ°æ¤é€šçŸ¥ã€‚" #: doc/classes/Spatial.xml msgid "" "Spatial nodes receives this notification when they are unregistered from " "current [World] resource." -msgstr "当空间节点从当å‰çš„ [World] 资æºä¸å–消注册时,它们会收到æ¤é€šçŸ¥ã€‚" +msgstr "当 Spatial 节点从当å‰çš„ [World] 资æºä¸å–消注册时,它们会收到æ¤é€šçŸ¥ã€‚" #: doc/classes/Spatial.xml msgid "Spatial nodes receives this notification when their visibility changes." -msgstr "空间节点在其å¯è§æ€§å‘生å˜åŒ–时会收到æ¤é€šçŸ¥ã€‚" +msgstr "Spatial 节点在其å¯è§æ€§å‘生å˜åŒ–时会收到æ¤é€šçŸ¥ã€‚" #: doc/classes/Spatial.xml msgid "" "Spatial nodes receives this notification if the portal system gameplay " "monitor detects they have entered the gameplay area." -msgstr "如果入å£ç³»ç»Ÿæ¸¸æˆç›‘视器检测到它们已进入游æˆåŒºåŸŸï¼Œç©ºé—´èŠ‚ç‚¹ä¼šæ”¶åˆ°æ¤é€šçŸ¥ã€‚" +msgstr "" +"如果入å£ç³»ç»Ÿæ¸¸æˆç›‘视器检测到它们已进入游æˆåŒºåŸŸï¼ŒSpatial 节点会收到æ¤é€šçŸ¥ã€‚" #: doc/classes/Spatial.xml msgid "" "Spatial nodes receives this notification if the portal system gameplay " "monitor detects they have exited the gameplay area." -msgstr "如果入å£ç³»ç»Ÿæ¸¸æˆç›‘视器检测到它们已退出游æˆåŒºåŸŸï¼Œç©ºé—´èŠ‚ç‚¹ä¼šæ”¶åˆ°æ¤é€šçŸ¥ã€‚" +msgstr "" +"如果入å£ç³»ç»Ÿæ¸¸æˆç›‘视器检测到它们已退出游æˆåŒºåŸŸï¼ŒSpatial 节点会收到æ¤é€šçŸ¥ã€‚" #: doc/classes/SpatialMaterial.xml msgid "Default 3D rendering material." @@ -72867,8 +73033,11 @@ msgstr "" "max_lights_per_object],以ç€è‰²å™¨ç¼–译时间为代价。" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." -msgstr "èšå…‰ç¯çš„角度,å•使˜¯åº¦ã€‚" +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." +msgstr "" #: doc/classes/SpotLight.xml msgid "The spotlight's angular attenuation curve." @@ -72879,11 +73048,14 @@ msgid "The spotlight's light energy attenuation curve." msgstr "èšå…‰ç¯çš„å…‰é‡è¡°å‡æ›²çº¿ã€‚" #: doc/classes/SpotLight.xml +#, fuzzy msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" "èšå…‰ç¯å¯ä»¥è¾¾åˆ°çš„æœ€å¤§èŒƒå›´ã€‚请注æ„ï¼Œæ ¹æ®ä½¿ç”¨çš„ [member spot_attenuation],有效" "照明区域å¯èƒ½çœ‹èµ·æ¥æ›´å°ã€‚æ— è®ºä½¿ç”¨[member spot_attenuation],光都ä¸ä¼šåˆ°è¾¾æ¤èŒƒå›´" @@ -77961,55 +78133,49 @@ msgid "Clears all values on the theme." msgstr "清除主题上的所有值。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Clears the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" -"å¦‚æžœä¸»é¢˜åŒ…å« [code]node_type[/code],则清除å为 [code]name[/code] çš„ [Color]" +"å¦‚æžœä¸»é¢˜åŒ…å« [code]theme_type[/code],则清除å为 [code]name[/code] çš„ [Color]" "颜色。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Clears the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" -"å¦‚æžœä¸»é¢˜åŒ…å« [code]node_type[/code],则清除å为 [code]name[/code] 的常é‡ã€‚" +"å¦‚æžœä¸»é¢˜åŒ…å« [code]theme_type[/code],则清除å为 [code]name[/code] 的常é‡ã€‚" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Clears the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" -"å¦‚æžœä¸»é¢˜åŒ…å« [code]node_type[/code],则清除å为 [code]name[/code] çš„ [Font]å—" -"体。" +"å¦‚æžœä¸»é¢˜åŒ…å« [code]theme_type[/code],则清除å为 [code]name[/code] çš„ [Font]" +"å—体。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Clears the icon at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" -"å¦‚æžœä¸»é¢˜åŒ…å« [code]node_type[/code],则清除å为 [code]name[/code] çš„å›¾æ ‡ã€‚" +"å¦‚æžœä¸»é¢˜åŒ…å« [code]theme_type[/code],则清除å为 [code]name[/code] çš„å›¾æ ‡ã€‚" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Clears [StyleBox] at [code]name[/code] if the theme has [code]theme_type[/" "code]." msgstr "" -"å¦‚æžœä¸»é¢˜åŒ…å« [code]node_type[/code],则清除å为 [code]name[/code] çš„ " +"å¦‚æžœä¸»é¢˜åŒ…å« [code]theme_type[/code],则清除å为 [code]name[/code] çš„ " "[StyleBox]æ ·å¼ç›’。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Clears the theme item of [code]data_type[/code] at [code]name[/code] if the " "theme has [code]theme_type[/code]." msgstr "" -"如果主题具有 [code]node_type[/code],则清除 [code]name[/code] 处的 " +"如果主题具有 [code]theme_type[/code],则清除 [code]name[/code] 处的 " "[code]data_type[/code] 主题项。" #: doc/classes/Theme.xml @@ -78029,21 +78195,20 @@ msgid "Sets the theme's values to a copy of a given theme." msgstr "将主题的å–值设置为指定主题的副本。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns the [Color] at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "如果主题有[code]node_type[/code],返回 [code]name[/code]处的[Color]。" +msgstr "" +"如果主题有 [code]theme_type[/code],返回 [code]name[/code] 处的 [Color]。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns all the [Color]s as a [PoolStringArray] filled with each [Color]'s " "name, for use in [method get_color], if the theme has [code]theme_type[/" "code]." msgstr "" -"如果主题有[code]node_type[/code],将所有的[Color]作为[PoolStringArray]返回," -"å¹¶å¡«å……æ¯ä¸ª[Color]çš„å称,用于[method get_color]使用。" +"如果主题有 [code]theme_type[/code],将所有的 [Color] 作为 [PoolStringArray] " +"返回,并填充æ¯ä¸ª [Color] çš„å称,用于 [method get_color] 使用。" #: doc/classes/Theme.xml msgid "" @@ -78054,20 +78219,18 @@ msgstr "" "[method get_color] å’Œ/或 [method get_color_list] 使用。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns the constant at [code]name[/code] if the theme has [code]theme_type[/" "code]." -msgstr "如果主题有 [code]node_type[/code],返回 [code]name[/code] 处的常é‡ã€‚" +msgstr "如果主题有 [code]theme_type[/code],返回 [code]name[/code] 处的常é‡ã€‚" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns all the constants as a [PoolStringArray] filled with each constant's " "name, for use in [method get_constant], if the theme has [code]theme_type[/" "code]." msgstr "" -"如果主题有 [code]node_type[/code],将所有常é‡ä½œä¸º [PoolStringArray] 返回,并" +"如果主题有 [code]theme_type[/code],将所有常é‡ä½œä¸º [PoolStringArray] 返回,并" "å¡«å……æ¯ä¸ªå¸¸é‡çš„å称,以供 [method get_constant] 使用。" #: doc/classes/Theme.xml @@ -78080,23 +78243,21 @@ msgstr "" "get_constant]å’Œ/或[method get_constant_list]使用。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns the [Font] at [code]name[/code] if the theme has [code]theme_type[/" "code]. If such item does not exist and [member default_font] is set on the " "theme, the default font will be returned." msgstr "" -"如果主题有 [code]node_type[/code],则返回å为 [code]name[/code] çš„ [Font]。如" -"æžœä¸å˜åœ¨è¿™æ ·çš„项目,而该主题设置了 [member default_font],则会返回该默认å—" +"如果主题有 [code]theme_type[/code],则返回å为 [code]name[/code] çš„ [Font]。" +"如果ä¸å˜åœ¨è¿™æ ·çš„项目,而该主题设置了 [member default_font],则会返回该默认å—" "体。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns all the [Font]s as a [PoolStringArray] filled with each [Font]'s " "name, for use in [method get_font], if the theme has [code]theme_type[/code]." msgstr "" -"如果主题有 [code]node_type[/code],将所有的 [Font] 作为 [PoolStringArray] è¿”" +"如果主题有 [code]theme_type[/code],将所有的 [Font] 作为 [PoolStringArray] è¿”" "回,并填入æ¯ä¸ª [Font] çš„å称,以供 [method get_font] 使用。" #: doc/classes/Theme.xml @@ -78108,21 +78269,20 @@ msgstr "" "get_font]å’Œ/或[method get_font_list]使用。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns the icon [Texture] at [code]name[/code] if the theme has " "[code]theme_type[/code]." msgstr "" -"如果主题有[code]node_type[/code],返回 [code]name[/code]å¤„çš„å›¾æ ‡[Texture]。" +"如果主题有 [code]theme_type[/code],返回 [code]name[/code] å¤„çš„å›¾æ ‡ " +"[Texture]。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns all the icons as a [PoolStringArray] filled with each [Texture]'s " "name, for use in [method get_icon], if the theme has [code]theme_type[/code]." msgstr "" -"如果主题有[code]node_type[/code]ï¼Œåˆ™è¿”å›žæ‰€æœ‰çš„å›¾æ ‡ä¸ºä¸€ä¸ª[PoolStringArray],并" -"å¡«å…¥æ¯ä¸ª[Texture]çš„å称,以供[method get_icon]使用。" +"如果主题有 [code]theme_type[/code]ï¼Œåˆ™è¿”å›žæ‰€æœ‰çš„å›¾æ ‡ä¸ºä¸€ä¸ª " +"[PoolStringArray],并填入æ¯ä¸ª [Texture] çš„å称,以供 [method get_icon] 使用。" #: doc/classes/Theme.xml msgid "" @@ -78133,7 +78293,6 @@ msgstr "" "get_icon]å’Œ/或[method get_icon_list]使用。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns the [StyleBox] at [code]name[/code] if the theme has " "[code]theme_type[/code].\n" @@ -78141,12 +78300,12 @@ msgid "" "Valid [code]theme_type[/code]s may be found using [method " "get_stylebox_types]." msgstr "" -"如果主题有[code]node_type[/code],返回 [code]name[/code]处的[StyleBox]。\n" -"å¯ä»¥ä½¿ç”¨[method get_stylebox_list]找到有效的[code]name[/code]。å¯ä»¥é€šè¿‡" -"[method get_stylebox_types]æ¥æ‰¾åˆ°æœ‰æ•ˆçš„[code]node_type[/code]。" +"如果主题有 [code]theme_type[/code],返回 [code]name[/code] 处的 " +"[StyleBox]。\n" +"å¯ä»¥ä½¿ç”¨ [method get_stylebox_list] 找到有效的 [code]name[/code]。å¯ä»¥é€šè¿‡ " +"[method get_stylebox_types] æ¥æ‰¾åˆ°æœ‰æ•ˆçš„ [code]theme_type[/code]。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns all the [StyleBox]s as a [PoolStringArray] filled with each " "[StyleBox]'s name, for use in [method get_stylebox], if the theme has " @@ -78154,9 +78313,10 @@ msgid "" "Valid [code]theme_type[/code]s may be found using [method " "get_stylebox_types]." msgstr "" -"如果主题有[code]node_type[/code],则返回所有[StyleBox]çš„[PoolStringArray],并" -"å¡«å…¥æ¯ä¸ª[StyleBox]çš„å称,以供[method get_stylebox]使用。\n" -"å¯ä»¥ä½¿ç”¨[method get_stylebox_types]找到有效的[code]node_type[/code]。" +"如果主题有 [code]theme_type[/code],则返回所有 [StyleBox] çš„ " +"[PoolStringArray],并填入æ¯ä¸ª [StyleBox] çš„å称,以供 [method get_stylebox] " +"使用。\n" +"å¯ä»¥ä½¿ç”¨ [method get_stylebox_types] 找到有效的 [code]theme_type[/code]。" #: doc/classes/Theme.xml msgid "" @@ -78168,7 +78328,6 @@ msgstr "" "[method get_stylebox]å’Œ/或[method get_stylebox_list]使用。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns the theme item of [code]data_type[/code] at [code]name[/code] if the " "theme has [code]theme_type[/code].\n" @@ -78176,14 +78335,13 @@ msgid "" "a data type specific method. Valid [code]theme_type[/code]s may be found " "using [method get_theme_item_types] or a data type specific method." msgstr "" -"如果主题有 [code]node_type[/code],则以 [code]name[/code] 返回 " +"如果主题有 [code]theme_type[/code],则以 [code]name[/code] 返回 " "[code]data_type[/code] 的主题项目。\n" "使用 [method get_theme_item_list] 或数æ®ç±»åž‹ç‰¹å®šæ–¹æ³•,å¯èƒ½ä¼šæ‰¾åˆ°æœ‰æ•ˆçš„ " "[code]name[/code]。å¯ä»¥ä½¿ç”¨ [method get_theme_item_types] 或数æ®ç±»åž‹ç‰¹å®šæ–¹" -"法,找到有效的 [code]node_type[/code]。" +"法,找到有效的 [code]theme_type[/code]。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns all the theme items of [code]data_type[/code] as a [PoolStringArray] " "filled with each theme items's name, for use in [method get_theme_item] or a " @@ -78191,11 +78349,11 @@ msgid "" "Valid [code]theme_type[/code]s may be found using [method " "get_theme_item_types] or a data type specific method." msgstr "" -"返回所有[code]data_type[/code]的主题项目,以[PoolStringArray]的形å¼å¡«å…¥æ¯ä¸ªä¸»" -"题项目的å称,如果主题有[code]node_type[/code],å¯ä»¥åœ¨[method get_theme_item]" -"或特定数æ®ç±»åž‹æ–¹æ³•ä¸ä½¿ç”¨ã€‚\n" -"å¯ä»¥é€šè¿‡[method get_theme_item_types]或特定数æ®ç±»åž‹çš„æ–¹æ³•找到有效的" -"[code]node_type[/code]。" +"返回所有 [code]data_type[/code] 的主题项目,以 [PoolStringArray] 的形å¼å¡«å…¥æ¯" +"个主题项目的å称,如果主题有 [code]theme_type[/code],å¯ä»¥åœ¨ [method " +"get_theme_item] 或特定数æ®ç±»åž‹æ–¹æ³•ä¸ä½¿ç”¨ã€‚\n" +"å¯ä»¥é€šè¿‡ [method get_theme_item_types] 或特定数æ®ç±»åž‹çš„æ–¹æ³•找到有效的 " +"[code]theme_type[/code]。" #: doc/classes/Theme.xml msgid "" @@ -78208,16 +78366,15 @@ msgstr "" "或数æ®ç±»åž‹ç‰¹å®šæ–¹æ³•使用。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns all the theme types as a [PoolStringArray] filled with unique type " "names, for use in other [code]get_*[/code] functions of this theme.\n" "[b]Note:[/b] [code]theme_type[/code] has no effect and will be removed in " "future version." msgstr "" -"将所有的主题类型作为一个[PoolStringArray]返回,其ä¸å¡«å…¥äº†å”¯ä¸€çš„类型å称,以供" -"这个主题的其他[code]get_*[/code]函数使用。\n" -"[b]注æ„:[/b][code]node_type[/code]没有生效,在未æ¥çš„版本ä¸ä¼šè¢«åˆ 除。" +"将所有的主题类型作为一个 [PoolStringArray] 返回,其ä¸å¡«å…¥äº†å”¯ä¸€çš„类型å称,以" +"供这个主题的其他 [code]get_*[/code] 函数使用。\n" +"[b]注æ„:[/b][code]theme_type[/code] 没有生效,在未æ¥çš„版本ä¸ä¼šè¢«åˆ 除。" #: doc/classes/Theme.xml msgid "" @@ -78233,28 +78390,26 @@ msgid "" msgstr "返回给定的基础类型 [code]base_type[/code] 的所有类型å˜ç§ã€‚" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if [Color] with [code]name[/code] is in " "[code]theme_type[/code].\n" "Returns [code]false[/code] if the theme does not have [code]theme_type[/" "code]." msgstr "" -"如果带有[code]name[/code]çš„[Color]在[code]node_type[/code]ä¸ï¼Œåˆ™è¿”回 " +"如果 [code]theme_type[/code] ä¸å˜åœ¨å为 [code]name[/code] çš„ [Color],则返回 " "[code]true[/code]。\n" -"如果主题没有[code]node_type[/code],则返回 [code]false[/code]。" +"如果主题没有 [code]theme_type[/code],则返回 [code]false[/code]。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if constant with [code]name[/code] is in " "[code]theme_type[/code].\n" "Returns [code]false[/code] if the theme does not have [code]theme_type[/" "code]." msgstr "" -"如果带有[code]name[/code]的常é‡åœ¨[code]node_type[/code]ä¸ï¼Œåˆ™è¿”回 " +"如果 [code]theme_type[/code] ä¸å˜åœ¨å为 [code]name[/code] 的常é‡ï¼Œåˆ™è¿”回 " "[code]true[/code]。\n" -"如果主题没有[code]node_type[/code],则返回 [code]false[/code]。" +"如果主题没有[code]theme_type[/code],则返回 [code]false[/code]。" #: doc/classes/Theme.xml msgid "" @@ -78264,52 +78419,48 @@ msgstr "" "如果这个主题有一个有效的[member default_font]值,返回 [code]true[/code]。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if [Font] with [code]name[/code] is in " "[code]theme_type[/code].\n" "Returns [code]false[/code] if the theme does not have [code]theme_type[/" "code]." msgstr "" -"如果带有[code]name[/code]çš„[Font]在[code]node_type[/code]ä¸ï¼Œåˆ™è¿”回 " +"如果 [code]theme_type[/code] ä¸å˜åœ¨å为 [code]name[/code] çš„ [Font],则返回 " "[code]true[/code]。\n" -"如果主题没有[code]node_type[/code],则返回 [code]false[/code]。" +"如果主题没有[code]theme_type[/code],则返回 [code]false[/code]。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if icon [Texture] with [code]name[/code] is in " "[code]theme_type[/code].\n" "Returns [code]false[/code] if the theme does not have [code]theme_type[/" "code]." msgstr "" -"如果带有[code]name[/code]çš„å›¾æ ‡[Texture]在[code]node_type[/code]ä¸ï¼Œåˆ™è¿”回 " -"[code]true[/code]。\n" -"如果主题没有[code]node_type[/code],则返回 [code]false[/code]。" +"如果 [code]theme_type[/code] ä¸å˜åœ¨å为 [code]name[/code] çš„å›¾æ ‡ [Texture]," +"则返回 [code]true[/code]。\n" +"如果主题没有[code]theme_type[/code],则返回 [code]false[/code]。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if [StyleBox] with [code]name[/code] is in " "[code]theme_type[/code].\n" "Returns [code]false[/code] if the theme does not have [code]theme_type[/" "code]." msgstr "" -"如果带有[code]name[/code]çš„[StyleBox]在[code]node_type[/code]ä¸ï¼Œè¿”回 " -"[code]true[/code]。\n" -"如果主题没有[code]node_type[/code],则返回 [code]false[/code]。" +"如果 [code]theme_type[/code] ä¸å˜åœ¨å为 [code]name[/code] çš„ [StyleBox],则返" +"回 [code]true[/code]。\n" +"如果主题没有[code]theme_type[/code],则返回 [code]false[/code]。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Returns [code]true[/code] if a theme item of [code]data_type[/code] with " "[code]name[/code] is in [code]theme_type[/code].\n" "Returns [code]false[/code] if the theme does not have [code]theme_type[/" "code]." msgstr "" -"如果一个 [code]data_type[/code] 的主题项目与 [code]name[/code] 在 " -"[code]node_type[/code] ä¸ï¼Œåˆ™è¿”回 [code]true[/code]。\n" -"如果该主题没有 [code]node_type[/code],则返回 [code]false[/code]。" +"如果 [code]theme_type[/code] ä¸å˜åœ¨å为 [code]name[/code] çš„ " +"[code]data_type[/code] 类型的主题项目,则返回 [code]true[/code]。\n" +"如果该主题没有 [code]theme_type[/code],则返回 [code]false[/code]。" #: doc/classes/Theme.xml msgid "" @@ -78341,123 +78492,111 @@ msgstr "" "被消除。如果该类型为类型å˜ç§çš„基础类型,则那些å˜ç§ä¼šå¤±åŽ»å…¶åŸºç¡€ç±»åž‹ã€‚" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Renames the [Color] at [code]old_name[/code] to [code]name[/code] if the " "theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" -"如果主题有 [code]node_type[/code],则将 [code]old_name[/code] çš„ [Color] é‡å‘½" -"å为 [code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•将失败。" +"如果主题有 [code]theme_type[/code],则将 [code]old_name[/code] çš„ [Color] é‡" +"命å为 [code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•将失败。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Renames the constant at [code]old_name[/code] to [code]name[/code] if the " "theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" -"如果主题有 [code]node_type[/code],则将 [code]old_name[/code] 的常é‡é‡å‘½å为 " -"[code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" +"如果主题有 [code]theme_type[/code],则将 [code]old_name[/code] 的常é‡é‡å‘½å" +"为 [code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Renames the [Font] at [code]old_name[/code] to [code]name[/code] if the " "theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" -"如果主题有 [code]node_type[/code],则将 [code]old_name[/code] çš„ [Font] é‡å‘½" +"如果主题有 [code]theme_type[/code],则将 [code]old_name[/code] çš„ [Font] é‡å‘½" "å为 [code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Renames the icon at [code]old_name[/code] to [code]name[/code] if the theme " "has [code]theme_type[/code]. If [code]name[/code] is already taken, this " "method fails." msgstr "" -"如果主题有 [code]node_type[/code],则将 [code]old_name[/code] çš„å›¾æ ‡é‡å‘½å为 " -"[code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" +"如果主题有 [code]theme_type[/code],则将 [code]old_name[/code] çš„å›¾æ ‡é‡å‘½å" +"为 [code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Renames [StyleBox] at [code]old_name[/code] to [code]name[/code] if the " "theme has [code]theme_type[/code]. If [code]name[/code] is already taken, " "this method fails." msgstr "" -"如果主题有 [code]node_type[/code],则将 [StyleBox] 在 [code]old_name[/code] " +"如果主题有 [code]theme_type[/code],则将 [StyleBox] 在 [code]old_name[/code] " "é‡å‘½å为 [code]name[/code]。如果 [code]name[/code] å·²ç»è¢«å ç”¨ï¼Œæ¤æ–¹æ³•会失败。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Renames the theme item of [code]data_type[/code] at [code]old_name[/code] to " "[code]name[/code] if the theme has [code]theme_type[/code]. If [code]name[/" "code] is already taken, this method fails." msgstr "" -"如果主题具有 [code]node_type[/code],则将 [code]old_name[/code] 处的 " +"如果主题具有 [code]theme_type[/code],则将 [code]old_name[/code] 处的 " "[code]data_type[/code] 的主题项é‡å‘½å为 [code]name[/code]。如果 [code]name[/" "code] å·²ç»è¢«å ç”¨ï¼Œåˆ™æ¤æ–¹æ³•失败。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Sets the theme's [Color] to [code]color[/code] at [code]name[/code] in " "[code]theme_type[/code].\n" "Creates [code]theme_type[/code] if the theme does not have it." msgstr "" -"在 [code]node_type[/code] ä¸çš„ [code]name[/code] 处,设置主题的[Color]为" -"[code]color[/code]。\n" -"如果主题没有[code]node_type[/code],则创建该节点。" +"在主题的 [code]theme_type[/code] ä¸ï¼Œå°†å为 [code]name[/code] çš„ [Color] 设置" +"为 [code]color[/code]。\n" +"如果该主题没有 [code]theme_type[/code],会创建该主题类型。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Sets the theme's constant to [code]constant[/code] at [code]name[/code] in " "[code]theme_type[/code].\n" "Creates [code]theme_type[/code] if the theme does not have it." msgstr "" -"在 [code]node_type[/code] ä¸çš„ [code]name[/code] 处,将主题的常é‡è®¾ç½®ä¸º" +"在主题的 [code]theme_type[/code] ä¸ï¼Œå°†å为 [code]name[/code] 的常é‡è®¾ç½®ä¸º " "[code]constant[/code]。\n" -"如果主题没有,则创建[code]node_type[/code]。" +"如果该主题没有 [code]theme_type[/code],会创建该主题类型。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Sets the theme's [Font] to [code]font[/code] at [code]name[/code] in " "[code]theme_type[/code].\n" "Creates [code]theme_type[/code] if the theme does not have it." msgstr "" -"在 [code]node_type[/code] ä¸çš„ [code]name[/code] 处将主题的 [Font] 设置为" -"[code]font[/code]。\n" -"如果主题没有[code]node_type[/code],则创建该节点。" +"在主题的 [code]theme_type[/code] ä¸ï¼Œå°†å为 [code]name[/code] çš„ [Font] 设置" +"为 [code]font[/code]。\n" +"如果该主题没有 [code]theme_type[/code],会创建该主题类型。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Sets the theme's icon [Texture] to [code]texture[/code] at [code]name[/code] " "in [code]theme_type[/code].\n" "Creates [code]theme_type[/code] if the theme does not have it." msgstr "" -"在 [code]node_type[/code] ä¸çš„ [code]name[/code] å¤„è®¾ç½®ä¸»é¢˜çš„å›¾æ ‡[Texture]为" -"[code]texture[/code]。\n" -"如果主题没有[code]node_type[/code],则创建该节点。" +"在主题的 [code]theme_type[/code] ä¸ï¼Œå°†å为 [code]name[/code] çš„å›¾æ ‡ " +"[Texture] 设置为 [code]texture[/code]。\n" +"如果该主题没有 [code]theme_type[/code],会创建该主题类型。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Sets theme's [StyleBox] to [code]stylebox[/code] at [code]name[/code] in " "[code]theme_type[/code].\n" "Creates [code]theme_type[/code] if the theme does not have it." msgstr "" -"将主题的[StyleBox]设置为[code]stylebox[/code],在[code]node_type[/code]çš„" -"[code]name[/code]处。\n" -"如果主题没有[code]node_type[/code],则创建该节点。" +"在主题的 [code]theme_type[/code] ä¸ï¼Œå°†å为 [code]name[/code] çš„ [StyleBox] " +"设置为 [code]stylebox[/code]。\n" +"如果该主题没有 [code]theme_type[/code],会创建该主题类型。" #: doc/classes/Theme.xml -#, fuzzy msgid "" "Sets the theme item of [code]data_type[/code] to [code]value[/code] at " "[code]name[/code] in [code]theme_type[/code].\n" @@ -78465,10 +78604,11 @@ msgid "" "code].\n" "Creates [code]theme_type[/code] if the theme does not have it." msgstr "" -"å°†[code]data_type[/code]的主题项目设置为[code]value[/code],在" -"[code]node_type[/code]ä¸çš„[code]name[/code]。\n" -"如果[code]value[/code]类型与[code]data_type[/code]ä¸åŒ¹é…,则ä¸åšä»»ä½•处ç†ã€‚\n" -"如果主题没有[code]node_type[/code],则创建该类型。" +"在主题的 [code]theme_type[/code] ä¸ï¼Œå°†å为 [code]name[/code] çš„ " +"[code]data_type[/code] 类型的主题项目设置为 [code]value[/code]。\n" +"如果 [code]value[/code]类型与 [code]data_type[/code]ä¸åŒ¹é…,则ä¸åšä»»ä½•处" +"ç†ã€‚\n" +"如果该主题没有 [code]theme_type[/code],会创建该主题类型。" #: doc/classes/Theme.xml msgid "" @@ -78743,7 +78883,7 @@ msgid "" "Optionally, the tilemap's half offset can be ignored." msgstr "" "返回与指定的图å—åœ°å›¾ï¼ˆåŸºäºŽç½‘æ ¼ï¼‰åæ ‡ç›¸å¯¹åº”çš„å•å…ƒæ ¼å·¦ä¸Šè§’çš„å±€éƒ¨åæ ‡ã€‚\n" -"è¦èŽ·å¾—å…¨å±€åæ ‡ï¼Œè¯·ä½¿ç”¨[method Node2D.to_global]。\n" +"è¦è޷得免局ä½ç½®ï¼Œè¯·ä½¿ç”¨ [method Node2D.to_global]:\n" "[codeblock]\n" "var local_position = my_tilemap.map_to_world(map_position)\n" "var global_position = my_tilemap.to_global(local_position)\n" @@ -78807,17 +78947,18 @@ msgstr "" #: doc/classes/TileMap.xml msgid "Sets the given collision layer bit." -msgstr "设置指定碰撞层bitä½ã€‚" +msgstr "设置指定碰撞层比特ä½ã€‚" #: doc/classes/TileMap.xml msgid "Sets the given collision mask bit." -msgstr "设置指定碰撞é®ç½©bitä½ã€‚" +msgstr "设置指定碰撞é®ç½©æ¯”特ä½ã€‚" #: doc/classes/TileMap.xml msgid "" "Applies autotiling rules to the cell (and its adjacent cells) referenced by " "its grid-based X and Y coordinates." -msgstr "å¯¹åŸºäºŽç½‘æ ¼çš„Xå’ŒYåæ ‡æ‰€å¼•用的å•å…ƒæ ¼ï¼ŒåŠå…¶ç›¸é‚»å•å…ƒæ ¼ï¼Œåº”ç”¨è‡ªåŠ¨å¹³ç§»è§„åˆ™ã€‚" +msgstr "" +"å¯¹åŸºäºŽç½‘æ ¼çš„ X å’Œ Y åæ ‡æ‰€å¼•用的å•å…ƒæ ¼ï¼ˆåŠå…¶ç›¸é‚»å•å…ƒæ ¼ï¼‰åº”ç”¨è‡ªåŠ¨å¹³ç§»è§„åˆ™ã€‚" #: doc/classes/TileMap.xml msgid "" @@ -78826,8 +78967,8 @@ msgid "" "Calling with invalid (or missing) parameters applies autotiling rules for " "the entire tilemap." msgstr "" -"对指定区域内的å•å…ƒæ ¼åº”ç”¨è‡ªåŠ¨å¹³ç§»è§„åˆ™ï¼Œç”±åŸºäºŽç½‘æ ¼çš„Xå’ŒYåæ ‡æŒ‡å®šã€‚\n" -"ç”¨æ— æ•ˆçš„æˆ–ç¼ºå¤±çš„å‚æ•°è°ƒç”¨æ—¶ï¼Œè‡ªåŠ¨å¹³é“ºè§„åˆ™åº”ç”¨äºŽæ•´ä¸ªå›¾å—地图。" +"对指定区域内的å•å…ƒæ ¼åº”ç”¨è‡ªåŠ¨å¹³ç§»è§„åˆ™ï¼ˆç”±åŸºäºŽç½‘æ ¼çš„ X å’Œ Y åæ ‡æŒ‡å®šï¼‰ã€‚\n" +"ç”¨æ— æ•ˆï¼ˆæˆ–ç¼ºå¤±ï¼‰çš„å‚æ•°è°ƒç”¨æ—¶ï¼Œè‡ªåŠ¨å¹³é“ºè§„åˆ™åº”ç”¨äºŽæ•´ä¸ªå›¾å—地图。" #: doc/classes/TileMap.xml msgid "" @@ -78875,15 +79016,15 @@ msgstr "便¬¡æŽ’列的图å—çš„åç§»é‡ã€‚å¯èƒ½çš„å–å€¼è§ [enum HalfOffset] msgid "" "The TileMap's quadrant size. Optimizes drawing by batching, using chunks of " "this size." -msgstr "图å—地图的象é™å¤§å°ã€‚使用这个尺寸的图å—,通过批处ç†ä¼˜åŒ–绘制。" +msgstr "该 TileMap 的象é™å¤§å°ã€‚会使用这个大å°çš„区å—对绘制进行批处ç†ä¼˜åŒ–。" #: doc/classes/TileMap.xml msgid "The TileMap's cell size." -msgstr "图å—地图的å•元大å°ã€‚" +msgstr "该 TileMap çš„å•å…ƒæ ¼å¤§å°ã€‚" #: doc/classes/TileMap.xml msgid "Position for tile origin. See [enum TileOrigin] for possible values." -msgstr "图å—åŽŸç‚¹çš„åæ ‡ã€‚å¯èƒ½çš„å–å€¼è§ [enum TileOrigin]。" +msgstr "图å—原点的ä½ç½®ã€‚å¯èƒ½çš„å–å€¼è§ [enum TileOrigin]。" #: doc/classes/TileMap.xml msgid "" @@ -83220,9 +83361,9 @@ msgid "" "result at position [code]weight[/code]. [code]weight[/code] is on the range " "of 0.0 to 1.0, representing the amount of interpolation." msgstr "" -"用[code]pre_a[/code]å’Œ[code]post_b[/code]ä½œä¸ºå¥æŸ„,在这个å‘é‡å’Œ[code]b[/code]" -"之间进行三次æ’值,并在[code]weight[/code]ä½ç½®è¿”回结果。[code]weight[/code]çš„" -"范围是0.0 到 1.0,表示æ’值的é‡ã€‚" +"用 [code]pre_a[/code] å’Œ [code]post_b[/code] 作为控制柄,在这个å‘é‡å’Œ " +"[code]b[/code] 之间进行三次æ’值,并在 [code]weight[/code] ä½ç½®è¿”回结果。" +"[code]weight[/code] 的范围是 0.0 到 1.0,表示æ’值的é‡ã€‚" #: doc/classes/Vector2.xml doc/classes/Vector3.xml msgid "" @@ -83501,9 +83642,9 @@ msgid "" "result at position [code]weight[/code]. [code]weight[/code] is on the range " "of 0.0 to 1.0, representing the amount of interpolation." msgstr "" -"用 [code]pre_a[/code] å’Œ [code]post_b[/code] ä½œä¸ºå¥æŸ„,在这个å‘é‡å’Œ [code]b[/" -"code] 之间进行三次æ’值,并在 [code]weight[/code] ä½ç½®è¿”回结果。[code]weight[/" -"code] 的范围是 0.0 到 1.0,表示æ’值的é‡ã€‚" +"用 [code]pre_a[/code] å’Œ [code]post_b[/code] 作为控制柄,在这个å‘é‡å’Œ " +"[code]b[/code] 之间进行三次æ’值,并在 [code]weight[/code] ä½ç½®è¿”回结果。" +"[code]weight[/code] 的范围是 0.0 到 1.0,表示æ’值的é‡ã€‚" #: doc/classes/Vector3.xml msgid "Returns the distance between this vector and [code]b[/code]." @@ -83524,11 +83665,11 @@ msgid "" "[b]Note:[/b] [code]a.dot(b)[/code] is equivalent to [code]b.dot(a)[/code]." msgstr "" "返回æ¤å‘é‡ä¸Ž [code]b[/code] 的点积。这å¯ä»¥ç”¨æ¥æ¯”较两个å‘é‡ä¹‹é—´çš„角度。例如," -"è¿™å¯ä»¥ç”¨æ¥ç¡®å®šä¸€ä¸ªæ•Œäººæ˜¯å¦æ£é¢å¯¹çŽ©å®¶ã€‚\n" -"对于直角 90 度,点积将是 [code]0[/code],对于窄于 90 度的角度,点积大于 0,对" -"于宽于 90 度的角度,点积å°äºŽ 0。\n" -"当使用归一化å•ä½å‘é‡ï¼Œå‘釿œå‘ç›¸åæ–¹å‘时,结果总是在 [code]-1.0[/code](180 " -"度角)和 [code]1.0[/code](0 度角)之间,当å‘é‡å¯¹é½ã€‚\n" +"è¿™å¯ä»¥ç”¨æ¥ç¡®å®šæ•Œäººæ˜¯å¦é¢å¯¹çŽ©å®¶ã€‚\n" +"直角(90 度)的点积是 [code]0[/code],夹角å°äºŽ 90 度点积大于 0,夹角大于 90 " +"度点积å°äºŽ 0。\n" +"使用å•ä½ï¼ˆå½’一化)å‘釿—¶ï¼Œç»“果总是在表示方å‘相åçš„ [code]-1.0[/code](180 度" +"角)和表示方å‘相åŒçš„ [code]1.0[/code](0 度角)之间。\n" "[b]注æ„:[/b][code]a.dot(b)[/code] 与 [code]b.dot(a)[/code] ç‰ä»·ã€‚" #: doc/classes/Vector3.xml @@ -83554,8 +83695,8 @@ msgid "" "constants. If all components are equal, this method returns [constant " "AXIS_X]." msgstr "" -"返回å‘é‡çš„æœ€å¤§å€¼çš„轴。å‚阅 [code]AXIS_*[/code] 常é‡ã€‚如果所有分é‡éƒ½ç›¸ç‰ï¼Œè¯¥æ–¹" -"法返回 [constant AXIS_X]。" +"返回该å‘é‡ä¸å€¼æœ€å¤§çš„è½´ã€‚è§ [code]AXIS_*[/code] 常é‡ã€‚如果所有分é‡éƒ½ç›¸ç‰ï¼Œåˆ™è¯¥" +"方法返回 [constant AXIS_X]。" #: doc/classes/Vector3.xml msgid "" @@ -83563,8 +83704,8 @@ msgid "" "constants. If all components are equal, this method returns [constant " "AXIS_Z]." msgstr "" -"返回矢é‡çš„æœ€å°å€¼çš„轴。å‚阅 [code]AXIS_*[/code] 常é‡ã€‚如果所有分é‡éƒ½ç›¸ç‰ï¼Œæœ¬æ–¹" -"法返回 [constant AXIS_Z]。" +"返回该å‘é‡ä¸å€¼æœ€å°çš„è½´ã€‚è§ [code]AXIS_*[/code] 常é‡ã€‚如果所有分é‡éƒ½ç›¸ç‰ï¼Œåˆ™è¯¥" +"方法返回 [constant AXIS_Z]。" #: doc/classes/Vector3.xml msgid "Returns the outer product with [code]b[/code]." @@ -83589,8 +83730,8 @@ msgid "" "clockwise direction when viewed from the side specified by the [code]axis[/" "code]." msgstr "" -"返回给定å‘é‡çš„带符å·çš„角度,å•使˜¯å¼§åº¦ã€‚当从[code]axis[/code]指定的一侧看,该" -"角度的符å·åœ¨é€†æ—¶é’ˆæ–¹å‘是æ£çš„ï¼Œåœ¨é¡ºæ—¶é’ˆæ–¹å‘æ˜¯è´Ÿçš„。" +"返回给定å‘é‡çš„带符å·çš„角度,å•使˜¯å¼§åº¦ã€‚当从 [code]axis[/code] 指定的一侧看," +"该角度的符å·åœ¨é€†æ—¶é’ˆæ–¹å‘是æ£çš„ï¼Œåœ¨é¡ºæ—¶é’ˆæ–¹å‘æ˜¯è´Ÿçš„。" #: doc/classes/Vector3.xml msgid "" @@ -83701,8 +83842,8 @@ msgid "" "value in the 25 - 30 range for hard braking." msgstr "" "é€šè¿‡æ–½åŠ ä¸€ä¸ªåˆ¶åŠ¨åŠ›ä½¿è½¦è¾†å‡é€Ÿã€‚åªæœ‰å½“è½¦è½®æŽ¥è§¦åˆ°è¡¨é¢æ—¶ï¼Œè½¦è¾†æ‰ä¼šå‡é€Ÿã€‚ä½ éœ€è¦æ–½" -"åŠ å¤šå°‘åŠ›æ¥ä½¿ä½ 的车辆充分å‡é€Ÿï¼Œå–决于车辆的[member RigidBody.mass]。对于一个质" -"é‡è®¾ç½®ä¸º1000的车辆,å°è¯•在25-30的范围内进行硬制动。" +"åŠ å¤šå°‘åŠ›æ¥ä½¿ä½ 的车辆充分å‡é€Ÿï¼Œå–决于车辆的 [member RigidBody.mass]。对于一个" +"è´¨é‡è®¾ç½®ä¸º 1000 的车辆,å°è¯•在 25 到 30 的范围内进行硬制动。" #: doc/classes/VehicleBody.xml msgid "" @@ -83718,8 +83859,8 @@ msgid "" msgstr "" "é€šè¿‡æ–½åŠ ä¸€ä¸ªå¼•æ“ŽåŠ›æ¥åŠ é€Ÿè½¦è¾†ã€‚åªæœ‰å½“ [member VehicleWheel.use_as_traction] 设" "置为 [code]true[/code] å¹¶ä¸Žè¡¨é¢æŽ¥è§¦çš„è½¦è½®æ‰ä¼šåŠ é€Ÿã€‚è½¦è¾†çš„ [member RigidBody." -"mass] å¯¹è½¦è¾†çš„åŠ é€Ÿåº¦æœ‰å½±å“。对于一个质é‡è®¾ç½®ä¸º 1000 的车辆,å¯ä»¥å°è¯•在 25-50 " -"çš„èŒƒå›´å†…é€‰æ‹©åŠ é€Ÿåº¦çš„å€¼ã€‚\n" +"mass] å¯¹è½¦è¾†çš„åŠ é€Ÿåº¦æœ‰å½±å“。对于一个质é‡è®¾ç½®ä¸º 1000 的车辆,å¯ä»¥å°è¯•在 25 到 " +"50 çš„èŒƒå›´å†…é€‰æ‹©åŠ é€Ÿåº¦çš„å€¼ã€‚\n" "[b]注æ„:[/b]模拟ä¸è€ƒè™‘齿轮的影å“ï¼Œå¦‚æžœä½ æƒ³æ¨¡æ‹Ÿé½¿è½®ï¼Œå°†éœ€è¦ä¸ºå…¶æ·»åŠ é€»è¾‘ã€‚\n" "负值将导致车辆倒车。" @@ -83730,8 +83871,8 @@ msgid "" "VehicleWheel.use_as_steering] set to [code]true[/code] will automatically be " "rotated." msgstr "" -"车辆的转å‘角。将æ¤è®¾ç½®ä¸ºéžé›¶å€¼å°†å¯¼è‡´è½¦è¾†åœ¨ç§»åŠ¨æ—¶è½¬å‘。将[member VehicleWheel." -"use_as_steering]设置为 [code]true[/code]的车轮会自动旋转。" +"车辆的转å‘角。将æ¤è®¾ç½®ä¸ºéžé›¶å€¼å°†å¯¼è‡´è½¦è¾†åœ¨ç§»åŠ¨æ—¶è½¬å‘。将 [member " +"VehicleWheel.use_as_steering] 设置为 [code]true[/code] 的车轮会自动旋转。" #: doc/classes/VehicleWheel.xml msgid "Physics object that simulates the behavior of a wheel." @@ -83802,9 +83943,9 @@ msgid "" "car will keep bouncing as the spring keeps its energy. A good value for this " "is around 0.3 for a normal car, 0.5 for a race car." msgstr "" -"当弹簧被压缩时,应用在弹簧上的阻尼。这个值应该在0.0ï¼ˆæ— é˜»å°¼ï¼‰å’Œ1.0之间。0.0çš„" -"值æ„å‘³ç€æ±½è½¦å°†æŒç»å¼¹è·³ï¼Œå› ä¸ºå¼¹ç°§å°†ä¿æŒå…¶èƒ½é‡ã€‚一个好的值是,普通汽车0.3å·¦å³ï¼Œ" -"赛车0.5å·¦å³ã€‚" +"当弹簧被压缩时,应用在弹簧上的阻尼。这个值应该在 0.0ï¼ˆæ— é˜»å°¼ï¼‰å’Œ 1.0 之间。" +"0.0 的值æ„å‘³ç€æ±½è½¦å°†æŒç»å¼¹è·³ï¼Œå› ä¸ºå¼¹ç°§å°†ä¿æŒå…¶èƒ½é‡ã€‚普通汽车 0.3 å·¦å³ï¼Œèµ›è½¦ " +"0.5 左峿¯”较好。" #: doc/classes/VehicleWheel.xml msgid "" @@ -83813,9 +83954,9 @@ msgid "" "higher than the [member damping_compression] property. For a [member " "damping_compression] value of 0.3, try a relaxation value of 0.5." msgstr "" -"æ”¾æ¾æ—¶æ–½åŠ åœ¨å¼¹ç°§ä¸Šçš„é˜»å°¼ã€‚è¿™ä¸ªå€¼åº”è¯¥åœ¨0.0ï¼ˆæ— é˜»å°¼ï¼‰å’Œ1.0之间。这个值应该总是" -"比 [member damping_compression] 属性ç¨é«˜ã€‚对于 [member damping_compression] " -"值0.3,å°è¯•放æ¾å€¼ä¸º0.5。" +"æ”¾æ¾æ—¶æ–½åŠ åœ¨å¼¹ç°§ä¸Šçš„é˜»å°¼ã€‚è¿™ä¸ªå€¼åº”è¯¥åœ¨ 0.0ï¼ˆæ— é˜»å°¼ï¼‰å’Œ 1.0 之间。这个值应该总" +"是比 [member damping_compression] 属性ç¨é«˜ã€‚对于 [member " +"damping_compression] 值 0.3,å°è¯•放æ¾å€¼ä¸º 0.5。" #: doc/classes/VehicleWheel.xml msgid "" @@ -83846,9 +83987,9 @@ msgid "" "will not carry the weight of the vehicle. Good results are often obtained by " "a value that is about 3× to 4× this number." msgstr "" -"弹簧所能抵抗的最大力。æ¤å€¼åº”该高于[VehicleBody]çš„[member RigidBody.mass]的四" -"分之一,å¦åˆ™å¼¹ç°§å°†æ— 法承载车辆的é‡é‡ã€‚通常由大约3×到4×这个数å—的值,以获得良" -"好的效果。" +"弹簧所能抵抗的最大力。æ¤å€¼åº”该高于 [VehicleBody] çš„ [member RigidBody.mass] " +"的四分之一,å¦åˆ™å¼¹ç°§å°†æ— 法承载车辆的é‡é‡ã€‚通常由大约 3× 到 4× 这个数å—的值," +"以获得良好的效果。" #: doc/classes/VehicleWheel.xml msgid "" @@ -83856,8 +83997,8 @@ msgid "" "50 for an off-road car, a value between 50 and 100 for a race car and try " "something around 200 for something like a Formula 1 car." msgstr "" -"这个值定义了悬架的刚度。越野车使用低于50的值,赛车使用50至100的值,åƒä¸€çº§æ–¹ç¨‹" -"å¼èµ›è½¦åˆ™å°è¯•200å·¦å³çš„值。" +"这个值定义了悬架的刚度。越野车使用低于 50 的值,赛车使用 50 至 100 的值,åƒä¸€" +"级方程å¼èµ›è½¦åˆ™å°è¯• 200 å·¦å³çš„值。" #: doc/classes/VehicleWheel.xml msgid "" @@ -83898,10 +84039,10 @@ msgid "" "simulate tire wear.\n" "It's best to set this to 1.0 when starting out." msgstr "" -"这决定了这个轮å的抓地力有多大。它与车轮所接触的表é¢çš„æ‘©æ“¦åŠ›è®¾ç½®ç›¸ç»“åˆã€‚0.0æ„" -"å‘³ç€æ²¡æœ‰æŠ“地力,1.0是æ£å¸¸æŠ“地力。对于漂移车的设置,å°è¯•å°†åŽè½®çš„æŠ“地力设置得比" -"å‰è½®ç•¥ä½Žï¼Œæˆ–è€…ä½¿ç”¨è¾ƒä½Žçš„æ•°å€¼æ¥æ¨¡æ‹Ÿè½®èƒŽçš„磨æŸã€‚\n" -"在开始时最好将其设置为1.0。" +"这决定了这个轮å的抓地力有多大。它与车轮所接触的表é¢çš„æ‘©æ“¦åŠ›è®¾ç½®ç›¸ç»“åˆã€‚0.0 " +"æ„å‘³ç€æ²¡æœ‰æŠ“地力,1.0 是æ£å¸¸æŠ“地力。对于漂移车的设置,å°è¯•å°†åŽè½®çš„æŠ“地力设置" +"得比å‰è½®ç•¥ä½Žï¼Œæˆ–è€…ä½¿ç”¨è¾ƒä½Žçš„æ•°å€¼æ¥æ¨¡æ‹Ÿè½®èƒŽçš„磨æŸã€‚\n" +"在开始时最好将其设置为 1.0。" #: doc/classes/VehicleWheel.xml msgid "The radius of the wheel in meters." @@ -83915,9 +84056,9 @@ msgid "" "will take when bottoming out, then use the rest length to move the wheel " "down to the position it should be in when the car is in rest." msgstr "" -"这是轮å从原点下é™çš„è·ç¦»ï¼Œä»¥ç±³ä¸ºå•ä½ã€‚ä¸è¦æŠŠè¿™ä¸ªè®¾ç½®ä¸º0.0ï¼Œç„¶åŽæŠŠè½¦è½®ç§»åˆ°ä½ç½®" -"上,而是把车轮的原点(Godotä¸çš„Gizmo)移到车轮触底时的ä½ç½®ï¼Œç„¶åŽä½¿ç”¨å‰©ä½™é•¿åº¦" -"将轮åå‘ä¸‹ç§»åŠ¨åˆ°æ±½è½¦é™æ¢æ—¶å®ƒåº”该所处ä½ç½®ã€‚" +"这是轮å从原点下é™çš„è·ç¦»ï¼Œä»¥ç±³ä¸ºå•ä½ã€‚ä¸è¦æŠŠè¿™ä¸ªè®¾ç½®ä¸º 0.0ï¼Œç„¶åŽæŠŠè½¦è½®ç§»åˆ°ä½" +"置上,而是把车轮的原点(Godot ä¸çš„å°å·¥å…·ï¼‰ç§»åˆ°è½¦è½®è§¦åº•æ—¶çš„ä½ç½®ï¼Œç„¶åŽä½¿ç”¨å‰©ä½™" +"长度将轮åå‘ä¸‹ç§»åŠ¨åˆ°æ±½è½¦é™æ¢æ—¶å®ƒåº”该所处ä½ç½®ã€‚" #: doc/classes/VehicleWheel.xml msgid "" @@ -83925,8 +84066,8 @@ msgid "" "your vehicle will be prone to rolling over, while a value of 0.0 will resist " "body roll." msgstr "" -"这个值会影å“车辆的滚动。如果所有车轮都设置为1.0,车辆将容易翻车,而0.0的值将" -"阻æ¢è½¦èº«ä¾§å€¾ã€‚" +"这个值会影å“车辆的滚动。如果所有车轮都设置为 1.0,车辆将容易翻车,而 0.0 的值" +"将阻æ¢è½¦èº«ä¾§å€¾ã€‚" #: doc/classes/VFlowContainer.xml msgid "Vertical flow container." @@ -83970,21 +84111,21 @@ msgstr "" #: doc/classes/VideoPlayer.xml msgid "Returns the current frame as a [Texture]." -msgstr "将当å‰å¸§ä½œä¸º[Texture]返回。" +msgstr "将当å‰å¸§ä½œä¸º [Texture] 返回。" #: doc/classes/VideoPlayer.xml msgid "" "Returns [code]true[/code] if the video is playing.\n" "[b]Note:[/b] The video is still considered playing if paused during playback." msgstr "" -"如果视频æ£åœ¨æ’放,返回 [code]true[/code] 。\n" +"如果视频æ£åœ¨æ’放,返回 [code]true[/code]。\n" "[b]注æ„:[/b]å¦‚æžœåœ¨æ’æ”¾è¿‡ç¨‹ä¸æš‚åœï¼Œè§†é¢‘ä»è¢«è®¤ä¸ºåœ¨æ’放。" #: doc/classes/VideoPlayer.xml msgid "" "Starts the video playback from the beginning. If the video is paused, this " "will not unpause the video." -msgstr "ä»Žå¤´å¼€å§‹æ’æ”¾è§†é¢‘。如果视频暂åœï¼Œè¿™ä¸ä¼šå–消暂åœã€‚" +msgstr "ä»Žå¤´å¼€å§‹æ’æ”¾è§†é¢‘。如果视频处于暂åœçжæ€ï¼Œä¸ä¼šå–消暂åœã€‚" #: doc/classes/VideoPlayer.xml msgid "" @@ -83992,8 +84133,8 @@ msgid "" "[b]Note:[/b] Although the stream position will be set to 0, the first frame " "of the video stream won't become the current frame." msgstr "" -"åœæ¢è§†é¢‘æ’æ”¾å¹¶å°†è§†é¢‘æµä½ç½®è®¾ç½®ä¸º0。\n" -"[b]注æ„:[/b]虽然视频æµä½ç½®å°†è¢«è®¾ç½®ä¸º0,但视频æµçš„第一帧ä¸ä¼šæˆä¸ºå½“å‰å¸§ã€‚" +"åœæ¢è§†é¢‘æ’æ”¾å¹¶å°†è§†é¢‘æµä½ç½®è®¾ç½®ä¸º 0。\n" +"[b]注æ„:[/b]虽然视频æµä½ç½®å°†è¢«è®¾ç½®ä¸º 0,但视频æµçš„第一帧ä¸ä¼šæˆä¸ºå½“å‰å¸§ã€‚" #: doc/classes/VideoPlayer.xml msgid "The embedded audio track to play." @@ -84044,7 +84185,7 @@ msgstr "音频音é‡ä¸ºçº¿æ€§å€¼ã€‚" #: doc/classes/VideoPlayer.xml msgid "Audio volume in dB." -msgstr "音频音é‡ï¼Œå•使˜¯dB。" +msgstr "音频音é‡ï¼Œå•使˜¯ dB。" #: doc/classes/VideoPlayer.xml msgid "Emitted when playback is finished." @@ -84060,8 +84201,8 @@ msgid "" "[VideoStream] can all be used as resource types to play back videos in " "[VideoPlayer]." msgstr "" -"所有视频æµçš„资æºç±»åž‹åŸºç±»ã€‚派生自[VideoStream]的类都å¯ä»¥ä½œä¸ºèµ„æºç±»åž‹ï¼Œåœ¨" -"[VideoPlayer]䏿’放视频。" +"所有视频æµçš„资æºç±»åž‹åŸºç±»ã€‚派生自 [VideoStream] 的类都å¯ä»¥ä½œä¸ºèµ„æºç±»åž‹ï¼Œåœ¨ " +"[VideoPlayer] 䏿’放视频。" #: modules/gdnative/doc_classes/VideoStreamGDNative.xml msgid "[VideoStream] resource for video formats implemented via GDNative." @@ -84081,7 +84222,7 @@ msgstr "" #: modules/gdnative/doc_classes/VideoStreamGDNative.xml msgid "Returns the video file handled by this [VideoStreamGDNative]." -msgstr "返回由这个[VideoStreamGDNative]处ç†çš„视频文件。" +msgstr "返回由这个 [VideoStreamGDNative] 处ç†çš„视频文件。" #: modules/gdnative/doc_classes/VideoStreamGDNative.xml msgid "" @@ -84089,12 +84230,12 @@ msgid "" "supported extensions depend on the GDNative plugins used to expose video " "formats." msgstr "" -"设置æ¤[VideoStreamGDNative]资æºå¤„ç†çš„视频文件。支æŒçš„æ‰©å±•å–决于,用于公开视频" -"æ ¼å¼çš„GDNativeæ’件。" +"è®¾ç½®æ¤ [VideoStreamGDNative] 资æºå¤„ç†çš„视频文件。支æŒçš„æ‰©å±•å–决于,用于公开视" +"é¢‘æ ¼å¼çš„ GDNative æ’件。" #: modules/theora/doc_classes/VideoStreamTheora.xml msgid "[VideoStream] resource for Ogg Theora videos." -msgstr "[VideoStream] Ogg Theora视频的资æºã€‚" +msgstr "[VideoStream] Ogg Theora 视频的资æºã€‚" #: modules/theora/doc_classes/VideoStreamTheora.xml msgid "" @@ -84227,7 +84368,7 @@ msgid "" "Returns the first valid [World] for this viewport, searching the [member " "world] property of itself and any Viewport ancestor." msgstr "" -"返回该视窗的首个有效 [World],在它自身åŠä»»ä½• Viewport 祖先节点的 [member " +"返回该视å£çš„首个有效 [World],在它自身åŠä»»ä½• Viewport 祖先节点的 [member " "world] å±žæ€§ä¸æŸ¥æ‰¾ã€‚" #: doc/classes/Viewport.xml @@ -84235,7 +84376,7 @@ msgid "" "Returns the first valid [World2D] for this viewport, searching the [member " "world_2d] property of itself and any Viewport ancestor." msgstr "" -"返回该视窗的首个有效 [World2D],在它自身åŠä»»ä½• Viewport 祖先节点的 [member " +"返回该视å£çš„首个有效 [World2D],在它自身åŠä»»ä½• Viewport 祖先节点的 [member " "world_2d] å±žæ€§ä¸æŸ¥æ‰¾ã€‚" #: doc/classes/Viewport.xml @@ -84290,7 +84431,7 @@ msgstr "" #: doc/classes/Viewport.xml msgid "Returns the viewport's RID from the [VisualServer]." -msgstr "从 [VisualServer] 返回该视窗的 RID。" +msgstr "从 [VisualServer] 返回该视å£çš„ RID。" #: doc/classes/Viewport.xml msgid "Returns the visible rectangle in global screen coordinates." @@ -84327,8 +84468,7 @@ msgid "" "Returns [code]true[/code] if the size override is enabled. See [method " "set_size_override]." msgstr "" -"如果å¯ç”¨äº†å°ºå¯¸è¦†ç›–,则返回 [code]true[/code]。请å‚阅 [method " -"set_size_override]。" +"如果å¯ç”¨äº†å°ºå¯¸è¦†ç›–,则返回 [code]true[/code]ã€‚è§ [method set_size_override]。" #: doc/classes/Viewport.xml msgid "" @@ -84363,7 +84503,7 @@ msgid "" "size. If the size parameter is [code](-1, -1)[/code], it won't update the " "size." msgstr "" -"设置该视窗的尺寸覆盖。如果 [code]enable[/code] 傿•°æ˜¯ [code]true[/code],就会" +"设置该视å£çš„尺寸覆盖。如果 [code]enable[/code] 傿•°æ˜¯ [code]true[/code],就会" "使用覆盖,å¦åˆ™å°±ä½¿ç”¨é»˜è®¤å°ºå¯¸ã€‚å¦‚æžœå°ºå¯¸å‚æ•°æ˜¯ [code](-1, -1)[/code],它将ä¸ä¼š" "更新尺寸。" @@ -84380,15 +84520,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "If [code]true[/code], the viewport will be used in AR/VR process." -msgstr "如果为 [code]true[/code],该视窗将用于AR/VR进程。" +msgstr "如果为 [code]true[/code],该视å£å°†ç”¨äºŽAR/VR进程。" #: doc/classes/Viewport.xml msgid "If [code]true[/code], the viewport will process 2D audio streams." -msgstr "如果为 [code]true[/code]ï¼Œè¯¥è§†çª—å°†å¤„ç† 2D 音频æµã€‚" +msgstr "如果为 [code]true[/code],该视å£å°†å¤„ç† 2D 音频æµã€‚" #: doc/classes/Viewport.xml msgid "If [code]true[/code], the viewport will process 3D audio streams." -msgstr "如果为 [code]true[/code]ï¼Œè¯¥è§†çª—å°†å¤„ç† 3D 音频æµã€‚" +msgstr "如果为 [code]true[/code],该视å£å°†å¤„ç† 3D 音频æµã€‚" #: doc/classes/Viewport.xml msgid "" @@ -84396,16 +84536,22 @@ msgid "" "positions of all child [CanvasItem]s. This is relative to the global canvas " "transform of the viewport." msgstr "" -"è¯¥è§†çª—çš„ç”»å¸ƒå˜æ¢ï¼Œå¯¹æ”¹å˜æ‰€æœ‰å [CanvasItem] çš„å±å¹•ä½ç½®å¾ˆæœ‰ç”¨ã€‚相对于该视窗的" +"该视å£çš„ç”»å¸ƒå˜æ¢ï¼Œå¯¹æ”¹å˜æ‰€æœ‰å [CanvasItem] çš„å±å¹•ä½ç½®å¾ˆæœ‰ç”¨ã€‚相对于该视å£çš„" "å…¨å±€ç”»å¸ƒå˜æ¢ã€‚" #: doc/classes/Viewport.xml +#, fuzzy msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -84420,11 +84566,12 @@ msgid "The overlay mode for test rendered geometry in debug purposes." msgstr "åœ¨è°ƒè¯•æ—¶ï¼Œç”¨äºŽæµ‹è¯•æ¸²æŸ“çš„å‡ ä½•å›¾å½¢çš„å åŠ æ¨¡å¼ã€‚" #: doc/classes/Viewport.xml +#, fuzzy msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" -"如果为 [code]true[/code],该视窗将ç¦ç”¨ 3D 渲染。对于实际ç¦ç”¨ï¼Œä½¿ç”¨ " +"如果为 [code]true[/code],该视å£å°†ç¦ç”¨ 3D 渲染。对于实际ç¦ç”¨ï¼Œä½¿ç”¨ " "[code]usage[/code]。" #: doc/classes/Viewport.xml @@ -84438,24 +84585,24 @@ msgid "" msgstr "" "å¯ç”¨å¿«é€Ÿè¿‘似抗锯齿。FXAA æ˜¯ä¸€ç§æµè¡Œçš„å±å¹•空间抗锯齿方法,它的速度很快,但会使" "图åƒçœ‹èµ·æ¥å¾ˆæ¨¡ç³Šï¼Œç‰¹åˆ«æ˜¯åœ¨è¾ƒä½Žçš„分辨率。在 1440p å’Œ 4K è¿™æ ·çš„å¤§åˆ†è¾¨çŽ‡ä¸‹ï¼Œå®ƒä»" -"ç„¶å¯ä»¥è¾ƒå¥½å·¥ä½œã€‚一些æŸå¤±çš„é”度å¯ä»¥é€šè¿‡å¯ç”¨å¯¹æ¯”度适应性é”åŒ–æ¥æ¢å¤ï¼Œå‚阅 " -"[member sharpen_intensity]。" +"ç„¶å¯ä»¥è¾ƒå¥½å·¥ä½œã€‚一些æŸå¤±çš„é”度å¯ä»¥é€šè¿‡å¯ç”¨å¯¹æ¯”度适应性é”åŒ–æ¥æ¢å¤ï¼ˆè§ [member " +"sharpen_intensity])。" #: doc/classes/Viewport.xml msgid "" "The global canvas transform of the viewport. The canvas transform is " "relative to this." -msgstr "è¯¥è§†çª—çš„å…¨å±€ç”»å¸ƒå˜æ¢ã€‚ç”»å¸ƒå˜æ¢æ˜¯ç›¸å¯¹äºŽè¿™ä¸ªçš„。" +msgstr "该视å£çš„å…¨å±€ç”»å¸ƒå˜æ¢ã€‚ç”»å¸ƒå˜æ¢æ˜¯ç›¸å¯¹äºŽè¿™ä¸ªçš„。" #: doc/classes/Viewport.xml msgid "If [code]true[/code], the viewport will not receive input events." -msgstr "如果为 [code]true[/code]ï¼Œè¯¥è§†çª—å°†ä¸æŽ¥æ”¶è¾“å…¥äº‹ä»¶ã€‚" +msgstr "如果为 [code]true[/code],该视å£å°†ä¸æŽ¥æ”¶è¾“入事件。" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], the GUI controls on the viewport will lay pixel " "perfectly." -msgstr "如果为 [code]true[/code],该视窗上的 GUI 控件将完美地放置åƒç´ 。" +msgstr "如果为 [code]true[/code],该视å£ä¸Šçš„ GUI 控件将完美地放置åƒç´ 。" #: doc/classes/Viewport.xml msgid "" @@ -84468,7 +84615,7 @@ msgid "" "[constant USAGE_3D_NO_EFFECTS], since HDR is not supported for 2D.\n" "[b]Note:[/b] Only available on the GLES3 backend." msgstr "" -"如果为 [code]true[/code],视窗的渲染将获益于高动æ€èŒƒå›´ç®—法。高动æ€èŒƒå›´å…许视" +"如果为 [code]true[/code],视å£çš„æ¸²æŸ“将获益于高动æ€èŒƒå›´ç®—法。高动æ€èŒƒå›´å…许视" "窗接收 0-1 范围以外的数值。在 Godot ä¸ HDR 默认使用åŠç²¾åº¦æµ®ç‚¹æ•°ï¼ˆ16 ä½ï¼‰ã€‚è¦" "使用全精度浮点数(32 ä½ï¼‰ï¼Œè¯·å¯ç”¨ [member use_32_bpc_depth]。\n" "[b]注æ„:[/b]需è¦å°† [member usage] 设置为 [constant USAGE_3D] 或 [constant " @@ -84488,11 +84635,11 @@ msgid "" "require input in linear color space!" msgstr "" "如果为 [code]true[/code],3D 渲染åŽçš„结果将ä¸ä¼šåº”用线性到 sRGB 的颜色转æ¢ã€‚当" -"è§†çª—è¢«ç”¨ä½œæ¸²æŸ“ç›®æ ‡æ—¶ï¼Œè¿™ç‚¹å¾ˆé‡è¦ï¼Œå› 为渲染结果会被用作å¦ä¸€ä¸ªè§†çª—䏿¸²æŸ“çš„ 3D " -"物体的纹ç†ã€‚如果视窗被用æ¥åˆ›å»ºä¸åŸºäºŽé¢œè‰²çš„æ•°æ®ï¼Œå™ªå£°ã€é«˜åº¦å›¾ã€é‡‡å›¾ç‰ï¼Œè¿™ä¹Ÿå¾ˆ" -"é‡è¦ã€‚当视窗被用作 2D å¯¹è±¡çš„çº¹ç†æ—¶ï¼Œæˆ–è€…è§†çª—æ˜¯ä½ çš„æœ€ç»ˆè¾“å‡ºæ—¶ï¼Œè¯·ä¸è¦å¯ç”¨è¿™ä¸ª" +"视å£è¢«ç”¨ä½œæ¸²æŸ“ç›®æ ‡æ—¶ï¼Œè¿™ç‚¹å¾ˆé‡è¦ï¼Œå› 为渲染结果会被用作å¦ä¸€ä¸ªè§†çª—䏿¸²æŸ“çš„ 3D " +"物体的纹ç†ã€‚如果视å£è¢«ç”¨æ¥åˆ›å»ºä¸åŸºäºŽé¢œè‰²çš„æ•°æ®ï¼Œå™ªå£°ã€é«˜åº¦å›¾ã€é‡‡å›¾ç‰ï¼Œè¿™ä¹Ÿå¾ˆ" +"é‡è¦ã€‚当视å£è¢«ç”¨ä½œ 2D å¯¹è±¡çš„çº¹ç†æ—¶ï¼Œæˆ–è€…è§†å£æ˜¯ä½ 的最终输出时,请ä¸è¦å¯ç”¨è¿™ä¸ª" "功能。对于 GLES2 驱动æ¥è¯´ï¼Œè¿™å°†æŠŠ sRGB 输出转æ¢ä¸ºçº¿æ€§è¾“出,这应该åªç”¨äºŽéœ€è¦çº¿" -"性色彩空间输入的VRæ’ä»¶!" +"性色彩空间输入的 VR æ’ä»¶!" #: doc/classes/Viewport.xml msgid "" @@ -84500,22 +84647,22 @@ msgid "" "edges at the cost of significantly worse performance. A value of 4 is best " "unless targeting very high-end systems." msgstr "" -"多é‡é‡‡æ ·æŠ—锯齿模å¼ã€‚一个较高的数å—会使边缘更平滑,但代价是性能明显下é™ã€‚除éž" -"是针对éžå¸¸é«˜ç«¯çš„系统,å¦åˆ™æ•°å€¼ä¸º4是最好的。" +"多é‡é‡‡æ ·æŠ—锯齿模å¼ã€‚æ•°å—越高边缘越平滑,但代价是性能明显下é™ã€‚é™¤éžæ˜¯é’ˆå¯¹éžå¸¸" +"高端的系统,å¦åˆ™æ•°å€¼ä¸º 4 是最好的。" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], the viewport will use a unique copy of the [World] " "defined in [member world]." msgstr "" -"如果为 [code]true[/code],该视窗将使用 [member world] ä¸å®šä¹‰çš„ [World] 的唯一" +"如果为 [code]true[/code],该视å£å°†ä½¿ç”¨ [member world] ä¸å®šä¹‰çš„ [World] 的唯一" "副本。" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], the objects rendered by viewport become subjects of " "mouse picking process." -msgstr "如果为 [code]true[/code],该视窗渲染的对象将æˆä¸ºé¼ æ ‡æ‹¾å–过程的对象。" +msgstr "如果为 [code]true[/code]ï¼Œè¯¥è§†å£æ¸²æŸ“的对象将æˆä¸ºé¼ æ ‡æ‹¾å–过程的对象。" #: doc/classes/Viewport.xml msgid "" @@ -84526,7 +84673,7 @@ msgid "" "information see [method VisualServer.viewport_set_render_direct_to_screen]." msgstr "" "如果为 [code]true[/code],会直接将该 Viewport 渲染到å±å¹•ä¸Šï¼Œè€Œä¸æ˜¯æ¸²æŸ“åˆ°æ ¹è§†" -"窗上。åªåœ¨ GLES2 ä¸å¯ç”¨ã€‚这是一个低级别的优化,在大多数情况下ä¸åº”该使用。如果" +"å£ä¸Šã€‚åªåœ¨ GLES2 ä¸å¯ç”¨ã€‚这是一个低级别的优化,在大多数情况下ä¸åº”该使用。如果" "使用,从该 Viewport 或从 [code]SCREEN_TEXTURE[/code] 读å–å°†å˜å¾—ä¸å¯ç”¨ã€‚更多信" "æ¯å‚阅 [method VisualServer.viewport_set_render_direct_to_screen]。" @@ -84535,12 +84682,12 @@ msgid "" "The clear mode when viewport used as a render target.\n" "[b]Note:[/b] This property is intended for 2D usage." msgstr "" -"è§†çª—ç”¨ä½œæ¸²æŸ“ç›®æ ‡æ—¶çš„æ¸…é™¤æ¨¡å¼ã€‚\n" +"视å£ç”¨ä½œæ¸²æŸ“ç›®æ ‡æ—¶çš„æ¸…é™¤æ¨¡å¼ã€‚\n" "[b]注æ„:[/b]æ¤å±žæ€§é€‚用于 2D 使用。" #: doc/classes/Viewport.xml msgid "The update mode when viewport used as a render target." -msgstr "è§†çª—ç”¨ä½œæ¸²æŸ“ç›®æ ‡æ—¶çš„æ›´æ–°æ¨¡å¼ã€‚" +msgstr "视å£ç”¨ä½œæ¸²æŸ“ç›®æ ‡æ—¶çš„æ›´æ–°æ¨¡å¼ã€‚" #: doc/classes/Viewport.xml msgid "" @@ -84598,7 +84745,7 @@ msgid "" "The width and height of viewport. Must be set to a value greater than or " "equal to 2 pixels on both dimensions. Otherwise, nothing will be displayed." msgstr "" -"视窗的宽度和高度。必须在两个维度上设置为大于或ç‰äºŽ 2 åƒç´ 的值。å¦åˆ™ï¼Œå°†ä¸ä¼šæ˜¾" +"视å£çš„宽度和高度。必须在两个维度上设置为大于或ç‰äºŽ 2 åƒç´ 的值。å¦åˆ™ï¼Œå°†ä¸ä¼šæ˜¾" "示任何东西。" #: doc/classes/Viewport.xml @@ -84609,11 +84756,14 @@ msgstr "如果为 [code]true[/code],尺寸é‡å†™ä¹Ÿä¼šå½±å“拉伸。" msgid "" "If [code]true[/code], the viewport should render its background as " "transparent." -msgstr "如果为 [code]true[/code]ï¼Œè¯¥è§†åŒºåº”ä½¿å…¶èƒŒæ™¯æ¸²æŸ“ä¸ºé€æ˜Žã€‚" +msgstr "如果为 [code]true[/code],该视å£åº”ä½¿å…¶èƒŒæ™¯æ¸²æŸ“ä¸ºé€æ˜Žã€‚" #: doc/classes/Viewport.xml +#, fuzzy msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -84657,7 +84807,7 @@ msgid "" "Emitted when the size of the viewport is changed, whether by [method " "set_size_override], resize of window, or some other means." msgstr "" -"当视窗的大å°è¢«æ”¹å˜æ—¶ï¼Œæ— 论是通过 [method set_size_override]ã€è°ƒæ•´çª—å£çš„大å°ï¼Œ" +"当视å£çš„大å°è¢«æ”¹å˜æ—¶ï¼Œæ— 论是通过 [method set_size_override]ã€è°ƒæ•´çª—å£çš„大å°ï¼Œ" "还是其他方å¼ï¼Œéƒ½ä¼šè§¦å‘。" #: doc/classes/Viewport.xml @@ -84877,10 +85027,10 @@ msgid "" "[b]Note:[/b] [member stretch] must be [code]true[/code] for this property to " "work." msgstr "" -"å°†è§†çª—çš„æœ‰æ•ˆåˆ†è¾¨çŽ‡é™¤ä»¥è¿™ä¸ªå€¼ï¼ŒåŒæ—¶ä¿ç•™å…¶æ¯”例。这å¯ä»¥ç”¨æ¥åŠ å¿«æ¸²æŸ“é€Ÿåº¦ã€‚\n" -"例如,一个1280×720的视窗,如果[member stretch_shrink]设置为[code]2[/code],将" -"以640×360çš„å°ºå¯¸è¿›è¡Œæ¸²æŸ“ï¼ŒåŒæ—¶åœ¨å®¹å™¨ä¸å æ®åŒæ ·çš„尺寸。\n" -"[b]注æ„:[/b][member stretch]拉伸必须是[code]true[/code],这个属性æ‰èƒ½å‘挥作" +"将视å£çš„æœ‰æ•ˆåˆ†è¾¨çŽ‡é™¤ä»¥è¿™ä¸ªå€¼ï¼ŒåŒæ—¶ä¿ç•™å…¶æ¯”例。这å¯ä»¥ç”¨æ¥åŠ å¿«æ¸²æŸ“é€Ÿåº¦ã€‚\n" +"例如,将 1280×720 的视å£çš„ [member stretch_shrink] 设置为 [code]2[/code],将" +"以 640×360 çš„å°ºå¯¸è¿›è¡Œæ¸²æŸ“ï¼ŒåŒæ—¶åœ¨å®¹å™¨ä¸å æ®åŒæ ·çš„尺寸。\n" +"[b]注æ„:[/b][member stretch] 必须是 [code]true[/code],这个属性æ‰èƒ½å‘挥作" "用。" #: doc/classes/ViewportTexture.xml @@ -84945,27 +85095,27 @@ msgstr "返回由给定的 [enum Enabler] 叏釿 ‡è¯†çš„å¯ç”¨ç¨‹åºæ˜¯å¦å¤„äº #: doc/classes/VisibilityEnabler.xml doc/classes/VisibilityEnabler2D.xml msgid "" "Sets active state of the enabler identified by given [enum Enabler] constant." -msgstr "设置由给定的[enum Enabler]常é‡è¯†åˆ«çš„å¯ç”¨ç¨‹åºçš„æ´»åŠ¨çŠ¶æ€ã€‚" +msgstr "设置由给定的 [enum Enabler] 常é‡è¯†åˆ«çš„å¯ç”¨ç¨‹åºçš„æ´»åŠ¨çŠ¶æ€ã€‚" #: doc/classes/VisibilityEnabler.xml msgid "If [code]true[/code], [RigidBody] nodes will be paused." -msgstr "如果为 [code]true[/code],[RigidBody]节点将被暂åœã€‚" +msgstr "如果为 [code]true[/code],[RigidBody] 节点将被暂åœã€‚" #: doc/classes/VisibilityEnabler.xml doc/classes/VisibilityEnabler2D.xml msgid "If [code]true[/code], [AnimationPlayer] nodes will be paused." -msgstr "如果为 [code]true[/code],[AnimationPlayer]节点将被暂åœã€‚" +msgstr "如果为 [code]true[/code],[AnimationPlayer] 节点将被暂åœã€‚" #: doc/classes/VisibilityEnabler.xml doc/classes/VisibilityEnabler2D.xml msgid "This enabler will pause [AnimationPlayer] nodes." -msgstr "这个å¯ç”¨ç¨‹åºå°†æš‚åœ[AnimationPlayer]节点。" +msgstr "这个å¯ç”¨ç¨‹åºå°†æš‚åœ [AnimationPlayer] 节点。" #: doc/classes/VisibilityEnabler.xml msgid "This enabler will freeze [RigidBody] nodes." -msgstr "这个å¯ç”¨ç¨‹åºå°†å†»ç»“[RigidBody]节点。" +msgstr "这个å¯ç”¨ç¨‹åºå°†å†»ç»“ [RigidBody] 节点。" #: doc/classes/VisibilityEnabler.xml doc/classes/VisibilityEnabler2D.xml msgid "Represents the size of the [enum Enabler] enum." -msgstr "表示[enum Enabler]枚举的大å°ã€‚" +msgstr "表示 [enum Enabler] 枚举的大å°ã€‚" #: doc/classes/VisibilityEnabler2D.xml msgid "" @@ -84981,38 +85131,39 @@ msgid "" "[b]Note:[/b] VisibilityEnabler2D will not affect nodes added after scene " "initialization." msgstr "" -"VisibilityEnabler2D会在[RigidBody2D]ã€[AnimationPlayer]和其他节点ä¸å¯è§æ—¶ç¦ç”¨" -"它们。它åªä¼šå½±å“与VisibilityEnabler2Dçš„æ ¹èŠ‚ç‚¹ç›¸åŒçš„èŠ‚ç‚¹ï¼Œä»¥åŠæ ¹èŠ‚ç‚¹æœ¬èº«ã€‚\n" -"å¦‚æžœä½ åªæƒ³æŽ¥æ”¶é€šçŸ¥ï¼Œè¯·ä½¿ç”¨[VisibilityNotifier2D]代替。\n" -"[b]注æ„:[/b]ç”±äºŽæ€§èƒ½åŽŸå› ï¼ŒVisibilityEnabler2D使用一个近似的å¯å‘弿–¹æ³•,其精" +"VisibilityEnabler2D 会在 [RigidBody2D]ã€[AnimationPlayer] 和其他节点ä¸å¯è§æ—¶" +"ç¦ç”¨å®ƒä»¬ã€‚它åªä¼šå½±å“与 VisibilityEnabler2D çš„æ ¹èŠ‚ç‚¹ç›¸åŒçš„èŠ‚ç‚¹ï¼Œä»¥åŠæ ¹èŠ‚ç‚¹æœ¬" +"身。\n" +"å¦‚æžœä½ åªæƒ³æŽ¥æ”¶é€šçŸ¥ï¼Œè¯·ä½¿ç”¨ [VisibilityNotifier2D] 代替。\n" +"[b]注æ„:[/b]ç”±äºŽæ€§èƒ½åŽŸå› ï¼ŒVisibilityEnabler2D 使用一个近似的å¯å‘弿–¹æ³•,其精" "度由 [member ProjectSettings.world/2d/cell_size] å†³å®šã€‚å¦‚æžœä½ éœ€è¦ç²¾ç¡®çš„å¯è§æ€§" -"检查,请使用å¦ä¸€ç§æ–¹æ³•ï¼Œä¾‹å¦‚æ·»åŠ ä¸€ä¸ª[Area2D]节点作为[Camera2D]节点的å节" +"检查,请使用å¦ä¸€ç§æ–¹æ³•ï¼Œä¾‹å¦‚æ·»åŠ ä¸€ä¸ª [Area2D] 节点作为 [Camera2D] 节点的å节" "点。\n" -"[b]注æ„:[/b]VisibilityEnabler2Dä¸ä¼šå½±å“场景åˆå§‹åŒ–åŽæ·»åŠ çš„èŠ‚ç‚¹ã€‚" +"[b]注æ„:[/b]VisibilityEnabler2D ä¸ä¼šå½±å“场景åˆå§‹åŒ–åŽæ·»åŠ çš„èŠ‚ç‚¹ã€‚" #: doc/classes/VisibilityEnabler2D.xml msgid "If [code]true[/code], [RigidBody2D] nodes will be paused." -msgstr "如果为 [code]true[/code],[RigidBody2D]节点将被暂åœã€‚" +msgstr "如果为 [code]true[/code],[RigidBody2D] 节点将被暂åœã€‚" #: doc/classes/VisibilityEnabler2D.xml msgid "If [code]true[/code], [AnimatedSprite] nodes will be paused." -msgstr "如果为 [code]true[/code],[AnimatedSprite]节点将被暂åœã€‚" +msgstr "如果为 [code]true[/code],[AnimatedSprite] 节点将被暂åœã€‚" #: doc/classes/VisibilityEnabler2D.xml msgid "If [code]true[/code], [Particles2D] nodes will be paused." -msgstr "如果为 [code]true[/code],[Particles2D]节点将被暂åœã€‚" +msgstr "如果为 [code]true[/code],[Particles2D] 节点将被暂åœã€‚" #: doc/classes/VisibilityEnabler2D.xml msgid "" "If [code]true[/code], the parent's [method Node._physics_process] will be " "stopped." msgstr "" -"如果为 [code]true[/code],父级的[method Node._physics_process]å°†è¢«åœæ¢ã€‚" +"如果为 [code]true[/code],父级的 [method Node._physics_process] å°†è¢«åœæ¢ã€‚" #: doc/classes/VisibilityEnabler2D.xml msgid "" "If [code]true[/code], the parent's [method Node._process] will be stopped." -msgstr "如果为 [code]true[/code],父级的[method Node._process]å°†è¢«åœæ¢ã€‚" +msgstr "如果为 [code]true[/code],父级的 [method Node._process] å°†è¢«åœæ¢ã€‚" #: doc/classes/VisibilityEnabler2D.xml msgid "This enabler will freeze [RigidBody2D] nodes." @@ -85075,7 +85226,7 @@ msgstr "" #: doc/classes/VisibilityNotifier.xml msgid "The VisibilityNotifier's bounding box." -msgstr "VisibilityNotifier的边界框。" +msgstr "VisibilityNotifier 的边界框。" #: doc/classes/VisibilityNotifier.xml msgid "" @@ -85093,19 +85244,19 @@ msgstr "" #: doc/classes/VisibilityNotifier.xml msgid "Emitted when the VisibilityNotifier enters a [Camera]'s view." -msgstr "当VisibilityNotifier进入[Camera]的视图时触å‘。" +msgstr "当 VisibilityNotifier 进入 [Camera] 的视图时触å‘。" #: doc/classes/VisibilityNotifier.xml msgid "Emitted when the VisibilityNotifier exits a [Camera]'s view." -msgstr "当VisibilityNotifier退出[Camera]的视图时触å‘。" +msgstr "当 VisibilityNotifier 退出 [Camera] 的视图时触å‘。" #: doc/classes/VisibilityNotifier.xml msgid "Emitted when the VisibilityNotifier enters the screen." -msgstr "当VisibilityNotifier进入å±å¹•时触å‘。" +msgstr "当 VisibilityNotifier 进入å±å¹•时触å‘。" #: doc/classes/VisibilityNotifier.xml msgid "Emitted when the VisibilityNotifier exits the screen." -msgstr "当VisibilityNotifier退出å±å¹•时触å‘。" +msgstr "当 VisibilityNotifier 退出å±å¹•时触å‘。" #: doc/classes/VisibilityNotifier2D.xml msgid "" @@ -85119,12 +85270,13 @@ msgid "" "world/2d/cell_size]. If you need precise visibility checking, use another " "method such as adding an [Area2D] node as a child of a [Camera2D] node." msgstr "" -"VisibilityNotifier2D检测它在å±å¹•上是å¦å¯è§ã€‚当它的边界矩形进入或退出å±å¹•或视" -"窗时,它也会å‘出通知。\n" -"å¦‚æžœä½ æƒ³è®©èŠ‚ç‚¹åœ¨é€€å‡ºå±å¹•时自动ç¦ç”¨ï¼Œè¯·ä½¿ç”¨[VisibilityEnabler2D]代替。\n" -"[b]注æ„:[/b]ç”±äºŽæ€§èƒ½åŽŸå› ï¼ŒVisibilityNotifier2D使用一个近似的å¯å‘弿–¹æ³•,其精" -"度由 [member ProjectSettings.world/2d/cell_size] å†³å®šã€‚å¦‚æžœä½ éœ€è¦ç²¾ç¡®çš„å¯è§æ€§" -"检查,请使用å¦ä¸€ç§æ–¹æ³•ï¼Œå¦‚æ·»åŠ ä¸€ä¸ª[Area2D]节点作为[Camera2D]节点的å节点。" +"VisibilityNotifier2D 检测它在å±å¹•上是å¦å¯è§ã€‚当它的边界矩形进入或退出å±å¹•或视" +"壿—¶ï¼Œå®ƒä¹Ÿä¼šå‘出通知。\n" +"å¦‚æžœä½ æƒ³è®©èŠ‚ç‚¹åœ¨é€€å‡ºå±å¹•时自动ç¦ç”¨ï¼Œè¯·ä½¿ç”¨ [VisibilityEnabler2D] 代替。\n" +"[b]注æ„:[/b]ç”±äºŽæ€§èƒ½åŽŸå› ï¼ŒVisibilityNotifier2D 使用一个近似的å¯å‘弿–¹æ³•,其" +"精度由 [member ProjectSettings.world/2d/cell_size] å†³å®šã€‚å¦‚æžœä½ éœ€è¦ç²¾ç¡®çš„å¯è§" +"性检查,请使用å¦ä¸€ç§æ–¹æ³•ï¼Œå¦‚æ·»åŠ ä¸€ä¸ª [Area2D] 节点作为 [Camera2D] 节点的å节" +"点。" #: doc/classes/VisibilityNotifier2D.xml msgid "" @@ -85140,27 +85292,27 @@ msgstr "" #: doc/classes/VisibilityNotifier2D.xml msgid "The VisibilityNotifier2D's bounding rectangle." -msgstr "VisibilityNotifier2D的边界矩形。" +msgstr "VisibilityNotifier2D 的边界矩形。" #: doc/classes/VisibilityNotifier2D.xml msgid "Emitted when the VisibilityNotifier2D enters the screen." -msgstr "当VisibilityNotifier2D进入å±å¹•时触å‘。" +msgstr "当 VisibilityNotifier2D 进入å±å¹•时触å‘。" #: doc/classes/VisibilityNotifier2D.xml msgid "Emitted when the VisibilityNotifier2D exits the screen." -msgstr "当VisibilityNotifier2D退出å±å¹•时触å‘。" +msgstr "当 VisibilityNotifier2D 退出å±å¹•时触å‘。" #: doc/classes/VisibilityNotifier2D.xml msgid "Emitted when the VisibilityNotifier2D enters a [Viewport]'s view." -msgstr "当VisibilityNotifier2D进入[Viewport]的视图时触å‘。" +msgstr "当 VisibilityNotifier2D 进入 [Viewport] 的视图时触å‘。" #: doc/classes/VisibilityNotifier2D.xml msgid "Emitted when the VisibilityNotifier2D exits a [Viewport]'s view." -msgstr "当VisibilityNotifier2D退出[Viewport]的视图时触å‘。" +msgstr "当 VisibilityNotifier2D 退出 [Viewport] 的视图时触å‘。" #: doc/classes/VisualInstance.xml msgid "Parent of all visual 3D nodes." -msgstr "所有å¯è§†3D节点的父节点。" +msgstr "所有å¯è§† 3D 节点的父节点。" #: doc/classes/VisualInstance.xml msgid "" @@ -85181,7 +85333,7 @@ msgid "" "Returns the [AABB] (also known as the bounding box) for this " "[VisualInstance]. See also [method get_transformed_aabb]." msgstr "" -"返回æ¤[VisualInstance]çš„[AABB],也称为边界框。å‚阅[method " +"è¿”å›žæ¤ [VisualInstance] çš„ [AABB],也称为边界框。å¦è¯·å‚阅 [method " "get_transformed_aabb]。" #: doc/classes/VisualInstance.xml @@ -85190,8 +85342,8 @@ msgid "" "example, if the Node is a [MeshInstance], this will return the RID of the " "associated [Mesh]." msgstr "" -"返回与æ¤[VisualInstance]相关的资æºçš„RID。例如,如果该节点是一个" -"[MeshInstance],这将返回相关的[Mesh]çš„RID。" +"è¿”å›žä¸Žæ¤ [VisualInstance] 相关的资æºçš„ RID。例如,如果该节点是一个 " +"[MeshInstance],这将返回相关的 [Mesh] çš„ RID。" #: doc/classes/VisualInstance.xml msgid "" @@ -85199,9 +85351,9 @@ msgid "" "by [method VisualServer.instance_create]. This RID is needed if you want to " "call [VisualServer] functions directly on this [VisualInstance]." msgstr "" -"返回这个实例的RID。这个RID与[method VisualServer.instance_create]所返回的RID" -"相åŒã€‚å¦‚æžœä½ æƒ³åœ¨è¿™ä¸ª[VisualInstance]上直接调用[VisualServer]函数,就需è¦è¿™ä¸ª" -"RID。" +"返回这个实例的 RID。这个 RID 与 [method VisualServer.instance_create] 所返回" +"çš„ RID 相åŒã€‚å¦‚æžœä½ æƒ³åœ¨è¿™ä¸ª [VisualInstance] 上直接调用 [VisualServer] 函数," +"就需è¦è¿™ä¸ª RID。" #: doc/classes/VisualInstance.xml msgid "" @@ -85218,9 +85370,9 @@ msgid "" "Transformed in this case means the [AABB] plus the position, rotation, and " "scale of the [Spatial]'s [Transform]. See also [method get_aabb]." msgstr "" -"返回æ¤[VisualInstance]çš„å˜æ¢åŽçš„[AABB],也称为边界框。\n" -"è¿™é‡Œçš„å˜æ¢æ˜¯æŒ‡[AABB]åŠ ä¸Š[Spatial]çš„[Transform]çš„ä½ç½®ã€æ—‹è½¬å’Œç¼©æ”¾ã€‚å‚阅" -"[method get_aabb]。" +"è¿”å›žæ¤ [VisualInstance] çš„å˜æ¢åŽçš„ [AABB],也称为边界框。\n" +"è¿™é‡Œçš„å˜æ¢æ˜¯æŒ‡ [AABB] åŠ ä¸Š [Spatial] çš„ [Transform] çš„ä½ç½®ã€æ—‹è½¬å’Œç¼©æ”¾ã€‚å¦è¯·" +"å‚阅 [method get_aabb]。" #: doc/classes/VisualInstance.xml msgid "" @@ -85242,7 +85394,23 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" "ç»˜åˆ¶æ¤ [VisualInstance] 的渲染层。\n" -"æ¤å¯¹è±¡ä»…对[Camera]å¯è§ï¼Œå…¶å‰”除é®ç½©åŒ…括æ¤[VisualInstance]设置的渲染对象。" +"æ¤å¯¹è±¡ä»…对 [Camera]å¯è§ï¼Œå…¶å‰”除é®ç½©åŒ…æ‹¬æ¤ [VisualInstance] 设置的渲染对象。" + +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." @@ -85320,13 +85488,13 @@ msgid "" "[code]from_port[/code] would be fed into [code]to_node[/code]'s " "[code]to_port[/code]." msgstr "" -"连接两个数æ®ç«¯å£ã€‚[code]from_node[/code]çš„[code]from_port[/code]的值将被输入" -"[code]to_node[/code]çš„[code]to_port[/code]。" +"连接两个数æ®ç«¯å£ã€‚[code]from_node[/code] çš„ [code]from_port[/code] 的值将被输" +"å…¥ [code]to_node[/code] çš„ [code]to_port[/code]。" #: modules/visual_script/doc_classes/VisualScript.xml msgid "" "Disconnect two data ports previously connected with [method data_connect]." -msgstr "æ–开之å‰ç”¨[method data_connect]连接的两个数æ®ç«¯å£ã€‚" +msgstr "æ–开之å‰ç”¨ [method data_connect] 连接的两个数æ®ç«¯å£ã€‚" #: modules/visual_script/doc_classes/VisualScript.xml msgid "Returns the id of a function's entry point node." @@ -85346,7 +85514,7 @@ msgstr "è¿”å›žèŠ‚ç‚¹çš„åæ ‡ï¼Œå•使˜¯åƒç´ 。" #: modules/visual_script/doc_classes/VisualScript.xml msgid "Returns the default (initial) value of a variable." -msgstr "返回å˜é‡çš„åˆå§‹é»˜è®¤å€¼ã€‚" +msgstr "返回å˜é‡çš„默认(åˆå§‹ï¼‰å€¼ã€‚" #: modules/visual_script/doc_classes/VisualScript.xml msgid "Returns whether a variable is exported." @@ -85418,10 +85586,10 @@ msgid "" "Unlike [method data_connect], there isn't a [code]to_port[/code], since the " "target node can have only one sequence port." msgstr "" -"连接两个åºåˆ—端å£ã€‚执行将从[code]from_node[/code]çš„[code]from_output[/code]输" -"å…¥[code]to_node[/code]。\n" -"与[method data_connect]ä¸åŒï¼Œæ²¡æœ‰[code]to_port[/code]ï¼Œå› ä¸ºç›®æ ‡èŠ‚ç‚¹åªèƒ½æœ‰ä¸€ä¸ª" -"åºåˆ—端å£ã€‚" +"连接两个åºåˆ—端å£ã€‚执行将从 [code]from_node[/code] çš„ [code]from_output[/" +"code] 输入 [code]to_node[/code]。\n" +"与 [method data_connect] ä¸åŒï¼Œæ²¡æœ‰ [code]to_port[/code]ï¼Œå› ä¸ºç›®æ ‡èŠ‚ç‚¹åªèƒ½æœ‰" +"一个åºåˆ—端å£ã€‚" #: modules/visual_script/doc_classes/VisualScript.xml msgid "" @@ -94604,8 +94772,8 @@ msgid "" "scenario, a navigation map and a sound space. Spatial nodes register their " "resources into the current world." msgstr "" -"拥有与世界相关的一切的类。物ç†ç©ºé—´ã€è§†è§‰åœºæ™¯ã€å¯¼èˆªåœ°å›¾å’Œå£°éŸ³ç©ºé—´ã€‚空间节点将" -"å…¶èµ„æºæ³¨å†Œåˆ°å½“å‰ä¸–界ä¸ã€‚" +"拥有与世界相关的一切的类。物ç†ç©ºé—´ã€è§†è§‰åœºæ™¯ã€å¯¼èˆªåœ°å›¾å’Œå£°éŸ³ç©ºé—´ã€‚Spatial 节" +"ç‚¹å°†å…¶èµ„æºæ³¨å†Œåˆ°å½“å‰ä¸–界ä¸ã€‚" #: doc/classes/World.xml msgid "" diff --git a/doc/translations/zh_TW.po b/doc/translations/zh_TW.po index fb62e692a7..a64bd25054 100644 --- a/doc/translations/zh_TW.po +++ b/doc/translations/zh_TW.po @@ -4,7 +4,7 @@ # This file is distributed under the same license as the Godot source code. # # binotaliu <binota@protonmail.ch>, 2020. -# BinotaLIU <me@binota.org>, 2020. +# BinotaLIU <me@binota.org>, 2020, 2022. # Eric K <eric900601@gmail.com>, 2020. # Pierre Stempin <pierre.stempin@gmail.com>, 2020. # Lihan Zhu <lihan@proctorio.com>, 2021. @@ -19,8 +19,8 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine class reference\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-08-25 13:04+0000\n" -"Last-Translator: Hugel <qihu@nfschina.com>\n" +"PO-Revision-Date: 2022-10-12 06:50+0000\n" +"Last-Translator: BinotaLIU <me@binota.org>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot-class-reference/zh_Hant/>\n" "Language: zh_TW\n" @@ -28,7 +28,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: doc/tools/make_rst.py msgid "Description" @@ -88,7 +88,7 @@ msgstr "" #: doc/tools/make_rst.py msgid "Default" -msgstr "默èª" +msgstr "é è¨" #: doc/tools/make_rst.py msgid "Setter" @@ -120,7 +120,7 @@ msgstr "" #: doc/tools/make_rst.py msgid "This method is used to construct a type." -msgstr "æ¤æ–¹æ³•ç”¨æ–¼æ§‹é€ é¡žåž‹ã€‚" +msgstr "æ¤æ–¹æ³•用於建構型別。" #: doc/tools/make_rst.py msgid "" @@ -570,7 +570,8 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Returns an array of dictionaries representing the current call stack.\n" +"Returns an array of dictionaries representing the current call stack. See " +"also [method print_stack].\n" "[codeblock]\n" "func _ready():\n" " foo()\n" @@ -585,7 +586,11 @@ msgid "" "[codeblock]\n" "[{function:bar, line:12, source:res://script.gd}, {function:foo, line:9, " "source:res://script.gd}, {function:_ready, line:6, source:res://script.gd}]\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method get_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"get_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -965,12 +970,16 @@ msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml msgid "" -"Prints a stack track at code location, only works when running with debugger " -"turned on.\n" +"Prints a stack trace at the current code location. See also [method " +"get_stack].\n" "Output in the console would look something like this:\n" "[codeblock]\n" "Frame 0 - res://test.gd:16 in function '_process'\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] [method print_stack] only works if the running instance is " +"connected to a debugging server (i.e. an editor instance). [method " +"print_stack] will not work in projects exported in release mode, or in " +"projects exported in debug mode if not connected to a debugging server." msgstr "" #: modules/gdscript/doc_classes/@GDScript.xml @@ -3589,6 +3598,26 @@ msgid "Hints that an image is compressed using lossless compression." msgstr "" #: doc/classes/@GlobalScope.xml +msgid "" +"Hint that a property represents a particular type. If a property is " +"[constant TYPE_STRING], allows to set a type from the create dialog. If you " +"need to create an [Array] to contain elements of a specific type, the " +"[code]hint_string[/code] must encode nested types using [code]\":\"[/code] " +"and [code]\"/\"[/code] for specifying [Resource] types. For instance:\n" +"[codeblock]\n" +"hint_string = \"%s:\" % [TYPE_INT] # Array of inteters.\n" +"hint_string = \"%s:%s:\" % [TYPE_ARRAY, TYPE_REAL] # Two-dimensional array " +"of floats.\n" +"hint_string = \"%s/%s:Resource\" % [TYPE_OBJECT, TYPE_OBJECT] # Array of " +"resources.\n" +"hint_string = \"%s:%s/%s:Resource\" % [TYPE_ARRAY, TYPE_OBJECT, TYPE_OBJECT] " +"# Two-dimensional array of resources.\n" +"[/codeblock]\n" +"[b]Note:[/b] The final colon is required to specify for properly detecting " +"built-in types." +msgstr "" + +#: doc/classes/@GlobalScope.xml msgid "The property is serialized and saved in the scene file (default)." msgstr "" @@ -4273,8 +4302,7 @@ msgstr "" #: doc/classes/AudioStreamPlayer.xml doc/classes/Button.xml #: doc/classes/CanvasLayer.xml doc/classes/CollisionShape2D.xml #: doc/classes/ColorRect.xml doc/classes/Input.xml doc/classes/InputEvent.xml -#: doc/classes/InputEventAction.xml doc/classes/Label.xml -#: doc/classes/Particles2D.xml doc/classes/Timer.xml +#: doc/classes/InputEventAction.xml doc/classes/Label.xml doc/classes/Timer.xml #: doc/classes/VisibilityNotifier2D.xml msgid "2D Dodge The Creeps Demo" msgstr "" @@ -7196,7 +7224,10 @@ msgid "" "var array = []\n" "array.resize(10)\n" "array.fill(0) # Initialize the 10 elements to 0.\n" -"[/codeblock]" +"[/codeblock]\n" +"[b]Note:[/b] If [code]value[/code] is of a reference type ([Object]-derived, " +"[Array], [Dictionary], etc.) then the array is filled with the references to " +"the same object, i.e. no duplicates are created." msgstr "" #: doc/classes/Array.xml doc/classes/PoolByteArray.xml @@ -7381,6 +7412,9 @@ msgstr "" #: doc/classes/Array.xml msgid "" "Sorts the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method sort].\n" "[b]Note:[/b] Strings are sorted in alphabetical order (as opposed to natural " "order). This may lead to unexpected behavior when sorting an array of " "strings ending with a sequence of numbers. Consider the following example:\n" @@ -7400,9 +7434,13 @@ msgid "" "For two elements [code]a[/code] and [code]b[/code], if the given method " "returns [code]true[/code], element [code]b[/code] will be after element " "[code]a[/code] in the array.\n" +"[b]Note:[/b] The sorting algorithm used is not [url=https://en.wikipedia.org/" +"wiki/Sorting_algorithm#Stability]stable[/url]. This means that values " +"considered equal may have their order changed when using [method " +"sort_custom].\n" "[b]Note:[/b] You cannot randomize the return value as the heapsort algorithm " -"expects a deterministic result. Doing so will result in unexpected " -"behavior.\n" +"expects a deterministic result. Randomizing the return value will result in " +"unexpected behavior.\n" "[codeblock]\n" "class MyCustomSorter:\n" " static func sort_ascending(a, b):\n" @@ -10041,10 +10079,9 @@ msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml msgid "" -"Returns the number of audio data frames left to play. If this returned " -"number reaches [code]0[/code], the audio will stop playing until frames are " -"added again. Therefore, make sure your script can always generate and push " -"new audio frames fast enough to avoid audio cracking." +"Returns the number of frames that can be pushed to the audio sample data " +"buffer without overflowing it. If the result is [code]0[/code], the buffer " +"is full." msgstr "" #: doc/classes/AudioStreamGeneratorPlayback.xml @@ -10576,14 +10613,14 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" "Node for back-buffering the currently-displayed screen. The region defined " -"in the BackBufferCopy node is buffered with the content of the screen it " +"in the [BackBufferCopy] node is buffered with the content of the screen it " "covers, or the entire screen according to the copy mode set. Use the " "[code]texture(SCREEN_TEXTURE, ...)[/code] function in your shader scripts to " "access the buffer.\n" "[b]Note:[/b] Since this node inherits from [Node2D] (and not [Control]), " "anchors and margins won't apply to child [Control]-derived nodes. This can " "be problematic when resizing the window. To avoid this, add [Control]-" -"derived nodes as [i]siblings[/i] to the BackBufferCopy node instead of " +"derived nodes as [i]siblings[/i] to the [BackBufferCopy] node instead of " "adding them as children." msgstr "" @@ -10593,22 +10630,22 @@ msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"The area covered by the BackBufferCopy. Only used if [member copy_mode] is " +"The area covered by the [BackBufferCopy]. Only used if [member copy_mode] is " "[constant COPY_MODE_RECT]." msgstr "" #: doc/classes/BackBufferCopy.xml msgid "" -"Disables the buffering mode. This means the BackBufferCopy node will " +"Disables the buffering mode. This means the [BackBufferCopy] node will " "directly use the portion of screen it covers." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers a rectangular region." +msgid "[BackBufferCopy] buffers a rectangular region." msgstr "" #: doc/classes/BackBufferCopy.xml -msgid "BackBufferCopy buffers the entire screen." +msgid "[BackBufferCopy] buffers the entire screen." msgstr "" #: doc/classes/BakedLightmap.xml @@ -19407,6 +19444,14 @@ msgid "Cylinder shape for collisions." msgstr "" #: doc/classes/CylinderShape.xml +msgid "" +"Cylinder shape for collisions.\n" +"[b]Note:[/b] When using GodotPhysics instead of the default Bullet physics " +"engine, there are several known bugs with cylinder collision shapes. Using " +"[CapsuleShape] or [BoxShape] instead is recommended." +msgstr "" + +#: doc/classes/CylinderShape.xml msgid "The cylinder's height." msgstr "" @@ -22241,7 +22286,10 @@ msgid "" "[/codeblock]\n" "[b]Note:[/b] The script is run in the Editor context, which means the output " "is visible in the console window started with the Editor (stdout) instead of " -"the usual Godot [b]Output[/b] dock." +"the usual Godot [b]Output[/b] dock.\n" +"[b]Note:[/b] EditorScript is reference counted, meaning it is destroyed when " +"nothing references it. This can cause errors during asynchronous operations " +"if there are no references to the script." msgstr "" #: doc/classes/EditorScript.xml @@ -32980,7 +33028,9 @@ msgid "" "The size of the light in Godot units. Only considered in baked lightmaps and " "only if [member light_bake_mode] is set to [constant BAKE_ALL]. Increasing " "this value will make the shadows appear blurrier. This can be used to " -"simulate area lights to an extent." +"simulate area lights to an extent.\n" +"[b]Note:[/b] [member light_size] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/Light.xml @@ -36309,7 +36359,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent.xml doc/classes/NavigationAgent2D.xml @@ -36559,7 +36612,10 @@ msgid "" "use the [method get_next_location] function once every physics frame to " "update the internal path logic of the NavigationAgent. The returned vector " "position from this function should be used as the next movement position for " -"the agent's parent Node." +"the agent's parent Node.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues." msgstr "" #: doc/classes/NavigationAgent2D.xml @@ -37276,6 +37332,9 @@ msgid "" "modified velocity as-is might lead to pushing and agent outside of a " "navigable area. This is a limitation of the collision avoidance system, any " "more complex situation may require the use of the physics engine.\n" +"[b]Note:[/b] By default, the expensive calculations for avoidance are done " +"in a thread. In HTML5 exports without thread support, they will be done on " +"the main thread, which can lead to performance issues.\n" "This server keeps tracks of any call and executes them during the sync " "phase. This means that you can request any change to the map, using any " "thread, without worrying." @@ -40086,7 +40145,9 @@ msgid "" "The light's radius. Note that the effectively lit area may appear to be " "smaller depending on the [member omni_attenuation] in use. No matter the " "[member omni_attenuation] in use, the light will never reach anything " -"outside this radius." +"outside this radius.\n" +"[b]Note:[/b] [member omni_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/OmniLight.xml @@ -40602,11 +40663,11 @@ msgstr "å›žå‚³åƒæ•¸çš„æ£åˆ‡å€¼ã€‚" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] cache data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_CACHE_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_config_dir] and [method get_data_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_CACHE_HOME[/code] environment variable before starting the " +"project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_config_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40640,11 +40701,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user configuration directory according to the " -"operating system's standards. On desktop platforms, this path can be " -"overridden by setting the [code]XDG_CONFIG_HOME[/code] environment variable " -"before starting the project. See [url=$DOCS_URL/tutorials/io/data_paths." -"html]File paths in Godot projects[/url] in the documentation for more " -"information. See also [method get_cache_dir] and [method get_data_dir].\n" +"operating system's standards. On Linux, this path can be overridden by " +"setting the [code]XDG_CONFIG_HOME[/code] environment variable before " +"starting the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File " +"paths in Godot projects[/url] in the documentation for more information. See " +"also [method get_cache_dir] and [method get_data_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -40666,11 +40727,11 @@ msgstr "" #: doc/classes/OS.xml msgid "" "Returns the [i]global[/i] user data directory according to the operating " -"system's standards. On desktop platforms, this path can be overridden by " -"setting the [code]XDG_DATA_HOME[/code] environment variable before starting " -"the project. See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in " -"Godot projects[/url] in the documentation for more information. See also " -"[method get_cache_dir] and [method get_config_dir].\n" +"system's standards. On Linux, this path can be overridden by setting the " +"[code]XDG_DATA_HOME[/code] environment variable before starting the project. " +"See [url=$DOCS_URL/tutorials/io/data_paths.html]File paths in Godot " +"projects[/url] in the documentation for more information. See also [method " +"get_cache_dir] and [method get_config_dir].\n" "Not to be confused with [method get_user_data_dir], which returns the " "[i]project-specific[/i] user data path." msgstr "" @@ -42532,6 +42593,16 @@ msgid "Particle systems (2D)" msgstr "" #: doc/classes/Particles2D.xml +msgid "2D Particles Demo" +msgstr "" + +#: doc/classes/Particles2D.xml +msgid "" +"2D Dodge The Creeps Demo (uses GPUParticles2D for the trail behind the " +"player)" +msgstr "" + +#: doc/classes/Particles2D.xml msgid "Returns a rectangle containing the positions of all existing particles." msgstr "" @@ -50133,15 +50204,22 @@ msgstr "" #: doc/classes/ProjectSettings.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member rendering/quality/" +"intended_usage/framebuffer_allocation] must also be set to [b]3D[/b].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member rendering/quality/" "depth/hdr] must also be [code]true[/code] for debanding to be effective.\n" "[b]Note:[/b] There are known issues with debanding breaking rendering on " "mobile platforms. Due to this, it is recommended to leave this option " -"disabled when targeting mobile platforms." +"disabled when targeting mobile platforms.\n" +"[b]Note:[/b] This property is only read when the project starts. To set " +"debanding at run-time, set [member Viewport.debanding] on the root " +"[Viewport] instead." msgstr "" #: doc/classes/ProjectSettings.xml @@ -51738,17 +51816,28 @@ msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns a [RegExMatch] container " -"of the first matching result if found, otherwise [code]null[/code]. The " -"region to search within can be specified without modifying where the start " -"and end anchor would be." +"of the first matching result if found, otherwise [code]null[/code].\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml msgid "" "Searches the text for the compiled pattern. Returns an array of [RegExMatch] " "containers for each non-overlapping result. If no results were found, an " -"empty array is returned instead. The region to search within can be " -"specified without modifying where the start and end anchor would be." +"empty array is returned instead.\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegEx.xml @@ -51757,8 +51846,14 @@ msgid "" "specified string. Escapes and backreferences such as [code]$1[/code] and " "[code]$name[/code] are expanded and resolved. By default, only the first " "instance is replaced, but it can be changed for all instances (global " -"replacement). The region to search within can be specified without modifying " -"where the start and end anchor would be." +"replacement).\n" +"The region to search within can be specified with [code]offset[/code] and " +"[code]end[/code]. This is useful when searching for another match in the " +"same [code]subject[/code] by calling this method again after a previous " +"success. Setting these parameters differs from passing over a shortened " +"string. For example, the start anchor [code]^[/code] is not affected by " +"[code]offset[/code], and the character before [code]offset[/code] will be " +"checked for the word boundary [code]\\b[/code]." msgstr "" #: modules/regex/doc_classes/RegExMatch.xml @@ -54474,7 +54569,11 @@ msgid "Call a group immediately (calls are normally made on idle)." msgstr "" #: doc/classes/SceneTree.xml -msgid "Call a group only once even if the call is executed many times." +msgid "" +"Call a group only once even if the call is executed many times.\n" +"[b]Note:[/b] Arguments are not taken into account when deciding whether the " +"call is unique or not. Therefore when the same method is called with " +"different arguments, only the first call will be performed." msgstr "" #: doc/classes/SceneTree.xml @@ -56312,7 +56411,9 @@ msgid "" "[b]Note:[/b] Mixed negative scales in 3D are not decomposable from the " "transformation matrix. Due to the way scale is represented with " "transformation matrices in Godot, the scale values will either be all " -"positive or all negative." +"positive or all negative.\n" +"[b]Note:[/b] Not all nodes are visually scaled by the [member scale] " +"property. For example, [Light]s are not visually affected by [member scale]." msgstr "" #: doc/classes/Spatial.xml @@ -57690,7 +57791,10 @@ msgid "" msgstr "" #: doc/classes/SpotLight.xml -msgid "The spotlight's angle in degrees." +msgid "" +"The spotlight's angle in degrees.\n" +"[b]Note:[/b] [member spot_angle] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpotLight.xml @@ -57706,7 +57810,9 @@ msgid "" "The maximal range that can be reached by the spotlight. Note that the " "effectively lit area may appear to be smaller depending on the [member " "spot_attenuation] in use. No matter the [member spot_attenuation] in use, " -"the light will never reach anything outside this range." +"the light will never reach anything outside this range.\n" +"[b]Note:[/b] [member spot_range] is not affected by [member Spatial.scale] " +"(the light's scale or its parent's scale)." msgstr "" #: doc/classes/SpringArm.xml @@ -66994,10 +67100,15 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" "If [code]true[/code], uses a fast post-processing filter to make banding " -"significantly less visible. In some cases, debanding may introduce a " -"slightly noticeable dithering pattern. It's recommended to enable debanding " -"only when actually needed since the dithering pattern will make lossless-" -"compressed screenshots larger.\n" +"significantly less visible in 3D. 2D rendering is [i]not[/i] affected by " +"debanding unless the [member Environment.background_mode] is [constant " +"Environment.BG_CANVAS]. In this case, [member usage] must also be set to " +"[constant USAGE_3D]. See also [member ProjectSettings.rendering/quality/" +"filters/use_debanding].\n" +"In some cases, debanding may introduce a slightly noticeable dithering " +"pattern. It's recommended to enable debanding only when actually needed " +"since the dithering pattern will make lossless-compressed screenshots " +"larger.\n" "[b]Note:[/b] Only available on the GLES3 backend. [member hdr] must also be " "[code]true[/code] for debanding to be effective." msgstr "" @@ -67008,8 +67119,8 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"If [code]true[/code], the viewport will disable 3D rendering. For actual " -"disabling use [code]usage[/code]." +"If [code]true[/code], the viewport will disable 3D rendering. To actually " +"disable allocation of 3D buffers, set [member usage] instead." msgstr "" #: doc/classes/Viewport.xml @@ -67161,7 +67272,9 @@ msgstr "" #: doc/classes/Viewport.xml msgid "" -"The rendering mode of viewport.\n" +"The viewport's rendering mode. This controls which buffers are allocated for " +"the viewport (2D only, or 2D + 3D). 2D-only options can reduce memory usage " +"and improve performance slightly, especially on low-end devices.\n" "[b]Note:[/b] If set to [constant USAGE_2D] or [constant " "USAGE_2D_NO_SAMPLING], [member hdr] will have no effect when enabled since " "HDR is not supported for 2D." @@ -67693,6 +67806,22 @@ msgid "" "render object this [VisualInstance] is set to." msgstr "" +#: doc/classes/VisualInstance.xml +msgid "" +"The sorting offset used by this [VisualInstance]. Adjusting it to a higher " +"value will make the [VisualInstance] reliably draw on top of other " +"[VisualInstance]s that are otherwise positioned at the same spot." +msgstr "" + +#: doc/classes/VisualInstance.xml +msgid "" +"If [code]true[/code], the object is sorted based on the [AABB] center. " +"Sorted based on the global position otherwise.\n" +"The [AABB] center based sorting is generally more accurate for 3D models. " +"The position based sorting instead allows to better control the drawing " +"order when working with [Particles] and [CPUParticles]." +msgstr "" + #: modules/visual_script/doc_classes/VisualScript.xml msgid "A script implemented in the Visual Script programming environment." msgstr "" diff --git a/drivers/SCsub b/drivers/SCsub index 6cfcb1d18c..276b99e10b 100644 --- a/drivers/SCsub +++ b/drivers/SCsub @@ -24,7 +24,6 @@ SConscript("winmidi/SCsub") # Graphics drivers if env["vulkan"]: - SConscript("spirv-reflect/SCsub") SConscript("vulkan/SCsub") if env["opengl3"]: SConscript("gl_context/SCsub") diff --git a/drivers/gles3/effects/copy_effects.cpp b/drivers/gles3/effects/copy_effects.cpp index b552b52cd5..58cdc90a7c 100644 --- a/drivers/gles3/effects/copy_effects.cpp +++ b/drivers/gles3/effects/copy_effects.cpp @@ -148,8 +148,8 @@ void CopyEffects::bilinear_blur(GLuint p_source_texture, int p_mipmap_count, con dest_region.size.y = MAX(1, dest_region.size.y >> 1); glBindFramebuffer(GL_DRAW_FRAMEBUFFER, framebuffers[i % 2]); glFramebufferTexture2D(GL_DRAW_FRAMEBUFFER, GL_COLOR_ATTACHMENT0, GL_TEXTURE_2D, p_source_texture, i); - glBlitFramebuffer(source_region.position.x, source_region.position.y, source_region.size.x, source_region.size.y, - dest_region.position.x, dest_region.position.y, dest_region.size.x, dest_region.size.y, GL_COLOR_BUFFER_BIT, GL_LINEAR); + glBlitFramebuffer(source_region.position.x, source_region.position.y, source_region.position.x + source_region.size.x, source_region.position.y + source_region.size.y, + dest_region.position.x, dest_region.position.y, dest_region.position.x + dest_region.size.x, dest_region.position.y + dest_region.size.y, GL_COLOR_BUFFER_BIT, GL_LINEAR); glBindFramebuffer(GL_READ_FRAMEBUFFER, framebuffers[i % 2]); source_region = dest_region; } diff --git a/drivers/gles3/rasterizer_canvas_gles3.cpp b/drivers/gles3/rasterizer_canvas_gles3.cpp index e5d4077393..ecad4b66a5 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -454,7 +454,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ update_skeletons = false; } // Canvas group begins here, render until before this item - _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, false); + _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, r_sdf_used); item_count = 0; if (ci->canvas_group_owner->canvas_group->mode != RS::CANVAS_GROUP_MODE_TRANSPARENT) { @@ -485,7 +485,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ mesh_storage->update_mesh_instances(); update_skeletons = false; } - _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, true); + _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, r_sdf_used, true); item_count = 0; if (ci->canvas_group->blur_mipmaps) { @@ -504,7 +504,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ } //render anything pending, including clearing if no items - _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, false); + _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, r_sdf_used); item_count = 0; texture_storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, backbuffer_gen_mipmaps); @@ -530,7 +530,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ mesh_storage->update_mesh_instances(); update_skeletons = false; } - _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, false); + _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, starting_index, r_sdf_used); //then reset item_count = 0; } @@ -549,7 +549,7 @@ void RasterizerCanvasGLES3::canvas_render_items(RID p_to_render_target, Item *p_ state.current_buffer = (state.current_buffer + 1) % state.canvas_instance_data_buffers.size(); } -void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, uint32_t &r_last_index, bool p_to_backbuffer) { +void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, uint32_t &r_last_index, bool &r_sdf_used, bool p_to_backbuffer) { GLES3::MaterialStorage *material_storage = GLES3::MaterialStorage::get_singleton(); canvas_begin(p_to_render_target, p_to_backbuffer); @@ -568,9 +568,8 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou _new_batch(batch_broken, index); // Override the start position and index as we want to start from where we finished off last time. - state.canvas_instance_batches[state.current_batch_index].start = r_last_index * sizeof(InstanceData); + state.canvas_instance_batches[state.current_batch_index].start = r_last_index; index = 0; - _align_instance_data_buffer(index); for (int i = 0; i < p_item_count; i++) { Item *ci = items[i]; @@ -588,10 +587,12 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou material = default_clip_children_material; } } else { - if (ci->canvas_group->mode == RS::CANVAS_GROUP_MODE_CLIP_ONLY) { - material = default_clip_children_material; - } else { - material = default_canvas_group_material; + if (material.is_null()) { + if (ci->canvas_group->mode == RS::CANVAS_GROUP_MODE_CLIP_ONLY) { + material = default_clip_children_material; + } else { + material = default_canvas_group_material; + } } } } @@ -617,7 +618,7 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou GLES3::CanvasShaderData::BlendMode blend_mode = shader_data_cache ? shader_data_cache->blend_mode : GLES3::CanvasShaderData::BLEND_MODE_MIX; - _record_item_commands(ci, p_to_render_target, p_canvas_transform_inverse, current_clip, blend_mode, p_lights, index, batch_broken); + _record_item_commands(ci, p_to_render_target, p_canvas_transform_inverse, current_clip, blend_mode, p_lights, index, batch_broken, r_sdf_used); } if (index == 0) { @@ -628,14 +629,14 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou } // Copy over all data needed for rendering. - glBindBuffer(GL_UNIFORM_BUFFER, state.canvas_instance_data_buffers[state.current_buffer].ubo); + glBindBuffer(GL_ARRAY_BUFFER, state.canvas_instance_data_buffers[state.current_buffer].buffer); #ifdef WEB_ENABLED - glBufferSubData(GL_UNIFORM_BUFFER, r_last_index * sizeof(InstanceData), sizeof(InstanceData) * index, state.instance_data_array); + glBufferSubData(GL_ARRAY_BUFFER, r_last_index * sizeof(InstanceData), sizeof(InstanceData) * index, state.instance_data_array); #else // On Desktop and mobile we map the memory without synchronizing for maximum speed. - void *ubo = glMapBufferRange(GL_UNIFORM_BUFFER, r_last_index * sizeof(InstanceData), index * sizeof(InstanceData), GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT); - memcpy(ubo, state.instance_data_array, index * sizeof(InstanceData)); - glUnmapBuffer(GL_UNIFORM_BUFFER); + void *buffer = glMapBufferRange(GL_ARRAY_BUFFER, r_last_index * sizeof(InstanceData), index * sizeof(InstanceData), GL_MAP_WRITE_BIT | GL_MAP_UNSYNCHRONIZED_BIT); + memcpy(buffer, state.instance_data_array, index * sizeof(InstanceData)); + glUnmapBuffer(GL_ARRAY_BUFFER); #endif glDisable(GL_SCISSOR_TEST); @@ -662,7 +663,17 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou uint64_t specialization = 0; specialization |= uint64_t(state.canvas_instance_batches[i].lights_disabled); specialization |= uint64_t(!GLES3::Config::get_singleton()->float_texture_supported) << 1; - bool success = _bind_material(material_data, variant, specialization); + RID shader_version = data.canvas_shader_default_version; + + if (material_data) { + if (material_data->shader_data->version.is_valid() && material_data->shader_data->valid) { + // Bind uniform buffer and textures + material_data->bind_uniforms(); + shader_version = material_data->shader_data->version; + } + } + + bool success = GLES3::MaterialStorage::get_singleton()->shaders.canvas_shader.version_bind_shader(shader_version, variant, specialization); if (!success) { continue; } @@ -749,7 +760,7 @@ void RasterizerCanvasGLES3::_render_items(RID p_to_render_target, int p_item_cou r_last_index += index; } -void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_render_target, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, GLES3::CanvasShaderData::BlendMode p_blend_mode, Light *p_lights, uint32_t &r_index, bool &r_batch_broken) { +void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_render_target, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, GLES3::CanvasShaderData::BlendMode p_blend_mode, Light *p_lights, uint32_t &r_index, bool &r_batch_broken, bool &r_sdf_used) { RenderingServer::CanvasItemTextureFilter texture_filter = p_item->texture_filter == RS::CANVAS_ITEM_TEXTURE_FILTER_DEFAULT ? state.default_filter : p_item->texture_filter; if (texture_filter != state.canvas_instance_batches[state.current_batch_index].filter) { @@ -1120,16 +1131,10 @@ void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_rend RID particles = pt->particles; state.canvas_instance_batches[state.current_batch_index].tex = pt->texture; state.canvas_instance_batches[state.current_batch_index].shader_variant = CanvasShaderGLES3::MODE_INSTANCED; - bool local_coords = particles_storage->particles_is_using_local_coords(particles); if (particles_storage->particles_has_collision(particles) && texture_storage->render_target_is_sdf_enabled(p_render_target)) { // Pass collision information. - Transform2D xform; - if (local_coords) { - xform = p_item->final_transform; - } else { - xform = p_canvas_transform_inverse; - } + Transform2D xform = p_item->final_transform; GLuint sdf_texture = texture_storage->render_target_get_sdf_texture(p_render_target); @@ -1145,6 +1150,7 @@ void RasterizerCanvasGLES3::_record_item_commands(const Item *p_item, RID p_rend } else { particles_storage->particles_set_canvas_sdf_collision(pt->particles, false, Transform2D(), Rect2(), 0); } + r_sdf_used |= particles_storage->particles_has_collision(particles); } state.canvas_instance_batches[state.current_batch_index].command = c; @@ -1214,26 +1220,15 @@ void RasterizerCanvasGLES3::_render_batch(Light *p_lights, uint32_t p_index) { _bind_canvas_texture(state.canvas_instance_batches[p_index].tex, state.canvas_instance_batches[p_index].filter, state.canvas_instance_batches[p_index].repeat); - // Bind the region of the UBO used by this batch. - // If region exceeds the boundary of the UBO, just ignore. - uint32_t range_bytes = data.max_instances_per_batch * sizeof(InstanceData); - if (state.canvas_instance_batches[p_index].start >= (data.max_instances_per_ubo - 1) * sizeof(InstanceData)) { - return; - } else if (state.canvas_instance_batches[p_index].start >= (data.max_instances_per_ubo - data.max_instances_per_batch) * sizeof(InstanceData)) { - // If we have less than a full batch at the end, we can just draw it anyway. - // OpenGL will complain about the UBO being smaller than expected, but it should render fine. - range_bytes = (data.max_instances_per_ubo - 1) * sizeof(InstanceData) - state.canvas_instance_batches[p_index].start; - } - - uint32_t range_start = state.canvas_instance_batches[p_index].start; - glBindBufferRange(GL_UNIFORM_BUFFER, INSTANCE_UNIFORM_LOCATION, state.canvas_instance_data_buffers[state.current_buffer].ubo, range_start, range_bytes); - switch (state.canvas_instance_batches[p_index].command_type) { case Item::Command::TYPE_RECT: case Item::Command::TYPE_NINEPATCH: { glBindVertexArray(data.indexed_quad_array); - glDrawElements(GL_TRIANGLES, state.canvas_instance_batches[p_index].instance_count * 6, GL_UNSIGNED_INT, 0); - glBindBuffer(GL_UNIFORM_BUFFER, 0); + glBindBuffer(GL_ARRAY_BUFFER, state.canvas_instance_data_buffers[state.current_buffer].buffer); + uint32_t range_start = state.canvas_instance_batches[p_index].start * sizeof(InstanceData); + _enable_attributes(range_start, false); + + glDrawElementsInstanced(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0, state.canvas_instance_batches[p_index].instance_count); glBindVertexArray(0); } break; @@ -1245,18 +1240,21 @@ void RasterizerCanvasGLES3::_render_batch(Light *p_lights, uint32_t p_index) { ERR_FAIL_COND(!pb); glBindVertexArray(pb->vertex_array); + glBindBuffer(GL_ARRAY_BUFFER, state.canvas_instance_data_buffers[state.current_buffer].buffer); + + uint32_t range_start = state.canvas_instance_batches[p_index].start * sizeof(InstanceData); + _enable_attributes(range_start, false); if (pb->color_disabled && pb->color != Color(1.0, 1.0, 1.0, 1.0)) { glVertexAttrib4f(RS::ARRAY_COLOR, pb->color.r, pb->color.g, pb->color.b, pb->color.a); } if (pb->index_buffer != 0) { - glDrawElements(prim[polygon->primitive], pb->count, GL_UNSIGNED_INT, nullptr); + glDrawElementsInstanced(prim[polygon->primitive], pb->count, GL_UNSIGNED_INT, nullptr, 1); } else { - glDrawArrays(prim[polygon->primitive], 0, pb->count); + glDrawArraysInstanced(prim[polygon->primitive], 0, pb->count, 1); } glBindVertexArray(0); - glBindBuffer(GL_UNIFORM_BUFFER, 0); if (pb->color_disabled && pb->color != Color(1.0, 1.0, 1.0, 1.0)) { // Reset so this doesn't pollute other draw calls. @@ -1266,14 +1264,16 @@ void RasterizerCanvasGLES3::_render_batch(Light *p_lights, uint32_t p_index) { case Item::Command::TYPE_PRIMITIVE: { glBindVertexArray(data.canvas_quad_array); + glBindBuffer(GL_ARRAY_BUFFER, state.canvas_instance_data_buffers[state.current_buffer].buffer); + uint32_t range_start = state.canvas_instance_batches[p_index].start * sizeof(InstanceData); + _enable_attributes(range_start, true); + const GLenum primitive[5] = { GL_POINTS, GL_POINTS, GL_LINES, GL_TRIANGLES, GL_TRIANGLES }; int instance_count = state.canvas_instance_batches[p_index].instance_count; - if (instance_count > 1) { + ERR_FAIL_COND(instance_count <= 0); + if (instance_count >= 1) { glDrawArraysInstanced(primitive[state.canvas_instance_batches[p_index].primitive_points], 0, state.canvas_instance_batches[p_index].primitive_points, instance_count); - } else { - glDrawArrays(primitive[state.canvas_instance_batches[p_index].primitive_points], 0, state.canvas_instance_batches[p_index].primitive_points); } - glBindBuffer(GL_UNIFORM_BUFFER, 0); } break; @@ -1367,6 +1367,11 @@ void RasterizerCanvasGLES3::_render_batch(Light *p_lights, uint32_t p_index) { index_array_gl = mesh_storage->mesh_surface_get_index_buffer(surface, 0); bool use_index_buffer = false; glBindVertexArray(vertex_array_gl); + glBindBuffer(GL_ARRAY_BUFFER, state.canvas_instance_data_buffers[state.current_buffer].buffer); + + uint32_t range_start = state.canvas_instance_batches[p_index].start * sizeof(InstanceData); + _enable_attributes(range_start, false, instance_count); + if (index_array_gl != 0) { glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_array_gl); use_index_buffer = true; @@ -1393,20 +1398,13 @@ void RasterizerCanvasGLES3::_render_batch(Light *p_lights, uint32_t p_index) { } GLenum primitive_gl = prim[int(primitive)]; - if (instance_count == 1) { - if (use_index_buffer) { - glDrawElements(primitive_gl, mesh_storage->mesh_surface_get_vertices_drawn_count(surface), mesh_storage->mesh_surface_get_index_type(surface), 0); - } else { - glDrawArrays(primitive_gl, 0, mesh_storage->mesh_surface_get_vertices_drawn_count(surface)); - } - } else if (instance_count > 1) { - if (use_index_buffer) { - glDrawElementsInstanced(primitive_gl, mesh_storage->mesh_surface_get_vertices_drawn_count(surface), mesh_storage->mesh_surface_get_index_type(surface), 0, instance_count); - } else { - glDrawArraysInstanced(primitive_gl, 0, mesh_storage->mesh_surface_get_vertices_drawn_count(surface), instance_count); - } - } + if (use_index_buffer) { + glDrawElementsInstanced(primitive_gl, mesh_storage->mesh_surface_get_vertices_drawn_count(surface), mesh_storage->mesh_surface_get_index_type(surface), 0, instance_count); + } else { + glDrawArraysInstanced(primitive_gl, 0, mesh_storage->mesh_surface_get_vertices_drawn_count(surface), instance_count); + } + glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0); if (instance_count > 1) { glDisableVertexAttribArray(5); @@ -1426,7 +1424,7 @@ void RasterizerCanvasGLES3::_render_batch(Light *p_lights, uint32_t p_index) { } void RasterizerCanvasGLES3::_add_to_batch(uint32_t &r_index, bool &r_batch_broken) { - if (r_index >= data.max_instances_per_ubo - 1) { + if (r_index >= data.max_instances_per_buffer - 1) { ERR_PRINT_ONCE("Trying to draw too many items. Please increase maximum number of items in the project settings 'rendering/gl_compatibility/item_buffer_size'"); return; } @@ -1454,27 +1452,25 @@ void RasterizerCanvasGLES3::_new_batch(bool &r_batch_broken, uint32_t &r_index) // Copy the properties of the current batch, we will manually update the things that changed. Batch new_batch = state.canvas_instance_batches[state.current_batch_index]; new_batch.instance_count = 0; - new_batch.start = state.canvas_instance_batches[state.current_batch_index].start + state.canvas_instance_batches[state.current_batch_index].instance_count * sizeof(InstanceData); + new_batch.start = state.canvas_instance_batches[state.current_batch_index].start + state.canvas_instance_batches[state.current_batch_index].instance_count; state.current_batch_index++; state.canvas_instance_batches.push_back(new_batch); - _align_instance_data_buffer(r_index); } -bool RasterizerCanvasGLES3::_bind_material(GLES3::CanvasMaterialData *p_material_data, CanvasShaderGLES3::ShaderVariant p_variant, uint64_t p_specialization) { - if (p_material_data) { - if (p_material_data->shader_data->version.is_valid() && p_material_data->shader_data->valid) { - // Bind uniform buffer and textures - p_material_data->bind_uniforms(); - return GLES3::MaterialStorage::get_singleton()->shaders.canvas_shader.version_bind_shader(p_material_data->shader_data->version, p_variant, p_specialization); - } else { - return GLES3::MaterialStorage::get_singleton()->shaders.canvas_shader.version_bind_shader(data.canvas_shader_default_version, p_variant, p_specialization); - } - } else { - return GLES3::MaterialStorage::get_singleton()->shaders.canvas_shader.version_bind_shader(data.canvas_shader_default_version, p_variant, p_specialization); +void RasterizerCanvasGLES3::_enable_attributes(uint32_t p_start, bool p_primitive, uint32_t p_rate) { + uint32_t split = p_primitive ? 11 : 12; + for (uint32_t i = 6; i < split; i++) { + glEnableVertexAttribArray(i); + glVertexAttribPointer(i, 4, GL_FLOAT, GL_FALSE, sizeof(InstanceData), CAST_INT_TO_UCHAR_PTR(p_start + (i - 6) * 4 * sizeof(float))); + glVertexAttribDivisor(i, p_rate); + } + for (uint32_t i = split; i <= 13; i++) { + glEnableVertexAttribArray(i); + glVertexAttribIPointer(i, 4, GL_UNSIGNED_INT, sizeof(InstanceData), CAST_INT_TO_UCHAR_PTR(p_start + (i - 6) * 4 * sizeof(float))); + glVertexAttribDivisor(i, p_rate); } } - RID RasterizerCanvasGLES3::light_create() { CanvasLight canvas_light; return canvas_light_owner.make_rid(canvas_light); @@ -2099,6 +2095,9 @@ void RasterizerCanvasGLES3::_bind_canvas_texture(RID p_texture, RS::CanvasItemTe if (t) { ERR_FAIL_COND(!t->canvas_texture); ct = t->canvas_texture; + if (t->render_target) { + t->render_target->used_in_frame = true; + } } else { ct = texture_storage->get_canvas_texture(p_texture); } @@ -2126,6 +2125,9 @@ void RasterizerCanvasGLES3::_bind_canvas_texture(RID p_texture, RS::CanvasItemTe glBindTexture(GL_TEXTURE_2D, texture->tex_id); texture->gl_set_filter(filter); texture->gl_set_repeat(repeat); + if (texture->render_target) { + texture->render_target->used_in_frame = true; + } } GLES3::Texture *normal_map = texture_storage->get_texture(ct->normal_map); @@ -2139,6 +2141,9 @@ void RasterizerCanvasGLES3::_bind_canvas_texture(RID p_texture, RS::CanvasItemTe glBindTexture(GL_TEXTURE_2D, normal_map->tex_id); normal_map->gl_set_filter(filter); normal_map->gl_set_repeat(repeat); + if (normal_map->render_target) { + normal_map->render_target->used_in_frame = true; + } } GLES3::Texture *specular_map = texture_storage->get_texture(ct->specular); @@ -2152,6 +2157,9 @@ void RasterizerCanvasGLES3::_bind_canvas_texture(RID p_texture, RS::CanvasItemTe glBindTexture(GL_TEXTURE_2D, specular_map->tex_id); specular_map->gl_set_filter(filter); specular_map->gl_set_repeat(repeat); + if (specular_map->render_target) { + specular_map->render_target->used_in_frame = true; + } } } @@ -2413,8 +2421,8 @@ void RasterizerCanvasGLES3::_allocate_instance_data_buffer() { GLuint new_buffers[3]; glGenBuffers(3, new_buffers); // Batch UBO. - glBindBuffer(GL_UNIFORM_BUFFER, new_buffers[0]); - glBufferData(GL_UNIFORM_BUFFER, data.max_instance_buffer_size, nullptr, GL_STREAM_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, new_buffers[0]); + glBufferData(GL_ARRAY_BUFFER, data.max_instance_buffer_size, nullptr, GL_STREAM_DRAW); // Light uniform buffer. glBindBuffer(GL_UNIFORM_BUFFER, new_buffers[1]); glBufferData(GL_UNIFORM_BUFFER, sizeof(LightUniform) * data.max_lights_per_render, nullptr, GL_STREAM_DRAW); @@ -2424,36 +2432,16 @@ void RasterizerCanvasGLES3::_allocate_instance_data_buffer() { state.current_buffer = (state.current_buffer + 1); DataBuffer db; - db.ubo = new_buffers[0]; + db.buffer = new_buffers[0]; db.light_ubo = new_buffers[1]; db.state_ubo = new_buffers[2]; db.last_frame_used = RSG::rasterizer->get_frame_number(); state.canvas_instance_data_buffers.insert(state.current_buffer, db); state.current_buffer = state.current_buffer % state.canvas_instance_data_buffers.size(); + glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_UNIFORM_BUFFER, 0); } -// Batch start positions need to be aligned to the device's GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT. -// This needs to be called anytime a new batch is created. -void RasterizerCanvasGLES3::_align_instance_data_buffer(uint32_t &r_index) { - if (GLES3::Config::get_singleton()->uniform_buffer_offset_alignment > int(sizeof(InstanceData))) { - uint32_t offset = state.canvas_instance_batches[state.current_batch_index].start % GLES3::Config::get_singleton()->uniform_buffer_offset_alignment; - if (offset > 0) { - // uniform_buffer_offset_alignment can be 4, 16, 32, or 256. Our instance batches are 128 bytes. - // Accordingly, this branch is only triggered if we are 128 bytes off. - uint32_t offset_bytes = GLES3::Config::get_singleton()->uniform_buffer_offset_alignment - offset; - state.canvas_instance_batches[state.current_batch_index].start += offset_bytes; - // Offset the instance array so it stays in sync with batch start points. - // This creates gaps in the instance buffer with wasted space, but we can't help it. - r_index += offset_bytes / sizeof(InstanceData); - if (r_index > 0) { - // In this case we need to copy over the basic data. - state.instance_data_array[r_index] = state.instance_data_array[r_index - 1]; - } - } - } -} - void RasterizerCanvasGLES3::set_time(double p_time) { state.time = p_time; } @@ -2598,12 +2586,12 @@ RasterizerCanvasGLES3::RasterizerCanvasGLES3() { data.max_instances_per_batch = 128; } else { data.max_lights_per_render = 256; - data.max_instances_per_batch = 512; + data.max_instances_per_batch = 2048; } // Reserve 3 Uniform Buffers for instance data Frame N, N+1 and N+2 - data.max_instances_per_ubo = MAX(data.max_instances_per_batch, uint32_t(GLOBAL_GET("rendering/gl_compatibility/item_buffer_size"))); - data.max_instance_buffer_size = data.max_instances_per_ubo * sizeof(InstanceData); // 16,384 instances * 128 bytes = 2,097,152 bytes = 2,048 kb + data.max_instances_per_buffer = MAX(data.max_instances_per_batch, uint32_t(GLOBAL_GET("rendering/gl_compatibility/item_buffer_size"))); + data.max_instance_buffer_size = data.max_instances_per_buffer * sizeof(InstanceData); // 16,384 instances * 128 bytes = 2,097,152 bytes = 2,048 kb state.canvas_instance_data_buffers.resize(3); state.canvas_instance_batches.reserve(200); @@ -2611,8 +2599,8 @@ RasterizerCanvasGLES3::RasterizerCanvasGLES3() { GLuint new_buffers[3]; glGenBuffers(3, new_buffers); // Batch UBO. - glBindBuffer(GL_UNIFORM_BUFFER, new_buffers[0]); - glBufferData(GL_UNIFORM_BUFFER, data.max_instance_buffer_size, nullptr, GL_STREAM_DRAW); + glBindBuffer(GL_ARRAY_BUFFER, new_buffers[0]); + glBufferData(GL_ARRAY_BUFFER, data.max_instance_buffer_size, nullptr, GL_STREAM_DRAW); // Light uniform buffer. glBindBuffer(GL_UNIFORM_BUFFER, new_buffers[1]); glBufferData(GL_UNIFORM_BUFFER, sizeof(LightUniform) * data.max_lights_per_render, nullptr, GL_STREAM_DRAW); @@ -2620,41 +2608,28 @@ RasterizerCanvasGLES3::RasterizerCanvasGLES3() { glBindBuffer(GL_UNIFORM_BUFFER, new_buffers[2]); glBufferData(GL_UNIFORM_BUFFER, sizeof(StateBuffer), nullptr, GL_STREAM_DRAW); DataBuffer db; - db.ubo = new_buffers[0]; + db.buffer = new_buffers[0]; db.light_ubo = new_buffers[1]; db.state_ubo = new_buffers[2]; db.last_frame_used = 0; db.fence = glFenceSync(GL_SYNC_GPU_COMMANDS_COMPLETE, 0); state.canvas_instance_data_buffers[i] = db; } + glBindBuffer(GL_ARRAY_BUFFER, 0); glBindBuffer(GL_UNIFORM_BUFFER, 0); - state.instance_data_array = memnew_arr(InstanceData, data.max_instances_per_ubo); + state.instance_data_array = memnew_arr(InstanceData, data.max_instances_per_buffer); state.light_uniforms = memnew_arr(LightUniform, data.max_lights_per_render); { - const uint32_t no_of_instances = data.max_instances_per_batch; - + const uint32_t indices[6] = { 0, 2, 1, 3, 2, 0 }; glGenVertexArrays(1, &data.indexed_quad_array); glBindVertexArray(data.indexed_quad_array); glBindBuffer(GL_ARRAY_BUFFER, data.canvas_quad_vertices); - - const uint32_t num_indices = 6; - const uint32_t quad_indices[num_indices] = { 0, 2, 1, 3, 2, 0 }; - - const uint32_t total_indices = no_of_instances * num_indices; - uint32_t *indices = new uint32_t[total_indices]; - for (uint32_t i = 0; i < total_indices; i++) { - uint32_t quad = i / num_indices; - uint32_t quad_local = i % num_indices; - indices[i] = quad_indices[quad_local] + quad * num_indices; - } - glGenBuffers(1, &data.indexed_quad_buffer); glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, data.indexed_quad_buffer); - glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(uint32_t) * total_indices, indices, GL_STATIC_DRAW); + glBufferData(GL_ELEMENT_ARRAY_BUFFER, sizeof(uint32_t) * 6, indices, GL_STATIC_DRAW); glBindVertexArray(0); - delete[] indices; } String global_defines; @@ -2662,7 +2637,7 @@ RasterizerCanvasGLES3::RasterizerCanvasGLES3() { global_defines += "#define MAX_LIGHTS " + itos(data.max_lights_per_render) + "\n"; global_defines += "#define MAX_DRAW_DATA_INSTANCES " + itos(data.max_instances_per_batch) + "\n"; - GLES3::MaterialStorage::get_singleton()->shaders.canvas_shader.initialize(global_defines); + GLES3::MaterialStorage::get_singleton()->shaders.canvas_shader.initialize(global_defines, 1); data.canvas_shader_default_version = GLES3::MaterialStorage::get_singleton()->shaders.canvas_shader.version_create(); shadow_render.shader.initialize(); diff --git a/drivers/gles3/rasterizer_canvas_gles3.h b/drivers/gles3/rasterizer_canvas_gles3.h index 0a03d43d07..d99a8414f7 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.h +++ b/drivers/gles3/rasterizer_canvas_gles3.h @@ -245,7 +245,7 @@ public: uint32_t max_lights_per_render = 256; uint32_t max_lights_per_item = 16; uint32_t max_instances_per_batch = 512; - uint32_t max_instances_per_ubo = 16384; + uint32_t max_instances_per_buffer = 16384; uint32_t max_instance_buffer_size = 16384 * 128; } data; @@ -278,7 +278,7 @@ public: // We track them and ensure that they don't get reused until at least 2 frames have passed // to avoid the GPU stalling to wait for a resource to become available. struct DataBuffer { - GLuint ubo = 0; + GLuint buffer = 0; GLuint light_ubo = 0; GLuint state_ubo = 0; uint64_t last_frame_used = -3; @@ -351,14 +351,15 @@ public: void _prepare_canvas_texture(RID p_texture, RS::CanvasItemTextureFilter p_base_filter, RS::CanvasItemTextureRepeat p_base_repeat, uint32_t &r_index, Size2 &r_texpixel_size); void canvas_render_items(RID p_to_render_target, Item *p_item_list, const Color &p_modulate, Light *p_light_list, Light *p_directional_list, const Transform2D &p_canvas_transform, RS::CanvasItemTextureFilter p_default_filter, RS::CanvasItemTextureRepeat p_default_repeat, bool p_snap_2d_vertices_to_pixel, bool &r_sdf_used) override; - void _render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, uint32_t &r_last_index, bool p_to_backbuffer = false); - void _record_item_commands(const Item *p_item, RID p_render_target, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, GLES3::CanvasShaderData::BlendMode p_blend_mode, Light *p_lights, uint32_t &r_index, bool &r_break_batch); + void _render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, uint32_t &r_last_index, bool &r_sdf_used, bool p_to_backbuffer = false); + void _record_item_commands(const Item *p_item, RID p_render_target, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, GLES3::CanvasShaderData::BlendMode p_blend_mode, Light *p_lights, uint32_t &r_index, bool &r_break_batch, bool &r_sdf_used); void _render_batch(Light *p_lights, uint32_t p_index); bool _bind_material(GLES3::CanvasMaterialData *p_material_data, CanvasShaderGLES3::ShaderVariant p_variant, uint64_t p_specialization); void _new_batch(bool &r_batch_broken, uint32_t &r_index); void _add_to_batch(uint32_t &r_index, bool &r_batch_broken); void _allocate_instance_data_buffer(); void _align_instance_data_buffer(uint32_t &r_index); + void _enable_attributes(uint32_t p_start, bool p_primitive, uint32_t p_rate = 1); void set_time(double p_time); diff --git a/drivers/gles3/rasterizer_gles3.cpp b/drivers/gles3/rasterizer_gles3.cpp index 7b4131b3a3..75fc0c8c35 100644 --- a/drivers/gles3/rasterizer_gles3.cpp +++ b/drivers/gles3/rasterizer_gles3.cpp @@ -333,18 +333,14 @@ void RasterizerGLES3::set_boot_image(const Ref<Image> &p_image, const Color &p_c return; } - Size2i win_size = DisplayServer::get_singleton()->screen_get_size(); + Size2i win_size = DisplayServer::get_singleton()->window_get_size(); glBindFramebuffer(GL_FRAMEBUFFER, 0); glViewport(0, 0, win_size.width, win_size.height); - glDisable(GL_BLEND); + glEnable(GL_BLEND); + glBlendFuncSeparate(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA, GL_ZERO, GL_ONE); glDepthMask(GL_FALSE); - if (false) { - // if (OS::get_singleton()->get_window_per_pixel_transparency_enabled()) { - glClearColor(0.0, 0.0, 0.0, 0.0); - } else { - glClearColor(p_color.r, p_color.g, p_color.b, 1.0); - } + glClearColor(p_color.r, p_color.g, p_color.b, 1.0); glClear(GL_COLOR_BUFFER_BIT); RID texture = texture_storage->texture_allocate(); @@ -370,14 +366,24 @@ void RasterizerGLES3::set_boot_image(const Ref<Image> &p_image, const Color &p_c screenrect.position += ((Size2(win_size.width, win_size.height) - screenrect.size) / 2.0).floor(); } + // Flip Y. + screenrect.position.y = win_size.y - screenrect.position.y; + screenrect.size.y = -screenrect.size.y; + + // Normalize texture coordinates to window size. + screenrect.position /= win_size; + screenrect.size /= win_size; + GLES3::Texture *t = texture_storage->get_texture(texture); - glActiveTexture(GL_TEXTURE0 + config->max_texture_image_units - 1); + t->gl_set_filter(p_use_filter ? RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR : RS::CANVAS_ITEM_TEXTURE_FILTER_NEAREST); + glActiveTexture(GL_TEXTURE0); glBindTexture(GL_TEXTURE_2D, t->tex_id); + copy_effects->copy_to_rect(screenrect); glBindTexture(GL_TEXTURE_2D, 0); - texture_storage->texture_free(texture); - end_frame(true); + + texture_storage->texture_free(texture); } #endif // GLES3_ENABLED diff --git a/drivers/gles3/rasterizer_scene_gles3.cpp b/drivers/gles3/rasterizer_scene_gles3.cpp index 247b89658a..2b44043faf 100644 --- a/drivers/gles3/rasterizer_scene_gles3.cpp +++ b/drivers/gles3/rasterizer_scene_gles3.cpp @@ -1068,10 +1068,6 @@ void RasterizerSceneGLES3::environment_glow_set_use_bicubic_upscale(bool p_enabl glow_bicubic_upscale = p_enable; } -void RasterizerSceneGLES3::environment_glow_set_use_high_quality(bool p_enable) { - glow_high_quality = p_enable; -} - void RasterizerSceneGLES3::environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) { } @@ -1743,7 +1739,7 @@ void RasterizerSceneGLES3::render_scene(const Ref<RenderSceneBuffers> &p_render_ render_data.reflection_probes = ∅ } - bool reverse_cull = false; + bool reverse_cull = render_data.cam_transform.basis.determinant() < 0; /////////// // Fill Light lists here @@ -2210,10 +2206,13 @@ void RasterizerSceneGLES3::_render_list_template(RenderListParameters *p_params, glBindVertexArray(vertex_array_gl); } prev_vertex_array_gl = vertex_array_gl; + + // Invalidate the previous index array + prev_index_array_gl = 0; } bool use_index_buffer = index_array_gl != 0; - if (prev_index_array_gl != index_array_gl || prev_vertex_array_gl != vertex_array_gl) { + if (prev_index_array_gl != index_array_gl) { if (index_array_gl != 0) { // Bind index each time so we can use LODs glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, index_array_gl); diff --git a/drivers/gles3/rasterizer_scene_gles3.h b/drivers/gles3/rasterizer_scene_gles3.h index 255e62fc33..65cc8606b8 100644 --- a/drivers/gles3/rasterizer_scene_gles3.h +++ b/drivers/gles3/rasterizer_scene_gles3.h @@ -497,7 +497,6 @@ protected: float ssao_fadeout_to = 300.0; bool glow_bicubic_upscale = false; - bool glow_high_quality = false; RS::EnvironmentSSRRoughnessQuality ssr_roughness_quality = RS::ENV_SSR_ROUGHNESS_QUALITY_LOW; /* Sky */ @@ -610,7 +609,6 @@ public: /* ENVIRONMENT API */ void environment_glow_set_use_bicubic_upscale(bool p_enable) override; - void environment_glow_set_use_high_quality(bool p_enable) override; void environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) override; diff --git a/drivers/gles3/shaders/canvas.glsl b/drivers/gles3/shaders/canvas.glsl index c1c26ed963..9a90f33674 100644 --- a/drivers/gles3/shaders/canvas.glsl +++ b/drivers/gles3/shaders/canvas.glsl @@ -11,6 +11,7 @@ mode_instanced = #define USE_ATTRIBUTES \n#define USE_INSTANCING DISABLE_LIGHTING = false USE_RGBA_SHADOWS = false +SINGLE_INSTANCE = false #[vertex] @@ -25,9 +26,74 @@ layout(location = 1) in highp vec4 instance_xform0; layout(location = 2) in highp vec4 instance_xform1; layout(location = 5) in highp uvec4 instance_color_custom_data; // Color packed into xy, custom_data packed into zw for compatibility with 3D +#endif // USE_INSTANCING + +#endif // USE_ATTRIBUTES + +#include "stdlib_inc.glsl" + +layout(location = 6) in highp vec4 attrib_A; +layout(location = 7) in highp vec4 attrib_B; +layout(location = 8) in highp vec4 attrib_C; +layout(location = 9) in highp vec4 attrib_D; +layout(location = 10) in highp vec4 attrib_E; +#ifdef USE_PRIMITIVE +layout(location = 11) in highp uvec4 attrib_F; +#else +layout(location = 11) in highp vec4 attrib_F; +#endif +layout(location = 12) in highp uvec4 attrib_G; +layout(location = 13) in highp uvec4 attrib_H; + +#define read_draw_data_world_x attrib_A.xy +#define read_draw_data_world_y attrib_A.zw +#define read_draw_data_world_ofs attrib_B.xy +#define read_draw_data_color_texture_pixel_size attrib_B.zw + +#ifdef USE_PRIMITIVE + +#define read_draw_data_point_a attrib_C.xy +#define read_draw_data_point_b attrib_C.zw +#define read_draw_data_point_c attrib_D.xy +#define read_draw_data_uv_a attrib_D.zw +#define read_draw_data_uv_b attrib_E.xy +#define read_draw_data_uv_c attrib_E.zw + +#define read_draw_data_color_a_rg attrib_F.x +#define read_draw_data_color_a_ba attrib_F.y +#define read_draw_data_color_b_rg attrib_F.z +#define read_draw_data_color_b_ba attrib_F.w +#define read_draw_data_color_c_rg attrib_G.x +#define read_draw_data_color_c_ba attrib_G.y + +#else + +#define read_draw_data_modulation attrib_C +#define read_draw_data_ninepatch_margins attrib_D +#define read_draw_data_dst_rect attrib_E +#define read_draw_data_src_rect attrib_F + #endif +#define read_draw_data_flags attrib_G.z +#define read_draw_data_specular_shininess attrib_G.w +#define read_draw_data_lights attrib_H + +// Varyings so the per-instance info can be used in the fragment shader +flat out vec4 varying_A; +flat out vec2 varying_B; +#ifndef USE_PRIMITIVE +flat out vec4 varying_C; +#ifndef USE_ATTRIBUTES +#ifdef USE_NINEPATCH + +flat out vec2 varying_D; +#endif +flat out vec4 varying_E; +#endif #endif +flat out uvec2 varying_F; +flat out uvec4 varying_G; // This needs to be outside clang-format so the ubo comment is in the right place #ifdef MATERIAL_UNIFORMS_USED @@ -39,12 +105,10 @@ layout(std140) uniform MaterialUniforms{ //ubo:4 #endif /* clang-format on */ #include "canvas_uniforms_inc.glsl" -#include "stdlib_inc.glsl" out vec2 uv_interp; out vec4 color_interp; out vec2 vertex_interp; -flat out int draw_data_instance; #ifdef USE_NINEPATCH @@ -55,35 +119,46 @@ out vec2 pixel_size_interp; #GLOBALS void main() { + varying_A = vec4(read_draw_data_world_x, read_draw_data_world_y); + varying_B = read_draw_data_color_texture_pixel_size; +#ifndef USE_PRIMITIVE + varying_C = read_draw_data_ninepatch_margins; + +#ifndef USE_ATTRIBUTES +#ifdef USE_NINEPATCH + varying_D = vec2(read_draw_data_dst_rect.z, read_draw_data_dst_rect.w); +#endif // USE_NINEPATCH + varying_E = read_draw_data_src_rect; +#endif // !USE_ATTRIBUTES +#endif // USE_PRIMITIVE + + varying_F = uvec2(read_draw_data_flags, read_draw_data_specular_shininess); + varying_G = read_draw_data_lights; + vec4 instance_custom = vec4(0.0); #ifdef USE_PRIMITIVE - draw_data_instance = gl_InstanceID; vec2 vertex; vec2 uv; vec4 color; if (gl_VertexID % 3 == 0) { - vertex = draw_data[draw_data_instance].point_a; - uv = draw_data[draw_data_instance].uv_a; - color = vec4(unpackHalf2x16(draw_data[draw_data_instance].color_a_rg), unpackHalf2x16(draw_data[draw_data_instance].color_a_ba)); + vertex = read_draw_data_point_a; + uv = read_draw_data_uv_a; + color = vec4(unpackHalf2x16(read_draw_data_color_a_rg), unpackHalf2x16(read_draw_data_color_a_ba)); } else if (gl_VertexID % 3 == 1) { - vertex = draw_data[draw_data_instance].point_b; - uv = draw_data[draw_data_instance].uv_b; - color = vec4(unpackHalf2x16(draw_data[draw_data_instance].color_b_rg), unpackHalf2x16(draw_data[draw_data_instance].color_b_ba)); + vertex = read_draw_data_point_b; + uv = read_draw_data_uv_b; + color = vec4(unpackHalf2x16(read_draw_data_color_b_rg), unpackHalf2x16(read_draw_data_color_b_ba)); } else { - vertex = draw_data[draw_data_instance].point_c; - uv = draw_data[draw_data_instance].uv_c; - color = vec4(unpackHalf2x16(draw_data[draw_data_instance].color_c_rg), unpackHalf2x16(draw_data[draw_data_instance].color_c_ba)); + vertex = read_draw_data_point_c; + uv = read_draw_data_uv_c; + color = vec4(unpackHalf2x16(read_draw_data_color_c_rg), unpackHalf2x16(read_draw_data_color_c_ba)); } #elif defined(USE_ATTRIBUTES) - draw_data_instance = gl_InstanceID; -#ifdef USE_INSTANCING - draw_data_instance = 0; -#endif vec2 vertex = vertex_attrib; - vec4 color = color_attrib * draw_data[draw_data_instance].modulation; + vec4 color = color_attrib * read_draw_data_modulation; vec2 uv = uv_attrib; #ifdef USE_INSTANCING @@ -93,30 +168,29 @@ void main() { #endif #else - draw_data_instance = gl_VertexID / 6; vec2 vertex_base_arr[6] = vec2[](vec2(0.0, 0.0), vec2(0.0, 1.0), vec2(1.0, 1.0), vec2(1.0, 0.0), vec2(0.0, 0.0), vec2(1.0, 1.0)); vec2 vertex_base = vertex_base_arr[gl_VertexID % 6]; - vec2 uv = draw_data[draw_data_instance].src_rect.xy + abs(draw_data[draw_data_instance].src_rect.zw) * ((draw_data[draw_data_instance].flags & FLAGS_TRANSPOSE_RECT) != uint(0) ? vertex_base.yx : vertex_base.xy); - vec4 color = draw_data[draw_data_instance].modulation; - vec2 vertex = draw_data[draw_data_instance].dst_rect.xy + abs(draw_data[draw_data_instance].dst_rect.zw) * mix(vertex_base, vec2(1.0, 1.0) - vertex_base, lessThan(draw_data[draw_data_instance].src_rect.zw, vec2(0.0, 0.0))); + vec2 uv = read_draw_data_src_rect.xy + abs(read_draw_data_src_rect.zw) * ((read_draw_data_flags & FLAGS_TRANSPOSE_RECT) != uint(0) ? vertex_base.yx : vertex_base.xy); + vec4 color = read_draw_data_modulation; + vec2 vertex = read_draw_data_dst_rect.xy + abs(read_draw_data_dst_rect.zw) * mix(vertex_base, vec2(1.0, 1.0) - vertex_base, lessThan(read_draw_data_src_rect.zw, vec2(0.0, 0.0))); #endif - mat4 model_matrix = mat4(vec4(draw_data[draw_data_instance].world_x, 0.0, 0.0), vec4(draw_data[draw_data_instance].world_y, 0.0, 0.0), vec4(0.0, 0.0, 1.0, 0.0), vec4(draw_data[draw_data_instance].world_ofs, 0.0, 1.0)); + mat4 model_matrix = mat4(vec4(read_draw_data_world_x, 0.0, 0.0), vec4(read_draw_data_world_y, 0.0, 0.0), vec4(0.0, 0.0, 1.0, 0.0), vec4(read_draw_data_world_ofs, 0.0, 1.0)); #ifdef USE_INSTANCING model_matrix = model_matrix * transpose(mat4(instance_xform0, instance_xform1, vec4(0.0, 0.0, 1.0, 0.0), vec4(0.0, 0.0, 0.0, 1.0))); #endif // USE_INSTANCING #if !defined(USE_ATTRIBUTES) && !defined(USE_PRIMITIVE) - if (bool(draw_data[draw_data_instance].flags & FLAGS_USING_PARTICLES)) { + if (bool(read_draw_data_flags & FLAGS_USING_PARTICLES)) { //scale by texture size - vertex /= draw_data[draw_data_instance].color_texture_pixel_size; + vertex /= read_draw_data_color_texture_pixel_size; } #endif - vec2 color_texture_pixel_size = draw_data[draw_data_instance].color_texture_pixel_size.xy; + vec2 color_texture_pixel_size = read_draw_data_color_texture_pixel_size; #ifdef USE_POINT_SIZE float point_size = 1.0; @@ -126,7 +200,7 @@ void main() { } #ifdef USE_NINEPATCH - pixel_size_interp = abs(draw_data[draw_data_instance].dst_rect.zw) * vertex_base; + pixel_size_interp = abs(read_draw_data_dst_rect.zw) * vertex_base; #endif #if !defined(SKIP_TRANSFORM_USED) @@ -159,6 +233,46 @@ void main() { #include "canvas_uniforms_inc.glsl" #include "stdlib_inc.glsl" +in vec2 uv_interp; +in vec2 vertex_interp; +in vec4 color_interp; + +#ifdef USE_NINEPATCH + +in vec2 pixel_size_interp; + +#endif + +// Can all be flat as they are the same for the whole batched instance +flat in vec4 varying_A; +flat in vec2 varying_B; +#define read_draw_data_world_x varying_A.xy +#define read_draw_data_world_y varying_A.zw +#define read_draw_data_color_texture_pixel_size varying_B + +#ifndef USE_PRIMITIVE +flat in vec4 varying_C; +#define read_draw_data_ninepatch_margins varying_C + +#ifndef USE_ATTRIBUTES +#ifdef USE_NINEPATCH + +flat in vec2 varying_D; +#define read_draw_data_dst_rect_z varying_D.x +#define read_draw_data_dst_rect_w varying_D.y +#endif + +flat in vec4 varying_E; +#define read_draw_data_src_rect varying_E +#endif // USE_ATTRIBUTES +#endif // USE_PRIMITIVE + +flat in uvec2 varying_F; +flat in uvec4 varying_G; +#define read_draw_data_flags varying_F.x +#define read_draw_data_specular_shininess varying_F.y +#define read_draw_data_lights varying_G + #ifndef DISABLE_LIGHTING uniform sampler2D atlas_texture; //texunit:-2 uniform sampler2D shadow_atlas_texture; //texunit:-3 @@ -170,17 +284,6 @@ uniform sampler2D specular_texture; //texunit:-7 uniform sampler2D color_texture; //texunit:0 -in vec2 uv_interp; -in vec4 color_interp; -in vec2 vertex_interp; -flat in int draw_data_instance; - -#ifdef USE_NINEPATCH - -in vec2 pixel_size_interp; - -#endif - layout(location = 0) out vec4 frag_color; #ifdef MATERIAL_UNIFORMS_USED @@ -366,7 +469,7 @@ float map_ninepatch_axis(float pixel, float draw_size, float tex_pixel_size, flo } else if (pixel >= draw_size - margin_end) { return (tex_size - (draw_size - pixel)) * tex_pixel_size; } else { - if (!bool(draw_data[draw_data_instance].flags & FLAGS_NINEPACH_DRAW_CENTER)) { + if (!bool(read_draw_data_flags & FLAGS_NINEPACH_DRAW_CENTER)) { draw_center--; } @@ -414,28 +517,26 @@ void main() { int draw_center = 2; uv = vec2( - map_ninepatch_axis(pixel_size_interp.x, abs(draw_data[draw_data_instance].dst_rect.z), draw_data[draw_data_instance].color_texture_pixel_size.x, draw_data[draw_data_instance].ninepatch_margins.x, draw_data[draw_data_instance].ninepatch_margins.z, int(draw_data[draw_data_instance].flags >> FLAGS_NINEPATCH_H_MODE_SHIFT) & 0x3, draw_center), - map_ninepatch_axis(pixel_size_interp.y, abs(draw_data[draw_data_instance].dst_rect.w), draw_data[draw_data_instance].color_texture_pixel_size.y, draw_data[draw_data_instance].ninepatch_margins.y, draw_data[draw_data_instance].ninepatch_margins.w, int(draw_data[draw_data_instance].flags >> FLAGS_NINEPATCH_V_MODE_SHIFT) & 0x3, draw_center)); + map_ninepatch_axis(pixel_size_interp.x, abs(read_draw_data_dst_rect_z), read_draw_data_color_texture_pixel_size.x, read_draw_data_ninepatch_margins.x, read_draw_data_ninepatch_margins.z, int(read_draw_data_flags >> FLAGS_NINEPATCH_H_MODE_SHIFT) & 0x3, draw_center), + map_ninepatch_axis(pixel_size_interp.y, abs(read_draw_data_dst_rect_w), read_draw_data_color_texture_pixel_size.y, read_draw_data_ninepatch_margins.y, read_draw_data_ninepatch_margins.w, int(read_draw_data_flags >> FLAGS_NINEPATCH_V_MODE_SHIFT) & 0x3, draw_center)); if (draw_center == 0) { color.a = 0.0; } - uv = uv * draw_data[draw_data_instance].src_rect.zw + draw_data[draw_data_instance].src_rect.xy; //apply region if needed + uv = uv * read_draw_data_src_rect.zw + read_draw_data_src_rect.xy; //apply region if needed #endif - if (bool(draw_data[draw_data_instance].flags & FLAGS_CLIP_RECT_UV)) { - uv = clamp(uv, draw_data[draw_data_instance].src_rect.xy, draw_data[draw_data_instance].src_rect.xy + abs(draw_data[draw_data_instance].src_rect.zw)); + if (bool(read_draw_data_flags & FLAGS_CLIP_RECT_UV)) { + uv = clamp(uv, read_draw_data_src_rect.xy, read_draw_data_src_rect.xy + abs(read_draw_data_src_rect.zw)); } #endif #ifndef USE_PRIMITIVE - if (bool(draw_data[draw_data_instance].flags & FLAGS_USE_MSDF)) { - float px_range = draw_data[draw_data_instance].ninepatch_margins.x; - float outline_thickness = draw_data[draw_data_instance].ninepatch_margins.y; - //float reserved1 = draw_data[draw_data_instance].ninepatch_margins.z; - //float reserved2 = draw_data[draw_data_instance].ninepatch_margins.w; + if (bool(read_draw_data_flags & FLAGS_USE_MSDF)) { + float px_range = read_draw_data_ninepatch_margins.x; + float outline_thickness = read_draw_data_ninepatch_margins.y; vec4 msdf_sample = texture(color_texture, uv); vec2 msdf_size = vec2(textureSize(color_texture, 0)); @@ -451,7 +552,7 @@ void main() { float a = clamp(d * px_size + 0.5, 0.0, 1.0); color.a = a * color.a; } - } else if (bool(draw_data[draw_data_instance].flags & FLAGS_USE_LCD)) { + } else if (bool(read_draw_data_flags & FLAGS_USE_LCD)) { vec4 lcd_sample = texture(color_texture, uv); if (lcd_sample.a == 1.0) { color.rgb = lcd_sample.rgb * color.a; @@ -465,7 +566,7 @@ void main() { color *= texture(color_texture, uv); } - uint light_count = (draw_data[draw_data_instance].flags >> uint(FLAGS_LIGHT_COUNT_SHIFT)) & uint(0xF); //max 16 lights + uint light_count = (read_draw_data_flags >> uint(FLAGS_LIGHT_COUNT_SHIFT)) & uint(0xF); //max 16 lights bool using_light = light_count > 0u || directional_light_count > 0u; vec3 normal; @@ -476,7 +577,7 @@ void main() { bool normal_used = false; #endif - if (normal_used || (using_light && bool(draw_data[draw_data_instance].flags & FLAGS_DEFAULT_NORMAL_MAP_USED))) { + if (normal_used || (using_light && bool(read_draw_data_flags & FLAGS_DEFAULT_NORMAL_MAP_USED))) { normal.xy = texture(normal_texture, uv).xy * vec2(2.0, -2.0) - vec2(1.0, -1.0); normal.z = sqrt(1.0 - dot(normal.xy, normal.xy)); normal_used = true; @@ -493,9 +594,9 @@ void main() { bool specular_shininess_used = false; #endif - if (specular_shininess_used || (using_light && normal_used && bool(draw_data[draw_data_instance].flags & FLAGS_DEFAULT_SPECULAR_MAP_USED))) { + if (specular_shininess_used || (using_light && normal_used && bool(read_draw_data_flags & FLAGS_DEFAULT_SPECULAR_MAP_USED))) { specular_shininess = texture(specular_texture, uv); - specular_shininess *= godot_unpackUnorm4x8(draw_data[draw_data_instance].specular_shininess); + specular_shininess *= godot_unpackUnorm4x8(read_draw_data_specular_shininess); specular_shininess_used = true; } else { specular_shininess = vec4(1.0); @@ -507,7 +608,7 @@ void main() { vec2 screen_uv = vec2(0.0); #endif - vec2 color_texture_pixel_size = draw_data[draw_data_instance].color_texture_pixel_size.xy; + vec2 color_texture_pixel_size = read_draw_data_color_texture_pixel_size.xy; vec3 light_vertex = vec3(vertex, 0.0); vec2 shadow_vertex = vertex; @@ -529,7 +630,7 @@ void main() { if (normal_used) { //convert by item transform - normal.xy = mat2(normalize(draw_data[draw_data_instance].world_x), normalize(draw_data[draw_data_instance].world_y)) * normal.xy; + normal.xy = mat2(normalize(read_draw_data_world_x), normalize(read_draw_data_world_y)) * normal.xy; //convert by canvas transform normal = normalize((canvas_normal_transform * vec4(normal, 0.0)).xyz); } @@ -591,15 +692,15 @@ void main() { uint light_base; if (i < 8u) { if (i < 4u) { - light_base = draw_data[draw_data_instance].lights[0]; + light_base = read_draw_data_lights[0]; } else { - light_base = draw_data[draw_data_instance].lights[1]; + light_base = read_draw_data_lights[1]; } } else { if (i < 12u) { - light_base = draw_data[draw_data_instance].lights[2]; + light_base = read_draw_data_lights[2]; } else { - light_base = draw_data[draw_data_instance].lights[3]; + light_base = read_draw_data_lights[3]; } } light_base >>= (i & 3u) * 8u; diff --git a/drivers/gles3/shaders/canvas_uniforms_inc.glsl b/drivers/gles3/shaders/canvas_uniforms_inc.glsl index dd5ebecb1a..f65558f042 100644 --- a/drivers/gles3/shaders/canvas_uniforms_inc.glsl +++ b/drivers/gles3/shaders/canvas_uniforms_inc.glsl @@ -27,38 +27,6 @@ #define FLAGS_USE_MSDF uint(1 << 28) #define FLAGS_USE_LCD uint(1 << 29) -// must be always 128 bytes long -struct DrawData { - vec2 world_x; - vec2 world_y; - vec2 world_ofs; - vec2 color_texture_pixel_size; -#ifdef USE_PRIMITIVE - vec2 point_a; - vec2 point_b; - vec2 point_c; - vec2 uv_a; - vec2 uv_b; - vec2 uv_c; - uint color_a_rg; - uint color_a_ba; - uint color_b_rg; - uint color_b_ba; - uint color_c_rg; - uint color_c_ba; -#else - vec4 modulation; - vec4 ninepatch_margins; - vec4 dst_rect; //for built-in rect and UV - vec4 src_rect; - uint pad; - uint pad2; -#endif - uint flags; - uint specular_shininess; - uvec4 lights; -}; - layout(std140) uniform GlobalShaderUniformData { //ubo:1 vec4 global_shader_uniforms[MAX_GLOBAL_SHADER_UNIFORMS]; }; @@ -116,7 +84,3 @@ layout(std140) uniform LightData { //ubo:2 Light light_array[MAX_LIGHTS]; }; #endif // DISABLE_LIGHTING -layout(std140) uniform DrawDataInstances { //ubo:3 - - DrawData draw_data[MAX_DRAW_DATA_INSTANCES]; -}; diff --git a/drivers/gles3/shaders/scene.glsl b/drivers/gles3/shaders/scene.glsl index fa68f0063f..1b922fa726 100644 --- a/drivers/gles3/shaders/scene.glsl +++ b/drivers/gles3/shaders/scene.glsl @@ -503,8 +503,7 @@ multiview_data; /* clang-format on */ -//directional light data - +// Directional light data. #ifndef DISABLE_LIGHT_DIRECTIONAL struct DirectionalLightData { @@ -520,11 +519,12 @@ layout(std140) uniform DirectionalLights { // ubo:7 DirectionalLightData directional_lights[MAX_DIRECTIONAL_LIGHT_DATA_STRUCTS]; }; -#endif +#endif // !DISABLE_LIGHT_DIRECTIONAL + +// Omni and spot light data. +#if !defined(DISABLE_LIGHT_OMNI) || !defined(DISABLE_LIGHT_SPOT) -// omni and spot -#if !defined(DISABLE_LIGHT_OMNI) && !defined(DISABLE_LIGHT_SPOT) -struct LightData { //this structure needs to be as packed as possible +struct LightData { // This structure needs to be as packed as possible. highp vec3 position; highp float inv_radius; @@ -539,9 +539,9 @@ struct LightData { //this structure needs to be as packed as possible mediump float specular_amount; mediump float shadow_opacity; }; + #ifndef DISABLE_LIGHT_OMNI layout(std140) uniform OmniLightData { // ubo:5 - LightData omni_lights[MAX_LIGHT_DATA_STRUCTS]; }; uniform uint omni_light_indices[MAX_FORWARD_LIGHTS]; @@ -549,9 +549,7 @@ uniform uint omni_light_count; #endif #ifndef DISABLE_LIGHT_SPOT - layout(std140) uniform SpotLightData { // ubo:6 - LightData spot_lights[MAX_LIGHT_DATA_STRUCTS]; }; uniform uint spot_light_indices[MAX_FORWARD_LIGHTS]; @@ -562,7 +560,7 @@ uniform uint spot_light_count; uniform highp samplerCubeShadow positional_shadow; // texunit:-4 #endif -#endif // !defined(DISABLE_LIGHT_OMNI) && !defined(DISABLE_LIGHT_SPOT) +#endif // !defined(DISABLE_LIGHT_OMNI) || !defined(DISABLE_LIGHT_SPOT) #ifdef USE_MULTIVIEW uniform highp sampler2DArray depth_buffer; // texunit:-6 @@ -585,6 +583,7 @@ vec3 F0(float metallic, float specular, vec3 albedo) { } #if !defined(DISABLE_LIGHT_DIRECTIONAL) || !defined(DISABLE_LIGHT_OMNI) || !defined(DISABLE_LIGHT_SPOT) + float D_GGX(float cos_theta_m, float alpha) { float a = cos_theta_m * alpha; float k = alpha / (1.0 - cos_theta_m * cos_theta_m + a * a); @@ -641,7 +640,6 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte /* clang-format off */ - #CODE : LIGHT /* clang-format on */ @@ -672,11 +670,8 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte // https://web.archive.org/web/20210228210901/http://blog.stevemcauley.com/2011/12/03/energy-conserving-wrapped-diffuse/ diffuse_brdf_NL = max(0.0, (NdotL + roughness) / ((1.0 + roughness) * (1.0 + roughness))) * (1.0 / M_PI); #elif defined(DIFFUSE_TOON) - diffuse_brdf_NL = smoothstep(-roughness, max(roughness, 0.01), NdotL) * (1.0 / M_PI); - #elif defined(DIFFUSE_BURLEY) - { float FD90_minus_1 = 2.0 * cLdotH * cLdotH * roughness - 0.5; float FdV = 1.0 + FD90_minus_1 * SchlickFresnel(cNdotV); @@ -684,7 +679,7 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte diffuse_brdf_NL = (1.0 / M_PI) * FdV * FdL * cNdotL; } #else - // lambert + // Lambert diffuse_brdf_NL = cNdotL * (1.0 / M_PI); #endif @@ -720,7 +715,6 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte // shlick+ggx as default float alpha_ggx = roughness * roughness; #if defined(LIGHT_ANISOTROPY_USED) - float aspect = sqrt(1.0 - anisotropy * 0.9); float ax = alpha_ggx / aspect; float ay = alpha_ggx * aspect; @@ -728,7 +722,7 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte float YdotH = dot(B, H); float D = D_GGX_anisotropic(cNdotH, ax, ay, XdotH, YdotH); float G = V_GGX_anisotropic(ax, ay, dot(T, V), dot(T, L), dot(B, V), dot(B, L), cNdotV, cNdotL); -#else // LIGHT_ANISOTROPY_USED +#else float D = D_GGX(cNdotH, alpha_ggx); float G = V_GGX(cNdotL, cNdotV, alpha_ggx); #endif // LIGHT_ANISOTROPY_USED @@ -768,10 +762,10 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte alpha = min(alpha, clamp(1.0 - attenuation, 0.0, 1.0)); #endif -#endif //defined(LIGHT_CODE_USED) +#endif // LIGHT_CODE_USED } -float get_omni_attenuation(float distance, float inv_range, float decay) { +float get_omni_spot_attenuation(float distance, float inv_range, float decay) { float nd = distance * inv_range; nd *= nd; nd *= nd; // nd^4 @@ -779,6 +773,7 @@ float get_omni_attenuation(float distance, float inv_range, float decay) { nd *= nd; // nd^2 return nd * pow(max(distance, 0.0001), -decay); } + #ifndef DISABLE_LIGHT_OMNI void light_process_omni(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 f0, float roughness, float metallic, float shadow, vec3 albedo, inout float alpha, #ifdef LIGHT_BACKLIGHT_USED @@ -796,7 +791,7 @@ void light_process_omni(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 f inout vec3 diffuse_light, inout vec3 specular_light) { vec3 light_rel_vec = omni_lights[idx].position - vertex; float light_length = length(light_rel_vec); - float omni_attenuation = get_omni_attenuation(light_length, omni_lights[idx].inv_radius, omni_lights[idx].attenuation); + float omni_attenuation = get_omni_spot_attenuation(light_length, omni_lights[idx].inv_radius, omni_lights[idx].attenuation); vec3 color = omni_lights[idx].color; float size_A = 0.0; @@ -842,7 +837,7 @@ void light_process_spot(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 f vec3 light_rel_vec = spot_lights[idx].position - vertex; float light_length = length(light_rel_vec); - float spot_attenuation = get_omni_attenuation(light_length, spot_lights[idx].inv_radius, spot_lights[idx].attenuation); + float spot_attenuation = get_omni_spot_attenuation(light_length, spot_lights[idx].inv_radius, spot_lights[idx].attenuation); vec3 spot_dir = spot_lights[idx].direction; float scos = max(dot(-normalize(light_rel_vec), spot_dir), spot_lights[idx].cone_angle); float spot_rim = max(0.0001, (1.0 - scos) / (1.0 - spot_lights[idx].cone_angle)); @@ -872,7 +867,8 @@ void light_process_spot(uint idx, vec3 vertex, vec3 eye_vec, vec3 normal, vec3 f diffuse_light, specular_light); } #endif // !DISABLE_LIGHT_SPOT -#endif // !defined(DISABLE_LIGHT_DIRECTIONAL) || !defined(DISABLE_LIGHT_OMNI) && !defined(DISABLE_LIGHT_SPOT) + +#endif // !defined(DISABLE_LIGHT_DIRECTIONAL) || !defined(DISABLE_LIGHT_OMNI) || !defined(DISABLE_LIGHT_SPOT) #ifndef MODE_RENDER_DEPTH vec4 fog_process(vec3 vertex) { @@ -1070,15 +1066,11 @@ void main() { fog = fog_process(vertex); } #endif // !DISABLE_FOG -#endif //!CUSTOM_FOG_USED +#endif // !CUSTOM_FOG_USED uint fog_rg = packHalf2x16(fog.rg); uint fog_ba = packHalf2x16(fog.ba); -#endif //!MODE_RENDER_DEPTH - -#ifndef MODE_RENDER_DEPTH - // Convert colors to linear albedo = srgb_to_linear(albedo); emission = srgb_to_linear(emission); @@ -1199,7 +1191,7 @@ void main() { diffuse_light, specular_light); } -#endif //!DISABLE_LIGHT_DIRECTIONAL +#endif // !DISABLE_LIGHT_DIRECTIONAL #ifndef DISABLE_LIGHT_OMNI for (uint i = 0u; i < MAX_FORWARD_LIGHTS; i++) { @@ -1246,9 +1238,10 @@ void main() { #endif diffuse_light, specular_light); } - #endif // !DISABLE_LIGHT_SPOT + #endif // !MODE_UNSHADED + #endif // !MODE_RENDER_DEPTH #if defined(USE_SHADOW_TO_OPACITY) diff --git a/drivers/gles3/storage/config.cpp b/drivers/gles3/storage/config.cpp index 9b496c0999..46dc2b806e 100644 --- a/drivers/gles3/storage/config.cpp +++ b/drivers/gles3/storage/config.cpp @@ -90,8 +90,6 @@ Config::Config() { glGetIntegerv(GL_MAX_UNIFORM_BLOCK_SIZE, &max_uniform_buffer_size); glGetIntegerv(GL_MAX_VIEWPORT_DIMS, max_viewport_size); - glGetIntegerv(GL_UNIFORM_BUFFER_OFFSET_ALIGNMENT, &uniform_buffer_offset_alignment); - support_anisotropic_filter = extensions.has("GL_EXT_texture_filter_anisotropic"); if (support_anisotropic_filter) { glGetFloatv(_GL_MAX_TEXTURE_MAX_ANISOTROPY_EXT, &anisotropic_level); diff --git a/drivers/gles3/storage/config.h b/drivers/gles3/storage/config.h index 87202fde84..1a93b4b8ef 100644 --- a/drivers/gles3/storage/config.h +++ b/drivers/gles3/storage/config.h @@ -67,8 +67,6 @@ public: int max_renderable_lights = 0; int max_lights_per_object = 0; - int uniform_buffer_offset_alignment = 0; - // TODO implement wireframe in OpenGL // bool generate_wireframes; diff --git a/drivers/gles3/storage/material_storage.cpp b/drivers/gles3/storage/material_storage.cpp index 19e841f466..ebafdc88d8 100644 --- a/drivers/gles3/storage/material_storage.cpp +++ b/drivers/gles3/storage/material_storage.cpp @@ -923,6 +923,104 @@ _FORCE_INLINE_ static void _fill_std140_ubo_empty(ShaderLanguage::DataType type, } /////////////////////////////////////////////////////////////////////////// +// ShaderData + +void ShaderData::set_path_hint(const String &p_hint) { + path = p_hint; +} + +void ShaderData::set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) { + if (!p_texture.is_valid()) { + if (default_texture_params.has(p_name) && default_texture_params[p_name].has(p_index)) { + default_texture_params[p_name].erase(p_index); + + if (default_texture_params[p_name].is_empty()) { + default_texture_params.erase(p_name); + } + } + } else { + if (!default_texture_params.has(p_name)) { + default_texture_params[p_name] = HashMap<int, RID>(); + } + default_texture_params[p_name][p_index] = p_texture; + } +} + +Variant ShaderData::get_default_parameter(const StringName &p_parameter) const { + if (uniforms.has(p_parameter)) { + ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter]; + Vector<ShaderLanguage::ConstantNode::Value> default_value = uniform.default_value; + return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint); + } + return Variant(); +} + +void ShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { + SortArray<Pair<StringName, int>, ShaderLanguage::UniformOrderComparator> sorter; + LocalVector<Pair<StringName, int>> filtered_uniforms; + + for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { + if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_LOCAL) { + continue; + } + if (E.value.texture_order >= 0) { + filtered_uniforms.push_back(Pair<StringName, int>(E.key, E.value.texture_order + 100000)); + } else { + filtered_uniforms.push_back(Pair<StringName, int>(E.key, E.value.order)); + } + } + int uniform_count = filtered_uniforms.size(); + sorter.sort(filtered_uniforms.ptr(), uniform_count); + + String last_group; + for (int i = 0; i < uniform_count; i++) { + const StringName &uniform_name = filtered_uniforms[i].first; + const ShaderLanguage::ShaderNode::Uniform &uniform = uniforms[uniform_name]; + + String group = uniform.group; + if (!uniform.subgroup.is_empty()) { + group += "::" + uniform.subgroup; + } + + if (group != last_group) { + PropertyInfo pi; + pi.usage = PROPERTY_USAGE_GROUP; + pi.name = group; + p_param_list->push_back(pi); + + last_group = group; + } + + PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniform); + pi.name = uniform_name; + p_param_list->push_back(pi); + } +} + +void ShaderData::get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const { + for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { + if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { + continue; + } + + RendererMaterialStorage::InstanceShaderParam p; + p.info = ShaderLanguage::uniform_to_property_info(E.value); + p.info.name = E.key; //supply name + p.index = E.value.instance_index; + p.default_value = ShaderLanguage::constant_value_to_variant(E.value.default_value, E.value.type, E.value.array_size, E.value.hint); + p_param_list->push_back(p); + } +} + +bool ShaderData::is_parameter_texture(const StringName &p_param) const { + if (!uniforms.has(p_param)) { + return false; + } + + return uniforms[p_param].texture_order >= 0; +} + +/////////////////////////////////////////////////////////////////////////// // MaterialData // Look up table to translate ShaderLanguage::DataType to GL_TEXTURE_* @@ -2806,10 +2904,6 @@ void MaterialStorage::material_update_dependency(RID p_material, DependencyTrack /* Canvas Shader Data */ -void CanvasShaderData::set_path_hint(const String &p_path) { - path = p_path; -} - void CanvasShaderData::set_code(const String &p_code) { // compile the shader @@ -2890,85 +2984,6 @@ void CanvasShaderData::set_code(const String &p_code) { valid = true; } -void CanvasShaderData::set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) { - if (!p_texture.is_valid()) { - if (default_texture_params.has(p_name) && default_texture_params[p_name].has(p_index)) { - default_texture_params[p_name].erase(p_index); - - if (default_texture_params[p_name].is_empty()) { - default_texture_params.erase(p_name); - } - } - } else { - if (!default_texture_params.has(p_name)) { - default_texture_params[p_name] = HashMap<int, RID>(); - } - default_texture_params[p_name][p_index] = p_texture; - } -} - -void CanvasShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { - HashMap<int, StringName> order; - - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_LOCAL || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_SCREEN_TEXTURE || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL_ROUGHNESS_TEXTURE || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_DEPTH_TEXTURE) { - continue; - } - if (E.value.texture_order >= 0) { - order[E.value.texture_order + 100000] = E.key; - } else { - order[E.value.order] = E.key; - } - } - - String last_group; - for (const KeyValue<int, StringName> &E : order) { - String group = uniforms[E.value].group; - if (!uniforms[E.value].subgroup.is_empty()) { - group += "::" + uniforms[E.value].subgroup; - } - - if (group != last_group) { - PropertyInfo pi; - pi.usage = PROPERTY_USAGE_GROUP; - pi.name = group; - p_param_list->push_back(pi); - - last_group = group; - } - - PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniforms[E.value]); - pi.name = E.value; - p_param_list->push_back(pi); - } -} - -void CanvasShaderData::get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const { - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - RendererMaterialStorage::InstanceShaderParam p; - p.info = ShaderLanguage::uniform_to_property_info(E.value); - p.info.name = E.key; //supply name - p.index = E.value.instance_index; - p.default_value = ShaderLanguage::constant_value_to_variant(E.value.default_value, E.value.type, E.value.array_size, E.value.hint); - p_param_list->push_back(p); - } -} - -bool CanvasShaderData::is_parameter_texture(const StringName &p_param) const { - if (!uniforms.has(p_param)) { - return false; - } - - return uniforms[p_param].texture_order >= 0; -} - bool CanvasShaderData::is_animated() const { return false; } @@ -2977,15 +2992,6 @@ bool CanvasShaderData::casts_shadows() const { return false; } -Variant CanvasShaderData::get_default_parameter(const StringName &p_parameter) const { - if (uniforms.has(p_parameter)) { - ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter]; - Vector<ShaderLanguage::ConstantNode::Value> default_value = uniform.default_value; - return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint); - } - return Variant(); -} - RS::ShaderNativeSourceCode CanvasShaderData::get_native_source_code() const { return MaterialStorage::get_singleton()->shaders.canvas_shader.version_get_native_source_code(version); } @@ -3021,6 +3027,9 @@ void CanvasMaterialData::bind_uniforms() { Texture *texture = TextureStorage::get_singleton()->get_texture(textures[ti]); glActiveTexture(GL_TEXTURE1 + ti); // Start at GL_TEXTURE1 because texture slot 0 is used by the base texture glBindTexture(target_from_type[texture_uniforms[ti].type], texture->tex_id); + if (texture->render_target) { + texture->render_target->used_in_frame = true; + } // Set sampler state here as the same texture can be used in multiple places with different flags // Need to convert sampler state from ShaderLanguage::Texture* to RS::CanvasItemTexture* @@ -3044,10 +3053,6 @@ GLES3::MaterialData *GLES3::_create_canvas_material_func(ShaderData *p_shader) { //////////////////////////////////////////////////////////////////////////////// // SKY SHADER -void SkyShaderData::set_path_hint(const String &p_path) { - path = p_path; -} - void SkyShaderData::set_code(const String &p_code) { //compile @@ -3138,83 +3143,6 @@ void SkyShaderData::set_code(const String &p_code) { valid = true; } -void SkyShaderData::set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) { - if (!p_texture.is_valid()) { - if (default_texture_params.has(p_name) && default_texture_params[p_name].has(p_index)) { - default_texture_params[p_name].erase(p_index); - - if (default_texture_params[p_name].is_empty()) { - default_texture_params.erase(p_name); - } - } - } else { - if (!default_texture_params.has(p_name)) { - default_texture_params[p_name] = HashMap<int, RID>(); - } - default_texture_params[p_name][p_index] = p_texture; - } -} - -void SkyShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { - RBMap<int, StringName> order; - - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_GLOBAL || E.value.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - if (E.value.texture_order >= 0) { - order[E.value.texture_order + 100000] = E.key; - } else { - order[E.value.order] = E.key; - } - } - - String last_group; - for (const KeyValue<int, StringName> &E : order) { - String group = uniforms[E.value].group; - if (!uniforms[E.value].subgroup.is_empty()) { - group += "::" + uniforms[E.value].subgroup; - } - - if (group != last_group) { - PropertyInfo pi; - pi.usage = PROPERTY_USAGE_GROUP; - pi.name = group; - p_param_list->push_back(pi); - - last_group = group; - } - - PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniforms[E.value]); - pi.name = E.value; - p_param_list->push_back(pi); - } -} - -void SkyShaderData::get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const { - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - RendererMaterialStorage::InstanceShaderParam p; - p.info = ShaderLanguage::uniform_to_property_info(E.value); - p.info.name = E.key; //supply name - p.index = E.value.instance_index; - p.default_value = ShaderLanguage::constant_value_to_variant(E.value.default_value, E.value.type, E.value.array_size, E.value.hint); - p_param_list->push_back(p); - } -} - -bool SkyShaderData::is_parameter_texture(const StringName &p_param) const { - if (!uniforms.has(p_param)) { - return false; - } - - return uniforms[p_param].texture_order >= 0; -} - bool SkyShaderData::is_animated() const { return false; } @@ -3223,15 +3151,6 @@ bool SkyShaderData::casts_shadows() const { return false; } -Variant SkyShaderData::get_default_parameter(const StringName &p_parameter) const { - if (uniforms.has(p_parameter)) { - ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter]; - Vector<ShaderLanguage::ConstantNode::Value> default_value = uniform.default_value; - return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint); - } - return Variant(); -} - RS::ShaderNativeSourceCode SkyShaderData::get_native_source_code() const { return MaterialStorage::get_singleton()->shaders.sky_shader.version_get_native_source_code(version); } @@ -3278,6 +3197,9 @@ void SkyMaterialData::bind_uniforms() { Texture *texture = TextureStorage::get_singleton()->get_texture(textures[ti]); glActiveTexture(GL_TEXTURE0 + ti); glBindTexture(target_from_type[texture_uniforms[ti].type], texture->tex_id); + if (texture->render_target) { + texture->render_target->used_in_frame = true; + } // Set sampler state here as the same texture can be used in multiple places with different flags // Need to convert sampler state from ShaderLanguage::Texture* to RS::CanvasItemTexture* @@ -3291,10 +3213,6 @@ void SkyMaterialData::bind_uniforms() { //////////////////////////////////////////////////////////////////////////////// // Scene SHADER -void SceneShaderData::set_path_hint(const String &p_path) { - path = p_path; -} - void SceneShaderData::set_code(const String &p_code) { //compile @@ -3471,86 +3389,6 @@ void SceneShaderData::set_code(const String &p_code) { valid = true; } -void SceneShaderData::set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) { - if (!p_texture.is_valid()) { - if (default_texture_params.has(p_name) && default_texture_params[p_name].has(p_index)) { - default_texture_params[p_name].erase(p_index); - - if (default_texture_params[p_name].is_empty()) { - default_texture_params.erase(p_name); - } - } - } else { - if (!default_texture_params.has(p_name)) { - default_texture_params[p_name] = HashMap<int, RID>(); - } - default_texture_params[p_name][p_index] = p_texture; - } -} - -void SceneShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { - RBMap<int, StringName> order; - - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_LOCAL || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_SCREEN_TEXTURE || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL_ROUGHNESS_TEXTURE || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_DEPTH_TEXTURE) { - continue; - } - - if (E.value.texture_order >= 0) { - order[E.value.texture_order + 100000] = E.key; - } else { - order[E.value.order] = E.key; - } - } - - String last_group; - for (const KeyValue<int, StringName> &E : order) { - String group = uniforms[E.value].group; - if (!uniforms[E.value].subgroup.is_empty()) { - group += "::" + uniforms[E.value].subgroup; - } - - if (group != last_group) { - PropertyInfo pi; - pi.usage = PROPERTY_USAGE_GROUP; - pi.name = group; - p_param_list->push_back(pi); - - last_group = group; - } - - PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniforms[E.value]); - pi.name = E.value; - p_param_list->push_back(pi); - } -} - -void SceneShaderData::get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const { - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - RendererMaterialStorage::InstanceShaderParam p; - p.info = ShaderLanguage::uniform_to_property_info(E.value); - p.info.name = E.key; //supply name - p.index = E.value.instance_index; - p.default_value = ShaderLanguage::constant_value_to_variant(E.value.default_value, E.value.type, E.value.array_size, E.value.hint); - p_param_list->push_back(p); - } -} - -bool SceneShaderData::is_parameter_texture(const StringName &p_param) const { - if (!uniforms.has(p_param)) { - return false; - } - - return uniforms[p_param].texture_order >= 0; -} - bool SceneShaderData::is_animated() const { return (uses_fragment_time && uses_discard) || (uses_vertex_time && uses_vertex); } @@ -3563,15 +3401,6 @@ bool SceneShaderData::casts_shadows() const { return !has_alpha || (uses_depth_pre_pass && !(depth_draw == DEPTH_DRAW_DISABLED || depth_test == DEPTH_TEST_DISABLED)); } -Variant SceneShaderData::get_default_parameter(const StringName &p_parameter) const { - if (uniforms.has(p_parameter)) { - ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter]; - Vector<ShaderLanguage::ConstantNode::Value> default_value = uniform.default_value; - return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint); - } - return Variant(); -} - RS::ShaderNativeSourceCode SceneShaderData::get_native_source_code() const { return MaterialStorage::get_singleton()->shaders.scene_shader.version_get_native_source_code(version); } @@ -3624,6 +3453,9 @@ void SceneMaterialData::bind_uniforms() { Texture *texture = TextureStorage::get_singleton()->get_texture(textures[ti]); glActiveTexture(GL_TEXTURE0 + ti); glBindTexture(target_from_type[texture_uniforms[ti].type], texture->tex_id); + if (texture->render_target) { + texture->render_target->used_in_frame = true; + } // Set sampler state here as the same texture can be used in multiple places with different flags // Need to convert sampler state from ShaderLanguage::Texture* to RS::CanvasItemTexture* @@ -3636,10 +3468,6 @@ void SceneMaterialData::bind_uniforms() { /* Particles SHADER */ -void ParticlesShaderData::set_path_hint(const String &p_path) { - path = p_path; -} - void ParticlesShaderData::set_code(const String &p_code) { //compile @@ -3696,83 +3524,6 @@ void ParticlesShaderData::set_code(const String &p_code) { valid = true; } -void ParticlesShaderData::set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) { - if (!p_texture.is_valid()) { - if (default_texture_params.has(p_name) && default_texture_params[p_name].has(p_index)) { - default_texture_params[p_name].erase(p_index); - - if (default_texture_params[p_name].is_empty()) { - default_texture_params.erase(p_name); - } - } - } else { - if (!default_texture_params.has(p_name)) { - default_texture_params[p_name] = HashMap<int, RID>(); - } - default_texture_params[p_name][p_index] = p_texture; - } -} - -void ParticlesShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { - HashMap<int, StringName> order; - - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_GLOBAL || E.value.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - if (E.value.texture_order >= 0) { - order[E.value.texture_order + 100000] = E.key; - } else { - order[E.value.order] = E.key; - } - } - - String last_group; - for (const KeyValue<int, StringName> &E : order) { - String group = uniforms[E.value].group; - if (!uniforms[E.value].subgroup.is_empty()) { - group += "::" + uniforms[E.value].subgroup; - } - - if (group != last_group) { - PropertyInfo pi; - pi.usage = PROPERTY_USAGE_GROUP; - pi.name = group; - p_param_list->push_back(pi); - - last_group = group; - } - - PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniforms[E.value]); - pi.name = E.value; - p_param_list->push_back(pi); - } -} - -void ParticlesShaderData::get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const { - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - RendererMaterialStorage::InstanceShaderParam p; - p.info = ShaderLanguage::uniform_to_property_info(E.value); - p.info.name = E.key; //supply name - p.index = E.value.instance_index; - p.default_value = ShaderLanguage::constant_value_to_variant(E.value.default_value, E.value.type, E.value.array_size, E.value.hint); - p_param_list->push_back(p); - } -} - -bool ParticlesShaderData::is_parameter_texture(const StringName &p_param) const { - if (!uniforms.has(p_param)) { - return false; - } - - return uniforms[p_param].texture_order >= 0; -} - bool ParticlesShaderData::is_animated() const { return false; } @@ -3781,15 +3532,6 @@ bool ParticlesShaderData::casts_shadows() const { return false; } -Variant ParticlesShaderData::get_default_parameter(const StringName &p_parameter) const { - if (uniforms.has(p_parameter)) { - ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter]; - Vector<ShaderLanguage::ConstantNode::Value> default_value = uniform.default_value; - return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint); - } - return Variant(); -} - RS::ShaderNativeSourceCode ParticlesShaderData::get_native_source_code() const { return MaterialStorage::get_singleton()->shaders.particles_process_shader.version_get_native_source_code(version); } @@ -3827,8 +3569,11 @@ void ParticleProcessMaterialData::bind_uniforms() { ShaderCompiler::GeneratedCode::Texture *texture_uniforms = shader_data->texture_uniforms.ptrw(); for (int ti = 0; ti < texture_cache.size(); ti++) { Texture *texture = TextureStorage::get_singleton()->get_texture(textures[ti]); - glActiveTexture(GL_TEXTURE1 + ti); // Start at GL_TEXTURE1 becuase texture slot 0 is reserved for the heightmap texture. + glActiveTexture(GL_TEXTURE1 + ti); // Start at GL_TEXTURE1 because texture slot 0 is reserved for the heightmap texture. glBindTexture(target_from_type[texture_uniforms[ti].type], texture->tex_id); + if (texture->render_target) { + texture->render_target->used_in_frame = true; + } // Set sampler state here as the same texture can be used in multiple places with different flags // Need to convert sampler state from ShaderLanguage::Texture* to RS::CanvasItemTexture* diff --git a/drivers/gles3/storage/material_storage.h b/drivers/gles3/storage/material_storage.h index 8ae5e5eb9c..9965d23070 100644 --- a/drivers/gles3/storage/material_storage.h +++ b/drivers/gles3/storage/material_storage.h @@ -53,16 +53,20 @@ namespace GLES3 { /* Shader Structs */ struct ShaderData { - virtual void set_code(const String &p_Code) = 0; - virtual void set_path_hint(const String &p_hint) = 0; - virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) = 0; - virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const = 0; + String path; + HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms; + HashMap<StringName, HashMap<int, RID>> default_texture_params; - virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const = 0; - virtual bool is_parameter_texture(const StringName &p_param) const = 0; + virtual void set_path_hint(const String &p_hint); + virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index); + virtual Variant get_default_parameter(const StringName &p_parameter) const; + virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; + virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; + virtual bool is_parameter_texture(const StringName &p_param) const; + + virtual void set_code(const String &p_Code) = 0; virtual bool is_animated() const = 0; virtual bool casts_shadows() const = 0; - virtual Variant get_default_parameter(const StringName &p_parameter) const = 0; virtual RS::ShaderNativeSourceCode get_native_source_code() const { return RS::ShaderNativeSourceCode(); } virtual ~ShaderData() {} @@ -149,17 +153,14 @@ struct CanvasShaderData : public ShaderData { bool valid; RID version; - String path; BlendMode blend_mode = BLEND_MODE_MIX; - HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms; Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms; Vector<uint32_t> ubo_offsets; uint32_t ubo_size; String code; - HashMap<StringName, HashMap<int, RID>> default_texture_params; bool uses_screen_texture = false; bool uses_screen_texture_mipmaps = false; @@ -167,15 +168,8 @@ struct CanvasShaderData : public ShaderData { bool uses_time = false; virtual void set_code(const String &p_Code); - virtual void set_path_hint(const String &p_hint); - virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index); - virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; - virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; - - virtual bool is_parameter_texture(const StringName &p_param) const; virtual bool is_animated() const; virtual bool casts_shadows() const; - virtual Variant get_default_parameter(const StringName &p_parameter) const; virtual RS::ShaderNativeSourceCode get_native_source_code() const; CanvasShaderData(); @@ -202,15 +196,12 @@ struct SkyShaderData : public ShaderData { bool valid; RID version; - HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms; Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms; Vector<uint32_t> ubo_offsets; uint32_t ubo_size; - String path; String code; - HashMap<StringName, HashMap<int, RID>> default_texture_params; bool uses_time; bool uses_position; @@ -219,14 +210,8 @@ struct SkyShaderData : public ShaderData { bool uses_light; virtual void set_code(const String &p_Code); - virtual void set_path_hint(const String &p_hint); - virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index); - virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; - virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; - virtual bool is_parameter_texture(const StringName &p_param) const; virtual bool is_animated() const; virtual bool casts_shadows() const; - virtual Variant get_default_parameter(const StringName &p_parameter) const; virtual RS::ShaderNativeSourceCode get_native_source_code() const; SkyShaderData(); virtual ~SkyShaderData(); @@ -284,16 +269,12 @@ struct SceneShaderData : public ShaderData { bool valid; RID version; - String path; - - HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms; Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms; Vector<uint32_t> ubo_offsets; uint32_t ubo_size; String code; - HashMap<StringName, HashMap<int, RID>> default_texture_params; BlendMode blend_mode; AlphaAntiAliasing alpha_antialiasing_mode; @@ -343,15 +324,8 @@ struct SceneShaderData : public ShaderData { uint32_t index = 0; virtual void set_code(const String &p_Code); - virtual void set_path_hint(const String &p_hint); - virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index); - virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; - virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; - - virtual bool is_parameter_texture(const StringName &p_param) const; virtual bool is_animated() const; virtual bool casts_shadows() const; - virtual Variant get_default_parameter(const StringName &p_parameter) const; virtual RS::ShaderNativeSourceCode get_native_source_code() const; SceneShaderData(); @@ -386,15 +360,12 @@ struct ParticlesShaderData : public ShaderData { RID version; bool uses_collision = false; - HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms; Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms; Vector<uint32_t> ubo_offsets; uint32_t ubo_size = 0; - String path; String code; - HashMap<StringName, HashMap<int, RID>> default_texture_params; bool uses_time = false; @@ -402,14 +373,8 @@ struct ParticlesShaderData : public ShaderData { uint32_t userdata_count = 0; virtual void set_code(const String &p_Code); - virtual void set_path_hint(const String &p_hint); - virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index); - virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; - virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; - virtual bool is_parameter_texture(const StringName &p_param) const; virtual bool is_animated() const; virtual bool casts_shadows() const; - virtual Variant get_default_parameter(const StringName &p_parameter) const; virtual RS::ShaderNativeSourceCode get_native_source_code() const; ParticlesShaderData() {} diff --git a/drivers/gles3/storage/mesh_storage.cpp b/drivers/gles3/storage/mesh_storage.cpp index 5bbbc7b91b..d31ac4d413 100644 --- a/drivers/gles3/storage/mesh_storage.cpp +++ b/drivers/gles3/storage/mesh_storage.cpp @@ -323,27 +323,8 @@ void MeshStorage::mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface) } if (mesh->surface_count == 0) { - mesh->bone_aabbs = p_surface.bone_aabbs; mesh->aabb = p_surface.aabb; } else { - if (mesh->bone_aabbs.size() < p_surface.bone_aabbs.size()) { - // ArrayMesh::_surface_set_data only allocates bone_aabbs up to max_bone - // Each surface may affect different numbers of bones. - mesh->bone_aabbs.resize(p_surface.bone_aabbs.size()); - } - for (int i = 0; i < p_surface.bone_aabbs.size(); i++) { - const AABB &bone = p_surface.bone_aabbs[i]; - if (bone.has_volume()) { - AABB &mesh_bone = mesh->bone_aabbs.write[i]; - if (mesh_bone != AABB()) { - // Already initialized, merge AABBs. - mesh_bone.merge_with(bone); - } else { - // Not yet initialized, copy the bone AABB. - mesh_bone = bone; - } - } - } mesh->aabb.merge_with(p_surface.aabb); } @@ -528,7 +509,7 @@ AABB MeshStorage::mesh_get_aabb(RID p_mesh, RID p_skeleton) { Skeleton *skeleton = skeleton_owner.get_or_null(p_skeleton); - if (!skeleton || skeleton->size == 0) { + if (!skeleton || skeleton->size == 0 || mesh->skeleton_aabb_version == skeleton->version) { return mesh->aabb; } @@ -622,6 +603,8 @@ AABB MeshStorage::mesh_get_aabb(RID p_mesh, RID p_skeleton) { } } + mesh->aabb = aabb; + mesh->skeleton_aabb_version = skeleton->version; return aabb; } diff --git a/drivers/gles3/storage/mesh_storage.h b/drivers/gles3/storage/mesh_storage.h index 0f30814928..cbbba0d03e 100644 --- a/drivers/gles3/storage/mesh_storage.h +++ b/drivers/gles3/storage/mesh_storage.h @@ -120,12 +120,11 @@ struct Mesh { Surface **surfaces = nullptr; uint32_t surface_count = 0; - Vector<AABB> bone_aabbs; - bool has_bone_weights = false; AABB aabb; AABB custom_aabb; + uint64_t skeleton_aabb_version = 0; Vector<RID> material_cache; diff --git a/drivers/gles3/storage/particles_storage.cpp b/drivers/gles3/storage/particles_storage.cpp index 1a0d97df01..e158a3e90c 100644 --- a/drivers/gles3/storage/particles_storage.cpp +++ b/drivers/gles3/storage/particles_storage.cpp @@ -53,7 +53,7 @@ ParticlesStorage::ParticlesStorage() { { String global_defines; global_defines += "#define MAX_GLOBAL_SHADER_UNIFORMS 256\n"; // TODO: this is arbitrary for now - material_storage->shaders.particles_process_shader.initialize(global_defines); + material_storage->shaders.particles_process_shader.initialize(global_defines, 1); } { // default material and shader for particles shader @@ -528,6 +528,15 @@ void ParticlesStorage::_particles_process(Particles *p_particles, double p_delta //2D collision Transform2D xform = p_particles->sdf_collision_transform; //will use dotproduct manually so invert beforehand + + if (!p_particles->use_local_coords) { + Transform2D emission; + emission.columns[0] = Vector2(p_particles->emission_transform.basis.get_column(0).x, p_particles->emission_transform.basis.get_column(0).y); + emission.columns[1] = Vector2(p_particles->emission_transform.basis.get_column(1).x, p_particles->emission_transform.basis.get_column(1).y); + emission.set_origin(Vector2(p_particles->emission_transform.origin.x, p_particles->emission_transform.origin.y)); + xform = xform * emission.affine_inverse(); + } + Transform2D revert = xform.affine_inverse(); frame_params.collider_count = 1; frame_params.colliders[0].transform[0] = xform.columns[0][0]; diff --git a/drivers/gles3/storage/texture_storage.cpp b/drivers/gles3/storage/texture_storage.cpp index 99908d197a..e6aa6a39c1 100644 --- a/drivers/gles3/storage/texture_storage.cpp +++ b/drivers/gles3/storage/texture_storage.cpp @@ -1606,9 +1606,9 @@ void TextureStorage::_update_render_target(RenderTarget *rt) { return; } - if (rt->overridden.color.is_valid()) { - texture->is_render_target = true; - } else { + texture->is_render_target = true; + texture->render_target = rt; + if (rt->overridden.color.is_null()) { texture->format = rt->image_format; texture->real_format = rt->image_format; texture->target = texture_target; @@ -1717,9 +1717,12 @@ void TextureStorage::_clear_render_target(RenderTarget *rt) { tex->width = 0; tex->height = 0; tex->active = false; + tex->render_target = nullptr; + tex->is_render_target = false; } } else { Texture *tex = get_texture(rt->overridden.color); + tex->render_target = nullptr; tex->is_render_target = false; } @@ -1751,7 +1754,7 @@ void TextureStorage::_clear_render_target(RenderTarget *rt) { RID TextureStorage::render_target_create() { RenderTarget render_target; - //render_target.was_used = false; + render_target.used_in_frame = false; render_target.clear_requested = false; Texture t; diff --git a/drivers/gles3/storage/utilities.cpp b/drivers/gles3/storage/utilities.cpp index fe900c7cfb..02a110e3e5 100644 --- a/drivers/gles3/storage/utilities.cpp +++ b/drivers/gles3/storage/utilities.cpp @@ -156,6 +156,9 @@ bool Utilities::free(RID p_rid) { } else if (GLES3::ParticlesStorage::get_singleton()->owns_particles_collision_instance(p_rid)) { GLES3::ParticlesStorage::get_singleton()->particles_collision_instance_free(p_rid); return true; + } else if (GLES3::MeshStorage::get_singleton()->owns_skeleton(p_rid)) { + GLES3::MeshStorage::get_singleton()->skeleton_free(p_rid); + return true; } else { return false; } diff --git a/drivers/register_driver_types.cpp b/drivers/register_driver_types.cpp index 53a7f7aa4f..8362abefc9 100644 --- a/drivers/register_driver_types.cpp +++ b/drivers/register_driver_types.cpp @@ -30,7 +30,7 @@ #include "register_driver_types.h" -#include "core/extension/native_extension_manager.h" +#include "core/extension/gdextension_manager.h" #include "drivers/png/image_loader_png.h" #include "drivers/png/resource_saver_png.h" diff --git a/drivers/unix/os_unix.cpp b/drivers/unix/os_unix.cpp index b02a100784..711fd7b962 100644 --- a/drivers/unix/os_unix.cpp +++ b/drivers/unix/os_unix.cpp @@ -152,12 +152,10 @@ Vector<String> OS_Unix::get_video_adapter_driver_info() const { String OS_Unix::get_stdin_string(bool p_block) { if (p_block) { char buff[1024]; - String ret = stdin_buf + fgets(buff, 1024, stdin); - stdin_buf = ""; - return ret; + return String::utf8(fgets(buff, 1024, stdin)); } - return ""; + return String(); } Error OS_Unix::get_entropy(uint8_t *r_buffer, int p_bytes) { diff --git a/drivers/unix/os_unix.h b/drivers/unix/os_unix.h index ce06a52a95..68d2dd0042 100644 --- a/drivers/unix/os_unix.h +++ b/drivers/unix/os_unix.h @@ -46,8 +46,6 @@ protected: virtual void finalize_core() override; - String stdin_buf; - public: OS_Unix(); diff --git a/drivers/vulkan/rendering_device_vulkan.cpp b/drivers/vulkan/rendering_device_vulkan.cpp index 7f5bac30f1..b982ab3e40 100644 --- a/drivers/vulkan/rendering_device_vulkan.cpp +++ b/drivers/vulkan/rendering_device_vulkan.cpp @@ -40,7 +40,6 @@ #include "drivers/vulkan/vulkan_context.h" #include "thirdparty/misc/smolv.h" -#include "thirdparty/spirv-reflect/spirv_reflect.h" //#define FORCE_FULL_BARRIER @@ -996,8 +995,11 @@ void RenderingDeviceVulkan::get_compressed_image_format_block_dimensions(DataFor case DATA_FORMAT_EAC_R11G11_UNORM_BLOCK: case DATA_FORMAT_EAC_R11G11_SNORM_BLOCK: case DATA_FORMAT_ASTC_4x4_UNORM_BLOCK: // Again, not sure about astc. - case DATA_FORMAT_ASTC_4x4_SRGB_BLOCK: - case DATA_FORMAT_ASTC_5x4_UNORM_BLOCK: + case DATA_FORMAT_ASTC_4x4_SRGB_BLOCK: { + r_w = 4; + r_h = 4; + } break; + case DATA_FORMAT_ASTC_5x4_UNORM_BLOCK: // Unsupported case DATA_FORMAT_ASTC_5x4_SRGB_BLOCK: case DATA_FORMAT_ASTC_5x5_UNORM_BLOCK: case DATA_FORMAT_ASTC_5x5_SRGB_BLOCK: @@ -1008,10 +1010,16 @@ void RenderingDeviceVulkan::get_compressed_image_format_block_dimensions(DataFor case DATA_FORMAT_ASTC_8x5_UNORM_BLOCK: case DATA_FORMAT_ASTC_8x5_SRGB_BLOCK: case DATA_FORMAT_ASTC_8x6_UNORM_BLOCK: - case DATA_FORMAT_ASTC_8x6_SRGB_BLOCK: + case DATA_FORMAT_ASTC_8x6_SRGB_BLOCK: { + r_w = 4; + r_h = 4; + } break; case DATA_FORMAT_ASTC_8x8_UNORM_BLOCK: - case DATA_FORMAT_ASTC_8x8_SRGB_BLOCK: - case DATA_FORMAT_ASTC_10x5_UNORM_BLOCK: + case DATA_FORMAT_ASTC_8x8_SRGB_BLOCK: { + r_w = 8; + r_h = 8; + } break; + case DATA_FORMAT_ASTC_10x5_UNORM_BLOCK: // Unsupported case DATA_FORMAT_ASTC_10x5_SRGB_BLOCK: case DATA_FORMAT_ASTC_10x6_UNORM_BLOCK: case DATA_FORMAT_ASTC_10x6_SRGB_BLOCK: @@ -1101,7 +1109,7 @@ uint32_t RenderingDeviceVulkan::get_compressed_image_format_block_byte_size(Data case DATA_FORMAT_ASTC_12x10_SRGB_BLOCK: case DATA_FORMAT_ASTC_12x12_UNORM_BLOCK: case DATA_FORMAT_ASTC_12x12_SRGB_BLOCK: - return 8; // Wrong. + return 16; default: { } } @@ -1123,6 +1131,10 @@ uint32_t RenderingDeviceVulkan::get_compressed_image_format_pixel_rshift(DataFor case DATA_FORMAT_EAC_R11_UNORM_BLOCK: case DATA_FORMAT_EAC_R11_SNORM_BLOCK: return 1; + case DATA_FORMAT_ASTC_8x8_SRGB_BLOCK: + case DATA_FORMAT_ASTC_8x8_UNORM_BLOCK: { + return 2; + } default: { } } @@ -1579,12 +1591,12 @@ Error RenderingDeviceVulkan::_buffer_update(Buffer *p_buffer, size_t p_offset, c return OK; } -void RenderingDeviceVulkan::_memory_barrier(VkPipelineStageFlags p_src_stage_mask, VkPipelineStageFlags p_dst_stage_mask, VkAccessFlags p_src_access, VkAccessFlags p_dst_sccess, bool p_sync_with_draw) { +void RenderingDeviceVulkan::_memory_barrier(VkPipelineStageFlags p_src_stage_mask, VkPipelineStageFlags p_dst_stage_mask, VkAccessFlags p_src_access, VkAccessFlags p_dst_access, bool p_sync_with_draw) { VkMemoryBarrier mem_barrier; mem_barrier.sType = VK_STRUCTURE_TYPE_MEMORY_BARRIER; mem_barrier.pNext = nullptr; mem_barrier.srcAccessMask = p_src_access; - mem_barrier.dstAccessMask = p_dst_sccess; + mem_barrier.dstAccessMask = p_dst_access; if (p_src_stage_mask == 0 || p_dst_stage_mask == 0) { return; // No barrier, since this is invalid. @@ -1628,14 +1640,14 @@ void RenderingDeviceVulkan::_full_barrier(bool p_sync_with_draw) { p_sync_with_draw); } -void RenderingDeviceVulkan::_buffer_memory_barrier(VkBuffer buffer, uint64_t p_from, uint64_t p_size, VkPipelineStageFlags p_src_stage_mask, VkPipelineStageFlags p_dst_stage_mask, VkAccessFlags p_src_access, VkAccessFlags p_dst_sccess, bool p_sync_with_draw) { +void RenderingDeviceVulkan::_buffer_memory_barrier(VkBuffer buffer, uint64_t p_from, uint64_t p_size, VkPipelineStageFlags p_src_stage_mask, VkPipelineStageFlags p_dst_stage_mask, VkAccessFlags p_src_access, VkAccessFlags p_dst_access, bool p_sync_with_draw) { VkBufferMemoryBarrier buffer_mem_barrier; buffer_mem_barrier.sType = VK_STRUCTURE_TYPE_BUFFER_MEMORY_BARRIER; buffer_mem_barrier.pNext = nullptr; buffer_mem_barrier.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; buffer_mem_barrier.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; buffer_mem_barrier.srcAccessMask = p_src_access; - buffer_mem_barrier.dstAccessMask = p_dst_sccess; + buffer_mem_barrier.dstAccessMask = p_dst_access; buffer_mem_barrier.buffer = buffer; buffer_mem_barrier.offset = p_from; buffer_mem_barrier.size = p_size; @@ -4524,14 +4536,6 @@ RID RenderingDeviceVulkan::index_array_create(RID p_index_buffer, uint32_t p_ind /**** SHADER ****/ /****************/ -static const char *shader_stage_names[RenderingDevice::SHADER_STAGE_MAX] = { - "Vertex", - "Fragment", - "TesselationControl", - "TesselationEvaluation", - "Compute" -}; - static const char *shader_uniform_names[RenderingDevice::UNIFORM_TYPE_MAX] = { "Sampler", "CombinedSampler", "Texture", "Image", "TextureBuffer", "SamplerTextureBuffer", "ImageBuffer", "UniformBuffer", "StorageBuffer", "InputAttachment" }; @@ -4562,198 +4566,6 @@ String RenderingDeviceVulkan::_shader_uniform_debug(RID p_shader, int p_set) { } return ret; } -#if 0 -bool RenderingDeviceVulkan::_uniform_add_binding(Vector<Vector<VkDescriptorSetLayoutBinding> > &bindings, Vector<Vector<UniformInfo> > &uniform_infos, const glslang::TObjectReflection &reflection, RenderingDevice::ShaderStage p_stage, Shader::PushConstant &push_constant, String *r_error) { - VkDescriptorSetLayoutBinding layout_binding; - UniformInfo info; - - switch (reflection.getType()->getBasicType()) { - case glslang::EbtSampler: { - //print_line("DEBUG: IsSampler"); - if (reflection.getType()->getSampler().dim == glslang::EsdBuffer) { - // Texture buffers. - if (reflection.getType()->getSampler().isCombined()) { - layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER; - info.type = UNIFORM_TYPE_SAMPLER_WITH_TEXTURE_BUFFER; - //print_line("DEBUG: SAMPLER: texel combined"); - } else if (reflection.getType()->getSampler().isTexture()) { - layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER; - info.type = UNIFORM_TYPE_TEXTURE_BUFFER; - //print_line("DEBUG: SAMPLER: texel alone"); - } else if (reflection.getType()->getSampler().isImage()) { - layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER; - info.type = UNIFORM_TYPE_IMAGE_BUFFER; - //print_line("DEBUG: SAMPLER: texel buffer"); - } else { - if (r_error) { - *r_error = "On shader stage '" + String(shader_stage_names[p_stage]) + "', uniform '" + reflection.name + "' is of unsupported buffer type."; - } - return false; - } - } else if (reflection.getType()->getSampler().isCombined()) { - layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER; - info.type = UNIFORM_TYPE_SAMPLER_WITH_TEXTURE; - //print_line("DEBUG: SAMPLER: combined"); - } else if (reflection.getType()->getSampler().isPureSampler()) { - layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLER; - info.type = UNIFORM_TYPE_SAMPLER; - //print_line("DEBUG: SAMPLER: sampler"); - } else if (reflection.getType()->getSampler().isTexture()) { - layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_SAMPLED_IMAGE; - info.type = UNIFORM_TYPE_TEXTURE; - //print_line("DEBUG: SAMPLER: image"); - } else if (reflection.getType()->getSampler().isImage()) { - layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_IMAGE; - info.type = UNIFORM_TYPE_IMAGE; - //print_line("DEBUG: SAMPLER: storage image"); - } else { - //print_line("DEBUG: sampler unknown"); - if (r_error) { - *r_error = "On shader stage '" + String(shader_stage_names[p_stage]) + "', uniform '" + reflection.name + "' is of unsupported sampler type."; - } - return false; - } - - if (reflection.getType()->isArray()) { - layout_binding.descriptorCount = reflection.getType()->getArraySizes()->getCumulativeSize(); - //print_line("DEBUG: array of size: " + itos(layout_binding.descriptorCount)); - } else { - layout_binding.descriptorCount = 1; - } - - info.length = layout_binding.descriptorCount; - - } break; - /*case glslang::EbtStruct: { - print_line("DEBUG: Struct"); - - } break;*/ - case glslang::EbtBlock: { - //print_line("DEBUG: Block"); - if (reflection.getType()->getQualifier().storage == glslang::EvqUniform) { - if (reflection.getType()->getQualifier().layoutPushConstant) { - uint32_t len = reflection.size; - if (push_constant.push_constant_size != 0 && push_constant.push_constant_size != len) { - *r_error = "On shader stage '" + String(shader_stage_names[p_stage]) + "', uniform '" + reflection.name + "' push constants for different stages should all be the same size."; - return false; - } - push_constant.push_constant_size = len; - push_constant.push_constants_vk_stage |= shader_stage_masks[p_stage]; - return true; - } - //print_line("DEBUG: Uniform buffer"); - layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_UNIFORM_BUFFER; - info.type = UNIFORM_TYPE_UNIFORM_BUFFER; - } else if (reflection.getType()->getQualifier().storage == glslang::EvqBuffer) { - layout_binding.descriptorType = VK_DESCRIPTOR_TYPE_STORAGE_BUFFER; - info.type = UNIFORM_TYPE_STORAGE_BUFFER; - //print_line("DEBUG: Storage buffer"); - } else { - if (r_error) { - *r_error = "On shader stage '" + String(shader_stage_names[p_stage]) + "', uniform '" + reflection.name + "' is of unsupported block type: (" + itos(reflection.getType()->getQualifier().storage) + ")."; - } - return false; - } - - if (reflection.getType()->isArray()) { - layout_binding.descriptorCount = reflection.getType()->getArraySizes()->getCumulativeSize(); - //print_line("DEBUG: array of size: " + itos(layout_binding.descriptorCount)); - } else { - layout_binding.descriptorCount = 1; - } - - info.length = reflection.size; - - } break; - /*case glslang::EbtReference: { - } break;*/ - /*case glslang::EbtAtomicUint: { - } break;*/ - default: { - if (reflection.getType()->getQualifier().hasOffset() || reflection.name.find(".") != std::string::npos) { - // Member of uniform block? - return true; - } - - if (r_error) { - *r_error = "On shader stage '" + String(shader_stage_names[p_stage]) + "', uniform '" + reflection.name + "' unsupported uniform type."; - } - return false; - } - } - - if (!reflection.getType()->getQualifier().hasBinding()) { - if (r_error) { - *r_error = "On shader stage '" + String(shader_stage_names[p_stage]) + "', uniform '" + reflection.name + "' lacks a binding number."; - } - return false; - } - - uint32_t set = reflection.getType()->getQualifier().hasSet() ? reflection.getType()->getQualifier().layoutSet : 0; - - if (set >= MAX_UNIFORM_SETS) { - if (r_error) { - *r_error = "On shader stage '" + String(shader_stage_names[p_stage]) + "', uniform '" + reflection.name + "' uses a set (" + itos(set) + ") index larger than what is supported (" + itos(MAX_UNIFORM_SETS) + ")."; - } - return false; - } - - if (set >= limits.maxBoundDescriptorSets) { - if (r_error) { - *r_error = "On shader stage '" + String(shader_stage_names[p_stage]) + "', uniform '" + reflection.name + "' uses a set (" + itos(set) + ") index larger than what is supported by the hardware (" + itos(limits.maxBoundDescriptorSets) + ")."; - } - return false; - } - - uint32_t binding = reflection.getType()->getQualifier().layoutBinding; - - if (set < (uint32_t)bindings.size()) { - // Check if this already exists. - for (int i = 0; i < bindings[set].size(); i++) { - if (bindings[set][i].binding == binding) { - // Already exists, verify that it's the same type. - if (bindings[set][i].descriptorType != layout_binding.descriptorType) { - if (r_error) { - *r_error = "On shader stage '" + String(shader_stage_names[p_stage]) + "', uniform '" + reflection.name + "' trying to re-use location for set=" + itos(set) + ", binding=" + itos(binding) + " with different uniform type."; - } - return false; - } - - // Also, verify that it's the same size. - if (bindings[set][i].descriptorCount != layout_binding.descriptorCount || uniform_infos[set][i].length != info.length) { - if (r_error) { - *r_error = "On shader stage '" + String(shader_stage_names[p_stage]) + "', uniform '" + reflection.name + "' trying to re-use location for set=" + itos(set) + ", binding=" + itos(binding) + " with different uniform size."; - } - return false; - } - - // Just append stage mask and return. - bindings.write[set].write[i].stageFlags |= shader_stage_masks[p_stage]; - uniform_infos.write[set].write[i].stages |= 1 << p_stage; - return true; - } - } - } - layout_binding.binding = binding; - layout_binding.stageFlags = shader_stage_masks[p_stage]; - layout_binding.pImmutableSamplers = nullptr; // No support for this yet. - - info.stages = 1 << p_stage; - info.binding = binding; - - if (set >= (uint32_t)bindings.size()) { - bindings.resize(set + 1); - uniform_infos.resize(set + 1); - } -#if 0 - print_line("stage: " + String(shader_stage_names[p_stage]) + " set: " + itos(set) + " binding: " + itos(info.binding) + " type:" + shader_uniform_names[info.type] + " length: " + itos(info.length)); -#endif - bindings.write[set].push_back(layout_binding); - uniform_infos.write[set].push_back(info); - - return true; -} -#endif // Version 1: initial. // Version 2: Added shader name. @@ -4786,346 +4598,68 @@ struct RenderingDeviceVulkanShaderBinarySpecializationConstant { struct RenderingDeviceVulkanShaderBinaryData { uint32_t vertex_input_mask; - uint32_t fragment_outputs; - uint32_t specialization_constant_count; + uint32_t fragment_output_mask; + uint32_t specialization_constants_count; uint32_t is_compute; uint32_t compute_local_size[3]; uint32_t set_count; uint32_t push_constant_size; - uint32_t push_constants_vk_stage; + uint32_t push_constant_vk_stages_mask; uint32_t stage_count; uint32_t shader_name_len; }; Vector<uint8_t> RenderingDeviceVulkan::shader_compile_binary_from_spirv(const Vector<ShaderStageSPIRVData> &p_spirv, const String &p_shader_name) { - RenderingDeviceVulkanShaderBinaryData binary_data; - binary_data.vertex_input_mask = 0; - binary_data.fragment_outputs = 0; - binary_data.specialization_constant_count = 0; - binary_data.is_compute = 0; - binary_data.compute_local_size[0] = 0; - binary_data.compute_local_size[1] = 0; - binary_data.compute_local_size[2] = 0; - binary_data.set_count = 0; - binary_data.push_constant_size = 0; - binary_data.push_constants_vk_stage = 0; + SpirvReflectionData spirv_data; + if (_reflect_spirv(p_spirv, spirv_data) != OK) { + return Vector<uint8_t>(); + } + ERR_FAIL_COND_V_MSG((uint32_t)spirv_data.uniforms.size() > limits.maxBoundDescriptorSets, Vector<uint8_t>(), + "Number of uniform sets is larger than what is supported by the hardware (" + itos(limits.maxBoundDescriptorSets) + ")."); + + // Collect reflection data into binary data. + RenderingDeviceVulkanShaderBinaryData binary_data; Vector<Vector<RenderingDeviceVulkanShaderBinaryDataBinding>> uniform_info; // Set bindings. Vector<RenderingDeviceVulkanShaderBinarySpecializationConstant> specialization_constants; - - uint32_t stages_processed = 0; - - for (int i = 0; i < p_spirv.size(); i++) { - if (p_spirv[i].shader_stage == SHADER_STAGE_COMPUTE) { - binary_data.is_compute = true; - ERR_FAIL_COND_V_MSG(p_spirv.size() != 1, Vector<uint8_t>(), - "Compute shaders can only receive one stage, dedicated to compute."); - } - ERR_FAIL_COND_V_MSG(stages_processed & (1 << p_spirv[i].shader_stage), Vector<uint8_t>(), - "Stage " + String(shader_stage_names[p_spirv[i].shader_stage]) + " submitted more than once."); - - { - SpvReflectShaderModule module; - const uint8_t *spirv = p_spirv[i].spir_v.ptr(); - SpvReflectResult result = spvReflectCreateShaderModule(p_spirv[i].spir_v.size(), spirv, &module); - ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, Vector<uint8_t>(), - "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed parsing shader."); - - if (binary_data.is_compute) { - binary_data.compute_local_size[0] = module.entry_points->local_size.x; - binary_data.compute_local_size[1] = module.entry_points->local_size.y; - binary_data.compute_local_size[2] = module.entry_points->local_size.z; - } - uint32_t binding_count = 0; - result = spvReflectEnumerateDescriptorBindings(&module, &binding_count, nullptr); - ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, Vector<uint8_t>(), - "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed enumerating descriptor bindings."); - - uint32_t stage = p_spirv[i].shader_stage; - - if (binding_count > 0) { - // Parse bindings. - - Vector<SpvReflectDescriptorBinding *> bindings; - bindings.resize(binding_count); - result = spvReflectEnumerateDescriptorBindings(&module, &binding_count, bindings.ptrw()); - - ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, Vector<uint8_t>(), - "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed getting descriptor bindings."); - - for (uint32_t j = 0; j < binding_count; j++) { - const SpvReflectDescriptorBinding &binding = *bindings[j]; - - RenderingDeviceVulkanShaderBinaryDataBinding info{}; - - bool need_array_dimensions = false; - bool need_block_size = false; - bool may_be_writable = false; - - switch (binding.descriptor_type) { - case SPV_REFLECT_DESCRIPTOR_TYPE_SAMPLER: { - info.type = UNIFORM_TYPE_SAMPLER; - need_array_dimensions = true; - } break; - case SPV_REFLECT_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: { - info.type = UNIFORM_TYPE_SAMPLER_WITH_TEXTURE; - need_array_dimensions = true; - } break; - case SPV_REFLECT_DESCRIPTOR_TYPE_SAMPLED_IMAGE: { - info.type = UNIFORM_TYPE_TEXTURE; - need_array_dimensions = true; - } break; - case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_IMAGE: { - info.type = UNIFORM_TYPE_IMAGE; - need_array_dimensions = true; - may_be_writable = true; - } break; - case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: { - info.type = UNIFORM_TYPE_TEXTURE_BUFFER; - need_array_dimensions = true; - } break; - case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: { - info.type = UNIFORM_TYPE_IMAGE_BUFFER; - need_array_dimensions = true; - may_be_writable = true; - } break; - case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_BUFFER: { - info.type = UNIFORM_TYPE_UNIFORM_BUFFER; - need_block_size = true; - } break; - case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER: { - info.type = UNIFORM_TYPE_STORAGE_BUFFER; - need_block_size = true; - may_be_writable = true; - } break; - case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: { - ERR_PRINT("Dynamic uniform buffer not supported."); - continue; - } break; - case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: { - ERR_PRINT("Dynamic storage buffer not supported."); - continue; - } break; - case SPV_REFLECT_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: { - info.type = UNIFORM_TYPE_INPUT_ATTACHMENT; - need_array_dimensions = true; - } break; - case SPV_REFLECT_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: { - ERR_PRINT("Acceleration structure not supported."); - continue; - } break; - } - - if (need_array_dimensions) { - if (binding.array.dims_count == 0) { - info.length = 1; - } else { - for (uint32_t k = 0; k < binding.array.dims_count; k++) { - if (k == 0) { - info.length = binding.array.dims[0]; - } else { - info.length *= binding.array.dims[k]; - } - } - } - - } else if (need_block_size) { - info.length = binding.block.size; - } else { - info.length = 0; - } - - if (may_be_writable) { - info.writable = !(binding.type_description->decoration_flags & SPV_REFLECT_DECORATION_NON_WRITABLE) && !(binding.block.decoration_flags & SPV_REFLECT_DECORATION_NON_WRITABLE); - } else { - info.writable = false; - } - - info.binding = binding.binding; - uint32_t set = binding.set; - - ERR_FAIL_COND_V_MSG(set >= MAX_UNIFORM_SETS, Vector<uint8_t>(), - "On shader stage '" + String(shader_stage_names[stage]) + "', uniform '" + binding.name + "' uses a set (" + itos(set) + ") index larger than what is supported (" + itos(MAX_UNIFORM_SETS) + ")."); - - ERR_FAIL_COND_V_MSG(set >= limits.maxBoundDescriptorSets, Vector<uint8_t>(), - "On shader stage '" + String(shader_stage_names[stage]) + "', uniform '" + binding.name + "' uses a set (" + itos(set) + ") index larger than what is supported by the hardware (" + itos(limits.maxBoundDescriptorSets) + ")."); - - if (set < (uint32_t)uniform_info.size()) { - // Check if this already exists. - bool exists = false; - for (int k = 0; k < uniform_info[set].size(); k++) { - if (uniform_info[set][k].binding == (uint32_t)info.binding) { - // Already exists, verify that it's the same type. - ERR_FAIL_COND_V_MSG(uniform_info[set][k].type != info.type, Vector<uint8_t>(), - "On shader stage '" + String(shader_stage_names[stage]) + "', uniform '" + binding.name + "' trying to re-use location for set=" + itos(set) + ", binding=" + itos(info.binding) + " with different uniform type."); - - // Also, verify that it's the same size. - ERR_FAIL_COND_V_MSG(uniform_info[set][k].length != info.length, Vector<uint8_t>(), - "On shader stage '" + String(shader_stage_names[stage]) + "', uniform '" + binding.name + "' trying to re-use location for set=" + itos(set) + ", binding=" + itos(info.binding) + " with different uniform size."); - - // Also, verify that it has the same writability. - ERR_FAIL_COND_V_MSG(uniform_info[set][k].writable != info.writable, Vector<uint8_t>(), - "On shader stage '" + String(shader_stage_names[stage]) + "', uniform '" + binding.name + "' trying to re-use location for set=" + itos(set) + ", binding=" + itos(info.binding) + " with different writability."); - - // Just append stage mask and return. - uniform_info.write[set].write[k].stages |= 1 << stage; - exists = true; - break; - } - } - - if (exists) { - continue; // Merged. - } - } - - info.stages = 1 << stage; - - if (set >= (uint32_t)uniform_info.size()) { - uniform_info.resize(set + 1); - } - - uniform_info.write[set].push_back(info); - } - } - - { - // Specialization constants. - - uint32_t sc_count = 0; - result = spvReflectEnumerateSpecializationConstants(&module, &sc_count, nullptr); - ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, Vector<uint8_t>(), - "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed enumerating specialization constants."); - - if (sc_count) { - Vector<SpvReflectSpecializationConstant *> spec_constants; - spec_constants.resize(sc_count); - - result = spvReflectEnumerateSpecializationConstants(&module, &sc_count, spec_constants.ptrw()); - ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, Vector<uint8_t>(), - "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed obtaining specialization constants."); - - for (uint32_t j = 0; j < sc_count; j++) { - int32_t existing = -1; - RenderingDeviceVulkanShaderBinarySpecializationConstant sconst{}; - SpvReflectSpecializationConstant *spc = spec_constants[j]; - - sconst.constant_id = spc->constant_id; - sconst.int_value = 0.0; // Clear previous value JIC. - switch (spc->constant_type) { - case SPV_REFLECT_SPECIALIZATION_CONSTANT_BOOL: { - sconst.type = PIPELINE_SPECIALIZATION_CONSTANT_TYPE_BOOL; - sconst.bool_value = spc->default_value.int_bool_value != 0; - } break; - case SPV_REFLECT_SPECIALIZATION_CONSTANT_INT: { - sconst.type = PIPELINE_SPECIALIZATION_CONSTANT_TYPE_INT; - sconst.int_value = spc->default_value.int_bool_value; - } break; - case SPV_REFLECT_SPECIALIZATION_CONSTANT_FLOAT: { - sconst.type = PIPELINE_SPECIALIZATION_CONSTANT_TYPE_FLOAT; - sconst.float_value = spc->default_value.float_value; - } break; - } - sconst.stage_flags = 1 << p_spirv[i].shader_stage; - - for (int k = 0; k < specialization_constants.size(); k++) { - if (specialization_constants[k].constant_id == sconst.constant_id) { - ERR_FAIL_COND_V_MSG(specialization_constants[k].type != sconst.type, Vector<uint8_t>(), "More than one specialization constant used for id (" + itos(sconst.constant_id) + "), but their types differ."); - ERR_FAIL_COND_V_MSG(specialization_constants[k].int_value != sconst.int_value, Vector<uint8_t>(), "More than one specialization constant used for id (" + itos(sconst.constant_id) + "), but their default values differ."); - existing = k; - break; - } - } - - if (existing > 0) { - specialization_constants.write[existing].stage_flags |= sconst.stage_flags; - } else { - specialization_constants.push_back(sconst); - } - } - } - } - - if (stage == SHADER_STAGE_VERTEX) { - uint32_t iv_count = 0; - result = spvReflectEnumerateInputVariables(&module, &iv_count, nullptr); - ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, Vector<uint8_t>(), - "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed enumerating input variables."); - - if (iv_count) { - Vector<SpvReflectInterfaceVariable *> input_vars; - input_vars.resize(iv_count); - - result = spvReflectEnumerateInputVariables(&module, &iv_count, input_vars.ptrw()); - ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, Vector<uint8_t>(), - "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed obtaining input variables."); - - for (uint32_t j = 0; j < iv_count; j++) { - if (input_vars[j] && input_vars[j]->decoration_flags == 0) { // Regular input. - binary_data.vertex_input_mask |= (1 << uint32_t(input_vars[j]->location)); - } - } - } - } - - if (stage == SHADER_STAGE_FRAGMENT) { - uint32_t ov_count = 0; - result = spvReflectEnumerateOutputVariables(&module, &ov_count, nullptr); - ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, Vector<uint8_t>(), - "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed enumerating output variables."); - - if (ov_count) { - Vector<SpvReflectInterfaceVariable *> output_vars; - output_vars.resize(ov_count); - - result = spvReflectEnumerateOutputVariables(&module, &ov_count, output_vars.ptrw()); - ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, Vector<uint8_t>(), - "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed obtaining output variables."); - - for (uint32_t j = 0; j < ov_count; j++) { - const SpvReflectInterfaceVariable *refvar = output_vars[j]; - if (refvar != nullptr && refvar->built_in != SpvBuiltInFragDepth) { - binary_data.fragment_outputs |= 1 << refvar->location; - } - } - } + { + binary_data.vertex_input_mask = spirv_data.vertex_input_mask; + binary_data.fragment_output_mask = spirv_data.fragment_output_mask; + binary_data.specialization_constants_count = spirv_data.specialization_constants.size(); + binary_data.is_compute = spirv_data.is_compute; + binary_data.compute_local_size[0] = spirv_data.compute_local_size[0]; + binary_data.compute_local_size[1] = spirv_data.compute_local_size[1]; + binary_data.compute_local_size[2] = spirv_data.compute_local_size[2]; + binary_data.set_count = spirv_data.uniforms.size(); + binary_data.push_constant_size = spirv_data.push_constant_size; + for (uint32_t i = 0; i < SHADER_STAGE_MAX; i++) { + if (spirv_data.push_constant_stages_mask.has_flag((ShaderStage)(1 << i))) { + binary_data.push_constant_vk_stages_mask |= shader_stage_masks[i]; } + } - uint32_t pc_count = 0; - result = spvReflectEnumeratePushConstantBlocks(&module, &pc_count, nullptr); - ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, Vector<uint8_t>(), - "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed enumerating push constants."); - - if (pc_count) { - ERR_FAIL_COND_V_MSG(pc_count > 1, Vector<uint8_t>(), - "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "': Only one push constant is supported, which should be the same across shader stages."); - - Vector<SpvReflectBlockVariable *> pconstants; - pconstants.resize(pc_count); - result = spvReflectEnumeratePushConstantBlocks(&module, &pc_count, pconstants.ptrw()); - ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, Vector<uint8_t>(), - "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed obtaining push constants."); -#if 0 - if (pconstants[0] == nullptr) { - Ref<FileAccess> f = FileAccess::open("res://popo.spv", FileAccess::WRITE); - f->store_buffer((const uint8_t *)&SpirV[0], SpirV.size() * sizeof(uint32_t)); - } -#endif - - ERR_FAIL_COND_V_MSG(binary_data.push_constant_size && binary_data.push_constant_size != pconstants[0]->size, Vector<uint8_t>(), - "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "': Push constant block must be the same across shader stages."); - - binary_data.push_constant_size = pconstants[0]->size; - binary_data.push_constants_vk_stage |= shader_stage_masks[stage]; - - //print_line("Stage: " + String(shader_stage_names[stage]) + " push constant of size=" + itos(push_constant.push_constant_size)); + for (const Vector<SpirvReflectionData::Uniform> &spirv_set : spirv_data.uniforms) { + Vector<RenderingDeviceVulkanShaderBinaryDataBinding> set_bindings; + for (const SpirvReflectionData::Uniform &spirv_uniform : spirv_set) { + RenderingDeviceVulkanShaderBinaryDataBinding binding{}; + binding.type = (uint32_t)spirv_uniform.type; + binding.binding = spirv_uniform.binding; + binding.stages = (uint32_t)spirv_uniform.stages_mask; + binding.length = spirv_uniform.length; + binding.writable = (uint32_t)spirv_uniform.writable; + set_bindings.push_back(binding); } - - // Destroy the reflection data when no longer required. - spvReflectDestroyShaderModule(&module); + uniform_info.push_back(set_bindings); } - stages_processed |= (1 << p_spirv[i].shader_stage); + for (const SpirvReflectionData::SpecializationConstant &spirv_sc : spirv_data.specialization_constants) { + RenderingDeviceVulkanShaderBinarySpecializationConstant spec_constant{}; + spec_constant.type = (uint32_t)spirv_sc.type; + spec_constant.constant_id = spirv_sc.constant_id; + spec_constant.int_value = spirv_sc.int_value; + spec_constant.stage_flags = (uint32_t)spirv_sc.stages_mask; + specialization_constants.push_back(spec_constant); + } } Vector<Vector<uint8_t>> compressed_stages; @@ -5167,7 +4701,7 @@ Vector<uint8_t> RenderingDeviceVulkan::shader_compile_binary_from_spirv(const Ve stages_binary_size += s; } - binary_data.specialization_constant_count = specialization_constants.size(); + binary_data.specialization_constants_count = specialization_constants.size(); binary_data.set_count = uniform_info.size(); binary_data.stage_count = p_spirv.size(); @@ -5273,12 +4807,12 @@ RID RenderingDeviceVulkan::shader_create_from_bytecode(const Vector<uint8_t> &p_ const RenderingDeviceVulkanShaderBinaryData &binary_data = *(reinterpret_cast<const RenderingDeviceVulkanShaderBinaryData *>(binptr + 12)); Shader::PushConstant push_constant; - push_constant.push_constant_size = binary_data.push_constant_size; - push_constant.push_constants_vk_stage = binary_data.push_constants_vk_stage; + push_constant.size = binary_data.push_constant_size; + push_constant.vk_stages_mask = binary_data.push_constant_vk_stages_mask; uint32_t vertex_input_mask = binary_data.vertex_input_mask; - uint32_t fragment_outputs = binary_data.fragment_outputs; + uint32_t fragment_output_mask = binary_data.fragment_output_mask; bool is_compute = binary_data.is_compute; @@ -5374,11 +4908,11 @@ RID RenderingDeviceVulkan::shader_create_from_bytecode(const Vector<uint8_t> &p_ read_offset += set_size; } - ERR_FAIL_COND_V(read_offset + binary_data.specialization_constant_count * sizeof(RenderingDeviceVulkanShaderBinarySpecializationConstant) >= binsize, RID()); + ERR_FAIL_COND_V(read_offset + binary_data.specialization_constants_count * sizeof(RenderingDeviceVulkanShaderBinarySpecializationConstant) >= binsize, RID()); Vector<Shader::SpecializationConstant> specialization_constants; - for (uint32_t i = 0; i < binary_data.specialization_constant_count; i++) { + for (uint32_t i = 0; i < binary_data.specialization_constants_count; i++) { const RenderingDeviceVulkanShaderBinarySpecializationConstant &src_sc = *(reinterpret_cast<const RenderingDeviceVulkanShaderBinarySpecializationConstant *>(binptr + read_offset)); Shader::SpecializationConstant sc; sc.constant.int_value = src_sc.int_value; @@ -5444,7 +4978,7 @@ RID RenderingDeviceVulkan::shader_create_from_bytecode(const Vector<uint8_t> &p_ Shader shader; shader.vertex_input_mask = vertex_input_mask; - shader.fragment_output_mask = fragment_outputs; + shader.fragment_output_mask = fragment_output_mask; shader.push_constant = push_constant; shader.is_compute = is_compute; shader.compute_local_size[0] = compute_local_size[0]; @@ -5474,19 +5008,11 @@ RID RenderingDeviceVulkan::shader_create_from_bytecode(const Vector<uint8_t> &p_ break; } - const VkShaderStageFlagBits shader_stage_bits[SHADER_STAGE_MAX] = { - VK_SHADER_STAGE_VERTEX_BIT, - VK_SHADER_STAGE_FRAGMENT_BIT, - VK_SHADER_STAGE_TESSELLATION_CONTROL_BIT, - VK_SHADER_STAGE_TESSELLATION_EVALUATION_BIT, - VK_SHADER_STAGE_COMPUTE_BIT, - }; - VkPipelineShaderStageCreateInfo shader_stage; shader_stage.sType = VK_STRUCTURE_TYPE_PIPELINE_SHADER_STAGE_CREATE_INFO; shader_stage.pNext = nullptr; shader_stage.flags = 0; - shader_stage.stage = shader_stage_bits[stage_type[i]]; + shader_stage.stage = shader_stage_masks[stage_type[i]]; shader_stage.module = module; shader_stage.pName = "main"; shader_stage.pSpecializationInfo = nullptr; @@ -5558,10 +5084,10 @@ RID RenderingDeviceVulkan::shader_create_from_bytecode(const Vector<uint8_t> &p_ // Needs to be declared in this outer scope, otherwise it may not outlive its assignment // to pipeline_layout_create_info. VkPushConstantRange push_constant_range; - if (push_constant.push_constant_size) { - push_constant_range.stageFlags = push_constant.push_constants_vk_stage; + if (push_constant.size) { + push_constant_range.stageFlags = push_constant.vk_stages_mask; push_constant_range.offset = 0; - push_constant_range.size = push_constant.push_constant_size; + push_constant_range.size = push_constant.size; pipeline_layout_create_info.pushConstantRangeCount = 1; pipeline_layout_create_info.pPushConstantRanges = &push_constant_range; @@ -5635,7 +5161,7 @@ RID RenderingDeviceVulkan::uniform_buffer_create(uint32_t p_size_bytes, const Ve return id; } -RID RenderingDeviceVulkan::storage_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data, uint32_t p_usage) { +RID RenderingDeviceVulkan::storage_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data, BitField<StorageBufferUsage> p_usage) { _THREAD_SAFE_METHOD_ ERR_FAIL_COND_V_MSG(draw_list != nullptr && p_data.size(), RID(), "Creating buffers with data is forbidden during creation of a draw list"); @@ -5646,7 +5172,7 @@ RID RenderingDeviceVulkan::storage_buffer_create(uint32_t p_size_bytes, const Ve Buffer buffer; uint32_t flags = VK_BUFFER_USAGE_TRANSFER_SRC_BIT | VK_BUFFER_USAGE_TRANSFER_DST_BIT | VK_BUFFER_USAGE_STORAGE_BUFFER_BIT; - if (p_usage & STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT) { + if (p_usage.has_flag(STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT)) { flags |= VK_BUFFER_USAGE_INDIRECT_BUFFER_BIT; } Error err = _buffer_allocate(&buffer, p_size_bytes, flags, VMA_MEMORY_USAGE_AUTO_PREFER_DEVICE, 0); @@ -5956,10 +5482,8 @@ RID RenderingDeviceVulkan::uniform_set_create(const Vector<Uniform> &p_uniforms, // Can also be used as storage, add to mutable sampled. mutable_sampled_textures.push_back(texture); } - if (texture->owner.is_valid()) { - texture = texture_owner.get_or_null(texture->owner); - ERR_FAIL_COND_V(!texture, RID()); // Bug, should never happen. - } + + DEV_ASSERT(!texture->owner.is_valid() || texture_owner.get_or_null(texture->owner)); img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; @@ -6010,10 +5534,7 @@ RID RenderingDeviceVulkan::uniform_set_create(const Vector<Uniform> &p_uniforms, mutable_sampled_textures.push_back(texture); } - if (texture->owner.is_valid()) { - texture = texture_owner.get_or_null(texture->owner); - ERR_FAIL_COND_V(!texture, RID()); // Bug, should never happen. - } + DEV_ASSERT(!texture->owner.is_valid() || texture_owner.get_or_null(texture->owner)); img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; @@ -6058,10 +5579,7 @@ RID RenderingDeviceVulkan::uniform_set_create(const Vector<Uniform> &p_uniforms, mutable_storage_textures.push_back(texture); } - if (texture->owner.is_valid()) { - texture = texture_owner.get_or_null(texture->owner); - ERR_FAIL_COND_V(!texture, RID()); // Bug, should never happen. - } + DEV_ASSERT(!texture->owner.is_valid() || texture_owner.get_or_null(texture->owner)); img_info.imageLayout = VK_IMAGE_LAYOUT_GENERAL; @@ -6223,10 +5741,7 @@ RID RenderingDeviceVulkan::uniform_set_create(const Vector<Uniform> &p_uniforms, img_info.sampler = VK_NULL_HANDLE; img_info.imageView = texture->view; - if (texture->owner.is_valid()) { - texture = texture_owner.get_or_null(texture->owner); - ERR_FAIL_COND_V(!texture, RID()); // Bug, should never happen. - } + DEV_ASSERT(!texture->owner.is_valid() || texture_owner.get_or_null(texture->owner)); img_info.imageLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; @@ -6424,7 +5939,7 @@ Vector<uint8_t> RenderingDeviceVulkan::buffer_get_data(RID p_buffer) { } // Make sure no one is using the buffer -- the "false" gets us to the same command buffer as below. - _buffer_memory_barrier(buffer->buffer, 0, buffer->size, src_stage_mask, src_access_mask, VK_PIPELINE_STAGE_TRANSFER_BIT, VK_ACCESS_TRANSFER_READ_BIT, false); + _buffer_memory_barrier(buffer->buffer, 0, buffer->size, src_stage_mask, VK_PIPELINE_STAGE_TRANSFER_BIT, src_access_mask, VK_ACCESS_TRANSFER_READ_BIT, false); VkCommandBuffer command_buffer = frames[frame].setup_command_buffer; @@ -6460,7 +5975,7 @@ Vector<uint8_t> RenderingDeviceVulkan::buffer_get_data(RID p_buffer) { /**** RENDER PIPELINE ****/ /*************************/ -RID RenderingDeviceVulkan::render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const PipelineRasterizationState &p_rasterization_state, const PipelineMultisampleState &p_multisample_state, const PipelineDepthStencilState &p_depth_stencil_state, const PipelineColorBlendState &p_blend_state, int p_dynamic_state_flags, uint32_t p_for_render_pass, const Vector<PipelineSpecializationConstant> &p_specialization_constants) { +RID RenderingDeviceVulkan::render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const PipelineRasterizationState &p_rasterization_state, const PipelineMultisampleState &p_multisample_state, const PipelineDepthStencilState &p_depth_stencil_state, const PipelineColorBlendState &p_blend_state, BitField<PipelineDynamicStateFlags> p_dynamic_state_flags, uint32_t p_for_render_pass, const Vector<PipelineSpecializationConstant> &p_specialization_constants) { _THREAD_SAFE_METHOD_ // Needs a shader. @@ -6746,31 +6261,31 @@ RID RenderingDeviceVulkan::render_pipeline_create(RID p_shader, FramebufferForma dynamic_states.push_back(VK_DYNAMIC_STATE_VIEWPORT); // Viewport and scissor are always dynamic. dynamic_states.push_back(VK_DYNAMIC_STATE_SCISSOR); - if (p_dynamic_state_flags & DYNAMIC_STATE_LINE_WIDTH) { + if (p_dynamic_state_flags.has_flag(DYNAMIC_STATE_LINE_WIDTH)) { dynamic_states.push_back(VK_DYNAMIC_STATE_LINE_WIDTH); } - if (p_dynamic_state_flags & DYNAMIC_STATE_DEPTH_BIAS) { + if (p_dynamic_state_flags.has_flag(DYNAMIC_STATE_DEPTH_BIAS)) { dynamic_states.push_back(VK_DYNAMIC_STATE_DEPTH_BIAS); } - if (p_dynamic_state_flags & DYNAMIC_STATE_BLEND_CONSTANTS) { + if (p_dynamic_state_flags.has_flag(DYNAMIC_STATE_BLEND_CONSTANTS)) { dynamic_states.push_back(VK_DYNAMIC_STATE_BLEND_CONSTANTS); } - if (p_dynamic_state_flags & DYNAMIC_STATE_DEPTH_BOUNDS) { + if (p_dynamic_state_flags.has_flag(DYNAMIC_STATE_DEPTH_BOUNDS)) { dynamic_states.push_back(VK_DYNAMIC_STATE_DEPTH_BOUNDS); } - if (p_dynamic_state_flags & DYNAMIC_STATE_STENCIL_COMPARE_MASK) { + if (p_dynamic_state_flags.has_flag(DYNAMIC_STATE_STENCIL_COMPARE_MASK)) { dynamic_states.push_back(VK_DYNAMIC_STATE_STENCIL_COMPARE_MASK); } - if (p_dynamic_state_flags & DYNAMIC_STATE_STENCIL_WRITE_MASK) { + if (p_dynamic_state_flags.has_flag(DYNAMIC_STATE_STENCIL_WRITE_MASK)) { dynamic_states.push_back(VK_DYNAMIC_STATE_STENCIL_WRITE_MASK); } - if (p_dynamic_state_flags & DYNAMIC_STATE_STENCIL_REFERENCE) { + if (p_dynamic_state_flags.has_flag(DYNAMIC_STATE_STENCIL_REFERENCE)) { dynamic_states.push_back(VK_DYNAMIC_STATE_STENCIL_REFERENCE); } @@ -6878,10 +6393,10 @@ RID RenderingDeviceVulkan::render_pipeline_create(RID p_shader, FramebufferForma ERR_FAIL_COND_V_MSG(err, RID(), "vkCreateGraphicsPipelines failed with error " + itos(err) + " for shader '" + shader->name + "'."); pipeline.set_formats = shader->set_formats; - pipeline.push_constant_stages = shader->push_constant.push_constants_vk_stage; + pipeline.push_constant_stages_mask = shader->push_constant.vk_stages_mask; pipeline.pipeline_layout = shader->pipeline_layout; pipeline.shader = p_shader; - pipeline.push_constant_size = shader->push_constant.push_constant_size; + pipeline.push_constant_size = shader->push_constant.size; #ifdef DEBUG_ENABLED pipeline.validation.dynamic_state = p_dynamic_state_flags; @@ -6993,10 +6508,10 @@ RID RenderingDeviceVulkan::compute_pipeline_create(RID p_shader, const Vector<Pi ERR_FAIL_COND_V_MSG(err, RID(), "vkCreateComputePipelines failed with error " + itos(err) + "."); pipeline.set_formats = shader->set_formats; - pipeline.push_constant_stages = shader->push_constant.push_constants_vk_stage; + pipeline.push_constant_stages_mask = shader->push_constant.vk_stages_mask; pipeline.pipeline_layout = shader->pipeline_layout; pipeline.shader = p_shader; - pipeline.push_constant_size = shader->push_constant.push_constant_size; + pipeline.push_constant_size = shader->push_constant.size; pipeline.local_group_size[0] = shader->compute_local_size[0]; pipeline.local_group_size[1] = shader->compute_local_size[1]; pipeline.local_group_size[2] = shader->compute_local_size[2]; @@ -7638,7 +7153,7 @@ void RenderingDeviceVulkan::draw_list_bind_render_pipeline(DrawListID p_list, RI dl->state.set_count = pcount; // Update set count. if (pipeline->push_constant_size) { - dl->state.pipeline_push_constant_stages = pipeline->push_constant_stages; + dl->state.pipeline_push_constant_stages = pipeline->push_constant_stages_mask; #ifdef DEBUG_ENABLED dl->validation.pipeline_push_constant_supplied = false; #endif @@ -8254,7 +7769,7 @@ void RenderingDeviceVulkan::compute_list_bind_compute_pipeline(ComputeListID p_l cl->state.set_count = pcount; // Update set count. if (pipeline->push_constant_size) { - cl->state.pipeline_push_constant_stages = pipeline->push_constant_stages; + cl->state.pipeline_push_constant_stages = pipeline->push_constant_stages_mask; #ifdef DEBUG_ENABLED cl->validation.pipeline_push_constant_supplied = false; #endif diff --git a/drivers/vulkan/rendering_device_vulkan.h b/drivers/vulkan/rendering_device_vulkan.h index c6e1830e90..3ccd7bb1d9 100644 --- a/drivers/vulkan/rendering_device_vulkan.h +++ b/drivers/vulkan/rendering_device_vulkan.h @@ -226,8 +226,8 @@ class RenderingDeviceVulkan : public RenderingDevice { Error _buffer_update(Buffer *p_buffer, size_t p_offset, const uint8_t *p_data, size_t p_data_size, bool p_use_draw_command_buffer = false, uint32_t p_required_align = 32); void _full_barrier(bool p_sync_with_draw); - void _memory_barrier(VkPipelineStageFlags p_src_stage_mask, VkPipelineStageFlags p_dst_stage_mask, VkAccessFlags p_src_access, VkAccessFlags p_dst_sccess, bool p_sync_with_draw); - void _buffer_memory_barrier(VkBuffer buffer, uint64_t p_from, uint64_t p_size, VkPipelineStageFlags p_src_stage_mask, VkPipelineStageFlags p_dst_stage_mask, VkAccessFlags p_src_access, VkAccessFlags p_dst_sccess, bool p_sync_with_draw); + void _memory_barrier(VkPipelineStageFlags p_src_stage_mask, VkPipelineStageFlags p_dst_stage_mask, VkAccessFlags p_src_access, VkAccessFlags p_dst_access, bool p_sync_with_draw); + void _buffer_memory_barrier(VkBuffer buffer, uint64_t p_from, uint64_t p_size, VkPipelineStageFlags p_src_stage_mask, VkPipelineStageFlags p_dst_stage_mask, VkAccessFlags p_src_access, VkAccessFlags p_dst_access, bool p_sync_with_draw); /*********************/ /**** FRAMEBUFFER ****/ @@ -543,10 +543,6 @@ class RenderingDeviceVulkan : public RenderingDevice { // As a result, we need to figure out quickly when something is no longer "compatible". // in order to avoid costly rebinds. - enum { - MAX_UNIFORM_SETS = 16 - }; - struct UniformInfo { UniformType type = UniformType::UNIFORM_TYPE_MAX; bool writable = false; @@ -628,8 +624,8 @@ class RenderingDeviceVulkan : public RenderingDevice { uint32_t fragment_output_mask = 0; struct PushConstant { - uint32_t push_constant_size = 0; - uint32_t push_constants_vk_stage = 0; + uint32_t size = 0; + uint32_t vk_stages_mask = 0; }; PushConstant push_constant; @@ -791,7 +787,7 @@ class RenderingDeviceVulkan : public RenderingDevice { VkPipelineLayout pipeline_layout = VK_NULL_HANDLE; // Not owned, needed for push constants. VkPipeline pipeline = VK_NULL_HANDLE; uint32_t push_constant_size = 0; - uint32_t push_constant_stages = 0; + uint32_t push_constant_stages_mask = 0; }; RID_Owner<RenderPipeline, true> render_pipeline_owner; @@ -802,7 +798,7 @@ class RenderingDeviceVulkan : public RenderingDevice { VkPipelineLayout pipeline_layout = VK_NULL_HANDLE; // Not owned, needed for push constants. VkPipeline pipeline = VK_NULL_HANDLE; uint32_t push_constant_size = 0; - uint32_t push_constant_stages = 0; + uint32_t push_constant_stages_mask = 0; uint32_t local_group_size[3] = { 0, 0, 0 }; }; @@ -1117,7 +1113,7 @@ public: /*****************/ virtual RID uniform_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data = Vector<uint8_t>()); - virtual RID storage_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data = Vector<uint8_t>(), uint32_t p_usage = 0); + virtual RID storage_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data = Vector<uint8_t>(), BitField<StorageBufferUsage> p_usage = 0); virtual RID texture_buffer_create(uint32_t p_size_elements, DataFormat p_format, const Vector<uint8_t> &p_data = Vector<uint8_t>()); virtual RID uniform_set_create(const Vector<Uniform> &p_uniforms, RID p_shader, uint32_t p_shader_set); @@ -1132,7 +1128,7 @@ public: /**** RENDER PIPELINE ****/ /*************************/ - virtual RID render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const PipelineRasterizationState &p_rasterization_state, const PipelineMultisampleState &p_multisample_state, const PipelineDepthStencilState &p_depth_stencil_state, const PipelineColorBlendState &p_blend_state, int p_dynamic_state_flags = 0, uint32_t p_for_render_pass = 0, const Vector<PipelineSpecializationConstant> &p_specialization_constants = Vector<PipelineSpecializationConstant>()); + virtual RID render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const PipelineRasterizationState &p_rasterization_state, const PipelineMultisampleState &p_multisample_state, const PipelineDepthStencilState &p_depth_stencil_state, const PipelineColorBlendState &p_blend_state, BitField<PipelineDynamicStateFlags> p_dynamic_state_flags = 0, uint32_t p_for_render_pass = 0, const Vector<PipelineSpecializationConstant> &p_specialization_constants = Vector<PipelineSpecializationConstant>()); virtual bool render_pipeline_is_valid(RID p_pipeline); /**************************/ diff --git a/editor/action_map_editor.cpp b/editor/action_map_editor.cpp index c376d5434f..a1e4b5fde4 100644 --- a/editor/action_map_editor.cpp +++ b/editor/action_map_editor.cpp @@ -35,6 +35,7 @@ #include "editor/input_event_configuration_dialog.h" #include "scene/gui/check_button.h" #include "scene/gui/tree.h" +#include "scene/scene_string_names.h" static bool _is_action_name_valid(const String &p_name) { const char32_t *cstr = p_name.get_data(); @@ -362,6 +363,8 @@ void ActionMapEditor::_bind_methods() { ADD_SIGNAL(MethodInfo("action_removed", PropertyInfo(Variant::STRING, "name"))); ADD_SIGNAL(MethodInfo("action_renamed", PropertyInfo(Variant::STRING, "old_name"), PropertyInfo(Variant::STRING, "new_name"))); ADD_SIGNAL(MethodInfo("action_reordered", PropertyInfo(Variant::STRING, "action_name"), PropertyInfo(Variant::STRING, "relative_to"), PropertyInfo(Variant::BOOL, "before"))); + ADD_SIGNAL(MethodInfo(SNAME("filter_focused"))); + ADD_SIGNAL(MethodInfo(SNAME("filter_unfocused"))); } LineEdit *ActionMapEditor::get_search_box() const { @@ -492,6 +495,14 @@ void ActionMapEditor::use_external_search_box(LineEdit *p_searchbox) { action_list_search->connect("text_changed", callable_mp(this, &ActionMapEditor::_search_term_updated)); } +void ActionMapEditor::_on_filter_focused() { + emit_signal(SNAME("filter_focused")); +} + +void ActionMapEditor::_on_filter_unfocused() { + emit_signal(SNAME("filter_unfocused")); +} + ActionMapEditor::ActionMapEditor() { // Main Vbox Container VBoxContainer *main_vbox = memnew(VBoxContainer); @@ -512,6 +523,8 @@ ActionMapEditor::ActionMapEditor() { action_list_search_by_event->set_h_size_flags(Control::SIZE_EXPAND_FILL); action_list_search_by_event->set_stretch_ratio(0.75); action_list_search_by_event->connect("event_changed", callable_mp(this, &ActionMapEditor::_search_by_event)); + action_list_search_by_event->connect(SceneStringNames::get_singleton()->focus_entered, callable_mp(this, &ActionMapEditor::_on_filter_focused)); + action_list_search_by_event->connect(SceneStringNames::get_singleton()->focus_exited, callable_mp(this, &ActionMapEditor::_on_filter_unfocused)); top_hbox->add_child(action_list_search_by_event); Button *clear_all_search = memnew(Button); diff --git a/editor/action_map_editor.h b/editor/action_map_editor.h index ad9980c4ef..1908805b17 100644 --- a/editor/action_map_editor.h +++ b/editor/action_map_editor.h @@ -106,6 +106,9 @@ private: bool can_drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from) const; void drop_data_fw(const Point2 &p_point, const Variant &p_data, Control *p_from); + void _on_filter_focused(); + void _on_filter_unfocused(); + protected: void _notification(int p_what); static void _bind_methods(); diff --git a/editor/animation_bezier_editor.cpp b/editor/animation_bezier_editor.cpp index 7ffec0835b..530708f3e5 100644 --- a/editor/animation_bezier_editor.cpp +++ b/editor/animation_bezier_editor.cpp @@ -1592,7 +1592,7 @@ void AnimationBezierTrackEdit::duplicate_selection() { } Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); - undo_redo->create_action(TTR("Anim Duplicate Keys")); + undo_redo->create_action(TTR("Animation Duplicate Keys")); List<Pair<int, real_t>> new_selection_values; @@ -1638,7 +1638,7 @@ void AnimationBezierTrackEdit::duplicate_selection() { void AnimationBezierTrackEdit::delete_selection() { if (selection.size()) { Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); - undo_redo->create_action(TTR("Anim Delete Keys")); + undo_redo->create_action(TTR("Animation Delete Keys")); for (SelectionSet::Element *E = selection.back(); E; E = E->prev()) { undo_redo->add_do_method(animation.ptr(), "track_remove_key", E->get().first, E->get().second); diff --git a/editor/animation_track_editor.cpp b/editor/animation_track_editor.cpp index ecc465ef64..2ee06a0dbd 100644 --- a/editor/animation_track_editor.cpp +++ b/editor/animation_track_editor.cpp @@ -137,7 +137,7 @@ public: setting = true; Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); - undo_redo->create_action(TTR("Anim Change Keyframe Time"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Change Keyframe Time"), UndoRedo::MERGE_ENDS); Variant val = animation->track_get_key_value(track, key); float trans = animation->track_get_key_transition(track, key); @@ -165,7 +165,7 @@ public: float prev_val = animation->track_get_key_transition(track, key); setting = true; Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); - undo_redo->create_action(TTR("Anim Change Transition"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Change Transition"), UndoRedo::MERGE_ENDS); undo_redo->add_do_method(animation.ptr(), "track_set_key_transition", track, key, val); undo_redo->add_undo_method(animation.ptr(), "track_set_key_transition", track, key, prev_val); undo_redo->add_do_method(this, "_update_obj", animation); @@ -221,7 +221,7 @@ public: } setting = true; - undo_redo->create_action(TTR("Anim Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Change Keyframe Value"), UndoRedo::MERGE_ENDS); Variant prev = animation->track_get_key_value(track, key); undo_redo->add_do_method(animation.ptr(), "track_set_key_value", track, key, value); undo_redo->add_undo_method(animation.ptr(), "track_set_key_value", track, key, prev); @@ -281,9 +281,9 @@ public: } if (mergeable) { - undo_redo->create_action(TTR("Anim Change Call"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Change Call"), UndoRedo::MERGE_ENDS); } else { - undo_redo->create_action(TTR("Anim Change Call")); + undo_redo->create_action(TTR("Animation Change Call")); } setting = true; @@ -304,7 +304,7 @@ public: const Variant &value = p_value; setting = true; - undo_redo->create_action(TTR("Anim Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Change Keyframe Value"), UndoRedo::MERGE_ENDS); float prev = animation->bezier_track_get_key_value(track, key); undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_value", track, key, value); undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_value", track, key, prev); @@ -320,7 +320,7 @@ public: const Variant &value = p_value; setting = true; - undo_redo->create_action(TTR("Anim Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Change Keyframe Value"), UndoRedo::MERGE_ENDS); Vector2 prev = animation->bezier_track_get_key_in_handle(track, key); undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_in_handle", track, key, value); undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_in_handle", track, key, prev); @@ -336,7 +336,7 @@ public: const Variant &value = p_value; setting = true; - undo_redo->create_action(TTR("Anim Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Change Keyframe Value"), UndoRedo::MERGE_ENDS); Vector2 prev = animation->bezier_track_get_key_out_handle(track, key); undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_out_handle", track, key, value); undo_redo->add_undo_method(animation.ptr(), "bezier_track_set_key_out_handle", track, key, prev); @@ -352,7 +352,7 @@ public: const Variant &value = p_value; setting = true; - undo_redo->create_action(TTR("Anim Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Change Keyframe Value"), UndoRedo::MERGE_ENDS); int prev = animation->bezier_track_get_key_handle_mode(track, key); undo_redo->add_do_method(this, "_bezier_track_set_key_handle_mode", animation.ptr(), track, key, value); undo_redo->add_undo_method(this, "_bezier_track_set_key_handle_mode", animation.ptr(), track, key, prev); @@ -369,7 +369,7 @@ public: Ref<AudioStream> stream = p_value; setting = true; - undo_redo->create_action(TTR("Anim Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Change Keyframe Value"), UndoRedo::MERGE_ENDS); Ref<Resource> prev = animation->audio_track_get_key_stream(track, key); undo_redo->add_do_method(animation.ptr(), "audio_track_set_key_stream", track, key, stream); undo_redo->add_undo_method(animation.ptr(), "audio_track_set_key_stream", track, key, prev); @@ -385,7 +385,7 @@ public: float value = p_value; setting = true; - undo_redo->create_action(TTR("Anim Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Change Keyframe Value"), UndoRedo::MERGE_ENDS); float prev = animation->audio_track_get_key_start_offset(track, key); undo_redo->add_do_method(animation.ptr(), "audio_track_set_key_start_offset", track, key, value); undo_redo->add_undo_method(animation.ptr(), "audio_track_set_key_start_offset", track, key, prev); @@ -401,7 +401,7 @@ public: float value = p_value; setting = true; - undo_redo->create_action(TTR("Anim Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Change Keyframe Value"), UndoRedo::MERGE_ENDS); float prev = animation->audio_track_get_key_end_offset(track, key); undo_redo->add_do_method(animation.ptr(), "audio_track_set_key_end_offset", track, key, value); undo_redo->add_undo_method(animation.ptr(), "audio_track_set_key_end_offset", track, key, prev); @@ -418,7 +418,7 @@ public: StringName anim_name = p_value; setting = true; - undo_redo->create_action(TTR("Anim Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Change Keyframe Value"), UndoRedo::MERGE_ENDS); StringName prev = animation->animation_track_get_key_animation(track, key); undo_redo->add_do_method(animation.ptr(), "animation_track_set_key_animation", track, key, anim_name); undo_redo->add_undo_method(animation.ptr(), "animation_track_set_key_animation", track, key, prev); @@ -818,7 +818,7 @@ public: Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); if (!setting) { setting = true; - undo_redo->create_action(TTR("Anim Multi Change Keyframe Time"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Multi Change Keyframe Time"), UndoRedo::MERGE_ENDS); } Variant val = animation->track_get_key_value(track, key); @@ -843,7 +843,7 @@ public: Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); if (!setting) { setting = true; - undo_redo->create_action(TTR("Anim Multi Change Transition"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Multi Change Transition"), UndoRedo::MERGE_ENDS); } undo_redo->add_do_method(animation.ptr(), "track_set_key_transition", track, key, val); undo_redo->add_undo_method(animation.ptr(), "track_set_key_transition", track, key, prev_val); @@ -873,7 +873,7 @@ public: } setting = true; - undo_redo->create_action(vformat(TTR("Anim Multi Change %s"), chan)); + undo_redo->create_action(vformat(TTR("Animation Multi Change %s"), chan)); } undo_redo->add_do_method(animation.ptr(), "track_set_key_value", track, key, p_value); undo_redo->add_undo_method(animation.ptr(), "track_set_key_value", track, key, old); @@ -890,7 +890,7 @@ public: if (!setting) { setting = true; - undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); } Variant prev = animation->track_get_key_value(track, key); undo_redo->add_do_method(animation.ptr(), "track_set_key_value", track, key, value); @@ -948,9 +948,9 @@ public: if (!setting) { if (mergeable) { - undo_redo->create_action(TTR("Anim Multi Change Call"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Multi Change Call"), UndoRedo::MERGE_ENDS); } else { - undo_redo->create_action(TTR("Anim Multi Change Call")); + undo_redo->create_action(TTR("Animation Multi Change Call")); } setting = true; @@ -966,7 +966,7 @@ public: if (!setting) { setting = true; - undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); } float prev = animation->bezier_track_get_key_value(track, key); undo_redo->add_do_method(animation.ptr(), "bezier_track_set_key_value", track, key, value); @@ -977,7 +977,7 @@ public: if (!setting) { setting = true; - undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); } Vector2 prev = animation->bezier_track_get_key_in_handle(track, key); undo_redo->add_do_method(this, "_bezier_track_set_key_in_handle", track, key, value); @@ -988,7 +988,7 @@ public: if (!setting) { setting = true; - undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); } Vector2 prev = animation->bezier_track_get_key_out_handle(track, key); undo_redo->add_do_method(this, "_bezier_track_set_key_out_handle", track, key, value); @@ -999,7 +999,7 @@ public: if (!setting) { setting = true; - undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); } int prev = animation->bezier_track_get_key_handle_mode(track, key); undo_redo->add_do_method(this, "_bezier_track_set_key_handle_mode", animation.ptr(), track, key, value); @@ -1013,7 +1013,7 @@ public: if (!setting) { setting = true; - undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); } Ref<Resource> prev = animation->audio_track_get_key_stream(track, key); undo_redo->add_do_method(animation.ptr(), "audio_track_set_key_stream", track, key, stream); @@ -1024,7 +1024,7 @@ public: if (!setting) { setting = true; - undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); } float prev = animation->audio_track_get_key_start_offset(track, key); undo_redo->add_do_method(animation.ptr(), "audio_track_set_key_start_offset", track, key, value); @@ -1035,7 +1035,7 @@ public: if (!setting) { setting = true; - undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); } float prev = animation->audio_track_get_key_end_offset(track, key); undo_redo->add_do_method(animation.ptr(), "audio_track_set_key_end_offset", track, key, value); @@ -1049,7 +1049,7 @@ public: if (!setting) { setting = true; - undo_redo->create_action(TTR("Anim Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); + undo_redo->create_action(TTR("Animation Multi Change Keyframe Value"), UndoRedo::MERGE_ENDS); } StringName prev = animation->animation_track_get_key_animation(track, key); undo_redo->add_do_method(animation.ptr(), "animation_track_set_key_animation", track, key, anim_name); @@ -3814,7 +3814,7 @@ void AnimationTrackEditor::_query_insert(const InsertData &p_id) { void AnimationTrackEditor::_insert_track(bool p_reset_wanted, bool p_create_beziers) { Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); - undo_redo->create_action(TTR("Anim Insert")); + undo_redo->create_action(TTR("Animation Insert Key")); Ref<Animation> reset_anim; if (p_reset_wanted) { @@ -4153,7 +4153,7 @@ Ref<Animation> AnimationTrackEditor::_create_and_get_reset_animation() { void AnimationTrackEditor::_confirm_insert_list() { Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); - undo_redo->create_action(TTR("Anim Create & Insert")); + undo_redo->create_action(TTR("Animation Insert Key")); bool create_reset = insert_confirm_reset->is_visible() && insert_confirm_reset->is_pressed(); Ref<Animation> reset_anim; @@ -4340,7 +4340,6 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD } } created = true; - undo_redo->create_action(TTR("Anim Insert Track & Key")); p_id.track_idx = p_next_tracks.normal; @@ -4349,9 +4348,6 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD if (p_id.type == Animation::TYPE_VALUE) { undo_redo->add_do_method(animation.ptr(), "value_track_set_update_mode", p_id.track_idx, update_mode); } - - } else { - undo_redo->create_action(TTR("Anim Insert Key")); } float time = timeline->get_play_position(); @@ -4422,8 +4418,6 @@ AnimationTrackEditor::TrackIndices AnimationTrackEditor::_confirm_insert(InsertD } } - undo_redo->commit_action(); - return p_next_tracks; } @@ -5359,7 +5353,7 @@ void AnimationTrackEditor::_select_at_anim(const Ref<Animation> &p_anim, int p_t void AnimationTrackEditor::_move_selection_commit() { Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); - undo_redo->create_action(TTR("Anim Move Keys")); + undo_redo->create_action(TTR("Animation Move Keys")); List<_AnimMoveRestore> to_restore; @@ -5611,7 +5605,7 @@ void AnimationTrackEditor::_anim_duplicate_keys(bool transpose) { int start_track = transpose ? _get_track_selected() : top_track; Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); - undo_redo->create_action(TTR("Anim Duplicate Keys")); + undo_redo->create_action(TTR("Animation Duplicate Keys")); List<Pair<int, float>> new_selection_values; @@ -5911,7 +5905,7 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) { ERR_FAIL_COND_MSG(s == 0, "Can't scale to 0."); Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); - undo_redo->create_action(TTR("Anim Scale Keys")); + undo_redo->create_action(TTR("Animation Scale Keys")); List<_AnimMoveRestore> to_restore; @@ -6098,7 +6092,7 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) { } break; case EDIT_ADD_RESET_KEY: { Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); - undo_redo->create_action(TTR("Anim Add RESET Keys")); + undo_redo->create_action(TTR("Animation Add RESET Keys")); Ref<Animation> reset = _create_and_get_reset_animation(); int reset_tracks = reset->get_track_count(); @@ -6159,7 +6153,7 @@ void AnimationTrackEditor::_edit_menu_pressed(int p_option) { if (selection.size()) { Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); - undo_redo->create_action(TTR("Anim Delete Keys")); + undo_redo->create_action(TTR("Animation Delete Keys")); for (RBMap<SelectedKey, KeyInfo>::Element *E = selection.back(); E; E = E->prev()) { undo_redo->add_do_method(animation.ptr(), "track_remove_key", E->key().track, E->key().key); diff --git a/editor/animation_track_editor_plugins.cpp b/editor/animation_track_editor_plugins.cpp index a5f6f449a6..704935e163 100644 --- a/editor/animation_track_editor_plugins.cpp +++ b/editor/animation_track_editor_plugins.cpp @@ -857,18 +857,14 @@ void AnimationTrackEditTypeAudio::draw_key(int p_index, float p_pixels_sec, int float start_ofs = get_animation()->audio_track_get_key_start_offset(get_track(), p_index); float end_ofs = get_animation()->audio_track_get_key_end_offset(get_track(), p_index); + int px_offset = 0; if (len_resizing && p_index == len_resizing_index) { - float ofs_local = -len_resizing_rel / get_timeline()->get_zoom_scale(); + float ofs_local = len_resizing_rel / get_timeline()->get_zoom_scale(); if (len_resizing_start) { start_ofs += ofs_local; - if (start_ofs < 0) { - start_ofs = 0; - } + px_offset = ofs_local * p_pixels_sec; } else { - end_ofs += ofs_local; - if (end_ofs < 0) { - end_ofs = 0; - } + end_ofs -= ofs_local; } } @@ -897,8 +893,8 @@ void AnimationTrackEditTypeAudio::draw_key(int p_index, float p_pixels_sec, int int pixel_len = len * p_pixels_sec; - int pixel_begin = p_x; - int pixel_end = p_x + pixel_len; + int pixel_begin = px_offset + p_x; + int pixel_end = px_offset + p_x + pixel_len; if (pixel_end < p_clip_left) { return; @@ -1061,9 +1057,6 @@ void AnimationTrackEditTypeAudio::gui_input(const Ref<InputEvent> &p_event) { len -= end_ofs; len -= start_ofs; - if (len <= 0.001) { - len = 0.001; - } if (get_animation()->track_get_key_count(get_track()) > i + 1) { len = MIN(len, get_animation()->track_get_key_time(get_track(), i + 1) - get_animation()->track_get_key_time(get_track(), i)); @@ -1078,6 +1071,13 @@ void AnimationTrackEditTypeAudio::gui_input(const Ref<InputEvent> &p_event) { int end = ofs + len * get_timeline()->get_zoom_scale(); if (end >= get_timeline()->get_name_limit() && end <= get_size().width - get_timeline()->get_buttons_width() && ABS(mm->get_position().x - end) < 5 * EDSCALE) { + len_resizing_start = false; + use_hsize_cursor = true; + len_resizing_index = i; + } + + if (ofs >= get_timeline()->get_name_limit() && ofs <= get_size().width - get_timeline()->get_buttons_width() && ABS(mm->get_position().x - ofs) < 5 * EDSCALE) { + len_resizing_start = true; use_hsize_cursor = true; len_resizing_index = i; } @@ -1086,8 +1086,25 @@ void AnimationTrackEditTypeAudio::gui_input(const Ref<InputEvent> &p_event) { } if (len_resizing && mm.is_valid()) { + // Rezising index is some. len_resizing_rel += mm->get_relative().x; - len_resizing_start = mm->is_shift_pressed(); + float ofs_local = len_resizing_rel / get_timeline()->get_zoom_scale(); + float prev_ofs_start = get_animation()->audio_track_get_key_start_offset(get_track(), len_resizing_index); + float prev_ofs_end = get_animation()->audio_track_get_key_end_offset(get_track(), len_resizing_index); + Ref<AudioStream> stream = get_animation()->audio_track_get_key_stream(get_track(), len_resizing_index); + float len = stream->get_length(); + if (len == 0) { + Ref<AudioStreamPreview> preview = AudioStreamPreviewGenerator::get_singleton()->generate_preview(stream); + float preview_len = preview->get_length(); + len = preview_len; + } + + if (len_resizing_start) { + len_resizing_rel = CLAMP(ofs_local, -prev_ofs_start, len - prev_ofs_end - prev_ofs_start) * get_timeline()->get_zoom_scale(); + } else { + len_resizing_rel = CLAMP(ofs_local, -(len - prev_ofs_end - prev_ofs_start), prev_ofs_end) * get_timeline()->get_zoom_scale(); + } + queue_redraw(); accept_event(); return; @@ -1096,7 +1113,11 @@ void AnimationTrackEditTypeAudio::gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT && over_drag_position) { len_resizing = true; - len_resizing_start = mb->is_shift_pressed(); + // In case if resizing index is not set yet reset the flag. + if (len_resizing_index < 0) { + len_resizing = false; + return; + } len_resizing_from_px = mb->get_position().x; len_resizing_rel = 0; queue_redraw(); @@ -1106,23 +1127,42 @@ void AnimationTrackEditTypeAudio::gui_input(const Ref<InputEvent> &p_event) { Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); if (len_resizing && mb.is_valid() && !mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { - float ofs_local = -len_resizing_rel / get_timeline()->get_zoom_scale(); + if (len_resizing_rel == 0 || len_resizing_index < 0) { + len_resizing = false; + return; + } + if (len_resizing_start) { + float ofs_local = len_resizing_rel / get_timeline()->get_zoom_scale(); float prev_ofs = get_animation()->audio_track_get_key_start_offset(get_track(), len_resizing_index); - undo_redo->create_action(TTR("Change Audio Track Clip Start Offset")); - undo_redo->add_do_method(get_animation().ptr(), "audio_track_set_key_start_offset", get_track(), len_resizing_index, prev_ofs + ofs_local); - undo_redo->add_undo_method(get_animation().ptr(), "audio_track_set_key_start_offset", get_track(), len_resizing_index, prev_ofs); - undo_redo->commit_action(); + float prev_time = get_animation()->track_get_key_time(get_track(), len_resizing_index); + float new_ofs = prev_ofs + ofs_local; + float new_time = prev_time + ofs_local; + if (prev_time != new_time) { + undo_redo->create_action(TTR("Change Audio Track Clip Start Offset")); + + undo_redo->add_do_method(get_animation().ptr(), "track_set_key_time", get_track(), len_resizing_index, new_time); + undo_redo->add_undo_method(get_animation().ptr(), "track_set_key_time", get_track(), len_resizing_index, prev_time); + + undo_redo->add_do_method(get_animation().ptr(), "audio_track_set_key_start_offset", get_track(), len_resizing_index, new_ofs); + undo_redo->add_undo_method(get_animation().ptr(), "audio_track_set_key_start_offset", get_track(), len_resizing_index, prev_ofs); + undo_redo->commit_action(); + } } else { + float ofs_local = -len_resizing_rel / get_timeline()->get_zoom_scale(); float prev_ofs = get_animation()->audio_track_get_key_end_offset(get_track(), len_resizing_index); - undo_redo->create_action(TTR("Change Audio Track Clip End Offset")); - undo_redo->add_do_method(get_animation().ptr(), "audio_track_set_key_end_offset", get_track(), len_resizing_index, prev_ofs + ofs_local); - undo_redo->add_undo_method(get_animation().ptr(), "audio_track_set_key_end_offset", get_track(), len_resizing_index, prev_ofs); - undo_redo->commit_action(); + float new_ofs = prev_ofs + ofs_local; + if (prev_ofs != new_ofs) { + undo_redo->create_action(TTR("Change Audio Track Clip End Offset")); + undo_redo->add_do_method(get_animation().ptr(), "audio_track_set_key_end_offset", get_track(), len_resizing_index, new_ofs); + undo_redo->add_undo_method(get_animation().ptr(), "audio_track_set_key_end_offset", get_track(), len_resizing_index, prev_ofs); + undo_redo->commit_action(); + } } len_resizing_index = -1; + len_resizing = false; queue_redraw(); accept_event(); return; diff --git a/editor/connections_dialog.cpp b/editor/connections_dialog.cpp index 2bd77bf99c..1f0cc1dc77 100644 --- a/editor/connections_dialog.cpp +++ b/editor/connections_dialog.cpp @@ -788,23 +788,7 @@ bool ConnectionsDock::_is_item_signal(TreeItem &p_item) { } bool ConnectionsDock::_is_connection_inherited(Connection &p_connection) { - Node *scene_root = EditorNode::get_singleton()->get_edited_scene(); - Ref<PackedScene> scn = ResourceLoader::load(scene_root->get_scene_file_path()); - ERR_FAIL_NULL_V(scn, false); - - Ref<SceneState> state = scn->get_state(); - ERR_FAIL_NULL_V(state, false); - - Node *source = Object::cast_to<Node>(p_connection.signal.get_object()); - Node *target = Object::cast_to<Node>(p_connection.callable.get_object()); - - const NodePath source_path = scene_root->get_path_to(source); - const NodePath target_path = scene_root->get_path_to(target); - const StringName signal_name = p_connection.signal.get_name(); - const StringName method_name = p_connection.callable.get_method(); - - // If it cannot be found in PackedScene, this connection was inherited. - return !state->has_connection(source_path, signal_name, target_path, method_name, true); + return bool(p_connection.flags & CONNECT_INHERITED); } /* diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp index 2adab089e4..5292b51032 100644 --- a/editor/create_dialog.cpp +++ b/editor/create_dialog.cpp @@ -284,8 +284,9 @@ void CreateDialog::_configure_search_option_item(TreeItem *r_item, const String bool can_instantiate = (p_type_category == TypeCategory::CPP_TYPE && ClassDB::can_instantiate(p_type)) || p_type_category == TypeCategory::OTHER_TYPE; + bool is_virtual = ClassDB::class_exists(p_type) && ClassDB::is_virtual(p_type); - if (can_instantiate && !ClassDB::is_virtual(p_type)) { + if (can_instantiate && !is_virtual) { r_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, icon_fallback)); } else { r_item->set_icon(0, EditorNode::get_singleton()->get_class_icon(p_type, "NodeDisabled")); diff --git a/editor/debugger/editor_debugger_node.cpp b/editor/debugger/editor_debugger_node.cpp index 610f467faa..0a0f0cf90a 100644 --- a/editor/debugger/editor_debugger_node.cpp +++ b/editor/debugger/editor_debugger_node.cpp @@ -36,6 +36,7 @@ #include "editor/editor_log.h" #include "editor/editor_node.h" #include "editor/editor_settings.h" +#include "editor/editor_undo_redo_manager.h" #include "editor/inspector_dock.h" #include "editor/plugins/editor_debugger_plugin.h" #include "editor/plugins/script_editor_plugin.h" @@ -274,6 +275,7 @@ void EditorDebuggerNode::stop(bool p_force) { }); _break_state_changed(); breakpoints.clear(); + EditorNode::get_undo_redo()->clear_history(false, EditorUndoRedoManager::REMOTE_HISTORY); set_process(false); } diff --git a/editor/debugger/script_editor_debugger.cpp b/editor/debugger/script_editor_debugger.cpp index deca638f3b..5cb7016b35 100644 --- a/editor/debugger/script_editor_debugger.cpp +++ b/editor/debugger/script_editor_debugger.cpp @@ -751,7 +751,16 @@ void ScriptEditorDebugger::_set_reason_text(const String &p_reason, MessageType reason->add_theme_color_override("font_color", get_theme_color(SNAME("success_color"), SNAME("Editor"))); } reason->set_text(p_reason); - reason->set_tooltip_text(p_reason.word_wrap(80)); + + const PackedInt32Array boundaries = TS->string_get_word_breaks(p_reason, "", 80); + PackedStringArray lines; + for (int i = 0; i < boundaries.size(); i += 2) { + const int start = boundaries[i]; + const int end = boundaries[i + 1]; + lines.append(p_reason.substr(start, end - start + 1)); + } + + reason->set_tooltip_text(String("\n").join(lines)); } void ScriptEditorDebugger::_notification(int p_what) { diff --git a/editor/doc_tools.cpp b/editor/doc_tools.cpp index 14a2640e63..65e73d8df4 100644 --- a/editor/doc_tools.cpp +++ b/editor/doc_tools.cpp @@ -701,7 +701,7 @@ void DocTools::generate(bool p_basic_types) { if (rt != Variant::NIL) { // Has operator. // Skip String % operator as it's registered separately for each Variant arg type, // we'll add it manually below. - if (i == Variant::STRING && Variant::Operator(j) == Variant::OP_MODULE) { + if ((i == Variant::STRING || i == Variant::STRING_NAME) && Variant::Operator(j) == Variant::OP_MODULE) { continue; } MethodInfo mi; @@ -718,7 +718,7 @@ void DocTools::generate(bool p_basic_types) { } } - if (i == Variant::STRING) { + if (i == Variant::STRING || i == Variant::STRING_NAME) { // We skipped % operator above, and we register it manually once for Variant arg type here. MethodInfo mi; mi.name = "operator %"; diff --git a/editor/editor_file_system.cpp b/editor/editor_file_system.cpp index 678ec04b9d..b98480b594 100644 --- a/editor/editor_file_system.cpp +++ b/editor/editor_file_system.cpp @@ -31,7 +31,7 @@ #include "editor_file_system.h" #include "core/config/project_settings.h" -#include "core/extension/native_extension_manager.h" +#include "core/extension/gdextension_manager.h" #include "core/io/file_access.h" #include "core/io/resource_importer.h" #include "core/io/resource_loader.h" @@ -2335,7 +2335,7 @@ ResourceUID::ID EditorFileSystem::_resource_saver_get_resource_id_for_path(const static void _scan_extensions_dir(EditorFileSystemDirectory *d, HashSet<String> &extensions) { int fc = d->get_file_count(); for (int i = 0; i < fc; i++) { - if (d->get_file_type(i) == SNAME("NativeExtension")) { + if (d->get_file_type(i) == SNAME("GDExtension")) { extensions.insert(d->get_file_path(i)); } } @@ -2356,19 +2356,19 @@ bool EditorFileSystem::_scan_extensions() { Vector<String> extensions_removed; for (const String &E : extensions) { - if (!NativeExtensionManager::get_singleton()->is_extension_loaded(E)) { + if (!GDExtensionManager::get_singleton()->is_extension_loaded(E)) { extensions_added.push_back(E); } } - Vector<String> loaded_extensions = NativeExtensionManager::get_singleton()->get_loaded_extensions(); + Vector<String> loaded_extensions = GDExtensionManager::get_singleton()->get_loaded_extensions(); for (int i = 0; i < loaded_extensions.size(); i++) { if (!extensions.has(loaded_extensions[i])) { extensions_removed.push_back(loaded_extensions[i]); } } - String extension_list_config_file = NativeExtension::get_extension_list_config_file(); + String extension_list_config_file = GDExtension::get_extension_list_config_file(); if (extensions.size()) { if (extensions_added.size() || extensions_removed.size()) { //extensions were added or removed Ref<FileAccess> f = FileAccess::open(extension_list_config_file, FileAccess::WRITE); @@ -2385,18 +2385,18 @@ bool EditorFileSystem::_scan_extensions() { bool needs_restart = false; for (int i = 0; i < extensions_added.size(); i++) { - NativeExtensionManager::LoadStatus st = NativeExtensionManager::get_singleton()->load_extension(extensions_added[i]); - if (st == NativeExtensionManager::LOAD_STATUS_FAILED) { + GDExtensionManager::LoadStatus st = GDExtensionManager::get_singleton()->load_extension(extensions_added[i]); + if (st == GDExtensionManager::LOAD_STATUS_FAILED) { EditorNode::get_singleton()->add_io_error("Error loading extension: " + extensions_added[i]); - } else if (st == NativeExtensionManager::LOAD_STATUS_NEEDS_RESTART) { + } else if (st == GDExtensionManager::LOAD_STATUS_NEEDS_RESTART) { needs_restart = true; } } for (int i = 0; i < extensions_removed.size(); i++) { - NativeExtensionManager::LoadStatus st = NativeExtensionManager::get_singleton()->unload_extension(extensions_removed[i]); - if (st == NativeExtensionManager::LOAD_STATUS_FAILED) { + GDExtensionManager::LoadStatus st = GDExtensionManager::get_singleton()->unload_extension(extensions_removed[i]); + if (st == GDExtensionManager::LOAD_STATUS_FAILED) { EditorNode::get_singleton()->add_io_error("Error removing extension: " + extensions_added[i]); - } else if (st == NativeExtensionManager::LOAD_STATUS_NEEDS_RESTART) { + } else if (st == GDExtensionManager::LOAD_STATUS_NEEDS_RESTART) { needs_restart = true; } } diff --git a/editor/editor_help.cpp b/editor/editor_help.cpp index 6bd67fbcb9..21119048cb 100644 --- a/editor/editor_help.cpp +++ b/editor/editor_help.cpp @@ -55,8 +55,6 @@ void EditorHelp::_update_theme() { qualifier_color = get_theme_color(SNAME("qualifier_color"), SNAME("EditorHelp")); type_color = get_theme_color(SNAME("type_color"), SNAME("EditorHelp")); - class_desc->add_theme_style_override("normal", get_theme_stylebox(SNAME("background"), SNAME("EditorHelp"))); - class_desc->add_theme_style_override("focus", get_theme_stylebox(SNAME("background"), SNAME("EditorHelp"))); class_desc->add_theme_color_override("selection_color", get_theme_color(SNAME("selection_color"), SNAME("EditorHelp"))); class_desc->add_theme_constant_override("line_separation", get_theme_constant(SNAME("line_separation"), SNAME("EditorHelp"))); class_desc->add_theme_constant_override("table_h_separation", get_theme_constant(SNAME("table_h_separation"), SNAME("EditorHelp"))); @@ -196,10 +194,11 @@ void EditorHelp::_class_desc_resized(bool p_force_update_theme) { if (display_margin != new_display_margin || p_force_update_theme) { display_margin = new_display_margin; - Ref<StyleBox> class_desc_stylebox = EditorNode::get_singleton()->get_theme_base()->get_theme_stylebox(SNAME("normal"), SNAME("RichTextLabel"))->duplicate(); + Ref<StyleBox> class_desc_stylebox = EditorNode::get_singleton()->get_theme_base()->get_theme_stylebox(SNAME("background"), SNAME("EditorHelp"))->duplicate(); class_desc_stylebox->set_default_margin(SIDE_LEFT, display_margin); class_desc_stylebox->set_default_margin(SIDE_RIGHT, display_margin); class_desc->add_theme_style_override("normal", class_desc_stylebox); + class_desc->add_theme_style_override("focused", class_desc_stylebox); } } diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp index 286dcf4b8e..b48fbb805a 100644 --- a/editor/editor_help_search.cpp +++ b/editor/editor_help_search.cpp @@ -443,6 +443,10 @@ bool EditorHelpSearch::Runner::_phase_member_items_init() { } bool EditorHelpSearch::Runner::_phase_member_items() { + if (!iterator_match) { + return true; + } + ClassMatch &match = iterator_match->value; if (!match.doc || match.doc->name.is_empty()) { diff --git a/editor/editor_inspector.cpp b/editor/editor_inspector.cpp index a5397a8e6a..e2ed264645 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -1172,6 +1172,36 @@ void EditorInspectorSection::_test_unfold() { } } +Ref<Texture2D> EditorInspectorSection::_get_arrow() { + Ref<Texture2D> arrow; + if (foldable) { + if (object->editor_is_section_unfolded(section)) { + arrow = get_theme_icon(SNAME("arrow"), SNAME("Tree")); + } else { + if (is_layout_rtl()) { + arrow = get_theme_icon(SNAME("arrow_collapsed_mirrored"), SNAME("Tree")); + } else { + arrow = get_theme_icon(SNAME("arrow_collapsed"), SNAME("Tree")); + } + } + } + return arrow; +} + +int EditorInspectorSection::_get_header_height() { + Ref<Font> font = get_theme_font(SNAME("bold"), SNAME("EditorFonts")); + int font_size = get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts")); + + int header_height = font->get_height(font_size); + Ref<Texture2D> arrow = _get_arrow(); + if (arrow.is_valid()) { + header_height = MAX(header_height, arrow->get_height()); + } + header_height += get_theme_constant(SNAME("v_separation"), SNAME("Tree")); + + return header_height; +} + void EditorInspectorSection::_notification(int p_what) { switch (p_what) { case NOTIFICATION_THEME_CHANGED: { @@ -1182,30 +1212,6 @@ void EditorInspectorSection::_notification(int p_what) { if (!vbox_added) { return; } - // Get the section header font. - Ref<Font> font = get_theme_font(SNAME("bold"), SNAME("EditorFonts")); - int font_size = get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts")); - - // Get the right direction arrow texture, if the section is foldable. - Ref<Texture2D> arrow; - if (foldable) { - if (object->editor_is_section_unfolded(section)) { - arrow = get_theme_icon(SNAME("arrow"), SNAME("Tree")); - } else { - if (is_layout_rtl()) { - arrow = get_theme_icon(SNAME("arrow_collapsed_mirrored"), SNAME("Tree")); - } else { - arrow = get_theme_icon(SNAME("arrow_collapsed"), SNAME("Tree")); - } - } - } - - // Compute the height of the section header. - int header_height = font->get_height(font_size); - if (arrow.is_valid()) { - header_height = MAX(header_height, arrow->get_height()); - } - header_height += get_theme_constant(SNAME("v_separation"), SNAME("Tree")); int inspector_margin = get_theme_constant(SNAME("inspector_margin"), SNAME("Editor")); int section_indent_size = get_theme_constant(SNAME("indent_size"), SNAME("EditorInspectorSection")); @@ -1218,6 +1224,7 @@ void EditorInspectorSection::_notification(int p_what) { } Size2 size = get_size() - Vector2(inspector_margin, 0); + int header_height = _get_header_height(); Vector2 offset = Vector2(is_layout_rtl() ? 0 : inspector_margin, header_height); for (int i = 0; i < get_child_count(); i++) { Control *c = Object::cast_to<Control>(get_child(i)); @@ -1233,36 +1240,6 @@ void EditorInspectorSection::_notification(int p_what) { } break; case NOTIFICATION_DRAW: { - // Get the section header font. - Ref<Font> font = get_theme_font(SNAME("bold"), SNAME("EditorFonts")); - int font_size = get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts")); - Color font_color = get_theme_color(SNAME("font_color"), SNAME("Editor")); - - // Get the right direction arrow texture, if the section is foldable. - Ref<Texture2D> arrow; - bool folded = foldable; - if (foldable) { - if (object->editor_is_section_unfolded(section)) { - arrow = get_theme_icon(SNAME("arrow"), SNAME("Tree")); - folded = false; - } else { - if (is_layout_rtl()) { - arrow = get_theme_icon(SNAME("arrow_collapsed_mirrored"), SNAME("Tree")); - } else { - arrow = get_theme_icon(SNAME("arrow_collapsed"), SNAME("Tree")); - } - } - } - - bool rtl = is_layout_rtl(); - - // Compute the height and width of the section header. - int header_height = font->get_height(font_size); - if (arrow.is_valid()) { - header_height = MAX(header_height, arrow->get_height()); - } - header_height += get_theme_constant(SNAME("v_separation"), SNAME("Tree")); - int section_indent = 0; int section_indent_size = get_theme_constant(SNAME("indent_size"), SNAME("EditorInspectorSection")); if (indent_depth > 0 && section_indent_size > 0) { @@ -1275,11 +1252,13 @@ void EditorInspectorSection::_notification(int p_what) { int header_width = get_size().width - section_indent; int header_offset_x = 0.0; + bool rtl = is_layout_rtl(); if (!rtl) { header_offset_x += section_indent; } // Draw header area. + int header_height = _get_header_height(); Rect2 header_rect = Rect2(Vector2(header_offset_x, 0.0), Vector2(header_width, header_height)); Color c = bg_color; c.a *= 0.4; @@ -1288,7 +1267,7 @@ void EditorInspectorSection::_notification(int p_what) { } draw_rect(header_rect, c); - // Draw header title, folding arrow and coutn of revertable properties. + // Draw header title, folding arrow and count of revertable properties. { int separation = Math::round(2 * EDSCALE); @@ -1296,6 +1275,7 @@ void EditorInspectorSection::_notification(int p_what) { int margin_end = separation; // - Arrow. + Ref<Texture2D> arrow = _get_arrow(); if (arrow.is_valid()) { Point2 arrow_position; if (rtl) { @@ -1313,6 +1293,13 @@ void EditorInspectorSection::_notification(int p_what) { // - Count of revertable properties. String num_revertable_str; int num_revertable_width = 0; + + bool folded = foldable && !object->editor_is_section_unfolded(section); + + Ref<Font> font = get_theme_font(SNAME("bold"), SNAME("EditorFonts")); + int font_size = get_theme_font_size(SNAME("bold_size"), SNAME("EditorFonts")); + Color font_color = get_theme_color(SNAME("font_color"), SNAME("Editor")); + if (folded && revertable_properties.size()) { int label_width = font->get_string_size(label, HORIZONTAL_ALIGNMENT_LEFT, available, font_size, TextServer::JUSTIFICATION_KASHIDA | TextServer::JUSTIFICATION_CONSTRAIN_ELLIPSIS).x; @@ -1481,10 +1468,12 @@ void EditorInspectorSection::gui_input(const Ref<InputEvent> &p_event) { Ref<InputEventMouseButton> mb = p_event; if (mb.is_valid() && mb->is_pressed() && mb->get_button_index() == MouseButton::LEFT) { - Ref<Font> font = get_theme_font(SNAME("font"), SNAME("Tree")); - int font_size = get_theme_font_size(SNAME("font_size"), SNAME("Tree")); - if (mb->get_position().y > font->get_height(font_size)) { //clicked outside - return; + if (object->editor_is_section_unfolded(section)) { + int header_height = _get_header_height(); + + if (mb->get_position().y >= header_height) { + return; + } } accept_event(); @@ -2597,7 +2586,7 @@ bool EditorInspector::_is_property_disabled_by_feature_profile(const StringName return false; } -void EditorInspector::update_tree() { +void EditorInspector::_update_tree() { //to update properly if all is refreshed StringName current_selected = property_selected; int current_focusable = -1; @@ -3316,6 +3305,10 @@ void EditorInspector::update_tree() { } } +void EditorInspector::update_tree() { + update_tree_pending = true; +} + void EditorInspector::update_property(const String &p_prop) { if (!editor_property_map.has(p_prop)) { return; @@ -3863,6 +3856,10 @@ void EditorInspector::_notification(int p_what) { _update_inspector_bg(); } break; + case NOTIFICATION_THEME_CHANGED: { + update_tree(); + } break; + case NOTIFICATION_ENTER_TREE: { if (!sub_inspector) { get_tree()->connect("node_removed", callable_mp(this, &EditorInspector::_node_removed)); @@ -3910,10 +3907,9 @@ void EditorInspector::_notification(int p_what) { changing++; if (update_tree_pending) { - update_tree(); update_tree_pending = false; pending.clear(); - + _update_tree(); } else { while (pending.size()) { StringName prop = *pending.begin(); diff --git a/editor/editor_inspector.h b/editor/editor_inspector.h index 41651494ce..53490f0880 100644 --- a/editor/editor_inspector.h +++ b/editor/editor_inspector.h @@ -280,6 +280,8 @@ class EditorInspectorSection : public Container { HashSet<StringName> revertable_properties; void _test_unfold(); + int _get_header_height(); + Ref<Texture2D> _get_arrow(); protected: Object *object = nullptr; @@ -540,6 +542,8 @@ class EditorInspector : public ScrollContainer { void _show_add_meta_dialog(); void _check_meta_name(const String &p_name); + void _update_tree(); + protected: static void _bind_methods(); void _notification(int p_what); diff --git a/editor/editor_layouts_dialog.cpp b/editor/editor_layouts_dialog.cpp index 886e29a504..33d9a410e2 100644 --- a/editor/editor_layouts_dialog.cpp +++ b/editor/editor_layouts_dialog.cpp @@ -33,6 +33,7 @@ #include "core/io/config_file.h" #include "core/object/class_db.h" #include "core/os/keyboard.h" +#include "editor/editor_scale.h" #include "editor/editor_settings.h" #include "scene/gui/item_list.h" #include "scene/gui/line_edit.h" @@ -106,7 +107,10 @@ EditorLayoutsDialog::EditorLayoutsDialog() { makevb->set_anchor_and_offset(SIDE_RIGHT, Control::ANCHOR_END, -5); layout_names = memnew(ItemList); + layout_names->set_auto_height(true); + makevb->add_margin_child(TTR("Select existing layout:"), layout_names); makevb->add_child(layout_names); + layout_names->set_custom_minimum_size(Size2(300 * EDSCALE, 1)); layout_names->set_visible(true); layout_names->set_offset(SIDE_TOP, 5); layout_names->set_anchor_and_offset(SIDE_LEFT, Control::ANCHOR_BEGIN, 5); @@ -116,8 +120,10 @@ EditorLayoutsDialog::EditorLayoutsDialog() { layout_names->set_allow_rmb_select(true); name = memnew(LineEdit); + name->set_placeholder("Or enter new layout name"); makevb->add_child(name); name->set_offset(SIDE_TOP, 5); + name->set_custom_minimum_size(Size2(300 * EDSCALE, 1)); name->set_anchor_and_offset(SIDE_LEFT, Control::ANCHOR_BEGIN, 5); name->set_anchor_and_offset(SIDE_RIGHT, Control::ANCHOR_END, -5); name->connect("gui_input", callable_mp(this, &EditorLayoutsDialog::_line_gui_input)); diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp index 06e1e8b22e..a70a40c5a1 100644 --- a/editor/editor_node.cpp +++ b/editor/editor_node.cpp @@ -96,6 +96,7 @@ #include "editor/export/editor_export.h" #include "editor/export/export_template_manager.h" #include "editor/export/project_export.h" +#include "editor/fbx_importer_manager.h" #include "editor/filesystem_dock.h" #include "editor/history_dock.h" #include "editor/import/audio_stream_import_settings.h" @@ -437,8 +438,6 @@ void EditorNode::_update_from_settings() { bool glow_bicubic = int(GLOBAL_GET("rendering/environment/glow/upscale_mode")) > 0; RS::get_singleton()->environment_set_ssil_quality(RS::EnvironmentSSILQuality(int(GLOBAL_GET("rendering/environment/ssil/quality"))), GLOBAL_GET("rendering/environment/ssil/half_size"), GLOBAL_GET("rendering/environment/ssil/adaptive_target"), GLOBAL_GET("rendering/environment/ssil/blur_passes"), GLOBAL_GET("rendering/environment/ssil/fadeout_from"), GLOBAL_GET("rendering/environment/ssil/fadeout_to")); RS::get_singleton()->environment_glow_set_use_bicubic_upscale(glow_bicubic); - bool glow_high_quality = GLOBAL_GET("rendering/environment/glow/use_high_quality"); - RS::get_singleton()->environment_glow_set_use_high_quality(glow_high_quality); RS::EnvironmentSSRRoughnessQuality ssr_roughness_quality = RS::EnvironmentSSRRoughnessQuality(int(GLOBAL_GET("rendering/environment/screen_space_reflection/roughness_quality"))); RS::get_singleton()->environment_set_ssr_roughness_quality(ssr_roughness_quality); RS::SubSurfaceScatteringQuality sss_quality = RS::SubSurfaceScatteringQuality(int(GLOBAL_GET("rendering/environment/subsurface_scattering/subsurface_scattering_quality"))); @@ -2756,11 +2755,20 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { log->add_message(TTR("Can't undo while mouse buttons are pressed."), EditorLog::MSG_TYPE_EDITOR); } else { String action = editor_data.get_undo_redo()->get_current_action_name(); - + int id = editor_data.get_undo_redo()->get_current_action_history_id(); if (!editor_data.get_undo_redo()->undo()) { log->add_message(TTR("Nothing to undo."), EditorLog::MSG_TYPE_EDITOR); } else if (!action.is_empty()) { - log->add_message(vformat(TTR("Undo: %s"), action), EditorLog::MSG_TYPE_EDITOR); + switch (id) { + case EditorUndoRedoManager::GLOBAL_HISTORY: + log->add_message(vformat(TTR("Global Undo: %s"), action), EditorLog::MSG_TYPE_EDITOR); + break; + case EditorUndoRedoManager::REMOTE_HISTORY: + log->add_message(vformat(TTR("Remote Undo: %s"), action), EditorLog::MSG_TYPE_EDITOR); + break; + default: + log->add_message(vformat(TTR("Scene Undo: %s"), action), EditorLog::MSG_TYPE_EDITOR); + } } } } break; @@ -2772,7 +2780,20 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { log->add_message(TTR("Nothing to redo."), EditorLog::MSG_TYPE_EDITOR); } else { String action = editor_data.get_undo_redo()->get_current_action_name(); - log->add_message(vformat(TTR("Redo: %s"), action), EditorLog::MSG_TYPE_EDITOR); + if (action.is_empty()) { + break; + } + + switch (editor_data.get_undo_redo()->get_current_action_history_id()) { + case EditorUndoRedoManager::GLOBAL_HISTORY: + log->add_message(vformat(TTR("Global Redo: %s"), action), EditorLog::MSG_TYPE_EDITOR); + break; + case EditorUndoRedoManager::REMOTE_HISTORY: + log->add_message(vformat(TTR("Remote Redo: %s"), action), EditorLog::MSG_TYPE_EDITOR); + break; + default: + log->add_message(vformat(TTR("Scene Redo: %s"), action), EditorLog::MSG_TYPE_EDITOR); + } } } } break; @@ -2961,7 +2982,11 @@ void EditorNode::_menu_option_confirm(int p_option, bool p_confirmed) { } break; case SETTINGS_MANAGE_EXPORT_TEMPLATES: { export_template_manager->popup_manager(); - + } break; + case SETTINGS_MANAGE_FBX_IMPORTER: { +#if !defined(ANDROID_ENABLED) && !defined(WEB_ENABLED) + fbx_importer_manager->show_dialog(); +#endif } break; case SETTINGS_INSTALL_ANDROID_BUILD_TEMPLATE: { custom_build_manage_templates->hide(); @@ -6038,14 +6063,7 @@ EditorNode::EditorNode() { Input *id = Input::get_singleton(); if (id) { - bool found_touchscreen = false; - for (int i = 0; i < DisplayServer::get_singleton()->get_screen_count(); i++) { - if (DisplayServer::get_singleton()->screen_is_touchscreen(i)) { - found_touchscreen = true; - } - } - - if (!found_touchscreen && Input::get_singleton()) { + if (!DisplayServer::get_singleton()->is_touchscreen_available() && Input::get_singleton()) { // Only if no touchscreen ui hint, disable emulation just in case. id->set_emulate_touch_from_mouse(false); } @@ -6611,6 +6629,11 @@ EditorNode::EditorNode() { gui_base->add_child(about); feature_profile_manager->connect("current_feature_profile_changed", callable_mp(this, &EditorNode::_feature_profile_changed)); +#if !defined(ANDROID_ENABLED) && !defined(WEB_ENABLED) + fbx_importer_manager = memnew(FBXImporterManager); + gui_base->add_child(fbx_importer_manager); +#endif + warning = memnew(AcceptDialog); warning->add_button(TTR("Copy Text"), true, "copy"); gui_base->add_child(warning); @@ -6783,6 +6806,9 @@ EditorNode::EditorNode() { #ifndef ANDROID_ENABLED settings_menu->add_item(TTR("Manage Export Templates..."), SETTINGS_MANAGE_EXPORT_TEMPLATES); #endif +#if !defined(ANDROID_ENABLED) && !defined(WEB_ENABLED) + settings_menu->add_item(TTR("Configure FBX Importer..."), SETTINGS_MANAGE_FBX_IMPORTER); +#endif help_menu = memnew(PopupMenu); help_menu->set_name(TTR("Help")); diff --git a/editor/editor_node.h b/editor/editor_node.h index c430662c7f..950970379d 100644 --- a/editor/editor_node.h +++ b/editor/editor_node.h @@ -77,6 +77,7 @@ class EditorSettingsDialog; class EditorToaster; class EditorUndoRedoManager; class ExportTemplateManager; +class FBXImporterManager; class FileDialog; class FileSystemDock; class HistoryDock; @@ -209,6 +210,7 @@ private: SETTINGS_EDITOR_DATA_FOLDER, SETTINGS_EDITOR_CONFIG_FOLDER, SETTINGS_MANAGE_EXPORT_TEMPLATES, + SETTINGS_MANAGE_FBX_IMPORTER, SETTINGS_MANAGE_FEATURE_PROFILES, SETTINGS_INSTALL_ANDROID_BUILD_TEMPLATE, SETTINGS_PICK_MAIN_SCENE, @@ -285,6 +287,8 @@ private: ProjectExportDialog *project_export = nullptr; ProjectSettingsEditor *project_settings_editor = nullptr; + FBXImporterManager *fbx_importer_manager = nullptr; + Vector<EditorPlugin *> editor_plugins; bool _initializing_plugins = false; HashMap<String, EditorPlugin *> addon_name_to_plugin; diff --git a/editor/editor_property_name_processor.cpp b/editor/editor_property_name_processor.cpp index 9587e65cad..e8a0912d66 100644 --- a/editor/editor_property_name_processor.cpp +++ b/editor/editor_property_name_processor.cpp @@ -231,6 +231,7 @@ EditorPropertyNameProcessor::EditorPropertyNameProcessor() { capitalize_string_remaps["tcp"] = "TCP"; capitalize_string_remaps["tls"] = "TLS"; capitalize_string_remaps["ui"] = "UI"; + capitalize_string_remaps["uri"] = "URI"; capitalize_string_remaps["url"] = "URL"; capitalize_string_remaps["urls"] = "URLs"; capitalize_string_remaps["us"] = String::utf8("(µs)"); // Unit. diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp index c44fe04442..79b03febdc 100644 --- a/editor/editor_settings.cpp +++ b/editor/editor_settings.cpp @@ -734,6 +734,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) { // TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. EDITOR_SETTING(Variant::INT, PROPERTY_HINT_ENUM, "project_manager/sorting_order", 0, "Last Edited,Name,Path") + EDITOR_SETTING(Variant::STRING, PROPERTY_HINT_NONE, "project_manager/default_renderer", "forward_plus", "forward_plus,mobile,gl_compatibility") if (p_extra_config.is_valid()) { if (p_extra_config->has_section("init_projects") && p_extra_config->has_section_key("init_projects", "list")) { diff --git a/editor/editor_undo_redo_manager.cpp b/editor/editor_undo_redo_manager.cpp index 4bfa9b686c..780ea2fd23 100644 --- a/editor/editor_undo_redo_manager.cpp +++ b/editor/editor_undo_redo_manager.cpp @@ -33,6 +33,7 @@ #include "core/io/resource.h" #include "core/os/os.h" #include "core/templates/local_vector.h" +#include "editor/debugger/editor_debugger_inspector.h" #include "editor/debugger/editor_debugger_node.h" #include "editor/editor_log.h" #include "editor/editor_node.h" @@ -59,6 +60,10 @@ UndoRedo *EditorUndoRedoManager::get_history_undo_redo(int p_idx) const { int EditorUndoRedoManager::get_history_id_for_object(Object *p_object) const { int history_id = INVALID_HISTORY; + if (Object::cast_to<EditorDebuggerRemoteObject>(p_object)) { + return REMOTE_HISTORY; + } + if (Node *node = Object::cast_to<Node>(p_object)) { Node *edited_scene = EditorNode::get_singleton()->get_edited_scene(); @@ -265,27 +270,9 @@ bool EditorUndoRedoManager::undo() { return false; } - int selected_history = INVALID_HISTORY; - double global_timestamp = 0; - - // Pick the history with greatest last action timestamp (either global or current scene). - { - History &history = get_or_create_history(GLOBAL_HISTORY); - if (!history.undo_stack.is_empty()) { - selected_history = history.id; - global_timestamp = history.undo_stack.back()->get().timestamp; - } - } - - { - History &history = get_or_create_history(EditorNode::get_editor_data().get_current_edited_scene_history_id()); - if (!history.undo_stack.is_empty() && history.undo_stack.back()->get().timestamp > global_timestamp) { - selected_history = history.id; - } - } - - if (selected_history != INVALID_HISTORY) { - return undo_history(selected_history); + History *selected_history = _get_newest_undo(); + if (selected_history) { + return undo_history(selected_history->id); } return false; } @@ -323,6 +310,14 @@ bool EditorUndoRedoManager::redo() { } { + History &history = get_or_create_history(REMOTE_HISTORY); + if (!history.redo_stack.is_empty() && history.redo_stack.back()->get().timestamp < global_timestamp) { + selected_history = history.id; + global_timestamp = history.redo_stack.back()->get().timestamp; + } + } + + { History &history = get_or_create_history(EditorNode::get_editor_data().get_current_edited_scene_history_id()); if (!history.redo_stack.is_empty() && history.redo_stack.back()->get().timestamp < global_timestamp) { selected_history = history.id; @@ -367,7 +362,7 @@ bool EditorUndoRedoManager::is_history_unsaved(int p_id) { bool EditorUndoRedoManager::has_undo() { for (const KeyValue<int, History> &E : history_map) { - if ((E.key == GLOBAL_HISTORY || E.key == EditorNode::get_editor_data().get_current_edited_scene_history_id()) && !E.value.undo_stack.is_empty()) { + if ((E.key == GLOBAL_HISTORY || E.key == REMOTE_HISTORY || E.key == EditorNode::get_editor_data().get_current_edited_scene_history_id()) && !E.value.undo_stack.is_empty()) { return true; } } @@ -376,7 +371,7 @@ bool EditorUndoRedoManager::has_undo() { bool EditorUndoRedoManager::has_redo() { for (const KeyValue<int, History> &E : history_map) { - if ((E.key == GLOBAL_HISTORY || E.key == EditorNode::get_editor_data().get_current_edited_scene_history_id()) && !E.value.redo_stack.is_empty()) { + if ((E.key == GLOBAL_HISTORY || E.key == REMOTE_HISTORY || E.key == EditorNode::get_editor_data().get_current_edited_scene_history_id()) && !E.value.redo_stack.is_empty()) { return true; } } @@ -385,7 +380,11 @@ bool EditorUndoRedoManager::has_redo() { void EditorUndoRedoManager::clear_history(bool p_increase_version, int p_idx) { if (p_idx != INVALID_HISTORY) { - get_or_create_history(p_idx).undo_redo->clear_history(p_increase_version); + History &history = get_or_create_history(p_idx); + history.undo_redo->clear_history(p_increase_version); + history.undo_stack.clear(); + history.redo_stack.clear(); + if (!p_increase_version) { set_history_as_saved(p_idx); } @@ -402,25 +401,7 @@ void EditorUndoRedoManager::clear_history(bool p_increase_version, int p_idx) { String EditorUndoRedoManager::get_current_action_name() { if (has_undo()) { - History *selected_history = nullptr; - double global_timestamp = 0; - - // Pick the history with greatest last action timestamp (either global or current scene). - { - History &history = get_or_create_history(GLOBAL_HISTORY); - if (!history.undo_stack.is_empty()) { - selected_history = &history; - global_timestamp = history.undo_stack.back()->get().timestamp; - } - } - - { - History &history = get_or_create_history(EditorNode::get_editor_data().get_current_edited_scene_history_id()); - if (!history.undo_stack.is_empty() && history.undo_stack.back()->get().timestamp > global_timestamp) { - selected_history = &history; - } - } - + History *selected_history = _get_newest_undo(); if (selected_history) { return selected_history->undo_redo->get_current_action_name(); } @@ -428,6 +409,16 @@ String EditorUndoRedoManager::get_current_action_name() { return ""; } +int EditorUndoRedoManager::get_current_action_history_id() { + if (has_undo()) { + History *selected_history = _get_newest_undo(); + if (selected_history) { + return selected_history->id; + } + } + return INVALID_HISTORY; +} + void EditorUndoRedoManager::discard_history(int p_idx, bool p_erase_from_map) { ERR_FAIL_COND(!history_map.has(p_idx)); History &history = history_map[p_idx]; @@ -442,6 +433,37 @@ void EditorUndoRedoManager::discard_history(int p_idx, bool p_erase_from_map) { } } +EditorUndoRedoManager::History *EditorUndoRedoManager::_get_newest_undo() { + History *selected_history = nullptr; + double global_timestamp = 0; + + // Pick the history with greatest last action timestamp (either global or current scene). + { + History &history = get_or_create_history(GLOBAL_HISTORY); + if (!history.undo_stack.is_empty()) { + selected_history = &history; + global_timestamp = history.undo_stack.back()->get().timestamp; + } + } + + { + History &history = get_or_create_history(REMOTE_HISTORY); + if (!history.undo_stack.is_empty() && history.undo_stack.back()->get().timestamp > global_timestamp) { + selected_history = &history; + global_timestamp = history.undo_stack.back()->get().timestamp; + } + } + + { + History &history = get_or_create_history(EditorNode::get_editor_data().get_current_edited_scene_history_id()); + if (!history.undo_stack.is_empty() && history.undo_stack.back()->get().timestamp > global_timestamp) { + selected_history = &history; + } + } + + return selected_history; +} + void EditorUndoRedoManager::_bind_methods() { ClassDB::bind_method(D_METHOD("create_action", "name", "merge_mode", "custom_context"), &EditorUndoRedoManager::create_action, DEFVAL(UndoRedo::MERGE_DISABLE), DEFVAL((Object *)nullptr)); ClassDB::bind_method(D_METHOD("commit_action", "execute"), &EditorUndoRedoManager::commit_action, DEFVAL(true)); @@ -477,6 +499,7 @@ void EditorUndoRedoManager::_bind_methods() { ADD_SIGNAL(MethodInfo("version_changed")); BIND_ENUM_CONSTANT(GLOBAL_HISTORY); + BIND_ENUM_CONSTANT(REMOTE_HISTORY); BIND_ENUM_CONSTANT(INVALID_HISTORY); } diff --git a/editor/editor_undo_redo_manager.h b/editor/editor_undo_redo_manager.h index 60bcd059df..74911180f0 100644 --- a/editor/editor_undo_redo_manager.h +++ b/editor/editor_undo_redo_manager.h @@ -41,6 +41,7 @@ class EditorUndoRedoManager : public RefCounted { public: enum SpecialHistory { GLOBAL_HISTORY = 0, + REMOTE_HISTORY = -9, INVALID_HISTORY = -99, }; @@ -65,6 +66,8 @@ private: bool is_committing = false; + History *_get_newest_undo(); + protected: static void _bind_methods(); @@ -126,6 +129,7 @@ public: bool has_redo(); String get_current_action_name(); + int get_current_action_history_id(); void discard_history(int p_idx, bool p_erase_from_map = true); ~EditorUndoRedoManager(); diff --git a/editor/editor_vcs_interface.cpp b/editor/editor_vcs_interface.cpp index d22c7bd149..3a6516fbfa 100644 --- a/editor/editor_vcs_interface.cpp +++ b/editor/editor_vcs_interface.cpp @@ -57,7 +57,7 @@ void EditorVCSInterface::set_credentials(String p_username, String p_password, S } List<String> EditorVCSInterface::get_remotes() { - TypedArray<Dictionary> result; + TypedArray<String> result; if (!GDVIRTUAL_CALL(_get_remotes, result)) { UNIMPLEMENTED(); return {}; @@ -137,7 +137,7 @@ List<EditorVCSInterface::Commit> EditorVCSInterface::get_previous_commits(int p_ } List<String> EditorVCSInterface::get_branch_list() { - TypedArray<Dictionary> result; + TypedArray<String> result; if (!GDVIRTUAL_CALL(_get_branch_list, result)) { UNIMPLEMENTED(); return {}; diff --git a/editor/editor_vcs_interface.h b/editor/editor_vcs_interface.h index 5d4901cefa..c93fe4a672 100644 --- a/editor/editor_vcs_interface.h +++ b/editor/editor_vcs_interface.h @@ -117,8 +117,8 @@ protected: GDVIRTUAL0R(bool, _shut_down); GDVIRTUAL0R(String, _get_vcs_name); GDVIRTUAL1R(TypedArray<Dictionary>, _get_previous_commits, int); - GDVIRTUAL0R(TypedArray<Dictionary>, _get_branch_list); - GDVIRTUAL0R(TypedArray<Dictionary>, _get_remotes); + GDVIRTUAL0R(TypedArray<String>, _get_branch_list); + GDVIRTUAL0R(TypedArray<String>, _get_remotes); GDVIRTUAL1(_create_branch, String); GDVIRTUAL1(_remove_branch, String); GDVIRTUAL2(_create_remote, String, String); diff --git a/editor/export/editor_export_platform.cpp b/editor/export/editor_export_platform.cpp index c01db215da..d0dcbc3bfd 100644 --- a/editor/export/editor_export_platform.cpp +++ b/editor/export/editor_export_platform.cpp @@ -32,7 +32,7 @@ #include "core/config/project_settings.h" #include "core/crypto/crypto_core.h" -#include "core/extension/native_extension.h" +#include "core/extension/gdextension.h" #include "core/io/file_access_encrypted.h" #include "core/io/file_access_pack.h" // PACK_HEADER_MAGIC, PACK_FORMAT_VERSION #include "core/io/zip_io.h" @@ -1267,7 +1267,7 @@ Error EditorExportPlatform::export_project_files(const Ref<EditorExportPreset> & } } - String extension_list_config_file = NativeExtension::get_extension_list_config_file(); + String extension_list_config_file = GDExtension::get_extension_list_config_file(); if (FileAccess::exists(extension_list_config_file)) { Vector<uint8_t> array = FileAccess::get_file_as_bytes(extension_list_config_file); err = p_func(p_udata, extension_list_config_file, array, idx, total, enc_in_filters, enc_ex_filters, key); diff --git a/editor/export/editor_export_platform_pc.cpp b/editor/export/editor_export_platform_pc.cpp index 5345346c48..9de2f94900 100644 --- a/editor/export/editor_export_platform_pc.cpp +++ b/editor/export/editor_export_platform_pc.cpp @@ -81,8 +81,8 @@ bool EditorExportPlatformPC::has_valid_export_configuration(const Ref<EditorExpo // Look for export templates (first official, and if defined custom templates). String arch = p_preset->get("binary_format/architecture"); - bool dvalid = exists_export_template(get_template_file_name("template_debug", arch), &err); - bool rvalid = exists_export_template(get_template_file_name("template_release", arch), &err); + bool dvalid = exists_export_template(get_template_file_name("debug", arch), &err); + bool rvalid = exists_export_template(get_template_file_name("release", arch), &err); if (p_preset->get("custom_template/debug") != "") { dvalid = FileAccess::exists(p_preset->get("custom_template/debug")); diff --git a/editor/export/editor_export_plugin.h b/editor/export/editor_export_plugin.h index 3f37ed40be..88eeaf821d 100644 --- a/editor/export/editor_export_plugin.h +++ b/editor/export/editor_export_plugin.h @@ -31,7 +31,7 @@ #ifndef EDITOR_EXPORT_PLUGIN_H #define EDITOR_EXPORT_PLUGIN_H -#include "core/extension/native_extension.h" +#include "core/extension/gdextension.h" #include "editor_export_preset.h" #include "editor_export_shared_object.h" #include "scene/main/node.h" diff --git a/editor/fbx_importer_manager.cpp b/editor/fbx_importer_manager.cpp new file mode 100644 index 0000000000..b258fe7e09 --- /dev/null +++ b/editor/fbx_importer_manager.cpp @@ -0,0 +1,158 @@ +/*************************************************************************/ +/* fbx_importer_manager.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "fbx_importer_manager.h" + +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" +#include "scene/gui/link_button.h" + +void FBXImporterManager::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_READY: { + connect("confirmed", callable_mp(this, &FBXImporterManager::_path_confirmed)); + } break; + } +} + +void FBXImporterManager::show_dialog(bool p_exclusive) { + String fbx2gltf_path = EDITOR_GET("filesystem/import/fbx/fbx2gltf_path"); + fbx_path->set_text(fbx2gltf_path); + _validate_path(fbx2gltf_path); + + set_flag(Window::FLAG_BORDERLESS, p_exclusive); // Avoid closing accidentally . + set_close_on_escape(!p_exclusive); + + popup_centered(); +} + +void FBXImporterManager::_validate_path(const String &p_path) { + String error; + bool success = false; + + if (p_path == "") { + error = TTR("Path to FBX2glTF executable is empty."); + } else if (!FileAccess::exists(p_path)) { + error = TTR("Path to FBX2glTF executable is invalid."); + } else { + List<String> args; + args.push_back("--version"); + int exitcode; + Error err = OS::get_singleton()->execute(p_path, args, nullptr, &exitcode); + + if (err == OK && exitcode == 0) { + success = true; + } else { + error = TTR("Error executing this file (wrong version or architecture)."); + } + } + + if (success) { + path_status->set_text(TTR("FBX2glTF executable is valid.")); + path_status->add_theme_color_override("font_color", path_status->get_theme_color(SNAME("success_color"), SNAME("Editor"))); + get_ok_button()->set_disabled(false); + } else { + path_status->set_text(error); + path_status->add_theme_color_override("font_color", path_status->get_theme_color(SNAME("error_color"), SNAME("Editor"))); + get_ok_button()->set_disabled(true); + } +} + +void FBXImporterManager::_select_file(const String &p_path) { + fbx_path->set_text(p_path); + _validate_path(p_path); +} + +void FBXImporterManager::_path_confirmed() { + String path = fbx_path->get_text(); + EditorSettings::get_singleton()->set("filesystem/import/fbx/fbx2gltf_path", path); + EditorSettings::get_singleton()->save(); +} + +void FBXImporterManager::_browse_install() { + if (fbx_path->get_text() != String()) { + browse_dialog->set_current_file(fbx_path->get_text()); + } + + browse_dialog->popup_centered_ratio(); +} + +FBXImporterManager *FBXImporterManager::singleton = nullptr; + +FBXImporterManager::FBXImporterManager() { + singleton = this; + + set_title(TTR("Configure FBX Importer")); + + VBoxContainer *vb = memnew(VBoxContainer); + vb->add_child(memnew(Label(TTR("FBX2glTF is required for importing FBX files.\nPlease download it and provide a valid path to the binary:")))); + LinkButton *lb = memnew(LinkButton); + lb->set_text(TTR("Click this link to download FBX2glTF")); + lb->set_uri("https://godotengine.org/fbx-import"); + vb->add_child(lb); + + HBoxContainer *hb = memnew(HBoxContainer); + + fbx_path = memnew(LineEdit); + fbx_path->set_h_size_flags(Control::SIZE_EXPAND_FILL); + hb->add_child(fbx_path); + fbx_path_browse = memnew(Button); + hb->add_child(fbx_path_browse); + fbx_path_browse->set_text(TTR("Browse")); + fbx_path_browse->connect("pressed", callable_mp(this, &FBXImporterManager::_browse_install)); + hb->set_h_size_flags(Control::SIZE_EXPAND_FILL); + hb->set_custom_minimum_size(Size2(400 * EDSCALE, 0)); + + vb->add_child(hb); + + path_status = memnew(Label); + vb->add_child(path_status); + + add_child(vb); + + fbx_path->connect("text_changed", callable_mp(this, &FBXImporterManager::_validate_path)); + + get_ok_button()->set_text(TTR("Confirm Path")); + + browse_dialog = memnew(EditorFileDialog); + browse_dialog->set_access(EditorFileDialog::ACCESS_FILESYSTEM); + browse_dialog->set_file_mode(EditorFileDialog::FILE_MODE_OPEN_FILE); +#if defined(X11_ENABLED) + browse_dialog->add_filter("FBX2glTF-linux-x86_64"); +#elif defined(OSX_ENABLED) + browse_dialog->add_filter("FBX2glTF-macos-x86_64"); +#elif defined(WINDOWS_ENABLED) + browse_dialog->add_filter("FBX2glTF-windows-x86_64"); +#endif + + browse_dialog->connect("file_selected", callable_mp(this, &FBXImporterManager::_select_file)); + + add_child(browse_dialog); +} diff --git a/editor/fbx_importer_manager.h b/editor/fbx_importer_manager.h new file mode 100644 index 0000000000..28de761519 --- /dev/null +++ b/editor/fbx_importer_manager.h @@ -0,0 +1,66 @@ +/*************************************************************************/ +/* fbx_importer_manager.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef FBX_IMPORTER_MANAGER_H +#define FBX_IMPORTER_MANAGER_H + +#include "editor/editor_file_dialog.h" +#include "scene/gui/dialogs.h" +#include "scene/gui/line_edit.h" + +class FBXImporterManager : public ConfirmationDialog { + GDCLASS(FBXImporterManager, ConfirmationDialog) + + Label *message = nullptr; + LineEdit *fbx_path = nullptr; + Button *fbx_path_browse = nullptr; + EditorFileDialog *browse_dialog = nullptr; + Label *path_status = nullptr; + + void _validate_path(const String &p_path); + void _select_file(const String &p_path); + void _path_confirmed(); + void _browse_install(); + void _link_clicked(); + + static FBXImporterManager *singleton; + +protected: + void _notification(int p_what); + +public: + static FBXImporterManager *get_singleton() { return singleton; } + + void show_dialog(bool p_exclusive = false); + + FBXImporterManager(); +}; + +#endif // FBX_IMPORTER_MANAGER_H diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp index 8df5808b11..6316a7f545 100644 --- a/editor/filesystem_dock.cpp +++ b/editor/filesystem_dock.cpp @@ -1414,7 +1414,7 @@ void FileSystemDock::_update_dependencies_after_move(const HashMap<String, Strin Error err = ResourceLoader::rename_dependencies(file, p_renames); if (err == OK) { if (ResourceLoader::get_resource_type(file) == "PackedScene") { - EditorNode::get_singleton()->reload_scene(file); + callable_mp(EditorNode::get_singleton(), &EditorNode::reload_scene).bind(file).call_deferred(); } } else { EditorNode::get_singleton()->add_io_error(TTR("Unable to update dependencies:") + "\n" + remaps[i] + "\n"); diff --git a/editor/find_in_files.cpp b/editor/find_in_files.cpp index 666444eaf9..3a6c891142 100644 --- a/editor/find_in_files.cpp +++ b/editor/find_in_files.cpp @@ -569,8 +569,6 @@ FindInFilesPanel::FindInFilesPanel() { hbc->add_child(find_label); _search_text_label = memnew(Label); - _search_text_label->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font(SNAME("source"), SNAME("EditorFonts"))); - _search_text_label->add_theme_font_size_override("font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size(SNAME("source_size"), SNAME("EditorFonts"))); hbc->add_child(_search_text_label); _progress_bar = memnew(ProgressBar); @@ -598,8 +596,6 @@ FindInFilesPanel::FindInFilesPanel() { } _results_display = memnew(Tree); - _results_display->add_theme_font_override("font", EditorNode::get_singleton()->get_gui_base()->get_theme_font(SNAME("source"), SNAME("EditorFonts"))); - _results_display->add_theme_font_size_override("font_size", EditorNode::get_singleton()->get_gui_base()->get_theme_font_size(SNAME("source_size"), SNAME("EditorFonts"))); _results_display->set_v_size_flags(SIZE_EXPAND_FILL); _results_display->connect("item_selected", callable_mp(this, &FindInFilesPanel::_on_result_selected)); _results_display->connect("item_edited", callable_mp(this, &FindInFilesPanel::_on_item_edited)); @@ -688,13 +684,20 @@ void FindInFilesPanel::stop_search() { void FindInFilesPanel::_notification(int p_what) { switch (p_what) { - case NOTIFICATION_PROCESS: { - _progress_bar->set_as_ratio(_finder->get_progress()); - } break; - case NOTIFICATION_THEME_CHANGED: { _search_text_label->add_theme_font_override("font", get_theme_font(SNAME("source"), SNAME("EditorFonts"))); + _search_text_label->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("source_size"), SNAME("EditorFonts"))); _results_display->add_theme_font_override("font", get_theme_font(SNAME("source"), SNAME("EditorFonts"))); + _results_display->add_theme_font_size_override("font_size", get_theme_font_size(SNAME("source_size"), SNAME("EditorFonts"))); + + // Rebuild search tree. + if (!_finder->get_search_text().is_empty()) { + start_search(); + } + } break; + + case NOTIFICATION_PROCESS: { + _progress_bar->set_as_ratio(_finder->get_progress()); } break; } } @@ -769,7 +772,7 @@ void FindInFilesPanel::draw_result_text(Object *item_obj, Rect2 rect) { Rect2 match_rect = rect; match_rect.position.x += font->get_string_size(item_text.left(r.begin_trimmed), HORIZONTAL_ALIGNMENT_LEFT, -1, font_size).x - 1; - match_rect.size.x = font->get_string_size(_search_text_label->get_text(), HORIZONTAL_ALIGNMENT_LEFT, -1, font_size).x + 2; + match_rect.size.x = font->get_string_size(_search_text_label->get_text(), HORIZONTAL_ALIGNMENT_LEFT, -1, font_size).x + 1; match_rect.position.y += 1 * EDSCALE; match_rect.size.y -= 2 * EDSCALE; diff --git a/editor/icons/OneWayTile.svg b/editor/icons/OneWayTile.svg new file mode 100644 index 0000000000..273b1a183b --- /dev/null +++ b/editor/icons/OneWayTile.svg @@ -0,0 +1 @@ +<svg clip-rule="evenodd" fill-rule="evenodd" height="16" stroke-linecap="round" stroke-linejoin="round" viewBox="0 0 16 16" width="16" xmlns="http://www.w3.org/2000/svg"><path d="m10.958984 1.5-1.4785152 1.4667969-1.4785157 1.46875-1.4804687-1.4667969-1.4785156-1.4667969-.5214844.5136719-.5214844.5136719 2 1.9863281 2 1.984375 2-1.984375 2-1.9824219-.519531-.5175781zm0 8-1.4785152 1.466797-1.4785157 1.46875-1.4804687-1.466797-1.4785156-1.4667969-.5214844.5136719-.5214844.513672 2 1.986328 2 1.984375 2-1.984375 2-1.982422-.519531-.517578z" fill="#fff"/></svg> diff --git a/editor/icons/TileSelection.svg b/editor/icons/TileSelection.svg new file mode 100644 index 0000000000..418382aa1c --- /dev/null +++ b/editor/icons/TileSelection.svg @@ -0,0 +1,57 @@ +<?xml version="1.0" encoding="UTF-8" standalone="no"?> +<svg + height="5" + viewBox="0 0 5 5" + width="5" + version="1.1" + id="svg10" + sodipodi:docname="TileSelection.svg" + inkscape:version="1.1 (c68e22c387, 2021-05-23)" + xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape" + xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd" + xmlns="http://www.w3.org/2000/svg" + xmlns:svg="http://www.w3.org/2000/svg"> + <defs + id="defs14"> + <linearGradient + id="linearGradient1060" + inkscape:swatch="solid"> + <stop + style="stop-color:#000000;stop-opacity:1;" + offset="0" + id="stop1058" /> + </linearGradient> + </defs> + <sodipodi:namedview + id="namedview12" + pagecolor="#505050" + bordercolor="#ffffff" + borderopacity="1" + inkscape:pageshadow="0" + inkscape:pageopacity="0" + inkscape:pagecheckerboard="1" + showgrid="false" + inkscape:zoom="64" + inkscape:cx="4.3125" + inkscape:cy="1.984375" + inkscape:window-width="3840" + inkscape:window-height="2066" + inkscape:window-x="-11" + inkscape:window-y="-11" + inkscape:window-maximized="1" + inkscape:current-layer="svg10" /> + <rect + style="fill:none;stroke:#ffffff;stroke-width:1.00038;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect940" + width="3.9996195" + height="3.999619" + x="0.50019002" + y="0.50019002" /> + <rect + style="fill:none;stroke:#000000;stroke-width:0.999543;stroke-miterlimit:4;stroke-dasharray:none;stroke-dashoffset:0;stroke-opacity:1" + id="rect3062" + width="2.000457" + height="2.000457" + x="1.4997715" + y="1.4997715" /> +</svg> diff --git a/editor/import/audio_stream_import_settings.cpp b/editor/import/audio_stream_import_settings.cpp index f635c74547..92d4397c68 100644 --- a/editor/import/audio_stream_import_settings.cpp +++ b/editor/import/audio_stream_import_settings.cpp @@ -465,12 +465,17 @@ void AudioStreamImportSettings::_settings_changed() { updating_settings = true; stream->call("set_loop", loop->is_pressed()); stream->call("set_loop_offset", loop_offset->get_value()); + if (loop->is_pressed()) { + loop_offset->set_editable(true); + } else { + loop_offset->set_editable(false); + } + if (bpm_enabled->is_pressed()) { stream->call("set_bpm", bpm_edit->get_value()); - beats_enabled->show(); - beats_edit->show(); - bar_beats_label->show(); - bar_beats_edit->show(); + beats_enabled->set_disabled(false); + beats_edit->set_editable(true); + bar_beats_edit->set_editable(true); double bpm = bpm_edit->get_value(); if (bpm > 0) { float beat_size = 60 / float(bpm); @@ -486,10 +491,9 @@ void AudioStreamImportSettings::_settings_changed() { } else { stream->call("set_bpm", 0); stream->call("set_bar_beats", 4); - beats_enabled->hide(); - beats_edit->hide(); - bar_beats_label->hide(); - bar_beats_edit->hide(); + beats_enabled->set_disabled(true); + beats_edit->set_editable(false); + bar_beats_edit->set_editable(false); } if (bpm_enabled->is_pressed() && beats_enabled->is_pressed()) { stream->call("set_beat_count", beats_edit->get_value()); @@ -552,17 +556,8 @@ AudioStreamImportSettings::AudioStreamImportSettings() { bpm_edit->connect("value_changed", callable_mp(this, &AudioStreamImportSettings::_settings_changed).unbind(1)); interactive_hb->add_child(bpm_edit); interactive_hb->add_spacer(); - bar_beats_label = memnew(Label(TTR("Beats/Bar:"))); - interactive_hb->add_child(bar_beats_label); - bar_beats_edit = memnew(SpinBox); - bar_beats_edit->set_tooltip_text(TTR("Configure the Beats Per Bar. This used for music-aware transitions between AudioStreams.")); - bar_beats_edit->set_min(2); - bar_beats_edit->set_max(32); - bar_beats_edit->connect("value_changed", callable_mp(this, &AudioStreamImportSettings::_settings_changed).unbind(1)); - interactive_hb->add_child(bar_beats_edit); - interactive_hb->add_spacer(); beats_enabled = memnew(CheckBox); - beats_enabled->set_text(TTR("Length (in beats):")); + beats_enabled->set_text(TTR("Beat Count:")); beats_enabled->connect("toggled", callable_mp(this, &AudioStreamImportSettings::_settings_changed).unbind(1)); interactive_hb->add_child(beats_enabled); beats_edit = memnew(SpinBox); @@ -570,6 +565,15 @@ AudioStreamImportSettings::AudioStreamImportSettings() { beats_edit->set_max(99999); beats_edit->connect("value_changed", callable_mp(this, &AudioStreamImportSettings::_settings_changed).unbind(1)); interactive_hb->add_child(beats_edit); + bar_beats_label = memnew(Label(TTR("Bar Beats:"))); + interactive_hb->add_child(bar_beats_label); + bar_beats_edit = memnew(SpinBox); + bar_beats_edit->set_tooltip_text(TTR("Configure the Beats Per Bar. This used for music-aware transitions between AudioStreams.")); + bar_beats_edit->set_min(2); + bar_beats_edit->set_max(32); + bar_beats_edit->connect("value_changed", callable_mp(this, &AudioStreamImportSettings::_settings_changed).unbind(1)); + interactive_hb->add_child(bar_beats_edit); + interactive_hb->add_spacer(); main_vbox->add_margin_child(TTR("Music Playback:"), interactive_hb); color_rect = memnew(ColorRect); diff --git a/editor/import/dynamic_font_import_settings.cpp b/editor/import/dynamic_font_import_settings.cpp index 75d0abbb0c..afcfacdf75 100644 --- a/editor/import/dynamic_font_import_settings.cpp +++ b/editor/import/dynamic_font_import_settings.cpp @@ -954,9 +954,18 @@ void DynamicFontImportSettings::_re_import() { Dictionary preload_config; preload_config["name"] = vars_item->get_text(0); + Size2i conf_size = Vector2i(16, 0); for (const KeyValue<StringName, Variant> &E : import_variation_data->settings) { - preload_config[E.key] = E.value; + if (E.key == "size") { + conf_size.x = E.value; + } + if (E.key == "outline_size") { + conf_size.y = E.value; + } else { + preload_config[E.key] = E.value; + } } + preload_config["size"] = conf_size; Array chars; for (const char32_t &E : import_variation_data->selected_chars) { diff --git a/editor/import/scene_import_settings.cpp b/editor/import/scene_import_settings.cpp index 730aa3bd61..380a4e370c 100644 --- a/editor/import/scene_import_settings.cpp +++ b/editor/import/scene_import_settings.cpp @@ -555,6 +555,7 @@ void SceneImportSettings::open_settings(const String &p_path, bool p_for_animati material_set.clear(); mesh_set.clear(); + animation_map.clear(); material_map.clear(); mesh_map.clear(); node_map.clear(); @@ -957,15 +958,15 @@ void SceneImportSettings::_notification(int p_what) { void SceneImportSettings::_menu_callback(int p_id) { switch (p_id) { case ACTION_EXTRACT_MATERIALS: { - save_path->set_text(TTR("Select folder to extract material resources")); + save_path->set_title(TTR("Select folder to extract material resources")); external_extension_type->select(0); } break; case ACTION_CHOOSE_MESH_SAVE_PATHS: { - save_path->set_text(TTR("Select folder where mesh resources will save on import")); + save_path->set_title(TTR("Select folder where mesh resources will save on import")); external_extension_type->select(1); } break; case ACTION_CHOOSE_ANIMATION_SAVE_PATHS: { - save_path->set_text(TTR("Select folder where animations will save on import")); + save_path->set_title(TTR("Select folder where animations will save on import")); external_extension_type->select(1); } break; } diff --git a/editor/plugins/animation_blend_space_1d_editor.cpp b/editor/plugins/animation_blend_space_1d_editor.cpp index e64b80abbd..7d64055cc3 100644 --- a/editor/plugins/animation_blend_space_1d_editor.cpp +++ b/editor/plugins/animation_blend_space_1d_editor.cpp @@ -46,6 +46,11 @@ StringName AnimationNodeBlendSpace1DEditor::get_blend_position_path() const { } void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEvent> &p_event) { + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; + } + Ref<InputEventKey> k = p_event; if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == Key::KEY_DELETE && !k->is_echo()) { @@ -71,11 +76,8 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven menu->add_submenu_item(TTR("Add Animation"), "animations"); - AnimationTree *gp = AnimationTreeEditor::get_singleton()->get_animation_tree(); - ERR_FAIL_COND(!gp); - - if (gp->has_node(gp->get_animation_player())) { - AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(gp->get_node(gp->get_animation_player())); + if (tree->has_node(tree->get_animation_player())) { + AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(tree->get_node(tree->get_animation_player())); if (ap) { List<StringName> names; @@ -180,7 +182,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven blend_pos *= blend_space->get_max_space() - blend_space->get_min_space(); blend_pos += blend_space->get_min_space(); - AnimationTreeEditor::get_singleton()->get_animation_tree()->set(get_blend_position_path(), blend_pos); + tree->set(get_blend_position_path(), blend_pos); blend_space_draw->queue_redraw(); } @@ -203,13 +205,18 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_gui_input(const Ref<InputEven blend_pos *= blend_space->get_max_space() - blend_space->get_min_space(); blend_pos += blend_space->get_min_space(); - AnimationTreeEditor::get_singleton()->get_animation_tree()->set(get_blend_position_path(), blend_pos); + tree->set(get_blend_position_path(), blend_pos); blend_space_draw->queue_redraw(); } } void AnimationNodeBlendSpace1DEditor::_blend_space_draw() { + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; + } + Color linecolor = get_theme_color(SNAME("font_color"), SNAME("Label")); Color linecolor_soft = linecolor; linecolor_soft.a *= 0.5; @@ -301,7 +308,7 @@ void AnimationNodeBlendSpace1DEditor::_blend_space_draw() { color.a *= 0.5; } - float point = AnimationTreeEditor::get_singleton()->get_animation_tree()->get(get_blend_position_path()); + float point = tree->get(get_blend_position_path()); point = (point - blend_space->get_min_space()) / (blend_space->get_max_space() - blend_space->get_min_space()); point *= s.width; @@ -575,12 +582,17 @@ void AnimationNodeBlendSpace1DEditor::_notification(int p_what) { } break; case NOTIFICATION_PROCESS: { + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; + } + String error; - if (!AnimationTreeEditor::get_singleton()->get_animation_tree()->is_active()) { + if (!tree->is_active()) { error = TTR("AnimationTree is inactive.\nActivate to enable playback, check node warnings if activation fails."); - } else if (AnimationTreeEditor::get_singleton()->get_animation_tree()->is_state_invalid()) { - error = AnimationTreeEditor::get_singleton()->get_animation_tree()->get_invalid_state_reason(); + } else if (tree->is_state_invalid()) { + error = tree->get_invalid_state_reason(); } if (error != error_label->get_text()) { diff --git a/editor/plugins/animation_blend_space_2d_editor.cpp b/editor/plugins/animation_blend_space_2d_editor.cpp index 4d8e972883..526f69732b 100644 --- a/editor/plugins/animation_blend_space_2d_editor.cpp +++ b/editor/plugins/animation_blend_space_2d_editor.cpp @@ -95,6 +95,11 @@ StringName AnimationNodeBlendSpace2DEditor::get_blend_position_path() const { } void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEvent> &p_event) { + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; + } + Ref<InputEventKey> k = p_event; if (tool_select->is_pressed() && k.is_valid() && k->is_pressed() && k->get_keycode() == Key::KEY_DELETE && !k->is_echo()) { if (selected_point != -1 || selected_triangle != -1) { @@ -118,10 +123,8 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven ClassDB::get_inheriters_from_class("AnimationRootNode", &classes); menu->add_submenu_item(TTR("Add Animation"), "animations"); - AnimationTree *gp = AnimationTreeEditor::get_singleton()->get_animation_tree(); - ERR_FAIL_COND(!gp); - if (gp && gp->has_node(gp->get_animation_player())) { - AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(gp->get_node(gp->get_animation_player())); + if (tree->has_node(tree->get_animation_player())) { + AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(tree->get_node(tree->get_animation_player())); if (ap) { List<StringName> names; ap->get_animation_list(&names); @@ -275,7 +278,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven blend_pos *= (blend_space->get_max_space() - blend_space->get_min_space()); blend_pos += blend_space->get_min_space(); - AnimationTreeEditor::get_singleton()->get_animation_tree()->set(get_blend_position_path(), blend_pos); + tree->set(get_blend_position_path(), blend_pos); blend_space_draw->queue_redraw(); } @@ -311,7 +314,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_gui_input(const Ref<InputEven blend_pos *= (blend_space->get_max_space() - blend_space->get_min_space()); blend_pos += blend_space->get_min_space(); - AnimationTreeEditor::get_singleton()->get_animation_tree()->set(get_blend_position_path(), blend_pos); + tree->set(get_blend_position_path(), blend_pos); blend_space_draw->queue_redraw(); } @@ -438,6 +441,11 @@ void AnimationNodeBlendSpace2DEditor::_tool_switch(int p_tool) { } void AnimationNodeBlendSpace2DEditor::_blend_space_draw() { + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; + } + Color linecolor = get_theme_color(SNAME("font_color"), SNAME("Label")); Color linecolor_soft = linecolor; linecolor_soft.a *= 0.5; @@ -596,7 +604,7 @@ void AnimationNodeBlendSpace2DEditor::_blend_space_draw() { color.a *= 0.5; } - Vector2 blend_pos = AnimationTreeEditor::get_singleton()->get_animation_tree()->get(get_blend_position_path()); + Vector2 blend_pos = tree->get(get_blend_position_path()); Vector2 point = blend_pos; point = (point - blend_space->get_min_space()) / (blend_space->get_max_space() - blend_space->get_min_space()); @@ -806,14 +814,19 @@ void AnimationNodeBlendSpace2DEditor::_notification(int p_what) { } break; case NOTIFICATION_PROCESS: { + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; + } + String error; - if (!AnimationTreeEditor::get_singleton()->get_animation_tree()) { + if (!tree) { error = TTR("BlendSpace2D does not belong to an AnimationTree node."); - } else if (!AnimationTreeEditor::get_singleton()->get_animation_tree()->is_active()) { + } else if (!tree->is_active()) { error = TTR("AnimationTree is inactive.\nActivate to enable playback, check node warnings if activation fails."); - } else if (AnimationTreeEditor::get_singleton()->get_animation_tree()->is_state_invalid()) { - error = AnimationTreeEditor::get_singleton()->get_animation_tree()->get_invalid_state_reason(); + } else if (tree->is_state_invalid()) { + error = tree->get_invalid_state_reason(); } else if (blend_space->get_triangle_count() == 0) { error = TTR("No triangles exist, so no blending can take place."); } diff --git a/editor/plugins/animation_blend_tree_editor_plugin.cpp b/editor/plugins/animation_blend_tree_editor_plugin.cpp index dbd1b12a94..509caa78ef 100644 --- a/editor/plugins/animation_blend_tree_editor_plugin.cpp +++ b/editor/plugins/animation_blend_tree_editor_plugin.cpp @@ -99,6 +99,9 @@ Size2 AnimationNodeBlendTreeEditor::get_minimum_size() const { void AnimationNodeBlendTreeEditor::_property_changed(const StringName &p_property, const Variant &p_value, const String &p_field, bool p_changing) { AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; + } updating = true; Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); undo_redo->create_action(TTR("Parameter Changed:") + " " + String(p_property), UndoRedo::MERGE_ENDS); @@ -115,6 +118,11 @@ void AnimationNodeBlendTreeEditor::update_graph() { return; } + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; + } + visible_properties.clear(); graph->set_scroll_ofs(blend_tree->get_graph_offset() * EDSCALE); @@ -177,10 +185,10 @@ void AnimationNodeBlendTreeEditor::update_graph() { continue; } String base_path = AnimationTreeEditor::get_singleton()->get_base_path() + String(E) + "/" + F.name; - EditorProperty *prop = EditorInspector::instantiate_property_editor(AnimationTreeEditor::get_singleton()->get_animation_tree(), F.type, base_path, F.hint, F.hint_string, F.usage); + EditorProperty *prop = EditorInspector::instantiate_property_editor(tree, F.type, base_path, F.hint, F.hint_string, F.usage); if (prop) { prop->set_read_only(read_only); - prop->set_object_and_property(AnimationTreeEditor::get_singleton()->get_animation_tree(), base_path); + prop->set_object_and_property(tree, base_path); prop->update_property(); prop->set_name_split_ratio(0); prop->connect("property_changed", callable_mp(this, &AnimationNodeBlendTreeEditor::_property_changed)); @@ -228,9 +236,8 @@ void AnimationNodeBlendTreeEditor::update_graph() { ProgressBar *pb = memnew(ProgressBar); - AnimationTree *player = AnimationTreeEditor::get_singleton()->get_animation_tree(); - if (player->has_node(player->get_animation_player())) { - AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(player->get_node(player->get_animation_player())); + if (tree->has_node(tree->get_animation_player())) { + AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(tree->get_node(tree->get_animation_player())); if (ap) { List<StringName> anims; ap->get_animation_list(&anims); @@ -601,14 +608,19 @@ bool AnimationNodeBlendTreeEditor::_update_filters(const Ref<AnimationNode> &ano return false; } - NodePath player_path = AnimationTreeEditor::get_singleton()->get_animation_tree()->get_animation_player(); + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return false; + } + + NodePath player_path = tree->get_animation_player(); - if (!AnimationTreeEditor::get_singleton()->get_animation_tree()->has_node(player_path)) { + if (!tree->has_node(player_path)) { EditorNode::get_singleton()->show_warning(TTR("No animation player set, so unable to retrieve track names.")); return false; } - AnimationPlayer *player = Object::cast_to<AnimationPlayer>(AnimationTreeEditor::get_singleton()->get_animation_tree()->get_node(player_path)); + AnimationPlayer *player = Object::cast_to<AnimationPlayer>(tree->get_node(player_path)); if (!player) { EditorNode::get_singleton()->show_warning(TTR("Player path set is invalid, so unable to retrieve track names.")); return false; @@ -839,12 +851,17 @@ void AnimationNodeBlendTreeEditor::_notification(int p_what) { } break; case NOTIFICATION_PROCESS: { + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; // Node has been changed. + } + String error; - if (!AnimationTreeEditor::get_singleton()->get_animation_tree()->is_active()) { + if (!tree->is_active()) { error = TTR("AnimationTree is inactive.\nActivate to enable playback, check node warnings if activation fails."); - } else if (AnimationTreeEditor::get_singleton()->get_animation_tree()->is_state_invalid()) { - error = AnimationTreeEditor::get_singleton()->get_animation_tree()->get_invalid_state_reason(); + } else if (tree->is_state_invalid()) { + error = tree->get_invalid_state_reason(); } if (error != error_label->get_text()) { @@ -861,16 +878,15 @@ void AnimationNodeBlendTreeEditor::_notification(int p_what) { for (const AnimationNodeBlendTree::NodeConnection &E : conns) { float activity = 0; StringName path = AnimationTreeEditor::get_singleton()->get_base_path() + E.input_node; - if (AnimationTreeEditor::get_singleton()->get_animation_tree() && !AnimationTreeEditor::get_singleton()->get_animation_tree()->is_state_invalid()) { - activity = AnimationTreeEditor::get_singleton()->get_animation_tree()->get_connection_activity(path, E.input_index); + if (!tree->is_state_invalid()) { + activity = tree->get_connection_activity(path, E.input_index); } graph->set_connection_activity(E.output_node, 0, E.input_node, E.input_index, activity); } - AnimationTree *graph_player = AnimationTreeEditor::get_singleton()->get_animation_tree(); AnimationPlayer *player = nullptr; - if (graph_player->has_node(graph_player->get_animation_player())) { - player = Object::cast_to<AnimationPlayer>(graph_player->get_node(graph_player->get_animation_player())); + if (tree->has_node(tree->get_animation_player())) { + player = Object::cast_to<AnimationPlayer>(tree->get_node(tree->get_animation_player())); } if (player) { @@ -883,7 +899,7 @@ void AnimationNodeBlendTreeEditor::_notification(int p_what) { E.value->set_max(anim->get_length()); //StringName path = AnimationTreeEditor::get_singleton()->get_base_path() + E.input_node; StringName time_path = AnimationTreeEditor::get_singleton()->get_base_path() + String(E.key) + "/time"; - E.value->set_value(AnimationTreeEditor::get_singleton()->get_animation_tree()->get(time_path)); + E.value->set_value(tree->get(time_path)); } } } @@ -937,6 +953,11 @@ void AnimationNodeBlendTreeEditor::_node_renamed(const String &p_text, Ref<Anima return; } + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; + } + String prev_name = blend_tree->get_node_name(p_node); ERR_FAIL_COND(prev_name.is_empty()); GraphNode *gn = Object::cast_to<GraphNode>(graph->get_node(prev_name)); @@ -965,8 +986,8 @@ void AnimationNodeBlendTreeEditor::_node_renamed(const String &p_text, Ref<Anima undo_redo->create_action(TTR("Node Renamed")); undo_redo->add_do_method(blend_tree.ptr(), "rename_node", prev_name, name); undo_redo->add_undo_method(blend_tree.ptr(), "rename_node", name, prev_name); - undo_redo->add_do_method(AnimationTreeEditor::get_singleton()->get_animation_tree(), "rename_parameter", base_path + prev_name, base_path + name); - undo_redo->add_undo_method(AnimationTreeEditor::get_singleton()->get_animation_tree(), "rename_parameter", base_path + name, base_path + prev_name); + undo_redo->add_do_method(tree, "rename_parameter", base_path + prev_name, base_path + name); + undo_redo->add_undo_method(tree, "rename_parameter", base_path + name, base_path + prev_name); undo_redo->add_do_method(this, "update_graph"); undo_redo->add_undo_method(this, "update_graph"); undo_redo->commit_action(); diff --git a/editor/plugins/animation_player_editor_plugin.cpp b/editor/plugins/animation_player_editor_plugin.cpp index 5183a738ae..de16400ec9 100644 --- a/editor/plugins/animation_player_editor_plugin.cpp +++ b/editor/plugins/animation_player_editor_plugin.cpp @@ -1922,10 +1922,12 @@ void AnimationPlayerEditorPlugin::_notification(int p_what) { } void AnimationPlayerEditorPlugin::_property_keyed(const String &p_keyed, const Variant &p_value, bool p_advance) { - if (!anim_editor->get_track_editor()->has_keying()) { + AnimationTrackEditor *te = anim_editor->get_track_editor(); + if (!te || !te->has_keying()) { return; } - anim_editor->get_track_editor()->insert_value_key(p_keyed, p_value, p_advance); + te->_clear_selection(); + te->insert_value_key(p_keyed, p_value, p_advance); } void AnimationPlayerEditorPlugin::_transform_key_request(Object *sp, const String &p_sub, const Transform3D &p_key) { diff --git a/editor/plugins/animation_state_machine_editor.cpp b/editor/plugins/animation_state_machine_editor.cpp index ef9477abea..66a0c746d9 100644 --- a/editor/plugins/animation_state_machine_editor.cpp +++ b/editor/plugins/animation_state_machine_editor.cpp @@ -79,7 +79,12 @@ void AnimationNodeStateMachineEditor::edit(const Ref<AnimationNode> &p_node) { } void AnimationNodeStateMachineEditor::_state_machine_gui_input(const Ref<InputEvent> &p_event) { - Ref<AnimationNodeStateMachinePlayback> playback = AnimationTreeEditor::get_singleton()->get_animation_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback"); + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; + } + + Ref<AnimationNodeStateMachinePlayback> playback = tree->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback"); if (playback.is_null()) { return; } @@ -736,6 +741,11 @@ void AnimationNodeStateMachineEditor::_ungroup_selected_nodes() { } void AnimationNodeStateMachineEditor::_open_menu(const Vector2 &p_position) { + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; + } + menu->clear(); animations_menu->clear(); animations_to_add.clear(); @@ -745,10 +755,8 @@ void AnimationNodeStateMachineEditor::_open_menu(const Vector2 &p_position) { ClassDB::get_inheriters_from_class("AnimationRootNode", &classes); menu->add_submenu_item(TTR("Add Animation"), "animations"); - AnimationTree *gp = AnimationTreeEditor::get_singleton()->get_animation_tree(); - ERR_FAIL_COND(!gp); - if (gp && gp->has_node(gp->get_animation_player())) { - AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(gp->get_node(gp->get_animation_player())); + if (tree->has_node(tree->get_animation_player())) { + AnimationPlayer *ap = Object::cast_to<AnimationPlayer>(tree->get_node(tree->get_animation_player())); if (ap) { List<StringName> names; ap->get_animation_list(&names); @@ -1192,7 +1200,12 @@ void AnimationNodeStateMachineEditor::_clip_dst_line_to_rect(const Vector2 &p_fr } void AnimationNodeStateMachineEditor::_state_machine_draw() { - Ref<AnimationNodeStateMachinePlayback> playback = AnimationTreeEditor::get_singleton()->get_animation_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback"); + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; + } + + Ref<AnimationNodeStateMachinePlayback> playback = tree->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback"); Ref<StyleBoxFlat> style = get_theme_stylebox(SNAME("state_machine_frame"), SNAME("GraphNode")); Ref<StyleBoxFlat> style_selected = get_theme_stylebox(SNAME("state_machine_selected_frame"), SNAME("GraphNode")); @@ -1380,7 +1393,7 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() { } StringName fullpath = AnimationTreeEditor::get_singleton()->get_base_path() + String(tl.advance_condition_name); - if (tl.advance_condition_name != StringName() && bool(AnimationTreeEditor::get_singleton()->get_animation_tree()->get(fullpath))) { + if (tl.advance_condition_name != StringName() && bool(tree->get(fullpath))) { tl.advance_condition_state = true; tl.auto_advance = true; } @@ -1495,7 +1508,12 @@ void AnimationNodeStateMachineEditor::_state_machine_draw() { } void AnimationNodeStateMachineEditor::_state_machine_pos_draw() { - Ref<AnimationNodeStateMachinePlayback> playback = AnimationTreeEditor::get_singleton()->get_animation_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback"); + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; + } + + Ref<AnimationNodeStateMachinePlayback> playback = tree->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback"); if (!playback.is_valid() || !playback->is_playing()) { return; @@ -1587,17 +1605,22 @@ void AnimationNodeStateMachineEditor::_notification(int p_what) { } break; case NOTIFICATION_PROCESS: { + AnimationTree *tree = AnimationTreeEditor::get_singleton()->get_animation_tree(); + if (!tree) { + return; + } + String error; - Ref<AnimationNodeStateMachinePlayback> playback = AnimationTreeEditor::get_singleton()->get_animation_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback"); + Ref<AnimationNodeStateMachinePlayback> playback = tree->get(AnimationTreeEditor::get_singleton()->get_base_path() + "playback"); if (error_time > 0) { error = error_text; error_time -= get_process_delta_time(); - } else if (!AnimationTreeEditor::get_singleton()->get_animation_tree()->is_active()) { + } else if (!tree->is_active()) { error = TTR("AnimationTree is inactive.\nActivate to enable playback, check node warnings if activation fails."); - } else if (AnimationTreeEditor::get_singleton()->get_animation_tree()->is_state_invalid()) { - error = AnimationTreeEditor::get_singleton()->get_animation_tree()->get_invalid_state_reason(); + } else if (tree->is_state_invalid()) { + error = tree->get_invalid_state_reason(); /*} else if (state_machine->get_parent().is_valid() && state_machine->get_parent()->is_class("AnimationNodeStateMachine")) { if (state_machine->get_start_node() == StringName() || state_machine->get_end_node() == StringName()) { error = TTR("Start and end nodes are needed for a sub-transition."); @@ -1649,7 +1672,7 @@ void AnimationNodeStateMachineEditor::_notification(int p_what) { break; } - bool acstate = transition_lines[i].advance_condition_name != StringName() && bool(AnimationTreeEditor::get_singleton()->get_animation_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + String(transition_lines[i].advance_condition_name))); + bool acstate = transition_lines[i].advance_condition_name != StringName() && bool(tree->get(AnimationTreeEditor::get_singleton()->get_base_path() + String(transition_lines[i].advance_condition_name))); if (transition_lines[i].advance_condition_state != acstate) { state_machine_draw->queue_redraw(); @@ -1704,7 +1727,7 @@ void AnimationNodeStateMachineEditor::_notification(int p_what) { Ref<AnimationNodeStateMachinePlayback> current_node_playback; while (anodesm.is_valid()) { - current_node_playback = AnimationTreeEditor::get_singleton()->get_animation_tree()->get(AnimationTreeEditor::get_singleton()->get_base_path() + next + "/playback"); + current_node_playback = tree->get(AnimationTreeEditor::get_singleton()->get_base_path() + next + "/playback"); next += "/" + current_node_playback->get_current_node(); anodesm = anodesm->get_node(current_node_playback->get_current_node()); } diff --git a/editor/plugins/animation_tree_editor_plugin.cpp b/editor/plugins/animation_tree_editor_plugin.cpp index 61aa861a3f..c31a2689ec 100644 --- a/editor/plugins/animation_tree_editor_plugin.cpp +++ b/editor/plugins/animation_tree_editor_plugin.cpp @@ -77,6 +77,7 @@ void AnimationTreeEditor::edit(AnimationTree *p_tree) { void AnimationTreeEditor::_node_removed(Node *p_node) { if (p_node == tree) { tree = nullptr; + _clear_editors(); } } @@ -151,7 +152,6 @@ void AnimationTreeEditor::edit_path(const Vector<String> &p_path) { } else { current_root = ObjectID(); edited_path = button_path; - for (int i = 0; i < editors.size(); i++) { editors[i]->edit(Ref<AnimationNode>()); editors[i]->hide(); @@ -161,6 +161,17 @@ void AnimationTreeEditor::edit_path(const Vector<String> &p_path) { _update_path(); } +void AnimationTreeEditor::_clear_editors() { + button_path.clear(); + current_root = ObjectID(); + edited_path = button_path; + for (int i = 0; i < editors.size(); i++) { + editors[i]->edit(Ref<AnimationNode>()); + editors[i]->hide(); + } + _update_path(); +} + Vector<String> AnimationTreeEditor::get_edited_path() const { return button_path; } diff --git a/editor/plugins/animation_tree_editor_plugin.h b/editor/plugins/animation_tree_editor_plugin.h index e1d9536f03..b933523057 100644 --- a/editor/plugins/animation_tree_editor_plugin.h +++ b/editor/plugins/animation_tree_editor_plugin.h @@ -60,6 +60,7 @@ class AnimationTreeEditor : public VBoxContainer { Vector<AnimationTreeNodeEditorPlugin *> editors; void _update_path(); + void _clear_editors(); ObjectID current_root; void _path_button_pressed(int p_path); diff --git a/editor/plugins/asset_library_editor_plugin.cpp b/editor/plugins/asset_library_editor_plugin.cpp index 7c3ecd5d4e..6483a18a4d 100644 --- a/editor/plugins/asset_library_editor_plugin.cpp +++ b/editor/plugins/asset_library_editor_plugin.cpp @@ -43,6 +43,11 @@ #include "editor/project_settings_editor.h" #include "scene/gui/menu_button.h" +#include "modules/modules_enabled.gen.h" // For svg. +#ifdef MODULE_SVG_ENABLED +#include "modules/svg/image_loader_svg.h" +#endif + static inline void setup_http_request(HTTPRequest *request) { request->set_use_threads(EDITOR_DEF("asset_library/use_threads", true)); @@ -751,13 +756,30 @@ void EditorAssetLibrary::_image_update(bool use_cache, bool final, const PackedB uint8_t png_signature[8] = { 137, 80, 78, 71, 13, 10, 26, 10 }; uint8_t jpg_signature[3] = { 255, 216, 255 }; + uint8_t webp_signature[4] = { 82, 73, 70, 70 }; + uint8_t bmp_signature[2] = { 66, 77 }; if (r) { if ((memcmp(&r[0], &png_signature[0], 8) == 0) && Image::_png_mem_loader_func) { image->copy_internals_from(Image::_png_mem_loader_func(r, len)); } else if ((memcmp(&r[0], &jpg_signature[0], 3) == 0) && Image::_jpg_mem_loader_func) { image->copy_internals_from(Image::_jpg_mem_loader_func(r, len)); + } else if ((memcmp(&r[0], &webp_signature[0], 4) == 0) && Image::_webp_mem_loader_func) { + image->copy_internals_from(Image::_webp_mem_loader_func(r, len)); + } else if ((memcmp(&r[0], &bmp_signature[0], 2) == 0) && Image::_bmp_mem_loader_func) { + image->copy_internals_from(Image::_bmp_mem_loader_func(r, len)); } +#ifdef MODULE_SVG_ENABLED + else { + ImageLoaderSVG svg_loader; + Ref<Image> img = Ref<Image>(memnew(Image)); + Error err = svg_loader.create_image_from_utf8_buffer(img, image_data, 1.0, false); + + if (err == OK) { + image->copy_internals_from(img); + } + } +#endif } if (!image->is_empty()) { diff --git a/editor/plugins/audio_stream_editor_plugin.cpp b/editor/plugins/audio_stream_editor_plugin.cpp new file mode 100644 index 0000000000..60d949cdf0 --- /dev/null +++ b/editor/plugins/audio_stream_editor_plugin.cpp @@ -0,0 +1,280 @@ +/*************************************************************************/ +/* audio_stream_editor_plugin.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "audio_stream_editor_plugin.h" + +#include "core/core_string_names.h" +#include "editor/audio_stream_preview.h" +#include "editor/editor_scale.h" +#include "editor/editor_settings.h" +#include "scene/resources/audio_stream_wav.h" + +// AudioStreamEditor + +void AudioStreamEditor::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_READY: { + AudioStreamPreviewGenerator::get_singleton()->connect(SNAME("preview_updated"), callable_mp(this, &AudioStreamEditor::_preview_changed)); + } break; + case NOTIFICATION_THEME_CHANGED: + case NOTIFICATION_ENTER_TREE: { + Ref<Font> font = get_theme_font(SNAME("status_source"), SNAME("EditorFonts")); + + _current_label->add_theme_font_override(SNAME("font"), font); + _duration_label->add_theme_font_override(SNAME("font"), font); + + _play_button->set_icon(get_theme_icon(SNAME("MainPlay"), SNAME("EditorIcons"))); + _stop_button->set_icon(get_theme_icon(SNAME("Stop"), SNAME("EditorIcons"))); + _preview->set_color(get_theme_color(SNAME("dark_color_2"), SNAME("Editor"))); + + set_color(get_theme_color(SNAME("dark_color_1"), SNAME("Editor"))); + + _indicator->queue_redraw(); + _preview->queue_redraw(); + } break; + case NOTIFICATION_PROCESS: { + _current = _player->get_playback_position(); + _indicator->queue_redraw(); + } break; + case NOTIFICATION_VISIBILITY_CHANGED: { + if (!is_visible_in_tree()) { + _stop(); + } + } break; + default: { + } break; + } +} + +void AudioStreamEditor::_draw_preview() { + Rect2 rect = _preview->get_rect(); + Size2 size = get_size(); + + Ref<AudioStreamPreview> preview = AudioStreamPreviewGenerator::get_singleton()->generate_preview(stream); + float preview_len = preview->get_length(); + + Vector<Vector2> lines; + lines.resize(size.width * 2); + + for (int i = 0; i < size.width; i++) { + float ofs = i * preview_len / size.width; + float ofs_n = (i + 1) * preview_len / size.width; + float max = preview->get_max(ofs, ofs_n) * 0.5 + 0.5; + float min = preview->get_min(ofs, ofs_n) * 0.5 + 0.5; + + int idx = i; + lines.write[idx * 2 + 0] = Vector2(i + 1, rect.position.y + min * rect.size.y); + lines.write[idx * 2 + 1] = Vector2(i + 1, rect.position.y + max * rect.size.y); + } + + RS::get_singleton()->canvas_item_add_multiline(_preview->get_canvas_item(), lines, { get_theme_color(SNAME("contrast_color_2"), SNAME("Editor")) }); +} + +void AudioStreamEditor::_preview_changed(ObjectID p_which) { + if (stream.is_valid() && stream->get_instance_id() == p_which) { + _preview->queue_redraw(); + } +} + +void AudioStreamEditor::_stream_changed() { + if (!is_visible()) { + return; + } + queue_redraw(); +} + +void AudioStreamEditor::_play() { + if (_player->is_playing()) { + _pausing = true; + _player->stop(); + _play_button->set_icon(get_theme_icon(SNAME("MainPlay"), SNAME("EditorIcons"))); + set_process(false); + } else { + _pausing = false; + _player->play(_current); + _play_button->set_icon(get_theme_icon(SNAME("Pause"), SNAME("EditorIcons"))); + set_process(true); + } +} + +void AudioStreamEditor::_stop() { + _player->stop(); + _play_button->set_icon(get_theme_icon(SNAME("MainPlay"), SNAME("EditorIcons"))); + _current = 0; + _indicator->queue_redraw(); + set_process(false); +} + +void AudioStreamEditor::_on_finished() { + _play_button->set_icon(get_theme_icon(SNAME("MainPlay"), SNAME("EditorIcons"))); + if (!_pausing) { + _current = 0; + _indicator->queue_redraw(); + } else { + _pausing = false; + } + set_process(false); +} + +void AudioStreamEditor::_draw_indicator() { + if (stream.is_null()) { + return; + } + + Rect2 rect = _preview->get_rect(); + float len = stream->get_length(); + float ofs_x = _current / len * rect.size.width; + const Color col = get_theme_color(SNAME("accent_color"), SNAME("Editor")); + Ref<Texture2D> icon = get_theme_icon(SNAME("TimelineIndicator"), SNAME("EditorIcons")); + _indicator->draw_line(Point2(ofs_x, 0), Point2(ofs_x, rect.size.height), col, Math::round(2 * EDSCALE)); + _indicator->draw_texture( + icon, + Point2(ofs_x - icon->get_width() * 0.5, 0), + col); + + _current_label->set_text(String::num(_current, 2).pad_decimals(2) + " /"); +} + +void AudioStreamEditor::_on_input_indicator(Ref<InputEvent> p_event) { + const Ref<InputEventMouseButton> mb = p_event; + if (mb.is_valid() && mb->get_button_index() == MouseButton::LEFT) { + if (mb->is_pressed()) { + _seek_to(mb->get_position().x); + } + _dragging = mb->is_pressed(); + } + + const Ref<InputEventMouseMotion> mm = p_event; + if (mm.is_valid()) { + if (_dragging) { + _seek_to(mm->get_position().x); + } + } +} + +void AudioStreamEditor::_seek_to(real_t p_x) { + _current = p_x / _preview->get_rect().size.x * stream->get_length(); + _current = CLAMP(_current, 0, stream->get_length()); + _player->seek(_current); + _indicator->queue_redraw(); +} + +void AudioStreamEditor::set_stream(const Ref<AudioStream> &p_stream) { + if (stream.is_valid()) { + stream->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &AudioStreamEditor::_stream_changed)); + } + + stream = p_stream; + if (stream.is_null()) { + hide(); + return; + } + stream->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &AudioStreamEditor::_stream_changed)); + + _player->set_stream(stream); + _current = 0; + + String text = String::num(stream->get_length(), 2).pad_decimals(2) + "s"; + _duration_label->set_text(text); + + queue_redraw(); +} + +AudioStreamEditor::AudioStreamEditor() { + set_custom_minimum_size(Size2(1, 100) * EDSCALE); + + _player = memnew(AudioStreamPlayer); + _player->connect(SNAME("finished"), callable_mp(this, &AudioStreamEditor::_on_finished)); + add_child(_player); + + VBoxContainer *vbox = memnew(VBoxContainer); + vbox->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT); + add_child(vbox); + + _preview = memnew(ColorRect); + _preview->set_v_size_flags(SIZE_EXPAND_FILL); + _preview->connect(SNAME("draw"), callable_mp(this, &AudioStreamEditor::_draw_preview)); + vbox->add_child(_preview); + + _indicator = memnew(Control); + _indicator->set_anchors_and_offsets_preset(Control::PRESET_FULL_RECT); + _indicator->connect(SNAME("draw"), callable_mp(this, &AudioStreamEditor::_draw_indicator)); + _indicator->connect(SNAME("gui_input"), callable_mp(this, &AudioStreamEditor::_on_input_indicator)); + _preview->add_child(_indicator); + + HBoxContainer *hbox = memnew(HBoxContainer); + hbox->add_theme_constant_override("separation", 0); + vbox->add_child(hbox); + + _play_button = memnew(Button); + hbox->add_child(_play_button); + _play_button->set_flat(true); + _play_button->set_focus_mode(Control::FOCUS_NONE); + _play_button->connect(SNAME("pressed"), callable_mp(this, &AudioStreamEditor::_play)); + _play_button->set_shortcut(ED_SHORTCUT("audio_stream_editor/audio_preview_play_pause", TTR("Audio Preview Play/Pause"), Key::SPACE)); + + _stop_button = memnew(Button); + hbox->add_child(_stop_button); + _stop_button->set_flat(true); + _stop_button->set_focus_mode(Control::FOCUS_NONE); + _stop_button->connect(SNAME("pressed"), callable_mp(this, &AudioStreamEditor::_stop)); + + _current_label = memnew(Label); + _current_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_RIGHT); + _current_label->set_h_size_flags(Control::SIZE_EXPAND_FILL); + _current_label->set_modulate(Color(1, 1, 1, 0.5)); + hbox->add_child(_current_label); + + _duration_label = memnew(Label); + hbox->add_child(_duration_label); +} + +// EditorInspectorPluginAudioStream + +bool EditorInspectorPluginAudioStream::can_handle(Object *p_object) { + return Object::cast_to<AudioStreamWAV>(p_object) != nullptr; +} + +void EditorInspectorPluginAudioStream::parse_begin(Object *p_object) { + AudioStream *stream = Object::cast_to<AudioStream>(p_object); + + editor = memnew(AudioStreamEditor); + editor->set_stream(Ref<AudioStream>(stream)); + + add_custom_control(editor); +} + +// AudioStreamEditorPlugin + +AudioStreamEditorPlugin::AudioStreamEditorPlugin() { + Ref<EditorInspectorPluginAudioStream> plugin; + plugin.instantiate(); + add_inspector_plugin(plugin); +} diff --git a/editor/plugins/audio_stream_editor_plugin.h b/editor/plugins/audio_stream_editor_plugin.h new file mode 100644 index 0000000000..13e52929ee --- /dev/null +++ b/editor/plugins/audio_stream_editor_plugin.h @@ -0,0 +1,93 @@ +/*************************************************************************/ +/* audio_stream_editor_plugin.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef AUDIO_STREAM_EDITOR_PLUGIN_H +#define AUDIO_STREAM_EDITOR_PLUGIN_H + +#include "editor/editor_inspector.h" +#include "editor/editor_plugin.h" +#include "scene/audio/audio_stream_player.h" +#include "scene/gui/button.h" +#include "scene/gui/color_rect.h" +#include "scene/gui/label.h" + +class AudioStreamEditor : public ColorRect { + GDCLASS(AudioStreamEditor, ColorRect); + + Ref<AudioStream> stream; + + AudioStreamPlayer *_player = nullptr; + ColorRect *_preview = nullptr; + Control *_indicator = nullptr; + Label *_current_label = nullptr; + Label *_duration_label = nullptr; + + Button *_play_button = nullptr; + Button *_stop_button = nullptr; + + float _current = 0; + bool _dragging = false; + bool _pausing = false; + +protected: + void _notification(int p_what); + void _preview_changed(ObjectID p_which); + void _play(); + void _stop(); + void _on_finished(); + void _draw_preview(); + void _draw_indicator(); + void _on_input_indicator(Ref<InputEvent> p_event); + void _seek_to(real_t p_x); + void _stream_changed(); + +public: + void set_stream(const Ref<AudioStream> &p_stream); + + AudioStreamEditor(); +}; + +class EditorInspectorPluginAudioStream : public EditorInspectorPlugin { + GDCLASS(EditorInspectorPluginAudioStream, EditorInspectorPlugin); + AudioStreamEditor *editor = nullptr; + +public: + virtual bool can_handle(Object *p_object) override; + virtual void parse_begin(Object *p_object) override; +}; + +class AudioStreamEditorPlugin : public EditorPlugin { + GDCLASS(AudioStreamEditorPlugin, EditorPlugin); + +public: + AudioStreamEditorPlugin(); +}; + +#endif // AUDIO_STREAM_EDITOR_PLUGIN_H diff --git a/editor/plugins/audio_stream_randomizer_editor_plugin.cpp b/editor/plugins/audio_stream_randomizer_editor_plugin.cpp index e21a50a434..61b7683a05 100644 --- a/editor/plugins/audio_stream_randomizer_editor_plugin.cpp +++ b/editor/plugins/audio_stream_randomizer_editor_plugin.cpp @@ -81,7 +81,7 @@ void AudioStreamRandomizerEditorPlugin::_move_stream_array_element(Object *p_und if (p_from_index < 0) { undo_redo_man->add_undo_method(randomizer, "remove_stream", p_to_pos < 0 ? randomizer->get_streams_count() : p_to_pos); } else if (p_to_pos < 0) { - undo_redo_man->add_undo_method(randomizer, "add_stream", p_from_index); + undo_redo_man->add_undo_method(randomizer, "add_stream", p_from_index, Ref<AudioStream>()); } List<PropertyInfo> properties; @@ -107,7 +107,7 @@ void AudioStreamRandomizerEditorPlugin::_move_stream_array_element(Object *p_und #undef ADD_UNDO if (p_from_index < 0) { - undo_redo_man->add_do_method(randomizer, "add_stream", p_to_pos); + undo_redo_man->add_do_method(randomizer, "add_stream", p_to_pos, Ref<AudioStream>()); } else if (p_to_pos < 0) { undo_redo_man->add_do_method(randomizer, "remove_stream", p_from_index); } else { diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp index c08c9a83a7..aab64587ce 100644 --- a/editor/plugins/canvas_item_editor_plugin.cpp +++ b/editor/plugins/canvas_item_editor_plugin.cpp @@ -5504,6 +5504,11 @@ void CanvasItemEditorViewport::_create_preview(const Vector<String> &files) cons Ref<Texture2D> texture = Ref<Texture2D>(Object::cast_to<Texture2D>(*res)); Ref<PackedScene> scene = Ref<PackedScene>(Object::cast_to<PackedScene>(*res)); if (texture != nullptr || scene != nullptr) { + bool root_node_selected = EditorNode::get_singleton()->get_editor_selection()->is_selected(EditorNode::get_singleton()->get_edited_scene()); + String desc = TTR("Drag and drop to add as child of current scene's root node.") + "\n" + TTR("Hold Ctrl when dropping to add as child of selected node."); + if (!root_node_selected) { + desc += "\n" + TTR("Hold Shift when dropping to add as sibling of selected node."); + } if (texture != nullptr) { Sprite2D *sprite = memnew(Sprite2D); sprite->set_texture(texture); @@ -5511,14 +5516,15 @@ void CanvasItemEditorViewport::_create_preview(const Vector<String> &files) cons preview_node->add_child(sprite); label->show(); label_desc->show(); - label_desc->set_text(TTR("Drag and drop to add as child of current scene's root node.\nHold Ctrl when dropping to add as child of selected node.\nHold Shift when dropping to add as sibling of selected node.\nHold Alt when dropping to add as a different node type.")); + desc += "\n" + TTR("Hold Alt when dropping to add as a different node type."); + label_desc->set_text(desc); } else { if (scene.is_valid()) { Node *instance = scene->instantiate(); if (instance) { preview_node->add_child(instance); label_desc->show(); - label_desc->set_text(TTR("Drag and drop to add as child of current scene's root node.\nHold Ctrl when dropping to add as child of selected node.\nHold Shift when dropping to add as sibling of selected node.")); + label_desc->set_text(desc); } } } diff --git a/editor/plugins/editor_preview_plugins.h b/editor/plugins/editor_preview_plugins.h index efb2c80cfd..0f8ed1c857 100644 --- a/editor/plugins/editor_preview_plugins.h +++ b/editor/plugins/editor_preview_plugins.h @@ -70,10 +70,12 @@ public: }; class EditorPackedScenePreviewPlugin : public EditorResourcePreviewGenerator { + GDCLASS(EditorPackedScenePreviewPlugin, EditorResourcePreviewGenerator); + public: - virtual bool handles(const String &p_type) const; - virtual Ref<Texture2D> generate(const Ref<Resource> &p_from, const Size2 &p_size) const; - virtual Ref<Texture2D> generate_from_path(const String &p_path, const Size2 &p_size) const; + virtual bool handles(const String &p_type) const override; + virtual Ref<Texture2D> generate(const Ref<Resource> &p_from, const Size2 &p_size) const override; + virtual Ref<Texture2D> generate_from_path(const String &p_path, const Size2 &p_size) const override; EditorPackedScenePreviewPlugin(); }; @@ -107,17 +109,21 @@ public: }; class EditorScriptPreviewPlugin : public EditorResourcePreviewGenerator { + GDCLASS(EditorScriptPreviewPlugin, EditorResourcePreviewGenerator); + public: - virtual bool handles(const String &p_type) const; - virtual Ref<Texture2D> generate(const Ref<Resource> &p_from, const Size2 &p_size) const; + virtual bool handles(const String &p_type) const override; + virtual Ref<Texture2D> generate(const Ref<Resource> &p_from, const Size2 &p_size) const override; EditorScriptPreviewPlugin(); }; class EditorAudioStreamPreviewPlugin : public EditorResourcePreviewGenerator { + GDCLASS(EditorAudioStreamPreviewPlugin, EditorResourcePreviewGenerator); + public: - virtual bool handles(const String &p_type) const; - virtual Ref<Texture2D> generate(const Ref<Resource> &p_from, const Size2 &p_size) const; + virtual bool handles(const String &p_type) const override; + virtual Ref<Texture2D> generate(const Ref<Resource> &p_from, const Size2 &p_size) const override; EditorAudioStreamPreviewPlugin(); }; diff --git a/editor/plugins/gdextension_export_plugin.h b/editor/plugins/gdextension_export_plugin.h index d62691c76d..41edf9ac75 100644 --- a/editor/plugins/gdextension_export_plugin.h +++ b/editor/plugins/gdextension_export_plugin.h @@ -40,7 +40,7 @@ protected: }; void GDExtensionExportPlugin::_export_file(const String &p_path, const String &p_type, const HashSet<String> &p_features) { - if (p_type != "NativeExtension") { + if (p_type != "GDExtension") { return; } @@ -55,7 +55,7 @@ void GDExtensionExportPlugin::_export_file(const String &p_path, const String &p String entry_symbol = config->get_value("configuration", "entry_symbol"); PackedStringArray tags; - String library_path = NativeExtension::find_extension_library( + String library_path = GDExtension::find_extension_library( p_path, config, [p_features](String p_feature) { return p_features.has(p_feature); }, &tags); if (!library_path.is_empty()) { add_shared_object(library_path, tags); @@ -85,7 +85,7 @@ void GDExtensionExportPlugin::_export_file(const String &p_path, const String &p for (const String &E : p_features) { features_vector.append(E); } - ERR_FAIL_MSG(vformat("No suitable library found. The libraries' tags referred to an invalid feature flag. Possible feature flags for your platform: %s", p_path, String(", ").join(tags))); + ERR_FAIL_MSG(vformat("No suitable library found for GDExtension: %s. Possible feature flags for your platform: %s", p_path, String(", ").join(features_vector))); } List<String> dependencies; diff --git a/editor/plugins/mesh_instance_3d_editor_plugin.cpp b/editor/plugins/mesh_instance_3d_editor_plugin.cpp index 57e8046f32..aec43290f9 100644 --- a/editor/plugins/mesh_instance_3d_editor_plugin.cpp +++ b/editor/plugins/mesh_instance_3d_editor_plugin.cpp @@ -41,6 +41,7 @@ #include "scene/gui/menu_button.h" #include "scene/resources/concave_polygon_shape_3d.h" #include "scene/resources/convex_polygon_shape_3d.h" +#include "scene/scene_string_names.h" void MeshInstance3DEditor::_node_removed(Node *p_node) { if (p_node == node) { @@ -87,8 +88,8 @@ void MeshInstance3DEditor::_menu_option(int p_option) { ur->add_do_method(node, "add_child", body, true); ur->add_do_method(body, "set_owner", owner); ur->add_do_method(cshape, "set_owner", owner); - ur->add_do_method(Node3DEditor::get_singleton(), "_request_gizmo", body); - ur->add_do_method(Node3DEditor::get_singleton(), "_request_gizmo", cshape); + ur->add_do_method(Node3DEditor::get_singleton(), SceneStringNames::get_singleton()->_request_gizmo, body); + ur->add_do_method(Node3DEditor::get_singleton(), SceneStringNames::get_singleton()->_request_gizmo, cshape); ur->add_do_reference(body); ur->add_undo_method(node, "remove_child", body); ur->commit_action(); @@ -123,8 +124,8 @@ void MeshInstance3DEditor::_menu_option(int p_option) { ur->add_do_method(instance, "add_child", body, true); ur->add_do_method(body, "set_owner", owner); ur->add_do_method(cshape, "set_owner", owner); - ur->add_do_method(Node3DEditor::get_singleton(), "_request_gizmo", body); - ur->add_do_method(Node3DEditor::get_singleton(), "_request_gizmo", cshape); + ur->add_do_method(Node3DEditor::get_singleton(), SceneStringNames::get_singleton()->_request_gizmo, body); + ur->add_do_method(Node3DEditor::get_singleton(), SceneStringNames::get_singleton()->_request_gizmo, cshape); ur->add_do_reference(body); ur->add_undo_method(instance, "remove_child", body); } @@ -158,7 +159,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) { ur->add_do_method(node->get_parent(), "add_child", cshape, true); ur->add_do_method(node->get_parent(), "move_child", cshape, node->get_index() + 1); ur->add_do_method(cshape, "set_owner", owner); - ur->add_do_method(Node3DEditor::get_singleton(), "_request_gizmo", cshape); + ur->add_do_method(Node3DEditor::get_singleton(), SceneStringNames::get_singleton()->_request_gizmo, cshape); ur->add_do_reference(cshape); ur->add_undo_method(node->get_parent(), "remove_child", cshape); ur->commit_action(); @@ -198,7 +199,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) { ur->add_do_method(node->get_parent(), "add_child", cshape, true); ur->add_do_method(node->get_parent(), "move_child", cshape, node->get_index() + 1); ur->add_do_method(cshape, "set_owner", owner); - ur->add_do_method(Node3DEditor::get_singleton(), "_request_gizmo", cshape); + ur->add_do_method(Node3DEditor::get_singleton(), SceneStringNames::get_singleton()->_request_gizmo, cshape); ur->add_do_reference(cshape); ur->add_undo_method(node->get_parent(), "remove_child", cshape); @@ -237,7 +238,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) { ur->add_do_method(node->get_parent(), "add_child", cshape); ur->add_do_method(node->get_parent(), "move_child", cshape, node->get_index() + 1); ur->add_do_method(cshape, "set_owner", owner); - ur->add_do_method(Node3DEditor::get_singleton(), "_request_gizmo", cshape); + ur->add_do_method(Node3DEditor::get_singleton(), SceneStringNames::get_singleton()->_request_gizmo, cshape); ur->add_do_reference(cshape); ur->add_undo_method(node->get_parent(), "remove_child", cshape); } @@ -263,7 +264,7 @@ void MeshInstance3DEditor::_menu_option(int p_option) { ur->add_do_method(node, "add_child", nmi, true); ur->add_do_method(nmi, "set_owner", owner); - ur->add_do_method(Node3DEditor::get_singleton(), "_request_gizmo", nmi); + ur->add_do_method(Node3DEditor::get_singleton(), SceneStringNames::get_singleton()->_request_gizmo, nmi); ur->add_do_reference(nmi); ur->add_undo_method(node, "remove_child", nmi); @@ -498,7 +499,7 @@ void MeshInstance3DEditor::_create_outline_mesh() { ur->add_do_method(node, "add_child", mi, true); ur->add_do_method(mi, "set_owner", owner); - ur->add_do_method(Node3DEditor::get_singleton(), "_request_gizmo", mi); + ur->add_do_method(Node3DEditor::get_singleton(), SceneStringNames::get_singleton()->_request_gizmo, mi); ur->add_do_reference(mi); ur->add_undo_method(node, "remove_child", mi); diff --git a/editor/plugins/mesh_library_editor_plugin.cpp b/editor/plugins/mesh_library_editor_plugin.cpp index 4a8e5d9979..4b31e99f0e 100644 --- a/editor/plugins/mesh_library_editor_plugin.cpp +++ b/editor/plugins/mesh_library_editor_plugin.cpp @@ -160,23 +160,23 @@ void MeshLibraryEditor::_import_scene(Node *p_scene, Ref<MeshLibrary> p_library, p_library->set_item_shapes(id, collisions); - Ref<NavigationMesh> navmesh; - Transform3D navmesh_transform; + Ref<NavigationMesh> navigation_mesh; + Transform3D navigation_mesh_transform; for (int j = 0; j < mi->get_child_count(); j++) { Node *child2 = mi->get_child(j); if (!Object::cast_to<NavigationRegion3D>(child2)) { continue; } NavigationRegion3D *sb = Object::cast_to<NavigationRegion3D>(child2); - navmesh = sb->get_navigation_mesh(); - navmesh_transform = sb->get_transform(); - if (!navmesh.is_null()) { + navigation_mesh = sb->get_navigation_mesh(); + navigation_mesh_transform = sb->get_transform(); + if (!navigation_mesh.is_null()) { break; } } - if (!navmesh.is_null()) { - p_library->set_item_navmesh(id, navmesh); - p_library->set_item_navmesh_transform(id, navmesh_transform); + if (!navigation_mesh.is_null()) { + p_library->set_item_navigation_mesh(id, navigation_mesh); + p_library->set_item_navigation_mesh_transform(id, navigation_mesh_transform); } } diff --git a/editor/plugins/node_3d_editor_gizmos.cpp b/editor/plugins/node_3d_editor_gizmos.cpp index 0af2a13df2..91c7fbc06a 100644 --- a/editor/plugins/node_3d_editor_gizmos.cpp +++ b/editor/plugins/node_3d_editor_gizmos.cpp @@ -30,6 +30,7 @@ #include "node_3d_editor_gizmos.h" +#include "core/config/project_settings.h" #include "core/math/convex_hull.h" #include "core/math/geometry_2d.h" #include "core/math/geometry_3d.h" @@ -1015,8 +1016,9 @@ Ref<StandardMaterial3D> EditorNode3DGizmoPlugin::get_material(const String &p_na } String EditorNode3DGizmoPlugin::get_gizmo_name() const { - if (get_script_instance() && get_script_instance()->has_method("_get_gizmo_name")) { - return get_script_instance()->call("_get_gizmo_name"); + String ret; + if (GDVIRTUAL_CALL(_get_gizmo_name, ret)) { + return ret; } WARN_PRINT_ONCE("A 3D editor gizmo has no name defined (it will appear as \"Unnamed Gizmo\" in the \"View > Gizmos\" menu). To resolve this, override the `_get_gizmo_name()` function to return a String in the script that extends EditorNode3DGizmoPlugin."); @@ -1024,8 +1026,9 @@ String EditorNode3DGizmoPlugin::get_gizmo_name() const { } int EditorNode3DGizmoPlugin::get_priority() const { - if (get_script_instance() && get_script_instance()->has_method("_get_priority")) { - return get_script_instance()->call("_get_priority"); + int ret; + if (GDVIRTUAL_CALL(_get_priority, ret)) { + return ret; } return 0; } @@ -1732,6 +1735,24 @@ Camera3DGizmoPlugin::Camera3DGizmoPlugin() { create_handle_material("handles"); } +Size2i Camera3DGizmoPlugin::_get_viewport_size(Camera3D *p_camera) { + Viewport *viewport = p_camera->get_viewport(); + + Window *window = Object::cast_to<Window>(viewport); + if (window) { + return window->get_size(); + } + + SubViewport *sub_viewport = Object::cast_to<SubViewport>(viewport); + ERR_FAIL_NULL_V(sub_viewport, Size2i()); + + if (sub_viewport == EditorNode::get_singleton()->get_scene_root()) { + return Size2(GLOBAL_GET("display/window/size/viewport_width"), GLOBAL_GET("display/window/size/viewport_height")); + } + + return sub_viewport->get_size(); +} + bool Camera3DGizmoPlugin::has_gizmo(Node3D *p_spatial) { return Object::cast_to<Camera3D>(p_spatial) != nullptr; } @@ -1830,6 +1851,10 @@ void Camera3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { Ref<Material> material = get_material("camera_material", p_gizmo); + const Size2i viewport_size = _get_viewport_size(camera); + const real_t viewport_aspect = viewport_size.x > 0 && viewport_size.y > 0 ? viewport_size.aspect() : 1.0; + const Size2 size_factor = viewport_aspect > 1.0 ? Size2(1.0, 1.0 / viewport_aspect) : Size2(viewport_aspect, 1.0); + #define ADD_TRIANGLE(m_a, m_b, m_c) \ { \ lines.push_back(m_a); \ @@ -1857,10 +1882,11 @@ void Camera3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { // The real FOV is halved for accurate representation float fov = camera->get_fov() / 2.0; - Vector3 side = Vector3(Math::sin(Math::deg_to_rad(fov)), 0, -Math::cos(Math::deg_to_rad(fov))); - Vector3 nside = side; - nside.x = -nside.x; - Vector3 up = Vector3(0, side.x, 0); + const float hsize = Math::sin(Math::deg_to_rad(fov)); + const float depth = -Math::cos(Math::deg_to_rad(fov)); + Vector3 side = Vector3(hsize * size_factor.x, 0, depth); + Vector3 nside = Vector3(-side.x, side.y, side.z); + Vector3 up = Vector3(0, hsize * size_factor.y, 0); ADD_TRIANGLE(Vector3(), side + up, side - up); ADD_TRIANGLE(Vector3(), nside + up, nside - up); @@ -1868,18 +1894,18 @@ void Camera3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { ADD_TRIANGLE(Vector3(), side - up, nside - up); handles.push_back(side); - side.x *= 0.25; - nside.x *= 0.25; - Vector3 tup(0, up.y * 3 / 2, side.z); + side.x = MIN(side.x, hsize * 0.25); + nside.x = -side.x; + Vector3 tup(0, up.y + hsize / 2, side.z); ADD_TRIANGLE(tup, side + up, nside + up); - } break; + case Camera3D::PROJECTION_ORTHOGONAL: { float size = camera->get_size(); float hsize = size * 0.5; - Vector3 right(hsize, 0, 0); - Vector3 up(0, hsize, 0); + Vector3 right(hsize * size_factor.x, 0, 0); + Vector3 up(0, hsize * size_factor.y, 0); Vector3 back(0, 0, -1.0); Vector3 front(0, 0, 0); @@ -1890,18 +1916,19 @@ void Camera3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { handles.push_back(right + back); - right.x *= 0.25; - Vector3 tup(0, up.y * 3 / 2, back.z); + right.x = MIN(right.x, hsize * 0.25); + Vector3 tup(0, up.y + hsize / 2, back.z); ADD_TRIANGLE(tup, right + up + back, -right + up + back); } break; + case Camera3D::PROJECTION_FRUSTUM: { float hsize = camera->get_size() / 2.0; Vector3 side = Vector3(hsize, 0, -camera->get_near()).normalized(); - Vector3 nside = side; - nside.x = -nside.x; - Vector3 up = Vector3(0, side.x, 0); + side.x *= size_factor.x; + Vector3 nside = Vector3(-side.x, side.y, side.z); + Vector3 up = Vector3(0, hsize * size_factor.y, 0); Vector3 offset = Vector3(camera->get_frustum_offset().x, camera->get_frustum_offset().y, 0.0); ADD_TRIANGLE(Vector3(), side + up + offset, side - up + offset); @@ -1909,11 +1936,11 @@ void Camera3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { ADD_TRIANGLE(Vector3(), side + up + offset, nside + up + offset); ADD_TRIANGLE(Vector3(), side - up + offset, nside - up + offset); - side.x *= 0.25; - nside.x *= 0.25; - Vector3 tup(0, up.y * 3 / 2, side.z); + side.x = MIN(side.x, hsize * 0.25); + nside.x = -side.x; + Vector3 tup(0, up.y + hsize / 2, side.z); ADD_TRIANGLE(tup + offset, side + up + offset, nside + up + offset); - } + } break; } #undef ADD_TRIANGLE @@ -1921,7 +1948,10 @@ void Camera3DGizmoPlugin::redraw(EditorNode3DGizmo *p_gizmo) { p_gizmo->add_lines(lines, material); p_gizmo->add_collision_segments(lines); - p_gizmo->add_handles(handles, get_material("handles")); + + if (!handles.is_empty()) { + p_gizmo->add_handles(handles, get_material("handles")); + } } ////// diff --git a/editor/plugins/node_3d_editor_gizmos.h b/editor/plugins/node_3d_editor_gizmos.h index d7e3e03f61..60d44ad787 100644 --- a/editor/plugins/node_3d_editor_gizmos.h +++ b/editor/plugins/node_3d_editor_gizmos.h @@ -264,6 +264,9 @@ public: class Camera3DGizmoPlugin : public EditorNode3DGizmoPlugin { GDCLASS(Camera3DGizmoPlugin, EditorNode3DGizmoPlugin); +private: + static Size2i _get_viewport_size(Camera3D *p_camera); + public: bool has_gizmo(Node3D *p_spatial) override; String get_gizmo_name() const override; diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index c97de80a76..4976c8c750 100644 --- a/editor/plugins/node_3d_editor_plugin.cpp +++ b/editor/plugins/node_3d_editor_plugin.cpp @@ -463,6 +463,15 @@ void Node3DEditorViewport::_view_settings_confirmed(real_t p_interp_delta) { _update_camera(p_interp_delta); } +void Node3DEditorViewport::_update_navigation_controls_visibility() { + bool show_viewport_rotation_gizmo = EDITOR_GET("editors/3d/navigation/show_viewport_rotation_gizmo") && (!previewing_cinema && !previewing_camera); + rotation_control->set_visible(show_viewport_rotation_gizmo); + + bool show_viewport_navigation_gizmo = EDITOR_GET("editors/3d/navigation/show_viewport_navigation_gizmo") && (!previewing_cinema && !previewing_camera); + position_control->set_visible(show_viewport_navigation_gizmo); + look_control->set_visible(show_viewport_navigation_gizmo); +} + void Node3DEditorViewport::_update_camera(real_t p_interp_delta) { bool is_orthogonal = camera->get_projection() == Camera3D::PROJECTION_ORTHOGONAL; @@ -2597,7 +2606,7 @@ void Node3DEditorViewport::_project_settings_changed() { const bool use_taa = GLOBAL_GET("rendering/anti_aliasing/quality/use_taa"); viewport->set_use_taa(use_taa); - const bool transparent_background = GLOBAL_GET("rendering/transparent_background"); + const bool transparent_background = GLOBAL_GET("rendering/viewport/transparent_background"); viewport->set_transparent_background(transparent_background); const bool use_debanding = GLOBAL_GET("rendering/anti_aliasing/quality/use_debanding"); @@ -2642,9 +2651,6 @@ void Node3DEditorViewport::_notification(int p_what) { set_freelook_active(false); } call_deferred(SNAME("update_transform_gizmo_view")); - rotation_control->set_visible(EDITOR_GET("editors/3d/navigation/show_viewport_rotation_gizmo")); - position_control->set_visible(EDITOR_GET("editors/3d/navigation/show_viewport_navigation_gizmo")); - look_control->set_visible(EDITOR_GET("editors/3d/navigation/show_viewport_navigation_gizmo")); } break; case NOTIFICATION_RESIZED: { @@ -2662,6 +2668,7 @@ void Node3DEditorViewport::_notification(int p_what) { } } + _update_navigation_controls_visibility(); _update_freelook(delta); Node *scene_root = SceneTreeDock::get_singleton()->get_editor_data()->get_edited_scene_root(); @@ -3566,9 +3573,8 @@ void Node3DEditorViewport::_toggle_camera_preview(bool p_activate) { ERR_FAIL_COND(p_activate && !preview); ERR_FAIL_COND(!p_activate && !previewing); - rotation_control->set_visible(!p_activate); - position_control->set_visible(!p_activate); - look_control->set_visible(!p_activate); + previewing_camera = p_activate; + _update_navigation_controls_visibility(); if (!p_activate) { previewing->disconnect("tree_exiting", callable_mp(this, &Node3DEditorViewport::_preview_exited_scene)); @@ -3589,9 +3595,7 @@ void Node3DEditorViewport::_toggle_camera_preview(bool p_activate) { void Node3DEditorViewport::_toggle_cinema_preview(bool p_activate) { previewing_cinema = p_activate; - rotation_control->set_visible(!p_activate); - position_control->set_visible(!p_activate); - look_control->set_visible(!p_activate); + _update_navigation_controls_visibility(); if (!previewing_cinema) { if (previewing != nullptr) { @@ -7477,6 +7481,8 @@ void Node3DEditor::_notification(int p_what) { sun_state->set_custom_minimum_size(sun_vb->get_combined_minimum_size()); environ_state->set_custom_minimum_size(environ_vb->get_combined_minimum_size()); + + EditorNode::get_singleton()->connect("project_settings_changed", callable_mp(this, &Node3DEditor::update_all_gizmos).bind(Variant())); } break; case NOTIFICATION_ENTER_TREE: { @@ -7637,6 +7643,13 @@ void Node3DEditor::_request_gizmo(Object *p_obj) { } } +void Node3DEditor::_request_gizmo_for_id(ObjectID p_id) { + Node3D *node = Object::cast_to<Node3D>(ObjectDB::get_instance(p_id)); + if (node) { + _request_gizmo(node); + } +} + void Node3DEditor::_set_subgizmo_selection(Object *p_obj, Ref<Node3DGizmo> p_gizmo, int p_id, Transform3D p_transform) { if (p_id == -1) { _clear_subgizmo_selection(p_obj); @@ -7817,6 +7830,7 @@ void Node3DEditor::_register_all_gizmos() { void Node3DEditor::_bind_methods() { ClassDB::bind_method("_get_editor_data", &Node3DEditor::_get_editor_data); ClassDB::bind_method("_request_gizmo", &Node3DEditor::_request_gizmo); + ClassDB::bind_method("_request_gizmo_for_id", &Node3DEditor::_request_gizmo_for_id); ClassDB::bind_method("_set_subgizmo_selection", &Node3DEditor::_set_subgizmo_selection); ClassDB::bind_method("_clear_subgizmo_selection", &Node3DEditor::_clear_subgizmo_selection); ClassDB::bind_method("_refresh_menu_icons", &Node3DEditor::_refresh_menu_icons); @@ -8419,8 +8433,8 @@ Node3DEditor::Node3DEditor() { EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::INT, "editors/3d/manipulator_gizmo_size", PROPERTY_HINT_RANGE, "16,160,1")); EDITOR_DEF("editors/3d/manipulator_gizmo_opacity", 0.9); EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::FLOAT, "editors/3d/manipulator_gizmo_opacity", PROPERTY_HINT_RANGE, "0,1,0.01")); - EDITOR_DEF_RST("editors/3d/navigation/show_viewport_rotation_gizmo", true); - EDITOR_DEF_RST("editors/3d/navigation/show_viewport_navigation_gizmo", DisplayServer::get_singleton()->screen_is_touchscreen()); + EDITOR_DEF("editors/3d/navigation/show_viewport_rotation_gizmo", true); + EDITOR_DEF("editors/3d/navigation/show_viewport_navigation_gizmo", DisplayServer::get_singleton()->is_touchscreen_available()); current_hover_gizmo_handle = -1; current_hover_gizmo_handle_secondary = false; diff --git a/editor/plugins/node_3d_editor_plugin.h b/editor/plugins/node_3d_editor_plugin.h index ed555d86c3..53e167ace6 100644 --- a/editor/plugins/node_3d_editor_plugin.h +++ b/editor/plugins/node_3d_editor_plugin.h @@ -384,6 +384,7 @@ private: void _view_settings_confirmed(real_t p_interp_delta); void _update_camera(real_t p_interp_delta); + void _update_navigation_controls_visibility(); Transform3D to_camera_transform(const Cursor &p_cursor) const; void _draw(); @@ -399,6 +400,7 @@ private: Camera3D *previewing = nullptr; Camera3D *preview = nullptr; + bool previewing_camera; bool previewing_cinema; bool _is_node_locked(const Node *p_node); void _preview_exited_scene(); @@ -716,6 +718,7 @@ private: Node3D *selected = nullptr; void _request_gizmo(Object *p_obj); + void _request_gizmo_for_id(ObjectID p_id); void _set_subgizmo_selection(Object *p_obj, Ref<Node3DGizmo> p_gizmo, int p_id, Transform3D p_transform = Transform3D()); void _clear_subgizmo_selection(Object *p_obj = nullptr); diff --git a/editor/plugins/packed_scene_editor_plugin.cpp b/editor/plugins/packed_scene_editor_plugin.cpp new file mode 100644 index 0000000000..0a1b96dccb --- /dev/null +++ b/editor/plugins/packed_scene_editor_plugin.cpp @@ -0,0 +1,81 @@ +/*************************************************************************/ +/* packed_scene_editor_plugin.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "packed_scene_editor_plugin.h" + +#include "editor/editor_node.h" +#include "scene/gui/button.h" +#include "scene/resources/packed_scene.h" +#include "scene/scene_string_names.h" + +void PackedSceneEditor::_on_open_scene_pressed() { + // Using deferred call because changing scene updates the Inspector and thus destroys this plugin. + callable_mp(EditorNode::get_singleton(), &EditorNode::open_request).call_deferred(packed_scene->get_path()); +} + +void PackedSceneEditor::_notification(int p_what) { + switch (p_what) { + case NOTIFICATION_ENTER_TREE: + case NOTIFICATION_THEME_CHANGED: { + open_scene_button->set_icon(get_theme_icon(SNAME("PackedScene"), SNAME("EditorIcons"))); + } break; + } +} + +PackedSceneEditor::PackedSceneEditor(Ref<PackedScene> &p_packed_scene) { + packed_scene = p_packed_scene; + + open_scene_button = EditorInspector::create_inspector_action_button(TTR("Open Scene")); + open_scene_button->connect(SNAME("pressed"), callable_mp(this, &PackedSceneEditor::_on_open_scene_pressed)); + open_scene_button->set_disabled(!packed_scene->get_path().get_file().is_valid_filename()); + add_child(open_scene_button); + + add_child(memnew(Control)); // Add padding before the regular properties. +} + +/////////////////////// + +bool EditorInspectorPluginPackedScene::can_handle(Object *p_object) { + return Object::cast_to<PackedScene>(p_object) != nullptr; +} + +void EditorInspectorPluginPackedScene::parse_begin(Object *p_object) { + Ref<PackedScene> packed_scene(p_object); + PackedSceneEditor *editor = memnew(PackedSceneEditor(packed_scene)); + add_custom_control(editor); +} + +/////////////////////// + +PackedSceneEditorPlugin::PackedSceneEditorPlugin() { + Ref<EditorInspectorPluginPackedScene> plugin; + plugin.instantiate(); + add_inspector_plugin(plugin); +} diff --git a/editor/plugins/packed_scene_editor_plugin.h b/editor/plugins/packed_scene_editor_plugin.h new file mode 100644 index 0000000000..0912030180 --- /dev/null +++ b/editor/plugins/packed_scene_editor_plugin.h @@ -0,0 +1,68 @@ +/*************************************************************************/ +/* packed_scene_editor_plugin.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef PACKED_SCENE_EDITOR_PLUGIN_H +#define PACKED_SCENE_EDITOR_PLUGIN_H + +#include "editor/editor_inspector.h" +#include "editor/editor_plugin.h" +#include "scene/gui/box_container.h" + +class PackedSceneEditor : public VBoxContainer { + GDCLASS(PackedSceneEditor, VBoxContainer); + + Ref<PackedScene> packed_scene; + Button *open_scene_button; + + void _on_open_scene_pressed(); + +protected: + void _notification(int p_what); + +public: + PackedSceneEditor(Ref<PackedScene> &p_packed_scene); +}; + +class EditorInspectorPluginPackedScene : public EditorInspectorPlugin { + GDCLASS(EditorInspectorPluginPackedScene, EditorInspectorPlugin); + +public: + virtual bool can_handle(Object *p_object) override; + virtual void parse_begin(Object *p_object) override; +}; + +class PackedSceneEditorPlugin : public EditorPlugin { + GDCLASS(PackedSceneEditorPlugin, EditorPlugin); + +public: + PackedSceneEditorPlugin(); +}; + +#endif // PACKED_SCENE_EDITOR_PLUGIN_H diff --git a/editor/plugins/path_3d_editor_plugin.cpp b/editor/plugins/path_3d_editor_plugin.cpp index 63ca78d6c0..7a9e50e482 100644 --- a/editor/plugins/path_3d_editor_plugin.cpp +++ b/editor/plugins/path_3d_editor_plugin.cpp @@ -274,13 +274,10 @@ void Path3DGizmo::redraw() { // Fish Bone. v3p.push_back(p1); - v3p.push_back(p1 + (side - forward) * 0.06); + v3p.push_back(p1 + (side - forward + up * 0.3) * 0.06); v3p.push_back(p1); - v3p.push_back(p1 + (-side - forward) * 0.06); - - v3p.push_back(p1); - v3p.push_back(p1 + up * 0.03); + v3p.push_back(p1 + (-side - forward + up * 0.3) * 0.06); } add_lines(v3p, path_material); diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp index 747fdfd041..38639ac811 100644 --- a/editor/plugins/script_text_editor.cpp +++ b/editor/plugins/script_text_editor.cpp @@ -1223,7 +1223,9 @@ void ScriptTextEditor::_edit_option(int p_op) { code_editor->duplicate_selection(); } break; case EDIT_TOGGLE_FOLD_LINE: { - tx->toggle_foldable_line(tx->get_caret_line()); + for (int caret_idx = 0; caret_idx < tx->get_caret_count(); caret_idx++) { + tx->toggle_foldable_line(tx->get_caret_line(caret_idx)); + } tx->queue_redraw(); } break; case EDIT_FOLD_ALL_LINES: { @@ -1291,28 +1293,28 @@ void ScriptTextEditor::_edit_option(int p_op) { } break; case EDIT_EVALUATE: { Expression expression; - Vector<String> lines = code_editor->get_text_editor()->get_selected_text().split("\n"); - PackedStringArray results; - - for (int i = 0; i < lines.size(); i++) { - String line = lines[i]; - String whitespace = line.substr(0, line.size() - line.strip_edges(true, false).size()); //extract the whitespace at the beginning - - if (expression.parse(line) == OK) { - Variant result = expression.execute(Array(), Variant(), false, true); - if (expression.get_error_text().is_empty()) { - results.push_back(whitespace + result.get_construct_string()); + tx->begin_complex_operation(); + for (int caret_idx = 0; caret_idx < tx->get_caret_count(); caret_idx++) { + Vector<String> lines = tx->get_selected_text(caret_idx).split("\n"); + PackedStringArray results; + + for (int i = 0; i < lines.size(); i++) { + String line = lines[i]; + String whitespace = line.substr(0, line.size() - line.strip_edges(true, false).size()); // Extract the whitespace at the beginning. + if (expression.parse(line) == OK) { + Variant result = expression.execute(Array(), Variant(), false, true); + if (expression.get_error_text().is_empty()) { + results.push_back(whitespace + result.get_construct_string()); + } else { + results.push_back(line); + } } else { results.push_back(line); } - } else { - results.push_back(line); } + tx->insert_text_at_caret(String("\n").join(results), caret_idx); } - - code_editor->get_text_editor()->begin_complex_operation(); //prevents creating a two-step undo - code_editor->get_text_editor()->insert_text_at_caret(String("\n").join(results)); - code_editor->get_text_editor()->end_complex_operation(); + tx->end_complex_operation(); } break; case SEARCH_FIND: { code_editor->get_find_replace_bar()->popup_search(); @@ -1327,14 +1329,14 @@ void ScriptTextEditor::_edit_option(int p_op) { code_editor->get_find_replace_bar()->popup_replace(); } break; case SEARCH_IN_FILES: { - String selected_text = code_editor->get_text_editor()->get_selected_text(); + String selected_text = tx->get_selected_text(); // Yep, because it doesn't make sense to instance this dialog for every single script open... // So this will be delegated to the ScriptEditor. emit_signal(SNAME("search_in_files_requested"), selected_text); } break; case REPLACE_IN_FILES: { - String selected_text = code_editor->get_text_editor()->get_selected_text(); + String selected_text = tx->get_selected_text(); emit_signal(SNAME("replace_in_files_requested"), selected_text); } break; @@ -1358,10 +1360,12 @@ void ScriptTextEditor::_edit_option(int p_op) { code_editor->remove_all_bookmarks(); } break; case DEBUG_TOGGLE_BREAKPOINT: { - int line = tx->get_caret_line(); - bool dobreak = !tx->is_line_breakpointed(line); - tx->set_line_as_breakpoint(line, dobreak); - EditorDebuggerNode::get_singleton()->set_breakpoint(script->get_path(), line + 1, dobreak); + for (int caret_idx = 0; caret_idx < tx->get_caret_count(); caret_idx++) { + int line = tx->get_caret_line(caret_idx); + bool dobreak = !tx->is_line_breakpointed(line); + tx->set_line_as_breakpoint(line, dobreak); + EditorDebuggerNode::get_singleton()->set_breakpoint(script->get_path(), line + 1, dobreak); + } } break; case DEBUG_REMOVE_ALL_BREAKPOINTS: { PackedInt32Array bpoints = tx->get_breakpointed_lines(); @@ -1379,26 +1383,14 @@ void ScriptTextEditor::_edit_option(int p_op) { return; } - tx->remove_secondary_carets(); - int line = tx->get_caret_line(); - - // wrap around - if (line >= (int)bpoints[bpoints.size() - 1]) { - tx->unfold_line(bpoints[0]); - tx->set_caret_line(bpoints[0]); - tx->center_viewport_to_caret(); - } else { - for (int i = 0; i < bpoints.size(); i++) { - int bline = bpoints[i]; - if (bline > line) { - tx->unfold_line(bline); - tx->set_caret_line(bline); - tx->center_viewport_to_caret(); - return; - } + int current_line = tx->get_caret_line(); + int bpoint_idx = 0; + if (current_line < (int)bpoints[bpoints.size() - 1]) { + while (bpoint_idx < bpoints.size() && bpoints[bpoint_idx] <= current_line) { + bpoint_idx++; } } - + code_editor->goto_line_centered(bpoints[bpoint_idx]); } break; case DEBUG_GOTO_PREV_BREAKPOINT: { PackedInt32Array bpoints = tx->get_breakpointed_lines(); @@ -1406,25 +1398,14 @@ void ScriptTextEditor::_edit_option(int p_op) { return; } - tx->remove_secondary_carets(); - int line = tx->get_caret_line(); - // wrap around - if (line <= (int)bpoints[0]) { - tx->unfold_line(bpoints[bpoints.size() - 1]); - tx->set_caret_line(bpoints[bpoints.size() - 1]); - tx->center_viewport_to_caret(); - } else { - for (int i = bpoints.size() - 1; i >= 0; i--) { - int bline = bpoints[i]; - if (bline < line) { - tx->unfold_line(bline); - tx->set_caret_line(bline); - tx->center_viewport_to_caret(); - return; - } + int current_line = tx->get_caret_line(); + int bpoint_idx = bpoints.size() - 1; + if (current_line > (int)bpoints[0]) { + while (bpoint_idx >= 0 && bpoints[bpoint_idx] >= current_line) { + bpoint_idx--; } } - + code_editor->goto_line_centered(bpoints[bpoint_idx]); } break; case HELP_CONTEXTUAL: { String text = tx->get_selected_text(0); @@ -1835,7 +1816,7 @@ void ScriptTextEditor::_text_edit_gui_input(const Ref<InputEvent> &ev) { base = _find_node_for_script(base, base, script); } ScriptLanguage::LookupResult result; - if (script->get_language()->lookup_code(code_editor->get_text_editor()->get_text_for_symbol_lookup(), word_at_pos, script->get_path(), base, result) == OK) { + if (script->get_language()->lookup_code(tx->get_text_for_symbol_lookup(), word_at_pos, script->get_path(), base, result) == OK) { open_docs = true; } } diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h index 1ae419053e..4f0894a1a9 100644 --- a/editor/plugins/shader_editor_plugin.h +++ b/editor/plugins/shader_editor_plugin.h @@ -96,6 +96,7 @@ protected: static void _bind_methods(); public: + virtual String get_name() const override { return "Shader"; } virtual void edit(Object *p_object) override; virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; diff --git a/editor/plugins/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp index e8bbfd1b91..d2dadd884b 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_3d_editor_plugin.cpp @@ -47,6 +47,7 @@ #include "scene/resources/skeleton_profile.h" #include "scene/resources/sphere_shape_3d.h" #include "scene/resources/surface_tool.h" +#include "scene/scene_string_names.h" void BoneTransformEditor::create_editors() { const Color section_color = get_theme_color(SNAME("prop_subsection"), SNAME("Editor")); @@ -152,9 +153,10 @@ void BoneTransformEditor::set_target(const String &p_prop) { void BoneTransformEditor::_property_keyed(const String &p_path, bool p_advance) { AnimationTrackEditor *te = AnimationPlayerEditor::get_singleton()->get_track_editor(); - if (!te->has_keying()) { + if (!te || !te->has_keying()) { return; } + te->_clear_selection(); PackedStringArray split = p_path.split("/"); if (split.size() == 3 && split[0] == "bones") { int bone_idx = split[1].to_int(); @@ -399,8 +401,8 @@ void Skeleton3DEditor::create_physical_skeleton() { ur->add_do_method(physical_bone, "set_joint_type", PhysicalBone3D::JOINT_TYPE_PIN); } - ur->add_do_method(Node3DEditor::get_singleton(), "_request_gizmo", physical_bone); - ur->add_do_method(Node3DEditor::get_singleton(), "_request_gizmo", collision_shape); + ur->add_do_method(Node3DEditor::get_singleton(), SceneStringNames::get_singleton()->_request_gizmo, physical_bone); + ur->add_do_method(Node3DEditor::get_singleton(), SceneStringNames::get_singleton()->_request_gizmo, collision_shape); ur->add_do_reference(physical_bone); ur->add_undo_method(skeleton, "remove_child", physical_bone); diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp index baf5e363f8..d6079d6285 100644 --- a/editor/plugins/text_editor.cpp +++ b/editor/plugins/text_editor.cpp @@ -353,7 +353,9 @@ void TextEditor::_edit_option(int p_op) { code_editor->duplicate_selection(); } break; case EDIT_TOGGLE_FOLD_LINE: { - tx->toggle_foldable_line(tx->get_caret_line()); + for (int caret_idx = 0; caret_idx < tx->get_caret_count(); caret_idx++) { + tx->toggle_foldable_line(tx->get_caret_line(caret_idx)); + } tx->queue_redraw(); } break; case EDIT_FOLD_ALL_LINES: { diff --git a/editor/plugins/tiles/atlas_merging_dialog.cpp b/editor/plugins/tiles/atlas_merging_dialog.cpp index e266d26b73..f892f3637d 100644 --- a/editor/plugins/tiles/atlas_merging_dialog.cpp +++ b/editor/plugins/tiles/atlas_merging_dialog.cpp @@ -236,7 +236,7 @@ void AtlasMergingDialog::update_tile_set(Ref<TileSet> p_tile_set) { if (atlas_source.is_valid()) { Ref<Texture2D> texture = atlas_source->get_texture(); if (texture.is_valid()) { - String item_text = vformat("%s (id:%d)", texture->get_path().get_file(), source_id); + String item_text = vformat(TTR("%s (ID: %d)"), texture->get_path().get_file(), source_id); atlas_merging_atlases_list->add_item(item_text, texture); atlas_merging_atlases_list->set_item_metadata(-1, source_id); } diff --git a/editor/plugins/tiles/tile_data_editors.cpp b/editor/plugins/tiles/tile_data_editors.cpp index 993f606f2f..1fdf940a82 100644 --- a/editor/plugins/tiles/tile_data_editors.cpp +++ b/editor/plugins/tiles/tile_data_editors.cpp @@ -309,7 +309,22 @@ void GenericTilePolygonEditor::_advanced_menu_item_pressed(int p_item_pressed) { case ROTATE_LEFT: case FLIP_HORIZONTALLY: case FLIP_VERTICALLY: { - undo_redo->create_action(TTR("Rotate Polygons Left")); + switch (p_item_pressed) { + case ROTATE_RIGHT: { + undo_redo->create_action(TTR("Rotate Polygons Right")); + } break; + case ROTATE_LEFT: { + undo_redo->create_action(TTR("Rotate Polygons Left")); + } break; + case FLIP_HORIZONTALLY: { + undo_redo->create_action(TTR("Flip Polygons Horizontally")); + } break; + case FLIP_VERTICALLY: { + undo_redo->create_action(TTR("Flip Polygons Vertically")); + } break; + default: + break; + } for (unsigned int i = 0; i < polygons.size(); i++) { Vector<Point2> new_polygon; for (int point_index = 0; point_index < polygons[i].size(); point_index++) { @@ -1207,8 +1222,6 @@ TileDataDefaultEditor::TileDataDefaultEditor() { label->set_theme_type_variation("HeaderSmall"); add_child(label); - toolbar->add_child(memnew(VSeparator)); - picker_button = memnew(Button); picker_button->set_flat(true); picker_button->set_toggle_mode(true); @@ -1603,12 +1616,31 @@ void TileDataCollisionEditor::draw_over_tile(CanvasItem *p_canvas_item, Transfor } RenderingServer::get_singleton()->canvas_item_add_set_transform(p_canvas_item->get_canvas_item(), p_transform); + + Ref<Texture2D> one_way_icon = get_theme_icon(SNAME("OneWayTile"), SNAME("EditorIcons")); for (int i = 0; i < tile_data->get_collision_polygons_count(physics_layer); i++) { Vector<Vector2> polygon = tile_data->get_collision_polygon_points(physics_layer, i); - if (polygon.size() >= 3) { - p_canvas_item->draw_polygon(polygon, color); + if (polygon.size() < 3) { + continue; + } + + p_canvas_item->draw_polygon(polygon, color); + + if (tile_data->is_collision_polygon_one_way(physics_layer, i)) { + PackedVector2Array uvs; + uvs.resize(polygon.size()); + Vector2 size_1 = Vector2(1, 1) / tile_set->get_tile_size(); + + for (int j = 0; j < polygon.size(); j++) { + uvs.write[j] = polygon[j] * size_1 + Vector2(0.5, 0.5); + } + + Vector<Color> color2; + color2.push_back(Color(1, 1, 1, 0.4)); + p_canvas_item->draw_polygon(polygon, color2, uvs, one_way_icon); } } + RenderingServer::get_singleton()->canvas_item_add_set_transform(p_canvas_item->get_canvas_item(), Transform2D()); } @@ -2640,8 +2672,6 @@ TileDataTerrainsEditor::TileDataTerrainsEditor() { add_child(label); // Toolbar - toolbar->add_child(memnew(VSeparator)); - picker_button = memnew(Button); picker_button->set_flat(true); picker_button->set_toggle_mode(true); diff --git a/editor/plugins/tiles/tile_map_editor.cpp b/editor/plugins/tiles/tile_map_editor.cpp index e622a0817a..5a1f214933 100644 --- a/editor/plugins/tiles/tile_map_editor.cpp +++ b/editor/plugins/tiles/tile_map_editor.cpp @@ -55,7 +55,7 @@ void TileMapEditorTilesPlugin::tile_set_changed() { } void TileMapEditorTilesPlugin::_on_random_tile_checkbox_toggled(bool p_pressed) { - scatter_spinbox->set_editable(p_pressed); + scatter_controls_container->set_visible(p_pressed); } void TileMapEditorTilesPlugin::_on_scattering_spinbox_changed(double p_value) { @@ -156,7 +156,7 @@ void TileMapEditorTilesPlugin::_update_tile_set_sources_list() { // Common to all type of sources. if (!source->get_name().is_empty()) { - item_text = vformat(TTR("%s (id:%d)"), source->get_name(), source_id); + item_text = vformat(TTR("%s (ID: %d)"), source->get_name(), source_id); } // Atlas source. @@ -165,7 +165,7 @@ void TileMapEditorTilesPlugin::_update_tile_set_sources_list() { texture = atlas_source->get_texture(); if (item_text.is_empty()) { if (texture.is_valid()) { - item_text = vformat("%s (ID: %d)", texture->get_path().get_file(), source_id); + item_text = vformat(TTR("%s (ID: %d)"), texture->get_path().get_file(), source_id); } else { item_text = vformat(TTR("No Texture Atlas Source (ID: %d)"), source_id); } @@ -472,6 +472,7 @@ void TileMapEditorTilesPlugin::_update_theme() { random_tile_toggle->set_icon(tiles_bottom_panel->get_theme_icon(SNAME("RandomNumberGenerator"), SNAME("EditorIcons"))); missing_atlas_texture_icon = tiles_bottom_panel->get_theme_icon(SNAME("TileSet"), SNAME("EditorIcons")); + _update_tile_set_sources_list(); } bool TileMapEditorTilesPlugin::forward_canvas_gui_input(const Ref<InputEvent> &p_event) { @@ -923,6 +924,7 @@ void TileMapEditorTilesPlugin::forward_canvas_draw_over_viewport(Control *p_over Color modulate = tile_data->get_modulate(); Color self_modulate = tile_map->get_self_modulate(); modulate *= self_modulate; + modulate *= tile_map->get_layer_modulate(tile_map_layer); // Draw the tile. p_overlay->draw_texture_rect_region(atlas_source->get_texture(), dest_rect, source_rect, modulate * Color(1.0, 1.0, 1.0, 0.5), transpose, tile_set->is_uv_clipping()); @@ -1164,7 +1166,7 @@ HashMap<Vector2i, TileMapCell> TileMapEditorTilesPlugin::_draw_bucket_fill(Vecto } // Get surrounding tiles (handles different tile shapes). - TypedArray<Vector2i> around = tile_map->get_surrounding_tiles(coords); + TypedArray<Vector2i> around = tile_map->get_surrounding_cells(coords); for (int i = 0; i < around.size(); i++) { to_check.push_back(around[i]); } @@ -1697,7 +1699,7 @@ void TileMapEditorTilesPlugin::_tile_atlas_control_draw() { if (frame > 0) { color.a *= 0.3; } - tile_atlas_control->draw_rect(atlas->get_tile_texture_region(E.get_atlas_coords(), frame), color, false); + TilesEditorPlugin::draw_selection_rect(tile_atlas_control, atlas->get_tile_texture_region(E.get_atlas_coords(), frame), color); } } } @@ -1705,11 +1707,8 @@ void TileMapEditorTilesPlugin::_tile_atlas_control_draw() { // Draw the hovered tile. if (hovered_tile.get_atlas_coords() != TileSetSource::INVALID_ATLAS_COORDS && hovered_tile.alternative_tile == 0 && !tile_set_dragging_selection) { for (int frame = 0; frame < atlas->get_tile_animation_frames_count(hovered_tile.get_atlas_coords()); frame++) { - Color color = Color(1.0, 1.0, 1.0); - if (frame > 0) { - color.a *= 0.3; - } - tile_atlas_control->draw_rect(atlas->get_tile_texture_region(hovered_tile.get_atlas_coords(), frame), color, false); + Color color = Color(1.0, 0.8, 0.0, frame == 0 ? 0.6 : 0.3); + TilesEditorPlugin::draw_selection_rect(tile_atlas_control, atlas->get_tile_texture_region(hovered_tile.get_atlas_coords(), frame), color); } } @@ -1730,9 +1729,8 @@ void TileMapEditorTilesPlugin::_tile_atlas_control_draw() { } } } - Color selection_rect_color = selection_color.lightened(0.2); for (const Vector2i &E : to_draw) { - tile_atlas_control->draw_rect(atlas->get_tile_texture_region(E), selection_rect_color, false); + TilesEditorPlugin::draw_selection_rect(tile_atlas_control, atlas->get_tile_texture_region(E)); } } } @@ -1881,7 +1879,7 @@ void TileMapEditorTilesPlugin::_tile_alternatives_control_draw() { if (E.source_id == source_id && E.get_atlas_coords() != TileSetSource::INVALID_ATLAS_COORDS && E.alternative_tile > 0) { Rect2i rect = tile_atlas_view->get_alternative_tile_rect(E.get_atlas_coords(), E.alternative_tile); if (rect != Rect2i()) { - alternative_tiles_control->draw_rect(rect, Color(0.2, 0.2, 1.0), false); + TilesEditorPlugin::draw_selection_rect(alternative_tiles_control, rect); } } } @@ -1890,7 +1888,7 @@ void TileMapEditorTilesPlugin::_tile_alternatives_control_draw() { if (hovered_tile.get_atlas_coords() != TileSetSource::INVALID_ATLAS_COORDS && hovered_tile.alternative_tile > 0) { Rect2i rect = tile_atlas_view->get_alternative_tile_rect(hovered_tile.get_atlas_coords(), hovered_tile.alternative_tile); if (rect != Rect2i()) { - alternative_tiles_control->draw_rect(rect, Color(1.0, 1.0, 1.0), false); + TilesEditorPlugin::draw_selection_rect(alternative_tiles_control, rect, Color(1.0, 0.8, 0.0, 0.5)); } } } @@ -2127,10 +2125,12 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { tools_settings->add_child(random_tile_toggle); // Random tile scattering. + scatter_controls_container = memnew(HBoxContainer); + scatter_label = memnew(Label); scatter_label->set_tooltip_text(TTR("Defines the probability of painting nothing instead of a randomly selected tile.")); scatter_label->set_text(TTR("Scattering:")); - tools_settings->add_child(scatter_label); + scatter_controls_container->add_child(scatter_label); scatter_spinbox = memnew(SpinBox); scatter_spinbox->set_min(0.0); @@ -2139,7 +2139,8 @@ TileMapEditorTilesPlugin::TileMapEditorTilesPlugin() { scatter_spinbox->set_tooltip_text(TTR("Defines the probability of painting nothing instead of a randomly selected tile.")); scatter_spinbox->get_line_edit()->add_theme_constant_override("minimum_character_width", 4); scatter_spinbox->connect("value_changed", callable_mp(this, &TileMapEditorTilesPlugin::_on_scattering_spinbox_changed)); - tools_settings->add_child(scatter_spinbox); + scatter_controls_container->add_child(scatter_spinbox); + tools_settings->add_child(scatter_controls_container); _on_random_tile_checkbox_toggled(false); @@ -2547,7 +2548,7 @@ RBSet<Vector2i> TileMapEditorTerrainsPlugin::_get_cells_for_bucket_fill(Vector2i output.insert(coords); // Get surrounding tiles (handles different tile shapes). - TypedArray<Vector2i> around = tile_map->get_surrounding_tiles(coords); + TypedArray<Vector2i> around = tile_map->get_surrounding_cells(coords); for (int i = 0; i < around.size(); i++) { to_check.push_back(around[i]); } diff --git a/editor/plugins/tiles/tile_map_editor.h b/editor/plugins/tiles/tile_map_editor.h index ad27795437..9700e26e01 100644 --- a/editor/plugins/tiles/tile_map_editor.h +++ b/editor/plugins/tiles/tile_map_editor.h @@ -91,6 +91,8 @@ private: VSeparator *tools_settings_vsep_2 = nullptr; CheckBox *bucket_contiguous_checkbox = nullptr; Button *random_tile_toggle = nullptr; + + HBoxContainer *scatter_controls_container = nullptr; float scattering = 0.0; Label *scatter_label = nullptr; SpinBox *scatter_spinbox = nullptr; diff --git a/editor/plugins/tiles/tile_proxies_manager_dialog.cpp b/editor/plugins/tiles/tile_proxies_manager_dialog.cpp index 40557f9b8e..b31fb1aa58 100644 --- a/editor/plugins/tiles/tile_proxies_manager_dialog.cpp +++ b/editor/plugins/tiles/tile_proxies_manager_dialog.cpp @@ -77,7 +77,7 @@ void TileProxiesManagerDialog::_delete_selected_bindings() { Vector<int> alternative_level_selected = alternative_level_list->get_selected_items(); for (int i = 0; i < alternative_level_selected.size(); i++) { Array key = alternative_level_list->get_item_metadata(alternative_level_selected[i]); - Array val = tile_set->get_coords_level_tile_proxy(key[0], key[1]); + Array val = tile_set->get_alternative_level_tile_proxy(key[0], key[1], key[2]); undo_redo->add_do_method(*tile_set, "remove_alternative_level_tile_proxy", key[0], key[1], key[2]); undo_redo->add_undo_method(*tile_set, "set_alternative_level_tile_proxy", key[0], key[1], key[2], val[0], val[1], val[2]); } diff --git a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp index 7ed84423bc..34bbfa2c7e 100644 --- a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp +++ b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp @@ -64,11 +64,15 @@ void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::set_id(int p_id) { emit_signal(SNAME("changed"), "id"); } -int TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::get_id() { +int TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::get_id() const { return source_id; } bool TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_set(const StringName &p_name, const Variant &p_value) { + if (p_name == "id") { + set_id(p_value); + return true; + } String name = p_name; if (name == "name") { // Use the resource_name property to store the source's name. @@ -86,6 +90,10 @@ bool TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get(const StringN if (!tile_set_atlas_source) { return false; } + if (p_name == "id") { + r_ret = get_id(); + return true; + } String name = p_name; if (name == "name") { // Use the resource_name property to store the source's name. @@ -97,6 +105,8 @@ bool TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get(const StringN } void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get_property_list(List<PropertyInfo> *p_list) const { + p_list->push_back(PropertyInfo(Variant::NIL, TTR("Atlas"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY)); + p_list->push_back(PropertyInfo(Variant::INT, "id", PROPERTY_HINT_RANGE, "0," + itos(INT_MAX) + ",1")); p_list->push_back(PropertyInfo(Variant::STRING, "name", PROPERTY_HINT_NONE, "")); p_list->push_back(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D")); p_list->push_back(PropertyInfo(Variant::VECTOR2I, "margins", PROPERTY_HINT_NONE, "suffix:px")); @@ -106,12 +116,6 @@ void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_get_property_list } void TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::_bind_methods() { - // -- Shape and layout -- - ClassDB::bind_method(D_METHOD("set_id", "id"), &TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::set_id); - ClassDB::bind_method(D_METHOD("get_id"), &TileSetAtlasSourceEditor::TileSetAtlasSourceProxyObject::get_id); - - ADD_PROPERTY(PropertyInfo(Variant::INT, "id", PROPERTY_HINT_RANGE, "0," + itos(INT_MAX) + ",1"), "set_id", "get_id"); - ADD_SIGNAL(MethodInfo("changed", PropertyInfo(Variant::STRING, "what"))); } @@ -383,11 +387,15 @@ void TileSetAtlasSourceEditor::AtlasTileProxyObject::_get_property_list(List<Pro // ID and size related properties. if (tiles.size() == 1) { if (tiles.front()->get().alternative == 0) { - p_list->push_back(PropertyInfo(Variant::VECTOR2I, "atlas_coords", PROPERTY_HINT_NONE, "")); - p_list->push_back(PropertyInfo(Variant::VECTOR2I, "size_in_atlas", PROPERTY_HINT_NONE, "")); + p_list->push_back(PropertyInfo(Variant::NIL, TTR("Base Tile"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY)); + p_list->push_back(PropertyInfo(Variant::VECTOR2I, "atlas_coords")); + p_list->push_back(PropertyInfo(Variant::VECTOR2I, "size_in_atlas")); } else { - p_list->push_back(PropertyInfo(Variant::INT, "alternative_id", PROPERTY_HINT_NONE, "")); + p_list->push_back(PropertyInfo(Variant::NIL, TTR("Alternative Tile"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY)); + p_list->push_back(PropertyInfo(Variant::INT, "alternative_id")); } + } else { + p_list->push_back(PropertyInfo(Variant::NIL, TTR("Tiles"), PROPERTY_HINT_NONE, String(), PROPERTY_USAGE_CATEGORY)); } // Animation. @@ -443,6 +451,11 @@ void TileSetAtlasSourceEditor::AtlasTileProxyObject::_get_property_list(List<Pro HashMap<String, int> counts; // Counts the number of time a property appears (useful for groups that may appear more than once) for (List<PropertyInfo>::Element *E_property = list.front(); E_property; E_property = E_property->next()) { + // Don't show category for TileData. + if (E_property->get().usage & PROPERTY_USAGE_CATEGORY) { + continue; + } + const String &property_string = E_property->get().name; if (!tile_data->is_allowing_transform() && (property_string == "flip_h" || property_string == "flip_v" || property_string == "transpose")) { continue; @@ -566,7 +579,6 @@ void TileSetAtlasSourceEditor::_update_fix_selected_and_hovered_tiles() { void TileSetAtlasSourceEditor::_update_atlas_source_inspector() { // Update visibility. bool inspector_visible = tools_button_group->get_pressed_button() == tool_setup_atlas_source_button; - atlas_source_inspector_label->set_visible(inspector_visible); atlas_source_inspector->set_visible(inspector_visible); } @@ -576,11 +588,9 @@ void TileSetAtlasSourceEditor::_update_tile_inspector() { if (!selection.is_empty()) { tile_proxy_object->edit(tile_set_atlas_source, selection); } - tile_inspector_label->show(); tile_inspector->set_visible(!selection.is_empty()); tile_inspector_no_tile_selected_label->set_visible(selection.is_empty()); } else { - tile_inspector_label->hide(); tile_inspector->hide(); tile_inspector_no_tile_selected_label->hide(); } @@ -797,7 +807,7 @@ void TileSetAtlasSourceEditor::_update_tile_data_editors() { } else { tile_data_editor_dropdown_button->set_text(TTR("Select a property editor")); } - tile_data_editors_label->set_visible(is_visible); + tile_data_editors_scroll->set_visible(is_visible); } void TileSetAtlasSourceEditor::_update_current_tile_data_editor() { @@ -954,21 +964,18 @@ void TileSetAtlasSourceEditor::_update_toolbar() { if (current_tile_data_editor_toolbar) { current_tile_data_editor_toolbar->hide(); } - tool_settings_vsep->show(); tools_settings_erase_button->show(); tool_advanced_menu_buttom->show(); } else if (tools_button_group->get_pressed_button() == tool_select_button) { if (current_tile_data_editor_toolbar) { current_tile_data_editor_toolbar->hide(); } - tool_settings_vsep->hide(); tools_settings_erase_button->hide(); tool_advanced_menu_buttom->hide(); } else if (tools_button_group->get_pressed_button() == tool_paint_button) { if (current_tile_data_editor_toolbar) { current_tile_data_editor_toolbar->show(); } - tool_settings_vsep->hide(); tools_settings_erase_button->hide(); tool_advanced_menu_buttom->hide(); } @@ -1684,10 +1691,6 @@ Array TileSetAtlasSourceEditor::_get_selection_as_array() { } void TileSetAtlasSourceEditor::_tile_atlas_control_draw() { - // Colors. - Color grid_color = EDITOR_GET("editors/tiles_editor/grid_color"); - Color selection_color = Color().from_hsv(Math::fposmod(grid_color.get_h() + 0.5, 1.0), grid_color.get_s(), grid_color.get_v(), 1.0); - // Draw the selected tile. if (tools_button_group->get_pressed_button() == tool_select_button) { for (const TileSelection &E : selection) { @@ -1695,12 +1698,9 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_draw() { if (selected.alternative == 0) { // Draw the rect. for (int frame = 0; frame < tile_set_atlas_source->get_tile_animation_frames_count(selected.tile); frame++) { - Color color = selection_color; - if (frame > 0) { - color.a *= 0.3; - } + Color color = Color(0.0, 1.0, 0.0, frame == 0 ? 1.0 : 0.3); Rect2 region = tile_set_atlas_source->get_tile_texture_region(selected.tile, frame); - tile_atlas_control->draw_rect(region, color, false); + TilesEditorPlugin::draw_selection_rect(tile_atlas_control, region, color); } } } @@ -1742,7 +1742,7 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_draw() { // Draw the tiles to be removed. for (const Vector2i &E : drag_modified_tiles) { for (int frame = 0; frame < tile_set_atlas_source->get_tile_animation_frames_count(E); frame++) { - tile_atlas_control->draw_rect(tile_set_atlas_source->get_tile_texture_region(E, frame), Color(0.0, 0.0, 0.0), false); + TilesEditorPlugin::draw_selection_rect(tile_atlas_control, tile_set_atlas_source->get_tile_texture_region(E, frame), Color(0.0, 0.0, 0.0)); } } } else if (drag_type == DRAG_TYPE_RECT_SELECT || drag_type == DRAG_TYPE_REMOVE_TILES_USING_RECT) { @@ -1754,7 +1754,7 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_draw() { Color color = Color(0.0, 0.0, 0.0); if (drag_type == DRAG_TYPE_RECT_SELECT) { - color = selection_color.lightened(0.2); + color = Color(1.0, 1.0, 0.0); } RBSet<Vector2i> to_paint; @@ -1769,7 +1769,7 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_draw() { for (const Vector2i &E : to_paint) { Vector2i coords = E; - tile_atlas_control->draw_rect(tile_set_atlas_source->get_tile_texture_region(coords), color, false); + TilesEditorPlugin::draw_selection_rect(tile_atlas_control, tile_set_atlas_source->get_tile_texture_region(coords), color); } } else if (drag_type == DRAG_TYPE_CREATE_TILES_USING_RECT) { // Draw tiles to be created. @@ -1786,7 +1786,7 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_draw() { Vector2i coords = Vector2i(x, y); if (tile_set_atlas_source->get_tile_at_coords(coords) == TileSetSource::INVALID_ATLAS_COORDS) { Vector2i origin = margins + (coords * (tile_size + separation)); - tile_atlas_control->draw_rect(Rect2i(origin, tile_size), Color(1.0, 1.0, 1.0), false); + TilesEditorPlugin::draw_selection_rect(tile_atlas_control, Rect2i(origin, tile_size)); } } } @@ -1803,7 +1803,7 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_draw() { Vector2i separation = tile_set_atlas_source->get_separation(); Vector2i tile_size = tile_set_atlas_source->get_texture_region_size(); Vector2i origin = margins + (area.position * (tile_size + separation)); - tile_atlas_control->draw_rect(Rect2i(origin, area.size * tile_size), Color(1.0, 1.0, 1.0), false); + TilesEditorPlugin::draw_selection_rect(tile_atlas_control, Rect2i(origin, area.size * tile_size)); } else { Vector2i grid_size = tile_set_atlas_source->get_atlas_grid_size(); if (hovered_base_tile_coords.x >= 0 && hovered_base_tile_coords.y >= 0 && hovered_base_tile_coords.x < grid_size.x && hovered_base_tile_coords.y < grid_size.y) { @@ -1811,11 +1811,8 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_draw() { if (hovered_tile != TileSetSource::INVALID_ATLAS_COORDS) { // Draw existing hovered tile. for (int frame = 0; frame < tile_set_atlas_source->get_tile_animation_frames_count(hovered_tile); frame++) { - Color color = Color(1.0, 1.0, 1.0); - if (frame > 0) { - color.a *= 0.3; - } - tile_atlas_control->draw_rect(tile_set_atlas_source->get_tile_texture_region(hovered_tile, frame), color, false); + Color color = Color(1.0, 0.8, 0.0, frame == 0 ? 0.6 : 0.3); + TilesEditorPlugin::draw_selection_rect(tile_atlas_control, tile_set_atlas_source->get_tile_texture_region(hovered_tile, frame), color); } } else { // Draw empty tile, only in add/remove tiles mode. @@ -1824,7 +1821,7 @@ void TileSetAtlasSourceEditor::_tile_atlas_control_draw() { Vector2i separation = tile_set_atlas_source->get_separation(); Vector2i tile_size = tile_set_atlas_source->get_texture_region_size(); Vector2i origin = margins + (hovered_base_tile_coords * (tile_size + separation)); - tile_atlas_control->draw_rect(Rect2i(origin, tile_size), Color(1.0, 1.0, 1.0), false); + TilesEditorPlugin::draw_selection_rect(tile_atlas_control, Rect2i(origin, tile_size)); } } } @@ -1976,9 +1973,6 @@ void TileSetAtlasSourceEditor::_tile_alternatives_control_mouse_exited() { } void TileSetAtlasSourceEditor::_tile_alternatives_control_draw() { - Color grid_color = EDITOR_GET("editors/tiles_editor/grid_color"); - Color selection_color = Color().from_hsv(Math::fposmod(grid_color.get_h() + 0.5, 1.0), grid_color.get_s(), grid_color.get_v(), 1.0); - // Update the hovered alternative tile. if (tools_button_group->get_pressed_button() == tool_select_button) { // Draw hovered tile. @@ -1986,7 +1980,7 @@ void TileSetAtlasSourceEditor::_tile_alternatives_control_draw() { if (coords != TileSetSource::INVALID_ATLAS_COORDS) { Rect2i rect = tile_atlas_view->get_alternative_tile_rect(coords, hovered_alternative_tile_coords.z); if (rect != Rect2i()) { - alternative_tiles_control->draw_rect(rect, Color(1.0, 1.0, 1.0), false); + TilesEditorPlugin::draw_selection_rect(alternative_tiles_control, rect, Color(1.0, 0.8, 0.0, 0.5)); } } @@ -1996,7 +1990,7 @@ void TileSetAtlasSourceEditor::_tile_alternatives_control_draw() { if (selected.alternative >= 1) { Rect2i rect = tile_atlas_view->get_alternative_tile_rect(selected.tile, selected.alternative); if (rect != Rect2i()) { - alternative_tiles_control->draw_rect(rect, selection_color, false); + TilesEditorPlugin::draw_selection_rect(alternative_tiles_control, rect); } } } @@ -2368,54 +2362,90 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { set_process_unhandled_key_input(true); set_process_internal(true); - // -- Right side -- - HSplitContainer *split_container_right_side = memnew(HSplitContainer); - split_container_right_side->set_h_size_flags(SIZE_EXPAND_FILL); - add_child(split_container_right_side); - // Middle panel. - ScrollContainer *middle_panel = memnew(ScrollContainer); - middle_panel->set_horizontal_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED); - middle_panel->set_custom_minimum_size(Size2(200, 0) * EDSCALE); - split_container_right_side->add_child(middle_panel); - VBoxContainer *middle_vbox_container = memnew(VBoxContainer); - middle_vbox_container->set_h_size_flags(SIZE_EXPAND_FILL); - middle_panel->add_child(middle_vbox_container); + middle_vbox_container->set_custom_minimum_size(Size2(200, 0) * EDSCALE); + add_child(middle_vbox_container); - // Tile inspector. - tile_inspector_label = memnew(Label); - tile_inspector_label->set_text(TTR("Tile Properties:")); - tile_inspector_label->set_theme_type_variation("HeaderSmall"); - middle_vbox_container->add_child(tile_inspector_label); + // -- Toolbox -- + tools_button_group.instantiate(); + tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_fix_selected_and_hovered_tiles).unbind(1)); + tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_tile_id_label).unbind(1)); + tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_atlas_source_inspector).unbind(1)); + tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_tile_inspector).unbind(1)); + tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_tile_data_editors).unbind(1)); + tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_current_tile_data_editor).unbind(1)); + tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_atlas_view).unbind(1)); + tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_toolbar).unbind(1)); + + HBoxContainer *toolbox = memnew(HBoxContainer); + middle_vbox_container->add_child(toolbox); + + tool_setup_atlas_source_button = memnew(Button); + tool_setup_atlas_source_button->set_text(TTR("Setup")); + tool_setup_atlas_source_button->set_flat(true); + tool_setup_atlas_source_button->set_toggle_mode(true); + tool_setup_atlas_source_button->set_pressed(true); + tool_setup_atlas_source_button->set_button_group(tools_button_group); + tool_setup_atlas_source_button->set_tooltip_text(TTR("Atlas setup. Add/Remove tiles tool (use the shift key to create big tiles, control for rectangle editing).")); + toolbox->add_child(tool_setup_atlas_source_button); + + tool_select_button = memnew(Button); + tool_select_button->set_text(TTR("Select")); + tool_select_button->set_flat(true); + tool_select_button->set_toggle_mode(true); + tool_select_button->set_pressed(false); + tool_select_button->set_button_group(tools_button_group); + tool_select_button->set_tooltip_text(TTR("Select tiles.")); + toolbox->add_child(tool_select_button); + + tool_paint_button = memnew(Button); + tool_paint_button->set_text(TTR("Paint")); + tool_paint_button->set_flat(true); + tool_paint_button->set_toggle_mode(true); + tool_paint_button->set_button_group(tools_button_group); + tool_paint_button->set_tooltip_text(TTR("Paint properties.")); + toolbox->add_child(tool_paint_button); + // Tile inspector. tile_proxy_object = memnew(AtlasTileProxyObject(this)); tile_proxy_object->connect("changed", callable_mp(this, &TileSetAtlasSourceEditor::_tile_proxy_object_changed)); tile_inspector = memnew(EditorInspector); - tile_inspector->set_vertical_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED); + tile_inspector->set_v_size_flags(SIZE_EXPAND_FILL); + tile_inspector->set_show_categories(true); tile_inspector->edit(tile_proxy_object); tile_inspector->set_use_folding(true); tile_inspector->connect("property_selected", callable_mp(this, &TileSetAtlasSourceEditor::_inspector_property_selected)); middle_vbox_container->add_child(tile_inspector); tile_inspector_no_tile_selected_label = memnew(Label); + tile_inspector_no_tile_selected_label->set_v_size_flags(SIZE_EXPAND | SIZE_SHRINK_CENTER); tile_inspector_no_tile_selected_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER); tile_inspector_no_tile_selected_label->set_text(TTR("No tiles selected.")); middle_vbox_container->add_child(tile_inspector_no_tile_selected_label); // Property values palette. + tile_data_editors_scroll = memnew(ScrollContainer); + tile_data_editors_scroll->set_horizontal_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED); + tile_data_editors_scroll->set_v_size_flags(SIZE_EXPAND_FILL); + middle_vbox_container->add_child(tile_data_editors_scroll); + + VBoxContainer *tile_data_editors_vbox = memnew(VBoxContainer); + tile_data_editors_vbox->set_h_size_flags(SIZE_EXPAND_FILL); + tile_data_editors_scroll->add_child(tile_data_editors_vbox); + tile_data_editors_popup = memnew(Popup); tile_data_editors_label = memnew(Label); tile_data_editors_label->set_text(TTR("Paint Properties:")); tile_data_editors_label->set_theme_type_variation("HeaderSmall"); - middle_vbox_container->add_child(tile_data_editors_label); + tile_data_editors_vbox->add_child(tile_data_editors_label); tile_data_editor_dropdown_button = memnew(Button); tile_data_editor_dropdown_button->connect("draw", callable_mp(this, &TileSetAtlasSourceEditor::_tile_data_editor_dropdown_button_draw)); tile_data_editor_dropdown_button->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_tile_data_editor_dropdown_button_pressed)); - middle_vbox_container->add_child(tile_data_editor_dropdown_button); + tile_data_editors_vbox->add_child(tile_data_editor_dropdown_button); tile_data_editor_dropdown_button->add_child(tile_data_editors_popup); tile_data_editors_tree = memnew(Tree); @@ -2428,80 +2458,25 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { tile_data_painting_editor_container = memnew(VBoxContainer); tile_data_painting_editor_container->set_h_size_flags(SIZE_EXPAND_FILL); - middle_vbox_container->add_child(tile_data_painting_editor_container); + tile_data_editors_vbox->add_child(tile_data_painting_editor_container); // Atlas source inspector. - atlas_source_inspector_label = memnew(Label); - atlas_source_inspector_label->set_text(TTR("Atlas Properties:")); - atlas_source_inspector_label->set_theme_type_variation("HeaderSmall"); - middle_vbox_container->add_child(atlas_source_inspector_label); - atlas_source_proxy_object = memnew(TileSetAtlasSourceProxyObject()); atlas_source_proxy_object->connect("changed", callable_mp(this, &TileSetAtlasSourceEditor::_atlas_source_proxy_object_changed)); atlas_source_inspector = memnew(EditorInspector); - atlas_source_inspector->set_vertical_scroll_mode(ScrollContainer::SCROLL_MODE_DISABLED); + atlas_source_inspector->set_v_size_flags(SIZE_EXPAND_FILL); + atlas_source_inspector->set_show_categories(true); atlas_source_inspector->edit(atlas_source_proxy_object); middle_vbox_container->add_child(atlas_source_inspector); - // Right panel. - VBoxContainer *right_panel = memnew(VBoxContainer); - right_panel->set_h_size_flags(SIZE_EXPAND_FILL); - right_panel->set_v_size_flags(SIZE_EXPAND_FILL); - split_container_right_side->add_child(right_panel); - - // -- Dialogs -- - confirm_auto_create_tiles = memnew(AcceptDialog); - confirm_auto_create_tiles->set_title(TTR("Auto Create Tiles in Non-Transparent Texture Regions?")); - confirm_auto_create_tiles->set_text(TTR("The atlas's texture was modified.\nWould you like to automatically create tiles in the atlas?")); - confirm_auto_create_tiles->set_ok_button_text(TTR("Yes")); - confirm_auto_create_tiles->add_cancel_button()->set_text(TTR("No")); - confirm_auto_create_tiles->connect("confirmed", callable_mp(this, &TileSetAtlasSourceEditor::_auto_create_tiles)); - add_child(confirm_auto_create_tiles); - - // -- Toolbox -- - tools_button_group.instantiate(); - tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_fix_selected_and_hovered_tiles).unbind(1)); - tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_tile_id_label).unbind(1)); - tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_atlas_source_inspector).unbind(1)); - tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_tile_inspector).unbind(1)); - tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_tile_data_editors).unbind(1)); - tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_current_tile_data_editor).unbind(1)); - tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_atlas_view).unbind(1)); - tools_button_group->connect("pressed", callable_mp(this, &TileSetAtlasSourceEditor::_update_toolbar).unbind(1)); - - toolbox = memnew(HBoxContainer); - right_panel->add_child(toolbox); - - tool_setup_atlas_source_button = memnew(Button); - tool_setup_atlas_source_button->set_flat(true); - tool_setup_atlas_source_button->set_toggle_mode(true); - tool_setup_atlas_source_button->set_pressed(true); - tool_setup_atlas_source_button->set_button_group(tools_button_group); - tool_setup_atlas_source_button->set_tooltip_text(TTR("Atlas setup. Add/Remove tiles tool (use the shift key to create big tiles, control for rectangle editing).")); - toolbox->add_child(tool_setup_atlas_source_button); - - tool_select_button = memnew(Button); - tool_select_button->set_flat(true); - tool_select_button->set_toggle_mode(true); - tool_select_button->set_pressed(false); - tool_select_button->set_button_group(tools_button_group); - tool_select_button->set_tooltip_text(TTR("Select tiles.")); - toolbox->add_child(tool_select_button); - - tool_paint_button = memnew(Button); - tool_paint_button->set_flat(true); - tool_paint_button->set_toggle_mode(true); - tool_paint_button->set_button_group(tools_button_group); - tool_paint_button->set_tooltip_text(TTR("Paint properties.")); - toolbox->add_child(tool_paint_button); + // -- Right side -- + VBoxContainer *right_vbox_container = memnew(VBoxContainer); + add_child(right_vbox_container); // Tool settings. tool_settings = memnew(HBoxContainer); - toolbox->add_child(tool_settings); - - tool_settings_vsep = memnew(VSeparator); - tool_settings->add_child(tool_settings_vsep); + right_vbox_container->add_child(tool_settings); tool_settings_tile_data_toolbar_container = memnew(HBoxContainer); tool_settings->add_child(tool_settings_tile_data_toolbar_container); @@ -2518,24 +2493,31 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { tool_advanced_menu_buttom->get_popup()->add_item(TTR("Create Tiles in Non-Transparent Texture Regions"), ADVANCED_AUTO_CREATE_TILES); tool_advanced_menu_buttom->get_popup()->add_item(TTR("Remove Tiles in Fully Transparent Texture Regions"), ADVANCED_AUTO_REMOVE_TILES); tool_advanced_menu_buttom->get_popup()->connect("id_pressed", callable_mp(this, &TileSetAtlasSourceEditor::_menu_option)); - toolbox->add_child(tool_advanced_menu_buttom); + tool_settings->add_child(tool_advanced_menu_buttom); _update_toolbar(); // Right side of toolbar. Control *middle_space = memnew(Control); middle_space->set_h_size_flags(SIZE_EXPAND_FILL); - toolbox->add_child(middle_space); + tool_settings->add_child(middle_space); tool_tile_id_label = memnew(Label); tool_tile_id_label->set_mouse_filter(Control::MOUSE_FILTER_STOP); - toolbox->add_child(tool_tile_id_label); + tool_settings->add_child(tool_tile_id_label); _update_tile_id_label(); + // Right panel. + VBoxContainer *right_panel = memnew(VBoxContainer); + right_panel->set_h_size_flags(SIZE_EXPAND_FILL); + right_panel->set_v_size_flags(SIZE_EXPAND_FILL); + right_vbox_container->add_child(right_panel); + // Tile atlas view. tile_atlas_view = memnew(TileAtlasView); tile_atlas_view->set_h_size_flags(SIZE_EXPAND_FILL); tile_atlas_view->set_v_size_flags(SIZE_EXPAND_FILL); + tile_atlas_view->set_custom_minimum_size(Size2(200, 0) * EDSCALE); tile_atlas_view->connect("transform_changed", callable_mp(TilesEditorPlugin::get_singleton(), &TilesEditorPlugin::set_atlas_view_transform)); tile_atlas_view->connect("transform_changed", callable_mp(this, &TileSetAtlasSourceEditor::_tile_atlas_view_transform_changed).unbind(2)); right_panel->add_child(tile_atlas_view); @@ -2578,17 +2560,17 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { tile_atlas_view->add_control_over_alternative_tiles(alternative_tiles_control_unscaled, false); alternative_tiles_control_unscaled->set_mouse_filter(Control::MOUSE_FILTER_IGNORE); - tile_atlas_view_missing_source_label = memnew(Label); - tile_atlas_view_missing_source_label->set_text(TTR("Add or select an atlas texture to the left panel.")); - tile_atlas_view_missing_source_label->set_horizontal_alignment(HORIZONTAL_ALIGNMENT_CENTER); - tile_atlas_view_missing_source_label->set_vertical_alignment(VERTICAL_ALIGNMENT_CENTER); - tile_atlas_view_missing_source_label->set_h_size_flags(SIZE_EXPAND_FILL); - tile_atlas_view_missing_source_label->set_v_size_flags(SIZE_EXPAND_FILL); - tile_atlas_view_missing_source_label->hide(); - right_panel->add_child(tile_atlas_view_missing_source_label); - EditorNode::get_singleton()->get_editor_data().add_undo_redo_inspector_hook_callback(callable_mp(this, &TileSetAtlasSourceEditor::_undo_redo_inspector_callback)); + // -- Dialogs -- + confirm_auto_create_tiles = memnew(AcceptDialog); + confirm_auto_create_tiles->set_title(TTR("Auto Create Tiles in Non-Transparent Texture Regions?")); + confirm_auto_create_tiles->set_text(TTR("The atlas's texture was modified.\nWould you like to automatically create tiles in the atlas?")); + confirm_auto_create_tiles->set_ok_button_text(TTR("Yes")); + confirm_auto_create_tiles->add_cancel_button()->set_text(TTR("No")); + confirm_auto_create_tiles->connect("confirmed", callable_mp(this, &TileSetAtlasSourceEditor::_auto_create_tiles)); + add_child(confirm_auto_create_tiles); + // Inspector plugin. Ref<EditorInspectorPluginTileData> tile_data_inspector_plugin; tile_data_inspector_plugin.instantiate(); diff --git a/editor/plugins/tiles/tile_set_atlas_source_editor.h b/editor/plugins/tiles/tile_set_atlas_source_editor.h index 14e120e2a3..eede2ec086 100644 --- a/editor/plugins/tiles/tile_set_atlas_source_editor.h +++ b/editor/plugins/tiles/tile_set_atlas_source_editor.h @@ -42,8 +42,8 @@ class TileSet; class Tree; class VSeparator; -class TileSetAtlasSourceEditor : public HBoxContainer { - GDCLASS(TileSetAtlasSourceEditor, HBoxContainer); +class TileSetAtlasSourceEditor : public HSplitContainer { + GDCLASS(TileSetAtlasSourceEditor, HSplitContainer); public: // A class to store which tiles are selected. @@ -77,7 +77,7 @@ public: public: void set_id(int p_id); - int get_id(); + int get_id() const; void edit(Ref<TileSet> p_tile_set, TileSetAtlasSource *p_tile_set_atlas_source, int p_source_id); TileSetAtlasSource *get_edited() { return tile_set_atlas_source; }; @@ -120,6 +120,7 @@ private: bool tile_set_changed_needs_update = false; // -- Properties painting -- + ScrollContainer *tile_data_editors_scroll = nullptr; VBoxContainer *tile_data_painting_editor_container = nullptr; Label *tile_data_editors_label = nullptr; Button *tile_data_editor_dropdown_button = nullptr; @@ -137,19 +138,15 @@ private: // -- Inspector -- AtlasTileProxyObject *tile_proxy_object = nullptr; - Label *tile_inspector_label = nullptr; EditorInspector *tile_inspector = nullptr; Label *tile_inspector_no_tile_selected_label = nullptr; String selected_property; void _inspector_property_selected(String p_property); TileSetAtlasSourceProxyObject *atlas_source_proxy_object = nullptr; - Label *atlas_source_inspector_label = nullptr; EditorInspector *atlas_source_inspector = nullptr; // -- Atlas view -- - HBoxContainer *toolbox = nullptr; - Label *tile_atlas_view_missing_source_label = nullptr; TileAtlasView *tile_atlas_view = nullptr; // Dragging @@ -210,7 +207,6 @@ private: // Tool settings. HBoxContainer *tool_settings = nullptr; - VSeparator *tool_settings_vsep = nullptr; HBoxContainer *tool_settings_tile_data_toolbar_container = nullptr; Button *tools_settings_erase_button = nullptr; MenuButton *tool_advanced_menu_buttom = nullptr; diff --git a/editor/plugins/tiles/tile_set_editor.cpp b/editor/plugins/tiles/tile_set_editor.cpp index b24c5059b0..e8ceacf8f8 100644 --- a/editor/plugins/tiles/tile_set_editor.cpp +++ b/editor/plugins/tiles/tile_set_editor.cpp @@ -120,7 +120,9 @@ bool TileSetEditor::_can_drop_data_fw(const Point2 &p_point, const Variant &p_da } void TileSetEditor::_update_sources_list(int force_selected_id) { - ERR_FAIL_COND(!tile_set.is_valid()); + if (tile_set.is_null()) { + return; + } // Get the previously selected id. int old_selected = TileSet::INVALID_SOURCE; @@ -151,7 +153,7 @@ void TileSetEditor::_update_sources_list(int force_selected_id) { // Common to all type of sources. if (!source->get_name().is_empty()) { - item_text = vformat(TTR("%s (id:%d)"), source->get_name(), source_id); + item_text = vformat(TTR("%s (ID: %d)"), source->get_name(), source_id); } // Atlas source. @@ -160,7 +162,7 @@ void TileSetEditor::_update_sources_list(int force_selected_id) { texture = atlas_source->get_texture(); if (item_text.is_empty()) { if (texture.is_valid()) { - item_text = vformat("%s (ID: %d)", texture->get_path().get_file(), source_id); + item_text = vformat(TTR("%s (ID: %d)"), texture->get_path().get_file(), source_id); } else { item_text = vformat(TTR("No Texture Atlas Source (ID: %d)"), source_id); } @@ -346,6 +348,7 @@ void TileSetEditor::_notification(int p_what) { source_sort_button->set_icon(get_theme_icon(SNAME("Sort"), SNAME("EditorIcons"))); sources_advanced_menu_button->set_icon(get_theme_icon(SNAME("GuiTabMenuHl"), SNAME("EditorIcons"))); missing_texture_texture = get_theme_icon(SNAME("TileSet"), SNAME("EditorIcons")); + _update_sources_list(); } break; case NOTIFICATION_INTERNAL_PROCESS: { diff --git a/editor/plugins/tiles/tiles_editor_plugin.cpp b/editor/plugins/tiles/tiles_editor_plugin.cpp index 5d93f58f34..ee29913334 100644 --- a/editor/plugins/tiles/tiles_editor_plugin.cpp +++ b/editor/plugins/tiles/tiles_editor_plugin.cpp @@ -385,6 +385,15 @@ bool TilesEditorPlugin::handles(Object *p_object) const { return p_object->is_class("TileMap") || p_object->is_class("TileSet"); } +void TilesEditorPlugin::draw_selection_rect(CanvasItem *p_ci, const Rect2 &p_rect, const Color &p_color) { + real_t scale = p_ci->get_global_transform().get_scale().x * 0.5; + p_ci->draw_set_transform(p_rect.position, 0, Vector2(1, 1) / scale); + RS::get_singleton()->canvas_item_add_nine_patch( + p_ci->get_canvas_item(), Rect2(Vector2(), p_rect.size * scale), Rect2(), EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("TileSelection"), SNAME("EditorIcons"))->get_rid(), + Vector2(2, 2), Vector2(2, 2), RS::NINE_PATCH_STRETCH, RS::NINE_PATCH_STRETCH, false, p_color); + p_ci->draw_set_transform_matrix(Transform2D()); +} + TilesEditorPlugin::TilesEditorPlugin() { set_process_internal(true); diff --git a/editor/plugins/tiles/tiles_editor_plugin.h b/editor/plugins/tiles/tiles_editor_plugin.h index fe0d8179bc..825a10dac2 100644 --- a/editor/plugins/tiles/tiles_editor_plugin.h +++ b/editor/plugins/tiles/tiles_editor_plugin.h @@ -128,6 +128,8 @@ public: virtual bool handles(Object *p_object) const override; virtual void make_visible(bool p_visible) override; + static void draw_selection_rect(CanvasItem *p_ci, const Rect2 &p_rect, const Color &p_color = Color(1.0, 1.0, 1.0)); + TilesEditorPlugin(); ~TilesEditorPlugin(); }; diff --git a/editor/plugins/version_control_editor_plugin.cpp b/editor/plugins/version_control_editor_plugin.cpp index 369a59c443..f54bebfd8e 100644 --- a/editor/plugins/version_control_editor_plugin.cpp +++ b/editor/plugins/version_control_editor_plugin.cpp @@ -47,43 +47,7 @@ VersionControlEditorPlugin *VersionControlEditorPlugin::singleton = nullptr; void VersionControlEditorPlugin::_bind_methods() { - ClassDB::bind_method(D_METHOD("_initialize_vcs"), &VersionControlEditorPlugin::_initialize_vcs); - ClassDB::bind_method(D_METHOD("_set_credentials"), &VersionControlEditorPlugin::_set_credentials); - ClassDB::bind_method(D_METHOD("_update_set_up_warning"), &VersionControlEditorPlugin::_update_set_up_warning); - ClassDB::bind_method(D_METHOD("_commit"), &VersionControlEditorPlugin::_commit); - ClassDB::bind_method(D_METHOD("_refresh_stage_area"), &VersionControlEditorPlugin::_refresh_stage_area); - ClassDB::bind_method(D_METHOD("_move_all"), &VersionControlEditorPlugin::_move_all); - ClassDB::bind_method(D_METHOD("_load_diff"), &VersionControlEditorPlugin::_load_diff); - ClassDB::bind_method(D_METHOD("_display_diff"), &VersionControlEditorPlugin::_display_diff); - ClassDB::bind_method(D_METHOD("_item_activated"), &VersionControlEditorPlugin::_item_activated); - ClassDB::bind_method(D_METHOD("_update_branch_create_button"), &VersionControlEditorPlugin::_update_branch_create_button); - ClassDB::bind_method(D_METHOD("_update_remote_create_button"), &VersionControlEditorPlugin::_update_remote_create_button); - ClassDB::bind_method(D_METHOD("_update_commit_button"), &VersionControlEditorPlugin::_update_commit_button); - ClassDB::bind_method(D_METHOD("_refresh_branch_list"), &VersionControlEditorPlugin::_refresh_branch_list); - ClassDB::bind_method(D_METHOD("_set_commit_list_size"), &VersionControlEditorPlugin::_set_commit_list_size); - ClassDB::bind_method(D_METHOD("_refresh_commit_list"), &VersionControlEditorPlugin::_refresh_commit_list); - ClassDB::bind_method(D_METHOD("_refresh_remote_list"), &VersionControlEditorPlugin::_refresh_remote_list); - ClassDB::bind_method(D_METHOD("_ssh_public_key_selected"), &VersionControlEditorPlugin::_ssh_public_key_selected); - ClassDB::bind_method(D_METHOD("_ssh_private_key_selected"), &VersionControlEditorPlugin::_ssh_private_key_selected); - ClassDB::bind_method(D_METHOD("_commit_message_gui_input"), &VersionControlEditorPlugin::_commit_message_gui_input); - ClassDB::bind_method(D_METHOD("_cell_button_pressed"), &VersionControlEditorPlugin::_cell_button_pressed); - ClassDB::bind_method(D_METHOD("_discard_all"), &VersionControlEditorPlugin::_discard_all); - ClassDB::bind_method(D_METHOD("_create_branch"), &VersionControlEditorPlugin::_create_branch); - ClassDB::bind_method(D_METHOD("_create_remote"), &VersionControlEditorPlugin::_create_remote); - ClassDB::bind_method(D_METHOD("_remove_branch"), &VersionControlEditorPlugin::_remove_branch); - ClassDB::bind_method(D_METHOD("_remove_remote"), &VersionControlEditorPlugin::_remove_remote); - ClassDB::bind_method(D_METHOD("_branch_item_selected"), &VersionControlEditorPlugin::_branch_item_selected); - ClassDB::bind_method(D_METHOD("_remote_selected"), &VersionControlEditorPlugin::_remote_selected); - ClassDB::bind_method(D_METHOD("_fetch"), &VersionControlEditorPlugin::_fetch); - ClassDB::bind_method(D_METHOD("_pull"), &VersionControlEditorPlugin::_pull); - ClassDB::bind_method(D_METHOD("_push"), &VersionControlEditorPlugin::_push); - ClassDB::bind_method(D_METHOD("_extra_option_selected"), &VersionControlEditorPlugin::_extra_option_selected); - ClassDB::bind_method(D_METHOD("_update_extra_options"), &VersionControlEditorPlugin::_update_extra_options); - ClassDB::bind_method(D_METHOD("_popup_branch_remove_confirm"), &VersionControlEditorPlugin::_popup_branch_remove_confirm); - ClassDB::bind_method(D_METHOD("_popup_remote_remove_confirm"), &VersionControlEditorPlugin::_popup_remote_remove_confirm); - ClassDB::bind_method(D_METHOD("_popup_file_dialog"), &VersionControlEditorPlugin::_popup_file_dialog); - - ClassDB::bind_method(D_METHOD("popup_vcs_set_up_dialog"), &VersionControlEditorPlugin::popup_vcs_set_up_dialog); + // No binds required so far. } void VersionControlEditorPlugin::_create_vcs_metadata_files() { @@ -94,12 +58,10 @@ void VersionControlEditorPlugin::_create_vcs_metadata_files() { void VersionControlEditorPlugin::_notification(int p_what) { if (p_what == NOTIFICATION_READY) { String installed_plugin = GLOBAL_DEF("editor/version_control/plugin_name", ""); - String project_path = GLOBAL_DEF("editor/version_control/project_path", OS::get_singleton()->get_resource_dir()); - project_path_input->set_text(project_path); bool has_autoload_enable = GLOBAL_DEF("editor/version_control/autoload_on_startup", false); if (installed_plugin != "" && has_autoload_enable) { - if (_load_plugin(installed_plugin, project_path)) { + if (_load_plugin(installed_plugin)) { _set_credentials(); } } @@ -144,18 +106,15 @@ void VersionControlEditorPlugin::_initialize_vcs() { const int id = set_up_choice->get_selected_id(); String selected_plugin = set_up_choice->get_item_text(id); - if (_load_plugin(selected_plugin, project_path_input->get_text())) { + if (_load_plugin(selected_plugin)) { ProjectSettings::get_singleton()->set("editor/version_control/autoload_on_startup", true); ProjectSettings::get_singleton()->set("editor/version_control/plugin_name", selected_plugin); - ProjectSettings::get_singleton()->set("editor/version_control/project_path", project_path_input->get_text()); ProjectSettings::get_singleton()->save(); } } void VersionControlEditorPlugin::_set_vcs_ui_state(bool p_enabled) { - select_project_path_button->set_disabled(p_enabled); set_up_dialog->get_ok_button()->set_disabled(!p_enabled); - project_path_input->set_editable(!p_enabled); set_up_choice->set_disabled(p_enabled); toggle_vcs_choice->set_pressed_no_signal(p_enabled); } @@ -181,14 +140,14 @@ void VersionControlEditorPlugin::_set_credentials() { EditorSettings::get_singleton()->set_setting("version_control/ssh_private_key_path", ssh_private_key); } -bool VersionControlEditorPlugin::_load_plugin(String p_name, String p_project_path) { +bool VersionControlEditorPlugin::_load_plugin(String p_name) { Object *extension_instance = ClassDB::instantiate(p_name); ERR_FAIL_NULL_V_MSG(extension_instance, false, "Received a nullptr VCS extension instance during construction."); EditorVCSInterface *vcs_plugin = Object::cast_to<EditorVCSInterface>(extension_instance); ERR_FAIL_NULL_V_MSG(vcs_plugin, false, vformat("Could not cast VCS extension instance to %s.", EditorVCSInterface::get_class_static())); - String res_dir = project_path_input->get_text(); + String res_dir = OS::get_singleton()->get_resource_dir(); ERR_FAIL_COND_V_MSG(!vcs_plugin->initialize(res_dir), false, "Could not initialize " + p_name); @@ -435,6 +394,10 @@ void VersionControlEditorPlugin::_discard_file(String p_file_path, EditorVCSInte EditorFileSystem::get_singleton()->update_file(p_file_path); } +void VersionControlEditorPlugin::_confirm_discard_all() { + discard_all_confirm->popup_centered(); +} + void VersionControlEditorPlugin::_discard_all() { TreeItem *file_entry = unstaged_files->get_root()->get_first_child(); while (file_entry) { @@ -943,10 +906,6 @@ void VersionControlEditorPlugin::_toggle_vcs_integration(bool p_toggled) { } } -void VersionControlEditorPlugin::_project_path_selected(String p_project_path) { - project_path_input->set_text(p_project_path); -} - void VersionControlEditorPlugin::fetch_available_vcs_plugin_names() { available_plugins.clear(); ClassDB::get_direct_inheriters_from_class(EditorVCSInterface::get_class_static(), &available_plugins); @@ -1040,34 +999,6 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() { set_up_choice->set_h_size_flags(Control::SIZE_EXPAND_FILL); set_up_hbc->add_child(set_up_choice); - HBoxContainer *project_path_hbc = memnew(HBoxContainer); - project_path_hbc->set_h_size_flags(Control::SIZE_FILL); - set_up_vbc->add_child(project_path_hbc); - - Label *project_path_label = memnew(Label); - project_path_label->set_h_size_flags(Control::SIZE_EXPAND_FILL); - project_path_label->set_text(TTR("VCS Project Path")); - project_path_hbc->add_child(project_path_label); - - project_path_input = memnew(LineEdit); - project_path_input->set_h_size_flags(Control::SIZE_EXPAND_FILL); - project_path_input->set_text(OS::get_singleton()->get_resource_dir()); - project_path_hbc->add_child(project_path_input); - - FileDialog *select_project_path_file_dialog = memnew(FileDialog); - select_project_path_file_dialog->set_access(FileDialog::ACCESS_FILESYSTEM); - select_project_path_file_dialog->set_file_mode(FileDialog::FILE_MODE_OPEN_DIR); - select_project_path_file_dialog->set_show_hidden_files(true); - select_project_path_file_dialog->set_current_dir(OS::get_singleton()->get_resource_dir()); - select_project_path_file_dialog->connect(SNAME("dir_selected"), callable_mp(this, &VersionControlEditorPlugin::_project_path_selected)); - project_path_hbc->add_child(select_project_path_file_dialog); - - select_project_path_button = memnew(Button); - select_project_path_button->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon("Folder", "EditorIcons")); - select_project_path_button->connect(SNAME("pressed"), callable_mp(this, &VersionControlEditorPlugin::_popup_file_dialog).bind(select_project_path_file_dialog)); - select_project_path_button->set_tooltip_text(TTR("Select VCS project path")); - project_path_hbc->add_child(select_project_path_button); - HBoxContainer *toggle_vcs_hbc = memnew(HBoxContainer); toggle_vcs_hbc->set_h_size_flags(Control::SIZE_EXPAND_FILL); set_up_vbc->add_child(toggle_vcs_hbc); @@ -1240,10 +1171,21 @@ VersionControlEditorPlugin::VersionControlEditorPlugin() { refresh_button->connect(SNAME("pressed"), callable_mp(this, &VersionControlEditorPlugin::_refresh_remote_list)); unstage_title->add_child(refresh_button); + discard_all_confirm = memnew(AcceptDialog); + discard_all_confirm->set_title(TTR("Discard all changes")); + discard_all_confirm->set_min_size(Size2i(400, 50)); + discard_all_confirm->set_text(TTR("This operation is IRREVERSIBLE. Your changes will be deleted FOREVER.")); + discard_all_confirm->set_hide_on_ok(true); + discard_all_confirm->set_ok_button_text(TTR("Permanentally delete my changes")); + discard_all_confirm->add_cancel_button(); + version_commit_dock->add_child(discard_all_confirm); + + discard_all_confirm->get_ok_button()->connect(SNAME("pressed"), callable_mp(this, &VersionControlEditorPlugin::_discard_all)); + discard_all_button = memnew(Button); discard_all_button->set_tooltip_text(TTR("Discard all changes")); discard_all_button->set_icon(EditorNode::get_singleton()->get_gui_base()->get_theme_icon(SNAME("Close"), SNAME("EditorIcons"))); - discard_all_button->connect(SNAME("pressed"), callable_mp(this, &VersionControlEditorPlugin::_discard_all)); + discard_all_button->connect(SNAME("pressed"), callable_mp(this, &VersionControlEditorPlugin::_confirm_discard_all)); discard_all_button->set_flat(true); unstage_title->add_child(discard_all_button); diff --git a/editor/plugins/version_control_editor_plugin.h b/editor/plugins/version_control_editor_plugin.h index 3340384a92..d73588a1bf 100644 --- a/editor/plugins/version_control_editor_plugin.h +++ b/editor/plugins/version_control_editor_plugin.h @@ -73,8 +73,6 @@ private: AcceptDialog *set_up_dialog = nullptr; CheckButton *toggle_vcs_choice = nullptr; OptionButton *set_up_choice = nullptr; - LineEdit *project_path_input = nullptr; - Button *select_project_path_button = nullptr; VBoxContainer *set_up_vbc = nullptr; VBoxContainer *set_up_settings_vbc = nullptr; LineEdit *set_up_username = nullptr; @@ -86,6 +84,8 @@ private: FileDialog *set_up_ssh_private_key_file_dialog = nullptr; Label *set_up_warning_text = nullptr; + AcceptDialog *discard_all_confirm = nullptr; + OptionButton *commit_list_size_button = nullptr; AcceptDialog *branch_create_confirm = nullptr; @@ -150,13 +150,14 @@ private: void _update_opened_tabs(); void _update_extra_options(); - bool _load_plugin(String p_name, String p_project_path); + bool _load_plugin(String p_name); void _pull(); void _push(); void _force_push(); void _fetch(); void _commit(); + void _confirm_discard_all(); void _discard_all(); void _refresh_stage_area(); void _refresh_branch_list(); @@ -193,7 +194,6 @@ private: void _create_vcs_metadata_files(); void _popup_file_dialog(Variant p_file_dialog_variant); void _toggle_vcs_integration(bool p_toggled); - void _project_path_selected(String p_project_path); friend class EditorVCSInterface; diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp index 9990d5c06f..c93b0019dc 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -269,6 +269,19 @@ void VisualShaderGraphPlugin::set_expression(VisualShader::Type p_type, int p_no links[p_node_id].expression_edit->set_text(p_expression); } +Ref<Script> VisualShaderGraphPlugin::get_node_script(int p_node_id) const { + if (!links.has(p_node_id)) { + return Ref<Script>(); + } + + Ref<VisualShaderNodeCustom> custom = Ref<VisualShaderNodeCustom>(links[p_node_id].visual_node); + if (custom.is_valid()) { + return custom->get_script(); + } + + return Ref<Script>(); +} + void VisualShaderGraphPlugin::update_node_size(int p_node_id) { if (!links.has(p_node_id)) { return; @@ -1137,10 +1150,6 @@ void VisualShaderEditor::edit(VisualShader *p_visual_shader) { } } -void VisualShaderEditor::update_nodes() { - _update_nodes(); -} - void VisualShaderEditor::add_plugin(const Ref<VisualShaderNodePlugin> &p_plugin) { if (plugins.has(p_plugin)) { return; @@ -1202,6 +1211,228 @@ void VisualShaderEditor::add_custom_type(const String &p_name, const Ref<Script> add_options.push_back(ao); } +Dictionary VisualShaderEditor::get_custom_node_data(Ref<VisualShaderNodeCustom> &p_custom_node) { + Dictionary dict; + dict["script"] = p_custom_node->get_script(); + + String name; + if (p_custom_node->has_method("_get_name")) { + name = (String)p_custom_node->call("_get_name"); + } else { + name = "Unnamed"; + } + dict["name"] = name; + + String description = ""; + if (p_custom_node->has_method("_get_description")) { + description = (String)p_custom_node->call("_get_description"); + } + dict["description"] = description; + + int return_icon_type = -1; + if (p_custom_node->has_method("_get_return_icon_type")) { + return_icon_type = (int)p_custom_node->call("_get_return_icon_type"); + } + dict["return_icon_type"] = return_icon_type; + + String category = ""; + if (p_custom_node->has_method("_get_category")) { + category = (String)p_custom_node->call("_get_category"); + } + category = category.rstrip("/"); + category = category.lstrip("/"); + category = "Addons/" + category; + + String subcategory = ""; + if (p_custom_node->has_method("_get_subcategory")) { + subcategory = (String)p_custom_node->call("_get_subcategory"); + } + if (!subcategory.is_empty()) { + category += "/" + subcategory; + } + dict["category"] = category; + + bool highend = false; + if (p_custom_node->has_method("_is_highend")) { + highend = (bool)p_custom_node->call("_is_highend"); + } + dict["highend"] = highend; + + return dict; +} + +void VisualShaderEditor::update_custom_type(const Ref<Resource> &p_resource) { + Ref<Script> scr = Ref<Script>(p_resource.ptr()); + if (scr.is_null() || scr->get_instance_base_type() != "VisualShaderNodeCustom") { + return; + } + + Ref<VisualShaderNodeCustom> ref; + ref.instantiate(); + ref->set_script(scr); + if (!ref->is_available(visual_shader->get_mode(), visual_shader->get_shader_type())) { + for (int i = 0; i < add_options.size(); i++) { + if (add_options[i].is_custom && add_options[i].script == scr) { + add_options.remove_at(i); + _update_options_menu(); + // TODO: Make indication for the existed custom nodes with that script on graph to be disabled. + break; + } + } + return; + } + Dictionary dict = get_custom_node_data(ref); + + bool found_type = false; + bool need_rebuild = false; + + for (int i = 0; i < add_options.size(); i++) { + if (add_options[i].is_custom && add_options[i].script == scr) { + found_type = true; + + add_options.write[i].name = dict["name"]; + add_options.write[i].return_type = dict["return_icon_type"]; + add_options.write[i].description = dict["description"]; + add_options.write[i].category = dict["category"]; + add_options.write[i].highend = dict["highend"]; + + int max_type = 0; + int type_offset = 0; + switch (visual_shader->get_mode()) { + case Shader::MODE_CANVAS_ITEM: + case Shader::MODE_SPATIAL: { + max_type = 3; + } break; + case Shader::MODE_PARTICLES: { + max_type = 5; + type_offset = 3; + } break; + case Shader::MODE_SKY: { + max_type = 1; + type_offset = 8; + } break; + case Shader::MODE_FOG: { + max_type = 1; + type_offset = 9; + } break; + default: { + } break; + } + max_type = type_offset + max_type; + + for (int t = type_offset; t < max_type; t++) { + VisualShader::Type type = (VisualShader::Type)t; + Vector<int> nodes = visual_shader->get_node_list(type); + + List<VisualShader::Connection> node_connections; + visual_shader->get_node_connections(type, &node_connections); + + List<VisualShader::Connection> custom_node_input_connections; + List<VisualShader::Connection> custom_node_output_connections; + for (const VisualShader::Connection &E : node_connections) { + int from = E.from_node; + int from_idx = E.from_port; + int to = E.to_node; + int to_idx = E.to_port; + + if (graph_plugin->get_node_script(from) == scr) { + custom_node_output_connections.push_back({ from, from_idx, to, to_idx }); + } else if (graph_plugin->get_node_script(to) == scr) { + custom_node_input_connections.push_back({ from, from_idx, to, to_idx }); + } + } + + for (int j = 0; j < nodes.size(); j++) { + int node_id = nodes[j]; + + Ref<VisualShaderNode> vsnode = visual_shader->get_node(type, node_id); + if (vsnode.is_null()) { + continue; + } + Ref<VisualShaderNodeCustom> custom_node = Ref<VisualShaderNodeCustom>(vsnode.ptr()); + if (custom_node.is_null() || custom_node->get_script() != scr) { + continue; + } + need_rebuild = true; + + // Removes invalid connections. + { + int prev_input_port_count = custom_node->get_input_port_count(); + int prev_output_port_count = custom_node->get_output_port_count(); + + custom_node->update_ports(); + + int input_port_count = custom_node->get_input_port_count(); + int output_port_count = custom_node->get_output_port_count(); + + if (output_port_count != prev_output_port_count) { + for (const VisualShader::Connection &E : custom_node_output_connections) { + int from = E.from_node; + int from_idx = E.from_port; + int to = E.to_node; + int to_idx = E.to_port; + + if (from_idx >= output_port_count) { + visual_shader->disconnect_nodes(type, from, from_idx, to, to_idx); + graph_plugin->disconnect_nodes(type, from, from_idx, to, to_idx); + } + } + } + if (input_port_count != prev_input_port_count) { + for (const VisualShader::Connection &E : custom_node_input_connections) { + int from = E.from_node; + int from_idx = E.from_port; + int to = E.to_node; + int to_idx = E.to_port; + + if (to_idx >= input_port_count) { + visual_shader->disconnect_nodes(type, from, from_idx, to, to_idx); + graph_plugin->disconnect_nodes(type, from, from_idx, to, to_idx); + } + } + } + } + + graph_plugin->update_node(type, node_id); + } + } + break; + } + } + + if (!found_type) { + add_custom_type(dict["name"], dict["script"], dict["description"], dict["return_icon_type"], dict["category"], dict["highend"]); + } + + // To prevent updating options multiple times when multiple scripts are saved. + if (!_block_update_options_menu) { + _block_update_options_menu = true; + + call_deferred(SNAME("_update_options_menu_deferred")); + } + + // To prevent rebuilding the shader multiple times when multiple scripts are saved. + if (need_rebuild && !_block_rebuild_shader) { + _block_rebuild_shader = true; + + call_deferred(SNAME("_rebuild_shader_deferred")); + } +} + +void VisualShaderEditor::_update_options_menu_deferred() { + _update_options_menu(); + + _block_update_options_menu = false; +} + +void VisualShaderEditor::_rebuild_shader_deferred() { + if (visual_shader.is_valid()) { + visual_shader->rebuild(); + } + + _block_rebuild_shader = false; +} + bool VisualShaderEditor::_is_available(int p_mode) { int current_mode = edit_type->get_selected(); @@ -1243,57 +1474,10 @@ void VisualShaderEditor::_update_nodes() { if (!ref->is_available(visual_shader->get_mode(), visual_shader->get_shader_type())) { continue; } - - String name; - if (ref->has_method("_get_name")) { - name = (String)ref->call("_get_name"); - } else { - name = "Unnamed"; - } - - String description = ""; - if (ref->has_method("_get_description")) { - description = (String)ref->call("_get_description"); - } - - int return_icon_type = -1; - if (ref->has_method("_get_return_icon_type")) { - return_icon_type = (int)ref->call("_get_return_icon_type"); - } - - String category = ""; - if (ref->has_method("_get_category")) { - category = (String)ref->call("_get_category"); - } - - String subcategory = ""; - if (ref->has_method("_get_subcategory")) { - subcategory = (String)ref->call("_get_subcategory"); - } - - bool highend = false; - if (ref->has_method("_is_highend")) { - highend = (bool)ref->call("_is_highend"); - } - - Dictionary dict; - dict["name"] = name; - dict["script"] = scr; - dict["description"] = description; - dict["return_icon_type"] = return_icon_type; - - category = category.rstrip("/"); - category = category.lstrip("/"); - category = "Addons/" + category; - if (!subcategory.is_empty()) { - category += "/" + subcategory; - } - - dict["category"] = category; - dict["highend"] = highend; + Dictionary dict = get_custom_node_data(ref); String key; - key = category + "/" + name; + key = String(dict["category"]) + "/" + String(dict["name"]); added[key] = dict; } @@ -4694,6 +4878,8 @@ void VisualShaderEditor::_bind_methods() { ClassDB::bind_method("_update_constant", &VisualShaderEditor::_update_constant); ClassDB::bind_method("_update_parameter", &VisualShaderEditor::_update_parameter); ClassDB::bind_method("_expand_output_port", &VisualShaderEditor::_expand_output_port); + ClassDB::bind_method("_update_options_menu_deferred", &VisualShaderEditor::_update_options_menu_deferred); + ClassDB::bind_method("_rebuild_shader_deferred", &VisualShaderEditor::_rebuild_shader_deferred); ClassDB::bind_method(D_METHOD("_get_drag_data_fw"), &VisualShaderEditor::get_drag_data_fw); ClassDB::bind_method(D_METHOD("_can_drop_data_fw"), &VisualShaderEditor::can_drop_data_fw); @@ -4704,6 +4890,7 @@ void VisualShaderEditor::_bind_methods() { VisualShaderEditor::VisualShaderEditor() { ShaderLanguage::get_keyword_list(&keyword_list); + EditorNode::get_singleton()->connect("resource_saved", callable_mp(this, &VisualShaderEditor::update_custom_type)); graph = memnew(GraphEdit); graph->get_zoom_hbox()->set_h_size_flags(SIZE_EXPAND_FILL); diff --git a/editor/plugins/visual_shader_editor_plugin.h b/editor/plugins/visual_shader_editor_plugin.h index 8afad9f668..d559237569 100644 --- a/editor/plugins/visual_shader_editor_plugin.h +++ b/editor/plugins/visual_shader_editor_plugin.h @@ -133,6 +133,7 @@ public: void update_curve_xyz(int p_node_id); void set_expression(VisualShader::Type p_type, int p_node_id, const String &p_expression); int get_constant_index(float p_constant) const; + Ref<Script> get_node_script(int p_node_id) const; void update_node_size(int p_node_id); void update_theme(); VisualShader::Type get_shader_type() const; @@ -190,6 +191,9 @@ class VisualShaderEditor : public VBoxContainer { PanelContainer *error_panel = nullptr; Label *error_label = nullptr; + bool _block_update_options_menu = false; + bool _block_rebuild_shader = false; + Point2 saved_node_pos; bool saved_node_pos_dirty = false; @@ -497,6 +501,9 @@ class VisualShaderEditor : public VBoxContainer { void _update_parameter_refs(HashSet<String> &p_names); void _update_varyings(); + void _update_options_menu_deferred(); + void _rebuild_shader_deferred(); + void _visibility_changed(); protected: @@ -504,7 +511,6 @@ protected: static void _bind_methods(); public: - void update_nodes(); void add_plugin(const Ref<VisualShaderNodePlugin> &p_plugin); void remove_plugin(const Ref<VisualShaderNodePlugin> &p_plugin); @@ -513,6 +519,9 @@ public: void clear_custom_types(); void add_custom_type(const String &p_name, const Ref<Script> &p_script, const String &p_description, int p_return_icon_type, const String &p_category, bool p_highend); + Dictionary get_custom_node_data(Ref<VisualShaderNodeCustom> &p_custom_node); + void update_custom_type(const Ref<Resource> &p_resource); + virtual Size2 get_minimum_size() const override; void edit(VisualShader *p_visual_shader); VisualShaderEditor(); diff --git a/editor/project_converter_3_to_4.cpp b/editor/project_converter_3_to_4.cpp index d42dc3c3bf..e07c672f5c 100644 --- a/editor/project_converter_3_to_4.cpp +++ b/editor/project_converter_3_to_4.cpp @@ -1398,7 +1398,7 @@ static const char *class_renames[][2] = { // { "Physics2DDirectBodyStateSW", "GodotPhysicsDirectBodyState2D" }, // Class is not visible in ClassDB // { "Physics2DShapeQueryResult", "PhysicsShapeQueryResult2D" }, // Class is not visible in ClassDB // { "PhysicsShapeQueryResult", "PhysicsShapeQueryResult3D" }, // Class is not visible in ClassDB - // { "NativeScript","NativeExtension"}, ?? + // { "NativeScript","GDExtension"}, ?? { "ARVRAnchor", "XRAnchor3D" }, { "ARVRCamera", "XRCamera3D" }, { "ARVRController", "XRController3D" }, diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp index 249504b6e8..1b169076c6 100644 --- a/editor/project_manager.cpp +++ b/editor/project_manager.cpp @@ -94,6 +94,7 @@ private: Container *path_container; Container *install_path_container; Container *renderer_container; + Label *renderer_info; HBoxContainer *default_files_container; Ref<ButtonGroup> renderer_button_group; Label *msg; @@ -426,6 +427,35 @@ private: ok_pressed(); } + void _renderer_selected() { + String renderer_type = renderer_button_group->get_pressed_button()->get_meta(SNAME("rendering_method")); + + if (renderer_type == "forward_plus") { + renderer_info->set_text( + String::utf8("• ") + TTR("Supports desktop platforms only.") + + String::utf8("\n• ") + TTR("Advanced 3D graphics available.") + + String::utf8("\n• ") + TTR("Can scale to large complex scenes.") + + String::utf8("\n• ") + TTR("Uses RenderingDevice backend.") + + String::utf8("\n• ") + TTR("Slower rendering of simple scenes.")); + } else if (renderer_type == "mobile") { + renderer_info->set_text( + String::utf8("• ") + TTR("Supports desktop + mobile platforms.") + + String::utf8("\n• ") + TTR("Less advanced 3D graphics.") + + String::utf8("\n• ") + TTR("Less scalable for complex scenes.") + + String::utf8("\n• ") + TTR("Uses RenderingDevice backend.") + + String::utf8("\n• ") + TTR("Fast rendering of simple scenes.")); + } else if (renderer_type == "gl_compatibility") { + renderer_info->set_text( + String::utf8("• ") + TTR("Supports desktop, mobile + web platforms.") + + String::utf8("\n• ") + TTR("Least advanced 3D graphics.") + + String::utf8("\n• ") + TTR("Intended for low-end/older devices.") + + String::utf8("\n• ") + TTR("Uses OpenGL 3 backend (OpenGL 3.3/ES 3.0/WebGL2).") + + String::utf8("\n• ") + TTR("Fastest rendering of simple scenes.")); + } else { + WARN_PRINT("Unknown renderer type. Please report this as a bug on GitHub."); + } + } + void ok_pressed() override { String dir = project_path->get_text(); @@ -483,10 +513,15 @@ private: String renderer_type = renderer_button_group->get_pressed_button()->get_meta(SNAME("rendering_method")); initial_settings["rendering/renderer/rendering_method"] = renderer_type; + EditorSettings::get_singleton()->set("project_manager/default_renderer", renderer_type); + EditorSettings::get_singleton()->save(); + if (renderer_type == "forward_plus") { project_features.push_back("Forward Plus"); } else if (renderer_type == "mobile") { project_features.push_back("Mobile"); + } else if (renderer_type == "gl_compatibility") { + project_features.push_back("GL Compatibility"); } else { WARN_PRINT("Unknown renderer type. Please report this as a bug on GitHub."); } @@ -860,42 +895,55 @@ public: renderer_container->add_child(rshc); renderer_button_group.instantiate(); + // Left hand side, used for checkboxes to select renderer. Container *rvb = memnew(VBoxContainer); - rvb->set_h_size_flags(Control::SIZE_EXPAND_FILL); rshc->add_child(rvb); + + String default_renderer_type = "forward_plus"; + if (EditorSettings::get_singleton()->has_setting("project_manager/default_renderer")) { + default_renderer_type = EditorSettings::get_singleton()->get_setting("project_manager/default_renderer"); + } + Button *rs_button = memnew(CheckBox); rs_button->set_button_group(renderer_button_group); rs_button->set_text(TTR("Forward+")); rs_button->set_meta(SNAME("rendering_method"), "forward_plus"); - rs_button->set_pressed(true); + rs_button->connect("pressed", callable_mp(this, &ProjectDialog::_renderer_selected)); rvb->add_child(rs_button); - l = memnew(Label); - l->set_text( - String::utf8("• ") + TTR("Supports desktop platforms only.") + - String::utf8("\n• ") + TTR("Advanced 3D graphics available.") + - String::utf8("\n• ") + TTR("Can scale to large complex scenes.") + - String::utf8("\n• ") + TTR("Slower rendering of simple scenes.")); - l->set_modulate(Color(1, 1, 1, 0.7)); - rvb->add_child(l); - - rshc->add_child(memnew(VSeparator)); + if (default_renderer_type == "forward_plus") { + rs_button->set_pressed(true); + } - rvb = memnew(VBoxContainer); - rvb->set_h_size_flags(Control::SIZE_EXPAND_FILL); - rshc->add_child(rvb); rs_button = memnew(CheckBox); rs_button->set_button_group(renderer_button_group); rs_button->set_text(TTR("Mobile")); rs_button->set_meta(SNAME("rendering_method"), "mobile"); + rs_button->connect("pressed", callable_mp(this, &ProjectDialog::_renderer_selected)); rvb->add_child(rs_button); - l = memnew(Label); - l->set_text( - String::utf8("• ") + TTR("Supports desktop + mobile platforms.") + - String::utf8("\n• ") + TTR("Less advanced 3D graphics.") + - String::utf8("\n• ") + TTR("Less scalable for complex scenes.") + - String::utf8("\n• ") + TTR("Faster rendering of simple scenes.")); - l->set_modulate(Color(1, 1, 1, 0.7)); - rvb->add_child(l); + if (default_renderer_type == "mobile") { + rs_button->set_pressed(true); + } + + rs_button = memnew(CheckBox); + rs_button->set_button_group(renderer_button_group); + rs_button->set_text(TTR("Compatibility")); + rs_button->set_meta(SNAME("rendering_method"), "gl_compatibility"); + rs_button->connect("pressed", callable_mp(this, &ProjectDialog::_renderer_selected)); + rvb->add_child(rs_button); + if (default_renderer_type == "gl_compatibility") { + rs_button->set_pressed(true); + } + + rshc->add_child(memnew(VSeparator)); + + // Right hand side, used for text explaining each choice. + rvb = memnew(VBoxContainer); + rvb->set_h_size_flags(Control::SIZE_EXPAND_FILL); + rshc->add_child(rvb); + renderer_info = memnew(Label); + renderer_info->set_modulate(Color(1, 1, 1, 0.7)); + rvb->add_child(renderer_info); + _renderer_selected(); l = memnew(Label); l->set_text(TTR("The renderer can be changed later, but scenes may need to be adjusted.")); diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp index 1e917e6b3d..b99a83a546 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -280,6 +280,8 @@ void ProjectSettingsEditor::_add_feature_overrides() { presets.insert("debug"); presets.insert("release"); presets.insert("template"); + presets.insert("double"); + presets.insert("single"); presets.insert("32"); presets.insert("64"); presets.insert("movie"); @@ -551,6 +553,14 @@ void ProjectSettingsEditor::_update_theme() { } } +void ProjectSettingsEditor::_input_filter_focused() { + set_close_on_escape(false); +} + +void ProjectSettingsEditor::_input_filter_unfocused() { + set_close_on_escape(true); +} + void ProjectSettingsEditor::_notification(int p_what) { switch (p_what) { case NOTIFICATION_VISIBILITY_CHANGED: { @@ -681,6 +691,8 @@ ProjectSettingsEditor::ProjectSettingsEditor(EditorData *p_data) { action_map_editor->connect("action_removed", callable_mp(this, &ProjectSettingsEditor::_action_removed)); action_map_editor->connect("action_renamed", callable_mp(this, &ProjectSettingsEditor::_action_renamed)); action_map_editor->connect("action_reordered", callable_mp(this, &ProjectSettingsEditor::_action_reordered)); + action_map_editor->connect(SNAME("filter_focused"), callable_mp(this, &ProjectSettingsEditor::_input_filter_focused)); + action_map_editor->connect(SNAME("filter_unfocused"), callable_mp(this, &ProjectSettingsEditor::_input_filter_unfocused)); tab_container->add_child(action_map_editor); localization_editor = memnew(LocalizationEditor); diff --git a/editor/project_settings_editor.h b/editor/project_settings_editor.h index 7f6dd1b692..1687be47fb 100644 --- a/editor/project_settings_editor.h +++ b/editor/project_settings_editor.h @@ -107,6 +107,9 @@ class ProjectSettingsEditor : public AcceptDialog { void _update_action_map_editor(); void _update_theme(); + void _input_filter_focused(); + void _input_filter_unfocused(); + protected: void _notification(int p_what); static void _bind_methods(); diff --git a/editor/register_editor_types.cpp b/editor/register_editor_types.cpp index f301ff5c6b..8ac0aa6fe3 100644 --- a/editor/register_editor_types.cpp +++ b/editor/register_editor_types.cpp @@ -48,6 +48,7 @@ #include "editor/import/editor_import_plugin.h" #include "editor/import/resource_importer_scene.h" #include "editor/plugins/animation_tree_editor_plugin.h" +#include "editor/plugins/audio_stream_editor_plugin.h" #include "editor/plugins/audio_stream_randomizer_editor_plugin.h" #include "editor/plugins/bit_map_editor_plugin.h" #include "editor/plugins/bone_map_editor_plugin.h" @@ -79,6 +80,7 @@ #include "editor/plugins/navigation_polygon_editor_plugin.h" #include "editor/plugins/node_3d_editor_gizmos.h" #include "editor/plugins/occluder_instance_3d_editor_plugin.h" +#include "editor/plugins/packed_scene_editor_plugin.h" #include "editor/plugins/path_2d_editor_plugin.h" #include "editor/plugins/path_3d_editor_plugin.h" #include "editor/plugins/physical_bone_3d_editor_plugin.h" @@ -154,6 +156,7 @@ void register_editor_types() { // This list is alphabetized, and plugins that depend on Node2D are in their own section below. EditorPlugins::add_by_type<AnimationTreeEditorPlugin>(); + EditorPlugins::add_by_type<AudioStreamEditorPlugin>(); EditorPlugins::add_by_type<AudioStreamRandomizerEditorPlugin>(); EditorPlugins::add_by_type<BitMapEditorPlugin>(); EditorPlugins::add_by_type<BoneMapEditorPlugin>(); @@ -175,6 +178,7 @@ void register_editor_types() { EditorPlugins::add_by_type<MeshLibraryEditorPlugin>(); EditorPlugins::add_by_type<MultiMeshEditorPlugin>(); EditorPlugins::add_by_type<OccluderInstance3DEditorPlugin>(); + EditorPlugins::add_by_type<PackedSceneEditorPlugin>(); EditorPlugins::add_by_type<Path3DEditorPlugin>(); EditorPlugins::add_by_type<PhysicalBone3DEditorPlugin>(); EditorPlugins::add_by_type<Polygon3DEditorPlugin>(); diff --git a/editor/scene_tree_dock.cpp b/editor/scene_tree_dock.cpp index 96688a3614..f91b571118 100644 --- a/editor/scene_tree_dock.cpp +++ b/editor/scene_tree_dock.cpp @@ -1965,37 +1965,21 @@ void SceneTreeDock::_script_created(Ref<Script> p_script) { } Ref<EditorUndoRedoManager> &undo_redo = EditorNode::get_undo_redo(); - if (selected.size() == 1) { - Node *node = selected.front()->get(); - Ref<Script> existing = node->get_script(); - - undo_redo->create_action(TTR("Attach Script"), UndoRedo::MERGE_DISABLE, node); - undo_redo->add_do_method(InspectorDock::get_singleton(), "store_script_properties", node); - undo_redo->add_undo_method(InspectorDock::get_singleton(), "store_script_properties", node); - undo_redo->add_do_method(node, "set_script", p_script); - undo_redo->add_undo_method(node, "set_script", existing); - undo_redo->add_do_method(InspectorDock::get_singleton(), "apply_script_properties", node); - undo_redo->add_undo_method(InspectorDock::get_singleton(), "apply_script_properties", node); + undo_redo->create_action(TTR("Attach Script"), UndoRedo::MERGE_DISABLE, selected.front()->get()); + for (Node *E : selected) { + Ref<Script> existing = E->get_script(); + undo_redo->add_do_method(InspectorDock::get_singleton(), "store_script_properties", E); + undo_redo->add_undo_method(InspectorDock::get_singleton(), "store_script_properties", E); + undo_redo->add_do_method(E, "set_script", p_script); + undo_redo->add_undo_method(E, "set_script", existing); + undo_redo->add_do_method(InspectorDock::get_singleton(), "apply_script_properties", E); + undo_redo->add_undo_method(InspectorDock::get_singleton(), "apply_script_properties", E); undo_redo->add_do_method(this, "_update_script_button"); undo_redo->add_undo_method(this, "_update_script_button"); - undo_redo->commit_action(); - } else { - undo_redo->create_action(TTR("Attach Script"), UndoRedo::MERGE_DISABLE, selected.front()->get()); - for (Node *E : selected) { - Ref<Script> existing = E->get_script(); - undo_redo->add_do_method(InspectorDock::get_singleton(), "store_script_properties", E); - undo_redo->add_undo_method(InspectorDock::get_singleton(), "store_script_properties", E); - undo_redo->add_do_method(E, "set_script", p_script); - undo_redo->add_undo_method(E, "set_script", existing); - undo_redo->add_do_method(InspectorDock::get_singleton(), "apply_script_properties", E); - undo_redo->add_undo_method(InspectorDock::get_singleton(), "apply_script_properties", E); - undo_redo->add_do_method(this, "_update_script_button"); - undo_redo->add_undo_method(this, "_update_script_button"); - } - undo_redo->commit_action(); } + undo_redo->commit_action(); - _push_item(p_script.operator->()); + _push_item(p_script.ptr()); _update_script_button(); } diff --git a/editor/scene_tree_editor.cpp b/editor/scene_tree_editor.cpp index 092ef30678..30a9dc5bbf 100644 --- a/editor/scene_tree_editor.cpp +++ b/editor/scene_tree_editor.cpp @@ -132,8 +132,16 @@ void SceneTreeEditor::_cell_button_pressed(Object *p_item, int p_column, int p_i if (config_err.is_empty()) { return; } - config_err = config_err.word_wrap(80); - warning->set_text(config_err); + + const PackedInt32Array boundaries = TS->string_get_word_breaks(config_err, "", 80); + PackedStringArray lines; + for (int i = 0; i < boundaries.size(); i += 2) { + const int start = boundaries[i]; + const int end = boundaries[i + 1]; + lines.append(config_err.substr(start, end - start + 1)); + } + + warning->set_text(String("\n").join(lines)); warning->popup_centered(); } else if (p_id == BUTTON_SIGNALS) { diff --git a/editor/translations/af.po b/editor/translations/af.po index 8ada9c3379..a705eb58fb 100644 --- a/editor/translations/af.po +++ b/editor/translations/af.po @@ -13115,9 +13115,10 @@ msgstr "EnkelHouer" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14517,13 +14518,13 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "" +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Kan nie '%s' oopmaak nie." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -23582,6 +23583,15 @@ msgstr "Fout terwyl laai:" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Skep Vouer" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/ar.po b/editor/translations/ar.po index adaef249f8..204dd9a41b 100644 --- a/editor/translations/ar.po +++ b/editor/translations/ar.po @@ -69,13 +69,14 @@ # عبد الرØÙ…Ù† أبو سعدة ||Abd Alrahman abo saada <abdalrahmanabs2005@gmail.com>, 2022. # xX-Void-Xx <arandomdude75@gmail.com>, 2022. # Ø£ØÙ…د النور <ahmed2699@gmail.com>, 2022. +# Commander Gordon <gordoncommander@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-08 07:39+0000\n" -"Last-Translator: Ø£ØÙ…د النور <ahmed2699@gmail.com>\n" +"PO-Revision-Date: 2022-10-29 23:55+0000\n" +"Last-Translator: Commander Gordon <gordoncommander@gmail.com>\n" "Language-Team: Arabic <https://hosted.weblate.org/projects/godot-engine/" "godot/ar/>\n" "Language: ar\n" @@ -84,7 +85,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=6; plural=n==0 ? 0 : n==1 ? 1 : n==2 ? 2 : n%100>=3 " "&& n%100<=10 ? 3 : n%100>=11 ? 4 : 5;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.14.2-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -524,7 +525,7 @@ msgstr "السرعة" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: scene/3d/sprite_3d.cpp msgid "Axis" -msgstr "Ù…ØØ§ÙˆØ±" +msgstr "Ù…ØÙˆØ±" #: core/os/input_event.cpp msgid "Axis Value" @@ -714,9 +715,8 @@ msgid "Version Control Autoload On Startup" msgstr "التØÙ…يل التلقائي للتØÙƒÙ… ÙÙŠ الإصدار عند بدء التشغيل" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "إدارة الإصدارات (Version Control)" +msgstr "اسم مدير اصدار Ø§Ù„Ø§Ø¶Ø§ÙØ©" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -797,9 +797,8 @@ msgid "3D" msgstr "ثلاثي الأبعاد 3D" #: core/project_settings.cpp -#, fuzzy msgid "Smooth Trimesh Collision" -msgstr "إنشاء متصادم تراميش قريب" +msgstr "إنشاء متصادم ترام" #: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles2/rasterizer_scene_gles2.cpp @@ -1194,7 +1193,7 @@ msgstr "توطين" #: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp #, fuzzy msgid "Rotation" -msgstr "خطوة الدوران:" +msgstr "خطوة الدوران" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp @@ -1204,7 +1203,7 @@ msgstr "قيمة" #: editor/animation_track_editor.cpp #, fuzzy msgid "Arg Count" -msgstr "الكمية:" +msgstr "الكمية" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp @@ -1238,12 +1237,12 @@ msgstr "المجرى (Stream)" #: editor/animation_track_editor.cpp #, fuzzy msgid "Start Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: editor/animation_track_editor.cpp #, fuzzy msgid "End Offset" -msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„:" +msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1373,7 +1372,7 @@ msgstr "الوقت(ثواني):" #: editor/animation_track_editor.cpp #, fuzzy msgid "Position:" -msgstr "مكان الرصيÙ" +msgstr "مكان الرصيÙ:" #: editor/animation_track_editor.cpp #, fuzzy @@ -1397,27 +1396,27 @@ msgstr "نوع:" #: editor/animation_track_editor.cpp #, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "إدارة قوالب التصدير:" +msgstr "إدارة قوالب التصدير" #: editor/animation_track_editor.cpp #, fuzzy msgid "Easing:" -msgstr "تسارع بعد بداية بطيئة" +msgstr "تسارع بعد بداية بطيئة:" #: editor/animation_track_editor.cpp #, fuzzy msgid "In-Handle:" -msgstr "ØØ¯Ø¯ المعامل" +msgstr "ØØ¯Ø¯ المعامل:" #: editor/animation_track_editor.cpp #, fuzzy msgid "Out-Handle:" -msgstr "ØØ¯Ø¯ المعامل" +msgstr "ØØ¯Ø¯ المعامل:" #: editor/animation_track_editor.cpp #, fuzzy msgid "Stream:" -msgstr "عنصر Ø®Ùيار" +msgstr "عنصر Ø®Ùيار:" #: editor/animation_track_editor.cpp #, fuzzy @@ -2613,7 +2612,7 @@ msgstr "لا يوجد مل٠'%s'." #: editor/editor_audio_buses.cpp #, fuzzy msgid "Layout:" -msgstr "المخطط" +msgstr "المخطط:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2821,7 +2820,7 @@ msgstr "تصدير المشروع لمنصة:" #: editor/editor_export.cpp #, fuzzy msgid "Completed with warnings." -msgstr "نسخ مسار العÙقدة" +msgstr "نسخ مسار العÙقدة." #: editor/editor_export.cpp #, fuzzy @@ -2831,7 +2830,7 @@ msgstr "اكتمل بنجاØ." #: editor/editor_export.cpp #, fuzzy msgid "Failed." -msgstr "ÙØ´Ù„:" +msgstr "ÙØ´Ù„." #: editor/editor_export.cpp msgid "Storing File:" @@ -2858,12 +2857,12 @@ msgstr "لا يمكن إنشاء المجلد." #: editor/editor_export.cpp #, fuzzy msgid "Failed to export project files." -msgstr "لم نتمكن من تصدير Ù…Ù„ÙØ§Øª المشروع" +msgstr "لم نتمكن من تصدير Ù…Ù„ÙØ§Øª المشروع." #: editor/editor_export.cpp #, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "لا يمكن ÙØªØ المل٠للكتابة:" +msgstr "لا يمكن ÙØªØ المل٠للكتابة." #: editor/editor_export.cpp #, fuzzy @@ -2998,17 +2997,17 @@ msgstr "إدارة القوالب" #: editor/editor_export.cpp platform/osx/export/export.cpp #, fuzzy msgid "The given export path doesn't exist." -msgstr "مسار التصدير Ø§Ù„Ù…ÙØ²ÙˆØ¯ غير موجود:" +msgstr "مسار التصدير Ø§Ù„Ù…ÙØ²ÙˆØ¯ غير موجود." #: editor/editor_export.cpp platform/javascript/export/export.cpp #, fuzzy msgid "Template file not found: \"%s\"." -msgstr "مل٠النموذج غير موجود:" +msgstr "مل٠النموذج غير موجود: ." #: editor/editor_export.cpp #, fuzzy msgid "Failed to copy export template." -msgstr "إدارة قوالب التصدير:" +msgstr "إدارة قوالب التصدير." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp @@ -3304,7 +3303,7 @@ msgstr "الوصول (للملÙ)" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #, fuzzy msgid "Display Mode" -msgstr "وضع التشغيل:" +msgstr "وضع التشغيل" #: editor/editor_file_dialog.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -3324,17 +3323,17 @@ msgstr "وضع Ø§Ù„Ø³ØØ¨" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Current Dir" -msgstr "Ø§Ù„ØØ§Ù„ÙŠ:" +msgstr "Ø§Ù„ØØ§Ù„ÙŠ" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Current File" -msgstr "المل٠(النسخة) Ø§Ù„ØØ§Ù„ية:" +msgstr "المل٠(النسخة) Ø§Ù„ØØ§Ù„ية" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Current Path" -msgstr "Ø§Ù„ØØ§Ù„ÙŠ:" +msgstr "Ø§Ù„ØØ§Ù„ÙŠ" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #: scene/gui/file_dialog.cpp @@ -3661,7 +3660,7 @@ msgstr "عنصر Ù…ÙÙØ¹Ù„" #: editor/editor_inspector.cpp #, fuzzy msgid "Draw Red" -msgstr "استدعاءات الرسم:" +msgstr "استدعاءات الرسم" #: editor/editor_inspector.cpp #, fuzzy @@ -4429,7 +4428,7 @@ msgstr "Ù…ÙØªÙØØµ" #: editor/editor_node.cpp #, fuzzy msgid "Default Property Name Style" -msgstr "مسار المشروع:" +msgstr "مسار المشروع" #: editor/editor_node.cpp msgid "Default Float Step" @@ -5278,7 +5277,7 @@ msgstr "ÙØªØ الكود البرمجي" #: editor/editor_resource_picker.cpp #, fuzzy msgid "Script Owner" -msgstr "اسم النص البرمجي:" +msgstr "اسم النص البرمجي" #: editor/editor_run_native.cpp msgid "" @@ -5454,12 +5453,12 @@ msgstr "الاتجاهات" #: editor/editor_settings.cpp #, fuzzy msgid "Autoscan Project Path" -msgstr "مسار المشروع:" +msgstr "مسار المشروع" #: editor/editor_settings.cpp #, fuzzy msgid "Default Project Path" -msgstr "مسار المشروع:" +msgstr "مسار المشروع" #: editor/editor_settings.cpp msgid "On Save" @@ -5482,7 +5481,7 @@ msgstr "Ù†Ø§ÙØ°Ø© XForm" #: editor/editor_settings.cpp #, fuzzy msgid "Thumbnail Size" -msgstr "الصورة المصغرة..." +msgstr "الصورة المصغرة" #: editor/editor_settings.cpp msgid "Docks" @@ -5612,12 +5611,12 @@ msgstr "المظهر" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Show Line Numbers" -msgstr "اضهار رقم الخط" +msgstr "اظهار رقم الخط" #: editor/editor_settings.cpp #, fuzzy msgid "Line Numbers Zero Padded" -msgstr "رقم الخط:" +msgstr "رقم الخط" #: editor/editor_settings.cpp msgid "Show Bookmark Gutter" @@ -5837,12 +5836,12 @@ msgstr "شكل" #: editor/editor_settings.cpp #, fuzzy msgid "Primary Grid Steps" -msgstr "خطوة الشبكة:" +msgstr "خطوة الشبكة" #: editor/editor_settings.cpp #, fuzzy msgid "Grid Size" -msgstr "خطوة الشبكة:" +msgstr "خطوة الشبكة" #: editor/editor_settings.cpp msgid "Grid Division Level Max" @@ -6027,7 +6026,7 @@ msgstr "إعادة تسمية عنصر اللون" #: editor/editor_settings.cpp #, fuzzy msgid "Bone Selected Color" -msgstr "عدل على Ø§Ù„ØØ³Ø§Ø¨ Ø§Ù„ØØ§Ù„ÙŠ:" +msgstr "عدل على Ø§Ù„ØØ³Ø§Ø¨ Ø§Ù„ØØ§Ù„ÙŠ" #: editor/editor_settings.cpp msgid "Bone IK Color" @@ -6040,7 +6039,7 @@ msgstr "لون ØØ¯ÙˆØ¯ العظام" #: editor/editor_settings.cpp #, fuzzy msgid "Bone Outline Size" -msgstr "ØØ¬Ù… الخطوط:" +msgstr "ØØ¬Ù… الخطوط" #: editor/editor_settings.cpp msgid "Viewport Border Color" @@ -6061,7 +6060,7 @@ msgstr "التمرير Ù„Ù„ØªØØ±ÙŠÙƒ" #: editor/editor_settings.cpp #, fuzzy msgid "Pan Speed" -msgstr "السرعة:" +msgstr "السرعة" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp #, fuzzy @@ -6136,7 +6135,7 @@ msgstr "الاقتطاع التلقائي" #: editor/editor_settings.cpp #, fuzzy msgid "Save Before Running" -msgstr "اØÙظ المشهد قبل التشغيل..." +msgstr "اØÙظ المشهد قبل التشغيل" #: editor/editor_settings.cpp #, fuzzy @@ -6182,7 +6181,7 @@ msgstr "مدير المشروع" #: editor/editor_settings.cpp #, fuzzy msgid "Sorting Order" -msgstr "إعادة تسمية مجلد:" +msgstr "إعادة تسمية مجلد" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Symbol Color" @@ -6216,19 +6215,19 @@ msgstr "لون التعليق" #: editor/editor_settings.cpp #, fuzzy msgid "String Color" -msgstr "تخزين الملÙ:" +msgstr "تخزين الملÙ" #: editor/editor_settings.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Background Color" -msgstr "لون خلÙية غير صالØ." +msgstr "لون خلÙية غير صالØ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Completion Background Color" -msgstr "لون خلÙية غير صالØ." +msgstr "لون خلÙية غير صالØ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6255,12 +6254,12 @@ msgstr "الطابق التالي" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Line Number Color" -msgstr "رقم الخط:" +msgstr "رقم الخط" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Safe Line Number Color" -msgstr "رقم الخط:" +msgstr "رقم الخط" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" @@ -6269,7 +6268,7 @@ msgstr "لون علامة Ø§Ù„Ø¥Ù‚ØØ§Ù…" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Caret Background Color" -msgstr "لون خلÙية غير صالØ." +msgstr "لون خلÙية غير صالØ" #: editor/editor_settings.cpp #, fuzzy @@ -7047,7 +7046,7 @@ msgstr "Ù…ØØ¯Ø¯" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy msgid "ColorCorrect" -msgstr "Ø§Ù„ÙˆØ¸ÙŠÙØ© البرمجية للون." +msgstr "Ø§Ù„ÙˆØ¸ÙŠÙØ© البرمجية للون" #: editor/import/resource_importer_layered_texture.cpp msgid "No BPTC If RGB" @@ -7072,7 +7071,7 @@ msgstr "كرر" #: scene/gui/control.cpp #, fuzzy msgid "Filter" -msgstr "Ù…Ø±Ø´ØØ§Øª:" +msgstr "Ù…Ø±Ø´ØØ§Øª" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp @@ -7101,7 +7100,7 @@ msgstr "الاقتطاع التلقائي" #: scene/resources/style_box.cpp #, fuzzy msgid "Horizontal" -msgstr "عَرضياً:" +msgstr "عَرضياً" #: editor/import/resource_importer_layered_texture.cpp #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp @@ -7109,7 +7108,7 @@ msgstr "عَرضياً:" #: scene/resources/style_box.cpp #, fuzzy msgid "Vertical" -msgstr "شاقولياً:" +msgstr "شاقولياً" #: editor/import/resource_importer_obj.cpp #, fuzzy @@ -7124,7 +7123,7 @@ msgstr "وضع Ø§Ù„ØªØØ¬ÙŠÙ…" #: editor/import/resource_importer_obj.cpp #, fuzzy msgid "Offset Mesh" -msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„:" +msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„" #: editor/import/resource_importer_obj.cpp #: editor/import/resource_importer_scene.cpp @@ -7205,7 +7204,7 @@ msgstr "قص العÙقد" #: editor/import/resource_importer_scene.cpp scene/resources/texture.cpp #, fuzzy msgid "Storage" -msgstr "تخزين الملÙ:" +msgstr "تخزين الملÙ" #: editor/import/resource_importer_scene.cpp msgid "Use Legacy Names" @@ -7214,7 +7213,7 @@ msgstr "استخدم الأسماء القديمة" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp #, fuzzy msgid "Materials" -msgstr "تغيرات المادة:" +msgstr "تغيرات المادة" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7294,12 +7293,12 @@ msgstr "ØªÙØ¹ÙŠÙ„" #: editor/import/resource_importer_scene.cpp #, fuzzy msgid "Max Linear Error" -msgstr "أقصي أخطاء خطية:" +msgstr "أقصي أخطاء خطية" #: editor/import/resource_importer_scene.cpp #, fuzzy msgid "Max Angular Error" -msgstr "أقصي أخطاء زواية:" +msgstr "أقصي أخطاء زواية" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7321,7 +7320,7 @@ msgstr "مقاطع الرسوم Ø§Ù„Ù…ØªØØ±ÙƒØ©" #: scene/3d/particles.cpp scene/resources/environment.cpp #, fuzzy msgid "Amount" -msgstr "الكمية:" +msgstr "الكمية" #: editor/import/resource_importer_scene.cpp #: editor/plugins/mesh_library_editor_plugin.cpp @@ -7435,7 +7434,7 @@ msgstr "رأس" #: editor/import/resource_importer_texture.cpp #, fuzzy msgid "Normal Map Invert Y" -msgstr "ØØ¬Ù… عشوائي:" +msgstr "ØØ¬Ù… عشوائي" #: editor/import/resource_importer_texture.cpp msgid "Size Limit" @@ -7461,12 +7460,12 @@ msgstr "" #: editor/import/resource_importer_texture_atlas.cpp #, fuzzy msgid "Atlas File" -msgstr "ØØ¬Ù… الخطوط:" +msgstr "ØØ¬Ù… الخطوط" #: editor/import/resource_importer_texture_atlas.cpp #, fuzzy msgid "Import Mode" -msgstr "وضع التصدير:" +msgstr "وضع التصدير" #: editor/import/resource_importer_texture_atlas.cpp #, fuzzy @@ -7603,7 +7602,7 @@ msgstr "ÙØ´Ù„ تØÙ…يل المورد." #: editor/inspector_dock.cpp #, fuzzy msgid "Property Name Style" -msgstr "اسم المشروع:" +msgstr "اسم المشروع" #: editor/inspector_dock.cpp scene/gui/color_picker.cpp msgid "Raw" @@ -8627,7 +8626,7 @@ msgstr "خطأ ÙÙŠ التØÙ…يل" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy msgid "Available URLs" -msgstr "Ø§Ù„Ù…Ù„ÙØ§Øª Ø§Ù„Ù…ØªÙˆØ§ÙØ±Ø©:" +msgstr "Ø§Ù„Ù…Ù„ÙØ§Øª Ø§Ù„Ù…ØªÙˆØ§ÙØ±Ø©" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -8763,7 +8762,9 @@ msgstr "لا يمكن انشاء خرائط الضوء, تاكد من ان ال٠#: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed determining lightmap size. Maximum lightmap size too small?" -msgstr "ÙØ´Ù„ ØªØØ¯ÙŠØ¯ ØØ¬Ù… الخريطة الضوئية. Ø§Ù„ØØ¬Ù… الأقصى للخريطة المضيئة صغير جدًا؟" +msgstr "" +"ÙØ´Ù„ ØªØØ¯ÙŠØ¯ ØØ¬Ù… الخريطة الضوئية (lightmap). هل Ø§Ù„ØØ¬Ù… الأقصى للخريطة الضوئية " +"صغير جدًا؟" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -9688,7 +9689,7 @@ msgstr "بطاقة تعريÙ" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Separator" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -10839,7 +10840,7 @@ msgstr "" #: editor/plugins/script_editor_plugin.cpp #, fuzzy msgid "Current Script Background Color" -msgstr "لون خلÙية غير صالØ." +msgstr "لون خلÙية غير صالØ" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -10854,7 +10855,7 @@ msgstr "إنشاء نص برمجي" #: editor/plugins/script_editor_plugin.cpp #, fuzzy msgid "List Script Names As" -msgstr "اسم النص البرمجي:" +msgstr "اسم النص البرمجي" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" @@ -13036,12 +13037,13 @@ msgstr "إعدادت Ø§Ù„Ù…ØØ§Ø°Ø§Ø©" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" -msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„:" +msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„" #: editor/plugins/tile_set_editor_plugin.cpp editor/rename_dialog.cpp #: scene/gui/range.cpp scene/resources/animation.cpp @@ -13054,7 +13056,7 @@ msgstr "الخطوة" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Separation" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13075,14 +13077,14 @@ msgstr "نص" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Tex Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp #: scene/3d/mesh_instance.cpp scene/resources/primitive_meshes.cpp #, fuzzy msgid "Material" -msgstr "تغيرات المادة:" +msgstr "تغيرات المادة" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp @@ -13103,7 +13105,7 @@ msgstr "وضع قناع-Ø§Ù„Ø¨ÙØª" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Subtile Size" -msgstr "ØØ¬Ù… الخطوط:" +msgstr "ØØ¬Ù… الخطوط" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13123,7 +13125,7 @@ msgstr "وضع التنقل" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy msgid "Shape Offset" -msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„:" +msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -13242,7 +13244,7 @@ msgstr "أختر مسار Ø§Ù„Ù…ÙØªØ§Ø الخاص Ù„SSH" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "كلمة مرور SSH" +msgstr "كلمة المرور Ù„(SSH)" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" @@ -14395,12 +14397,12 @@ msgstr "ØªØØ±ÙŠÙƒ إلي..." #: editor/project_export.cpp #, fuzzy msgid "Export PCK/Zip..." -msgstr "تصدير PCK/ مل٠مضغوط Zip" +msgstr "تصدير PCK/ مل٠مضغوط Zip..." #: editor/project_export.cpp #, fuzzy msgid "Export Project..." -msgstr "تصدير المشروع" +msgstr "تصدير المشروع..." #: editor/project_export.cpp msgid "Export All" @@ -14409,12 +14411,12 @@ msgstr "تصدير الكÙÙ„" #: editor/project_export.cpp #, fuzzy msgid "Choose an export mode:" -msgstr "من ÙØ¶Ù„Ùƒ اختر Ù…ÙØ¬Ù„داً ÙØ§Ø±ØºØ§Ù‹." +msgstr "من ÙØ¶Ù„Ùƒ اختر Ù…ÙØ¬Ù„داً ÙØ§Ø±ØºØ§Ù‹:" #: editor/project_export.cpp #, fuzzy msgid "Export All..." -msgstr "تصدير الكÙÙ„" +msgstr "تصدير الكÙÙ„..." #: editor/project_export.cpp editor/project_manager.cpp msgid "ZIP File" @@ -14497,15 +14499,16 @@ msgid "Invalid project path (changed anything?)." msgstr "مسار مشروع غير ØµØ§Ù„Ø (أعدلت شيء؟)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "لم يتم تØÙ…يل project.godot من مسار المشروع (خطأ %d). قد يكون Ù…Ùقوداً أو ØªØ§Ù„ÙØ§Ù‹." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "لا قدرة على ØªØØ±ÙŠØ± project.godot ÙÙŠ مسار المشروع." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "لا يمكن ÙØªØ المشروع ÙÙŠ '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -15541,7 +15544,7 @@ msgstr "اجعله Ù…ØÙ„ياً" #: editor/scene_tree_dock.cpp #, fuzzy msgid "Enable Scene Unique Name(s)" -msgstr "إسم العقدة:" +msgstr "إسم العقدة" #: editor/scene_tree_dock.cpp #, fuzzy @@ -15551,7 +15554,7 @@ msgstr "لقد تم استخدام هذا الاسم ÙÙŠ ÙˆØ¸ÙŠÙØ© Ø¨Ø±Ù…Ø¬ÙŠØ #: editor/scene_tree_dock.cpp #, fuzzy msgid "Disable Scene Unique Name(s)" -msgstr "إسم العقدة:" +msgstr "إسم العقدة" #: editor/scene_tree_dock.cpp msgid "New Scene Root" @@ -15752,7 +15755,7 @@ msgstr "مجموعة الأزرار" #: editor/scene_tree_editor.cpp #, fuzzy msgid "Disable Scene Unique Name" -msgstr "إسم العقدة:" +msgstr "إسم العقدة" #: editor/scene_tree_editor.cpp msgid "(Connecting From)" @@ -16634,7 +16637,7 @@ msgstr "Ø§Ù„ØØ¬Ù… الكامل" #: main/main.cpp scene/resources/dynamic_font.cpp #, fuzzy msgid "Use Filter" -msgstr "تصÙية:" +msgstr "تصÙية" #: main/main.cpp scene/resources/style_box.cpp #, fuzzy @@ -16683,7 +16686,7 @@ msgstr "" #: main/main.cpp #, fuzzy msgid "Tooltip Position Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الدوران:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الدوران" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #, fuzzy @@ -16698,7 +16701,7 @@ msgstr "Ù…ÙÙ†Ù‚Ø Ø§Ù„Ø£Ø®Ø·Ø§Ø¡" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #, fuzzy msgid "Wait Timeout" -msgstr "انتهت المهلة." +msgstr "انتهت المهلة" #: main/main.cpp msgid "Runtime" @@ -16808,12 +16811,12 @@ msgstr "اقلب الوجوه" #: scene/resources/sphere_shape.cpp #, fuzzy msgid "Radius" -msgstr "نص٠القطر:" +msgstr "نص٠القطر" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp #, fuzzy msgid "Radial Segments" -msgstr "معاملات المشهد الرئيس:" +msgstr "معاملات المشهد الرئيس" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp msgid "Rings" @@ -16878,7 +16881,7 @@ msgstr "" #: modules/csg/csg_shape.cpp #, fuzzy msgid "Path Rotation" -msgstr "دوران عشوائي:" +msgstr "دوران عشوائي" #: modules/csg/csg_shape.cpp #, fuzzy @@ -16897,7 +16900,7 @@ msgstr "المسار المØÙ„ÙŠ" #: modules/csg/csg_shape.cpp #, fuzzy msgid "Path Joined" -msgstr "دوران عشوائي:" +msgstr "دوران عشوائي" #: modules/enet/networked_multiplayer_enet.cpp msgid "Compression Mode" @@ -17020,12 +17023,12 @@ msgstr "مكتبات:" #: modules/gdnative/nativescript/nativescript.cpp #, fuzzy msgid "Class Name" -msgstr "اسم Ø§Ù„ÙØ¦Ø©:" +msgstr "اسم Ø§Ù„ÙØ¦Ø©" #: modules/gdnative/nativescript/nativescript.cpp #, fuzzy msgid "Script Class" -msgstr "اسم النص البرمجي:" +msgstr "اسم النص البرمجي" #: modules/gdnative/nativescript/nativescript.cpp msgid "Icon Path" @@ -17134,7 +17137,7 @@ msgstr "الواجهة View الخلÙية" #: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp #, fuzzy msgid "Byte Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: modules/gltf/gltf_accessor.cpp msgid "Component Type" @@ -17147,7 +17150,7 @@ msgstr "" #: modules/gltf/gltf_accessor.cpp #, fuzzy msgid "Count" -msgstr "الكمية:" +msgstr "الكمية" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp msgid "Min" @@ -17173,7 +17176,7 @@ msgstr "" #: modules/gltf/gltf_accessor.cpp #, fuzzy msgid "Sparse Indices Component Type" -msgstr "توزيع الأشكال الهندسية..." +msgstr "توزيع الأشكال الهندسية" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Buffer View" @@ -17252,7 +17255,7 @@ msgstr "طبخ (إعداد) خرائط الضوء" #: modules/gltf/gltf_mesh.cpp #, fuzzy msgid "Instance Materials" -msgstr "تغيرات المادة:" +msgstr "تغيرات المادة" #: modules/gltf/gltf_node.cpp scene/3d/skeleton.cpp msgid "Parent" @@ -17808,7 +17811,7 @@ msgstr "ضوضاء" #: modules/opensimplex/noise_texture.cpp #, fuzzy msgid "Noise Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: modules/opensimplex/open_simplex_noise.cpp msgid "Octaves" @@ -18363,7 +18366,7 @@ msgstr "اعادة التعيين Ù„Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠØ§Øª" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy msgid "Validate" -msgstr "Ø§Ù„Ø£ØØ±Ù Ø§Ù„ØµØ§Ù„ØØ©:" +msgstr "Ø§Ù„Ø£ØØ±Ù Ø§Ù„ØµØ§Ù„ØØ©" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -18457,7 +18460,7 @@ msgstr "تغيير ØØ¬Ù… المصÙÙˆÙØ©" #: scene/resources/visual_shader_nodes.cpp #, fuzzy msgid "Operator" -msgstr "Ù…ÙØ´ØºÙ„ التراكم." +msgstr "Ù…ÙØ´ØºÙ„ التراكم" #: modules/visual_script/visual_script_nodes.cpp msgid "Invalid argument of type:" @@ -18703,7 +18706,7 @@ msgstr "إخلاء سلسلة IK" #: modules/websocket/websocket_server.cpp #, fuzzy msgid "Handshake Timeout" -msgstr "انتهت المهلة." +msgstr "انتهت المهلة" #: modules/webxr/webxr_interface.cpp #, fuzzy @@ -18713,12 +18716,12 @@ msgstr "وضع الأقليم" #: modules/webxr/webxr_interface.cpp #, fuzzy msgid "Required Features" -msgstr "المزايا الرئيسية:" +msgstr "المزايا الرئيسية" #: modules/webxr/webxr_interface.cpp #, fuzzy msgid "Optional Features" -msgstr "المزايا الرئيسية:" +msgstr "المزايا الرئيسية" #: modules/webxr/webxr_interface.cpp msgid "Requested Reference Space Types" @@ -18825,7 +18828,7 @@ msgstr "مسار التصدير" #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Min SDK" -msgstr "ØØ¬Ù… الخطوط:" +msgstr "ØØ¬Ù… الخطوط" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18883,7 +18886,7 @@ msgstr "ÙŠÙŽØØ²Ù…\"ينتج المل٠المضغوط\"" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp #, fuzzy msgid "Unique Name" -msgstr "إسم العقدة:" +msgstr "إسم العقدة" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18893,7 +18896,7 @@ msgstr "الإشاراة" #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Classify As Game" -msgstr "اسم Ø§Ù„ÙØ¦Ø©:" +msgstr "اسم Ø§Ù„ÙØ¦Ø©" #: platform/android/export/export_plugin.cpp msgid "Retain Data On Uninstall" @@ -18907,7 +18910,7 @@ msgstr "ØØ°Ù العÙقد" #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Graphics" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18979,7 +18982,7 @@ msgstr "المجتمع" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp #, fuzzy msgid "Extra Args" -msgstr "وسائط إستدعاء إضاÙية :" +msgstr "وسائط إستدعاء إضاÙية" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19283,7 +19286,7 @@ msgstr "" msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." msgstr "" -"تعذرت كتابة overwrite Ù…Ù„ÙØ§Øª res://android/build/res/*.xml مع اسم المشروع" +"تعذرت كتابة overwrite Ù…Ù„ÙØ§Øª res://android/build/res/*.xml مع اسم المشروع." #: platform/android/export/export_plugin.cpp msgid "Could not export project files to gradle project." @@ -19318,7 +19321,7 @@ msgstr "تعذر نسخ وإعادة تسمية المل٠المصدر، تÙÙ‚ #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Package not found: \"%s\"." -msgstr "لم يتم إيجاد الرسم Ø§Ù„Ù…ØªØØ±Ùƒ: '%s'" +msgstr "لم يتم إيجاد الرسم Ø§Ù„Ù…ØªØØ±Ùƒ: '%s'." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19347,7 +19350,7 @@ msgstr "Ø¥Ø¶Ø§ÙØ© %s..." #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Could not export project files." -msgstr "لم نتمكن من تصدير Ù…Ù„ÙØ§Øª المشروع" +msgstr "لم نتمكن من تصدير Ù…Ù„ÙØ§Øª المشروع." #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19445,7 +19448,7 @@ msgstr "" #: platform/iphone/export/export.cpp #, fuzzy msgid "Export Method Release" -msgstr "وضع التصدير:" +msgstr "وضع التصدير" #: platform/iphone/export/export.cpp msgid "Targeted Device Family" @@ -19458,7 +19461,7 @@ msgstr "" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #, fuzzy msgid "Identifier" -msgstr "Ù…ÙØØ¯Ø¯ غير صالØ:" +msgstr "Ù…ÙØØ¯Ø¯ غير صالØ" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19488,7 +19491,7 @@ msgstr "الوصول للواي-ÙØ§ÙŠ" #: platform/iphone/export/export.cpp #, fuzzy msgid "Push Notifications" -msgstr "دوران عشوائي:" +msgstr "دوران عشوائي" #: platform/iphone/export/export.cpp #, fuzzy @@ -19629,17 +19632,17 @@ msgstr "شغل مل٠HTML Ø§Ù„Ù…ÙØµØ¯Ø± ÙÙŠ Ø§Ù„Ù…ØªØµÙØ Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠ #: platform/javascript/export/export.cpp #, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "لا يمكن ÙØªØ القالب من أجل التصدير:" +msgstr "لا يمكن ÙØªØ القالب من أجل التصدير: ." #: platform/javascript/export/export.cpp #, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "إدارة قوالب التصدير:" +msgstr "إدارة قوالب التصدير: ." #: platform/javascript/export/export.cpp #, fuzzy msgid "Could not write file: \"%s\"." -msgstr "لا يمكن كتابة الملÙ:" +msgstr "لا يمكن كتابة الملÙ: ." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19649,7 +19652,7 @@ msgstr "ØªØØ¯ÙŠØ¯ الهامش" #: platform/javascript/export/export.cpp #, fuzzy msgid "Could not read file: \"%s\"." -msgstr "لا يمكن كتابة الملÙ:" +msgstr "لا يمكن كتابة الملÙ: ." #: platform/javascript/export/export.cpp msgid "PWA" @@ -19658,7 +19661,7 @@ msgstr "" #: platform/javascript/export/export.cpp #, fuzzy msgid "Variant" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: platform/javascript/export/export.cpp #, fuzzy @@ -19732,17 +19735,17 @@ msgstr "" #: platform/javascript/export/export.cpp #, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "لا يمكن قراءة مل٠HTML مخصص:" +msgstr "لا يمكن قراءة مل٠HTML مخصص: ." #: platform/javascript/export/export.cpp #, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "لا يمكن إنشاء مجلد خادم ال HTTP:" +msgstr "لا يمكن إنشاء مجلد خادم ال HTTP: ." #: platform/javascript/export/export.cpp #, fuzzy msgid "Error starting HTTP server: %d." -msgstr "خطأ ÙÙŠ بدء تشغيل خادم HTTP:" +msgstr "خطأ ÙÙŠ بدء تشغيل خادم HTTP: ." #: platform/javascript/export/export.cpp msgid "Web" @@ -19848,7 +19851,7 @@ msgstr "" #: platform/osx/export/export.cpp #, fuzzy msgid "App Category" -msgstr "Ø§Ù„ÙØ¦Ø©:" +msgstr "Ø§Ù„ÙØ¦Ø©" #: platform/osx/export/export.cpp msgid "High Res" @@ -20044,7 +20047,7 @@ msgstr "" #: platform/osx/export/export.cpp #, fuzzy msgid "Could not open icon file \"%s\"." -msgstr "لم نتمكن من تصدير Ù…Ù„ÙØ§Øª المشروع" +msgstr "لم نتمكن من تصدير Ù…Ù„ÙØ§Øª المشروع." #: platform/osx/export/export.cpp msgid "Could not start xcrun executable." @@ -20053,7 +20056,7 @@ msgstr "تعذر بدء تشغيل xcrun." #: platform/osx/export/export.cpp #, fuzzy msgid "Notarization failed." -msgstr "توطين" +msgstr "توطين." #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" @@ -20108,7 +20111,7 @@ msgstr "لم توجد ايقونات." #: platform/osx/export/export.cpp #, fuzzy msgid "Cannot sign file %s." -msgstr "خطأ ÙÙŠ تØÙ…يل الملÙ: %s" +msgstr "خطأ ÙÙŠ تØÙ…يل المل٠%s." #: platform/osx/export/export.cpp msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" @@ -20139,12 +20142,12 @@ msgstr "ينشئ الصورة المصغرة" #: platform/osx/export/export.cpp #, fuzzy msgid "Could not find template app to export: \"%s\"." -msgstr "لم يتم إيجاد قالب التطبيق (Template app) للتصدير:" +msgstr "لم يتم إيجاد قالب التطبيق (Template app) للتصدير: ." #: platform/osx/export/export.cpp #, fuzzy msgid "Invalid export format." -msgstr "إدارة قوالب التصدير:" +msgstr "إدارة قوالب التصدير." #: platform/osx/export/export.cpp msgid "" @@ -20331,7 +20334,7 @@ msgstr "إظهار الكل" #: platform/uwp/export/export.cpp #, fuzzy msgid "Short Name" -msgstr "اسم النص البرمجي:" +msgstr "اسم النص البرمجي" #: platform/uwp/export/export.cpp msgid "Publisher" @@ -20340,12 +20343,12 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy msgid "Publisher Display Name" -msgstr "اسم الناشر المعروض Ù„Ù„Ø±ÙØ²Ù…Ø© غير صالØ." +msgstr "اسم الناشر المعروض Ù„Ù„Ø±ÙØ²Ù…Ø© غير صالØ" #: platform/uwp/export/export.cpp #, fuzzy msgid "Product GUID" -msgstr "Ù…ÙØ¹Ø±Ù GUID (Ø§Ù„Ù…ÙØ¹Ø±Ù‘Ù Ø§Ù„ÙØ±ÙŠØ¯ العالمي) للمنتج غير صالØ." +msgstr "Ù…ÙØ¹Ø±Ù GUID (Ø§Ù„Ù…ÙØ¹Ø±Ù‘Ù Ø§Ù„ÙØ±ÙŠØ¯ العالمي) للمنتج غير صالØ" #: platform/uwp/export/export.cpp #, fuzzy @@ -20360,7 +20363,7 @@ msgstr "الإشاراة" #: platform/uwp/export/export.cpp #, fuzzy msgid "Certificate" -msgstr "القمم:" +msgstr "القمم" #: platform/uwp/export/export.cpp #, fuzzy @@ -20387,7 +20390,7 @@ msgstr "ØªØØ¯ÙŠØ¯ التعبير" #: platform/uwp/export/export.cpp msgid "Landscape" -msgstr "" +msgstr "بشكل اÙقي (Landscape)" #: platform/uwp/export/export.cpp #, fuzzy @@ -20430,7 +20433,7 @@ msgstr "" #: platform/uwp/export/export.cpp #, fuzzy msgid "Splash Screen" -msgstr "استدعاءات الرسم:" +msgstr "استدعاءات الرسم" #: platform/uwp/export/export.cpp #, fuzzy @@ -20528,7 +20531,7 @@ msgstr "Ù…ÙÙ†Ù‚Ø Ø§Ù„Ø£Ø®Ø·Ø§Ø¡" #: platform/windows/export/export.cpp #, fuzzy msgid "Failed to rename temporary file \"%s\"." -msgstr "لا يمكن ØØ°Ù مل٠مؤقت:" +msgstr "لا يمكن ØØ°Ù مل٠مؤقت." #: platform/windows/export/export.cpp msgid "Identity Type" @@ -20556,17 +20559,17 @@ msgstr "الإصدار" #: platform/windows/export/export.cpp #, fuzzy msgid "Product Version" -msgstr "Ù…ÙØ¹Ø±Ù GUID (Ø§Ù„Ù…ÙØ¹Ø±Ù‘Ù Ø§Ù„ÙØ±ÙŠØ¯ العالمي) للمنتج غير صالØ:" +msgstr "Ù…ÙØ¹Ø±Ù GUID (Ø§Ù„Ù…ÙØ¹Ø±Ù‘Ù Ø§Ù„ÙØ±ÙŠØ¯ العالمي) للمنتج غير صالØ" #: platform/windows/export/export.cpp #, fuzzy msgid "Company Name" -msgstr "إسم العقدة:" +msgstr "إسم العقدة" #: platform/windows/export/export.cpp #, fuzzy msgid "Product Name" -msgstr "اسم المشروع:" +msgstr "اسم المشروع" #: platform/windows/export/export.cpp #, fuzzy @@ -20580,7 +20583,7 @@ msgstr "" #: platform/windows/export/export.cpp #, fuzzy msgid "Resources Modification" -msgstr "دوران عشوائي:" +msgstr "دوران عشوائي" #: platform/windows/export/export.cpp #, fuzzy @@ -20617,7 +20620,7 @@ msgstr "لا يمكن العثور على Ù…ÙØªØ§Ø المتجر، لا يمك٠#: platform/windows/export/export.cpp #, fuzzy msgid "Invalid identity type." -msgstr "Ù…ÙØØ¯Ø¯ غير صالØ:" +msgstr "Ù…ÙØØ¯Ø¯ غير صالØ." #: platform/windows/export/export.cpp #, fuzzy @@ -20639,7 +20642,7 @@ msgstr "صيغة غير ØµØ§Ù„ØØ©." #: platform/windows/export/export.cpp #, fuzzy msgid "Failed to remove temporary file \"%s\"." -msgstr "لا يمكن ØØ°Ù مل٠مؤقت:" +msgstr "لا يمكن ØØ°Ù مل٠مؤقت." #: platform/windows/export/export.cpp msgid "" @@ -20690,8 +20693,9 @@ msgid "Osslsigncode" msgstr "" #: platform/windows/export/export.cpp +#, fuzzy msgid "Wine" -msgstr "" +msgstr "طبقة المعالجة Wine" #: platform/x11/export/export.cpp msgid "32-bit executables cannot have embedded data >= 4 GiB." @@ -20828,7 +20832,7 @@ msgstr "" #: scene/resources/material.cpp #, fuzzy msgid "Max Distance" -msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©:" +msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©" #: scene/2d/audio_stream_player_2d.cpp scene/3d/light.cpp #, fuzzy @@ -20858,13 +20862,13 @@ msgstr "وضع الأيقونة" #: scene/2d/camera_2d.cpp #, fuzzy msgid "Rotating" -msgstr "خطوة الدوران:" +msgstr "خطوة الدوران" #: scene/2d/camera_2d.cpp scene/2d/listener_2d.cpp scene/3d/camera.cpp #: scene/3d/listener.cpp scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Current" -msgstr "Ø§Ù„ØØ§Ù„ÙŠ:" +msgstr "Ø§Ù„ØØ§Ù„ÙŠ" #: scene/2d/camera_2d.cpp scene/gui/graph_edit.cpp #, fuzzy @@ -20948,12 +20952,12 @@ msgstr "ØªØØ¯ÙŠØ¯ الهامش" #: scene/2d/camera_2d.cpp #, fuzzy msgid "Draw Screen" -msgstr "استدعاءات الرسم:" +msgstr "استدعاءات الرسم" #: scene/2d/camera_2d.cpp #, fuzzy msgid "Draw Limits" -msgstr "استدعاءات الرسم:" +msgstr "استدعاءات الرسم" #: scene/2d/camera_2d.cpp #, fuzzy @@ -21150,7 +21154,7 @@ msgstr "" #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp #, fuzzy msgid "Emitting" -msgstr "الإعدادات:" +msgstr "الإعدادات" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -21178,7 +21182,7 @@ msgstr "" #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp #, fuzzy msgid "Randomness" -msgstr "إعادة تشغيل عشوائية (ثواني):" +msgstr "إعادة تشغيل عشوائية (ثواني)" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21351,7 +21355,7 @@ msgstr "إغلاق المنØÙ†Ù‰" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #, fuzzy msgid "Scale Amount" -msgstr "الكمية:" +msgstr "الكمية" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp msgid "Scale Amount Random" @@ -21377,25 +21381,25 @@ msgstr "" #: scene/resources/particles_material.cpp #, fuzzy msgid "Hue Variation" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp #, fuzzy msgid "Variation" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp #, fuzzy msgid "Variation Random" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp #, fuzzy msgid "Variation Curve" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21413,7 +21417,7 @@ msgstr "تقسيم المنØÙ†Ù‰" #: scene/resources/particles_material.cpp #, fuzzy msgid "Offset Random" -msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„:" +msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21612,12 +21616,12 @@ msgstr "وضع الأقليم" #: scene/2d/line_2d.cpp #, fuzzy msgid "End Cap Mode" -msgstr "وضع Ø§Ù„Ù…ØØ§Ø°Ø§Ø©:" +msgstr "وضع Ø§Ù„Ù…ØØ§Ø°Ø§Ø©" #: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp scene/resources/style_box.cpp #, fuzzy msgid "Border" -msgstr "إعادة تسمية مجلد:" +msgstr "إعادة تسمية مجلد" #: scene/2d/line_2d.cpp msgid "Sharp Limit" @@ -21646,7 +21650,7 @@ msgstr "" #: scene/2d/navigation_2d.cpp scene/3d/navigation.cpp #, fuzzy msgid "Edge Connection Margin" -msgstr "تعديل الإتصال:" +msgstr "تعديل الإتصال" #: scene/2d/navigation_2d.cpp msgid "" @@ -21663,7 +21667,7 @@ msgstr "الربط" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp #, fuzzy msgid "Path Desired Distance" -msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©:" +msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Target Desired Distance" @@ -21672,7 +21676,7 @@ msgstr "" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp #, fuzzy msgid "Path Max Distance" -msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©:" +msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp #, fuzzy @@ -21700,7 +21704,7 @@ msgstr "القلب Ø£Ùقياً" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp #, fuzzy msgid "Max Speed" -msgstr "السرعة:" +msgstr "السرعة" #: scene/2d/navigation_agent_2d.cpp msgid "" @@ -21744,7 +21748,7 @@ msgstr "Ø§Ù„Ø³ÙØ±" #: scene/main/canvas_layer.cpp #, fuzzy msgid "Rotation Degrees" -msgstr "ÙŠÙØ¯ÙŠØ± %s من الدرجات." +msgstr "ÙŠÙØ¯ÙŠØ± %s من الدرجات" #: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy @@ -21754,12 +21758,12 @@ msgstr "ثابت" #: scene/2d/node_2d.cpp #, fuzzy msgid "Global Rotation Degrees" -msgstr "ÙŠÙØ¯ÙŠØ± %s من الدرجات." +msgstr "ÙŠÙØ¯ÙŠØ± %s من الدرجات" #: scene/2d/node_2d.cpp #, fuzzy msgid "Global Scale" -msgstr "ØØ¬Ù… عشوائي:" +msgstr "ØØ¬Ù… عشوائي" #: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy @@ -21779,7 +21783,7 @@ msgstr "" #: scene/2d/parallax_background.cpp #, fuzzy msgid "Base Offset" -msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„:" +msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„" #: scene/2d/parallax_background.cpp #, fuzzy @@ -21878,17 +21882,17 @@ msgstr "" #: scene/2d/path_2d.cpp scene/3d/path.cpp #, fuzzy msgid "Unit Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp #, fuzzy msgid "H Offset" -msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„:" +msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp #, fuzzy msgid "V Offset" -msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„:" +msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„" #: scene/2d/path_2d.cpp scene/3d/path.cpp msgid "Cubic Interp" @@ -21951,7 +21955,7 @@ msgstr "" #: scene/2d/physics_body_2d.cpp #, fuzzy msgid "Inertia" -msgstr "شاقولياً:" +msgstr "شاقولياً" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -21990,7 +21994,7 @@ msgstr "Ø§Ù„Ù…ØØ§Ø°Ø§Ø© الذكية" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy msgid "Can Sleep" -msgstr "السرعة:" +msgstr "السرعة" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Damp" @@ -22037,7 +22041,7 @@ msgstr "البنية (اللاØÙ‚Ø©)" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy msgid "Remainder" -msgstr "Ù…ÙØØ±Ùƒ الإخراج البصري:" +msgstr "Ù…ÙØØ±Ùƒ الإخراج البصري" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -22239,7 +22243,7 @@ msgstr "وضع الأولية" #: scene/2d/tile_map.cpp #, fuzzy msgid "Centered Textures" -msgstr "المزايا الرئيسية:" +msgstr "المزايا الرئيسية" #: scene/2d/tile_map.cpp msgid "Cell Clip UV" @@ -22371,7 +22375,7 @@ msgstr "" #: scene/3d/arvr_nodes.cpp servers/arvr_server.cpp #, fuzzy msgid "World Scale" -msgstr "ØØ¬Ù… عشوائي:" +msgstr "ØØ¬Ù… عشوائي" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22402,7 +22406,7 @@ msgstr "الوان الإنبعاث" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy msgid "Degrees" -msgstr "ÙŠÙØ¯ÙŠØ± %s من الدرجات." +msgstr "ÙŠÙØ¯ÙŠØ± %s من الدرجات" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22489,7 +22493,7 @@ msgstr "" #: scene/3d/baked_lightmap.cpp #, fuzzy msgid "Use Denoiser" -msgstr "تصÙية:" +msgstr "تصÙية" #: scene/3d/baked_lightmap.cpp scene/resources/texture.cpp msgid "Use HDR" @@ -22518,7 +22522,7 @@ msgstr "عام" #: scene/3d/baked_lightmap.cpp #, fuzzy msgid "Max Size" -msgstr "Ø§Ù„ØØ¬Ù…:" +msgstr "Ø§Ù„ØØ¬Ù…" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22528,7 +22532,7 @@ msgstr "قص العÙقد" #: scene/3d/baked_lightmap.cpp #, fuzzy msgid "Custom Sky Rotation Degrees" -msgstr "ÙŠÙØ¯ÙŠØ± %s من الدرجات." +msgstr "ÙŠÙØ¯ÙŠØ± %s من الدرجات" #: scene/3d/baked_lightmap.cpp scene/3d/ray_cast.cpp #, fuzzy @@ -22562,7 +22566,7 @@ msgstr "مع البيانات" #: scene/3d/bone_attachment.cpp scene/3d/physics_body.cpp #, fuzzy msgid "Bone Name" -msgstr "إسم العقدة:" +msgstr "إسم العقدة" #: scene/3d/camera.cpp msgid "Keep Aspect" @@ -22589,7 +22593,7 @@ msgstr "" #: scene/3d/camera.cpp #, fuzzy msgid "Frustum Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: scene/3d/camera.cpp #, fuzzy @@ -22853,7 +22857,7 @@ msgstr "الخطوط" #: scene/3d/label_3d.cpp scene/resources/primitive_meshes.cpp #, fuzzy msgid "Horizontal Alignment" -msgstr "عَرضياً:" +msgstr "عَرضياً" #: scene/3d/label_3d.cpp #, fuzzy @@ -22919,7 +22923,7 @@ msgstr "ÙØµÙ„ المسار" #: scene/3d/light.cpp #, fuzzy msgid "Blend Splits" -msgstr "أوقات الدمج:" +msgstr "أوقات الدمج" #: scene/3d/light.cpp #, fuzzy @@ -22965,7 +22969,7 @@ msgstr "" #: scene/3d/mesh_instance.cpp #, fuzzy msgid "Transform Normals" -msgstr "أجهض التØÙˆÙ„." +msgstr "أجهض التØÙˆÙ„" #: scene/3d/navigation.cpp msgid "" @@ -23058,12 +23062,12 @@ msgstr "تشغيل/Ø¥Ø·ÙØ§Ø¡ الوضوØÙŠØ© Visibility" #: scene/3d/particles.cpp #, fuzzy msgid "Draw Passes" -msgstr "استدعاءات الرسم:" +msgstr "استدعاءات الرسم" #: scene/3d/particles.cpp #, fuzzy msgid "Passes" -msgstr "استدعاءات الرسم:" +msgstr "استدعاءات الرسم" #: scene/3d/path.cpp msgid "PathFollow only works when set as a child of a Path node." @@ -23161,7 +23165,7 @@ msgstr "" #: scene/3d/vehicle_body.cpp #, fuzzy msgid "Relaxation" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: scene/3d/physics_body.cpp #, fuzzy @@ -23176,7 +23180,7 @@ msgstr "خطي" #: scene/3d/physics_body.cpp #, fuzzy msgid "Angular Limit Lower" -msgstr "أقصي أخطاء زواية:" +msgstr "أقصي أخطاء زواية" #: scene/3d/physics_body.cpp #, fuzzy @@ -23309,7 +23313,7 @@ msgstr "" #: scene/3d/physics_body.cpp #, fuzzy msgid "Body Offset" -msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„:" +msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be PhysicsBodies" @@ -23342,7 +23346,7 @@ msgstr "استثناء العÙقد" #: scene/3d/physics_joint.cpp #, fuzzy msgid "Params" -msgstr "لقد تم تغيير المَعلم:" +msgstr "لقد تم تغيير المَعلم" #: scene/3d/physics_joint.cpp msgid "Angular Limit" @@ -23370,7 +23374,7 @@ msgstr "ØªØØ±ÙŠÙƒ المسار لليمين" #: scene/3d/physics_joint.cpp #, fuzzy msgid "Max Impulse" -msgstr "السرعة:" +msgstr "السرعة" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23380,12 +23384,12 @@ msgstr "خطي" #: scene/3d/physics_joint.cpp #, fuzzy msgid "Upper Distance" -msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©:" +msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©" #: scene/3d/physics_joint.cpp #, fuzzy msgid "Lower Distance" -msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©:" +msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23418,7 +23422,7 @@ msgstr "رسوم Ù…ØªØØ±ÙƒØ©" #: scene/3d/physics_joint.cpp #, fuzzy msgid "Angular Ortho" -msgstr "أقصي أخطاء زواية:" +msgstr "أقصي أخطاء زواية" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23433,7 +23437,7 @@ msgstr "الشروع" #: scene/3d/physics_joint.cpp #, fuzzy msgid "Force Limit" -msgstr "استدعاءات الرسم:" +msgstr "استدعاءات الرسم" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23533,7 +23537,7 @@ msgstr "" #: scene/3d/portal.cpp #, fuzzy msgid "Linked Room" -msgstr "جذر التعديل المباشر:" +msgstr "جذر التعديل المباشر" #: scene/3d/portal.cpp #, fuzzy @@ -23552,7 +23556,7 @@ msgstr "" #: scene/3d/proximity_group.cpp #, fuzzy msgid "Grid Radius" -msgstr "نص٠القطر:" +msgstr "نص٠القطر" #: scene/3d/ray_cast.cpp #, fuzzy @@ -23570,7 +23574,7 @@ msgstr "وضع Ø§Ù„ØªØØ¯ÙŠØ«" #: scene/3d/reflection_probe.cpp #, fuzzy msgid "Origin Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: scene/3d/reflection_probe.cpp #, fuzzy @@ -23823,12 +23827,12 @@ msgstr "إنشاء Ù…ÙØ¶Ù„ع التصادم" #: scene/3d/soft_body.cpp #, fuzzy msgid "Simulation Precision" -msgstr "شجرة Ø§Ù„ØªØØ±ÙŠÙƒ غير ØµØ§Ù„ØØ©." +msgstr "شجرة Ø§Ù„ØªØØ±ÙŠÙƒ غير ØµØ§Ù„ØØ©" #: scene/3d/soft_body.cpp #, fuzzy msgid "Total Mass" -msgstr "المجموع الكلي:" +msgstr "المجموع الكلي" #: scene/3d/soft_body.cpp msgid "Linear Stiffness" @@ -23945,7 +23949,7 @@ msgstr "" #: scene/3d/vehicle_body.cpp #, fuzzy msgid "Use As Traction" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: scene/3d/vehicle_body.cpp msgid "Use As Steering" @@ -23978,6 +23982,16 @@ msgstr "خطأ" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "ترتيب" + +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Use AABB Center" +msgstr "استخدم Ambient" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" @@ -23991,7 +24005,7 @@ msgstr "يتجاوز" #: scene/3d/visual_instance.cpp #, fuzzy msgid "Material Overlay" -msgstr "تغيرات المادة:" +msgstr "تغيرات المادة" #: scene/3d/visual_instance.cpp #, fuzzy @@ -24001,7 +24015,7 @@ msgstr "إنشاء عÙقدة تظليل" #: scene/3d/visual_instance.cpp #, fuzzy msgid "Extra Cull Margin" -msgstr "وسائط إستدعاء إضاÙية :" +msgstr "وسائط إستدعاء إضاÙية" #: scene/3d/visual_instance.cpp #, fuzzy @@ -24026,7 +24040,7 @@ msgstr "" #: scene/resources/material.cpp #, fuzzy msgid "Min Distance" -msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©:" +msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©" #: scene/3d/visual_instance.cpp msgid "Min Hysteresis" @@ -24075,12 +24089,12 @@ msgstr "عقدة الخلط" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Fadein Time" -msgstr "وقت التلاشي X (ثواني):" +msgstr "وقت التلاشي X (ثواني)" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Fadeout Time" -msgstr "وقت التلاشي X (ثواني):" +msgstr "وقت التلاشي X (ثواني)" #: scene/animation/animation_blend_tree.cpp msgid "Auto Restart" @@ -24097,17 +24111,17 @@ msgstr "" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Random Delay" -msgstr "إمالة عشوائية:" +msgstr "إمالة عشوائية" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Add Amount" -msgstr "الكمية:" +msgstr "الكمية" #: scene/animation/animation_blend_tree.cpp #, fuzzy msgid "Blend Amount" -msgstr "الكمية:" +msgstr "الكمية" #: scene/animation/animation_blend_tree.cpp #, fuzzy @@ -24123,7 +24137,7 @@ msgstr "Ø£Ø¶Ù Ù…Ù†ÙØ° أدخال" #: scene/animation/animation_node_state_machine.cpp #, fuzzy msgid "Xfade Time" -msgstr "وقت التلاشي X (ثواني):" +msgstr "وقت التلاشي X (ثواني)" #: scene/animation/animation_node_state_machine.cpp #, fuzzy @@ -24171,7 +24185,7 @@ msgstr "Ø£Ø¶ÙØ© نقطة الرسوم Ø§Ù„Ù…ØªØØ±ÙƒØ©" #: scene/animation/animation_player.cpp #, fuzzy msgid "Playback Options" -msgstr "إعدادات الص٠(Class):" +msgstr "إعدادات الص٠(Class)" #: scene/animation/animation_player.cpp #, fuzzy @@ -24214,7 +24228,7 @@ msgstr "العÙقدة الرئيسة Ù„Ù…ÙØ´ØºÙ„ الرسومات Ø§Ù„Ù…ØªØØ± #: scene/animation/animation_tree.cpp #, fuzzy msgid "Tree Root" -msgstr "إنشاء العÙقدة الرئيسة (الجذر):" +msgstr "إنشاء العÙقدة الرئيسة (الجذر)" #: scene/animation/animation_tree.cpp #, fuzzy @@ -24475,12 +24489,12 @@ msgstr "الاتجاهات" #: scene/gui/control.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Min Size" -msgstr "ØØ¬Ù… الخطوط:" +msgstr "ØØ¬Ù… الخطوط" #: scene/gui/control.cpp #, fuzzy msgid "Pivot Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: scene/gui/control.cpp #, fuzzy @@ -24533,7 +24547,7 @@ msgstr "" #: scene/gui/control.cpp #, fuzzy msgid "Default Cursor Shape" -msgstr "تØÙ…يل نسق المسار Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠ." +msgstr "تØÙ…يل نسق المسار Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠ" #: scene/gui/control.cpp msgid "Pass On Modal Close Click" @@ -24591,12 +24605,12 @@ msgstr "قطع الاتصال" #: scene/gui/graph_edit.cpp #, fuzzy msgid "Scroll Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: scene/gui/graph_edit.cpp #, fuzzy msgid "Snap Distance" -msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©:" +msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©" #: scene/gui/graph_edit.cpp #, fuzzy @@ -24696,7 +24710,7 @@ msgstr "" #: scene/gui/item_list.cpp #, fuzzy msgid "Icon Scale" -msgstr "ØØ¬Ù… عشوائي:" +msgstr "ØØ¬Ù… عشوائي" #: scene/gui/item_list.cpp #, fuzzy @@ -24711,7 +24725,7 @@ msgstr "ألØÙ‚" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp #, fuzzy msgid "Visible Characters" -msgstr "Ø§Ù„Ø£ØØ±Ù Ø§Ù„ØµØ§Ù„ØØ©:" +msgstr "Ø§Ù„Ø£ØØ±Ù Ø§Ù„ØµØ§Ù„ØØ©" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp #, fuzzy @@ -24737,7 +24751,7 @@ msgstr "" #: scene/gui/line_edit.cpp #, fuzzy msgid "Secret Character" -msgstr "Ø§Ù„Ø£ØØ±Ù Ø§Ù„ØµØ§Ù„ØØ©:" +msgstr "Ø§Ù„Ø£ØØ±Ù Ø§Ù„ØµØ§Ù„ØØ©" #: scene/gui/line_edit.cpp msgid "Expand To Text Length" @@ -24803,7 +24817,7 @@ msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp #, fuzzy msgid "Blink Speed" -msgstr "السرعة:" +msgstr "السرعة" #: scene/gui/link_button.cpp msgid "Underline" @@ -24887,7 +24901,7 @@ msgstr "Ø¨ØØ«" #: scene/gui/progress_bar.cpp #, fuzzy msgid "Percent" -msgstr "Ø§Ù„ØØ§Ù„ÙŠ:" +msgstr "Ø§Ù„ØØ§Ù„ÙŠ" #: scene/gui/range.cpp msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." @@ -24948,7 +24962,7 @@ msgstr "Ù…Ø³Ø§ÙØ© بادئة تلقائية" #: scene/gui/rich_text_effect.cpp #, fuzzy msgid "Elapsed Time" -msgstr "أوقات الدمج:" +msgstr "أوقات الدمج" #: scene/gui/rich_text_effect.cpp #, fuzzy @@ -24958,7 +24972,7 @@ msgstr "النهاية" #: scene/gui/rich_text_effect.cpp #, fuzzy msgid "Character" -msgstr "Ø§Ù„Ø£ØØ±Ù Ø§Ù„ØµØ§Ù„ØØ©:" +msgstr "Ø§Ù„Ø£ØØ±Ù Ø§Ù„ØµØ§Ù„ØØ©" #: scene/gui/rich_text_label.cpp msgid "BBCode" @@ -24971,7 +24985,7 @@ msgstr "" #: scene/gui/rich_text_label.cpp #, fuzzy msgid "Tab Size" -msgstr "Ø§Ù„ØØ¬Ù…:" +msgstr "Ø§Ù„ØØ¬Ù…" #: scene/gui/rich_text_label.cpp #, fuzzy @@ -24994,7 +25008,7 @@ msgstr "Ø§Ù„Ù…ØØ¯Ø¯ Ùقط" #: scene/gui/rich_text_label.cpp scene/gui/text_edit.cpp #, fuzzy msgid "Override Selected Font Color" -msgstr "عدل على Ø§Ù„ØØ³Ø§Ø¨ Ø§Ù„ØØ§Ù„ÙŠ:" +msgstr "عدل على Ø§Ù„ØØ³Ø§Ø¨ Ø§Ù„ØØ§Ù„ÙŠ" #: scene/gui/rich_text_label.cpp #, fuzzy @@ -25024,7 +25038,7 @@ msgstr "تزويد السطØ" #: scene/gui/scroll_container.cpp #, fuzzy msgid "Horizontal Enabled" -msgstr "عَرضياً:" +msgstr "عَرضياً" #: scene/gui/scroll_container.cpp #, fuzzy @@ -25047,22 +25061,22 @@ msgstr "اختر لوناً" #: scene/gui/slider.cpp #, fuzzy msgid "Ticks On Borders" -msgstr "إعادة تسمية مجلد:" +msgstr "إعادة تسمية مجلد" #: scene/gui/spin_box.cpp #, fuzzy msgid "Prefix" -msgstr "بادئة:" +msgstr "بادئة" #: scene/gui/spin_box.cpp #, fuzzy msgid "Suffix" -msgstr "لاØÙ‚Ø©:" +msgstr "لاØÙ‚Ø©" #: scene/gui/split_container.cpp #, fuzzy msgid "Split Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: scene/gui/split_container.cpp scene/gui/tree.cpp #, fuzzy @@ -25081,7 +25095,7 @@ msgstr "" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp #, fuzzy msgid "Current Tab" -msgstr "Ø§Ù„ØØ§Ù„ÙŠ:" +msgstr "Ø§Ù„ØØ§Ù„ÙŠ" #: scene/gui/tab_container.cpp #, fuzzy @@ -25095,7 +25109,7 @@ msgstr "" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp #, fuzzy msgid "Drag To Rearrange Enabled" -msgstr "Ø¥Ø³ØØ¨ وأسقط لإعادة الترتيب." +msgstr "Ø¥Ø³ØØ¨ وأسقط لإعادة الترتيب" #: scene/gui/tab_container.cpp msgid "Use Hidden Tabs For Min Size" @@ -25126,7 +25140,7 @@ msgstr "تخطي نقاط التكسّر" #: scene/gui/text_edit.cpp #, fuzzy msgid "Fold Gutter" -msgstr "مجلد:" +msgstr "مجلد" #: scene/gui/text_edit.cpp #, fuzzy @@ -25146,17 +25160,17 @@ msgstr "ØªÙØ¹ÙŠÙ„" #: scene/gui/text_edit.cpp #, fuzzy msgid "Scroll Vertical" -msgstr "شاقولياً:" +msgstr "شاقولياً" #: scene/gui/text_edit.cpp #, fuzzy msgid "Scroll Horizontal" -msgstr "عَرضياً:" +msgstr "عَرضياً" #: scene/gui/text_edit.cpp #, fuzzy msgid "Draw" -msgstr "استدعاءات الرسم:" +msgstr "استدعاءات الرسم" #: scene/gui/text_edit.cpp #, fuzzy @@ -25216,7 +25230,7 @@ msgstr "" #: scene/gui/texture_progress.cpp #, fuzzy msgid "Fill Mode" -msgstr "وضع التشغيل:" +msgstr "وضع التشغيل" #: scene/gui/texture_progress.cpp scene/resources/material.cpp msgid "Tint" @@ -25234,7 +25248,7 @@ msgstr "الشروع" #: scene/gui/texture_progress.cpp #, fuzzy msgid "Fill Degrees" -msgstr "ÙŠÙØ¯ÙŠØ± %s من الدرجات." +msgstr "ÙŠÙØ¯ÙŠØ± %s من الدرجات" #: scene/gui/texture_progress.cpp scene/resources/primitive_meshes.cpp #, fuzzy @@ -25287,7 +25301,7 @@ msgstr "زر معطّل" #: scene/gui/tree.cpp #, fuzzy msgid "Hide Root" -msgstr "إنشاء العÙقدة الرئيسة (الجذر):" +msgstr "إنشاء العÙقدة الرئيسة (الجذر)" #: scene/gui/tree.cpp msgid "Drop Mode Flags" @@ -25342,7 +25356,7 @@ msgstr "" #: scene/main/http_request.cpp #, fuzzy msgid "Timeout" -msgstr "انتهت المهلة." +msgstr "انتهت المهلة" #: scene/main/node.cpp msgid "" @@ -25387,17 +25401,17 @@ msgstr "إعادة التسمية" #: scene/main/node.cpp #, fuzzy msgid "Owner" -msgstr "ملاك:" +msgstr "ملاك" #: scene/main/node.cpp scene/main/scene_tree.cpp #, fuzzy msgid "Multiplayer" -msgstr "ØªØØ¯ÙŠØ¯ التكرار:" +msgstr "ØªØØ¯ÙŠØ¯ التكرار" #: scene/main/node.cpp #, fuzzy msgid "Custom Multiplayer" -msgstr "ØªØØ¯ÙŠØ¯ التكرار:" +msgstr "ØªØØ¯ÙŠØ¯ التكرار" #: scene/main/node.cpp msgid "Process Priority" @@ -25434,7 +25448,7 @@ msgstr "" #: scene/main/scene_tree.cpp #, fuzzy msgid "Multiplayer Poll" -msgstr "ØªØØ¯ÙŠØ¯ التكرار:" +msgstr "ØªØØ¯ÙŠØ¯ التكرار" #: scene/main/scene_tree.cpp scene/resources/mesh_library.cpp #: scene/resources/shape_2d.cpp @@ -25470,12 +25484,12 @@ msgstr "أنشئ Ø§Ù„ØØ¯" #: scene/main/scene_tree.cpp servers/visual_server.cpp msgid "Reflections" -msgstr "الانعكاسات" +msgstr "انعكاسات" #: scene/main/scene_tree.cpp #, fuzzy msgid "Atlas Size" -msgstr "ØØ¬Ù… الخطوط:" +msgstr "ØØ¬Ù… الخطوط" #: scene/main/scene_tree.cpp msgid "Atlas Subdiv" @@ -25530,7 +25544,7 @@ msgstr "" #: scene/main/timer.cpp #, fuzzy msgid "Autostart" -msgstr "إعادة تشغيل تلقائية:" +msgstr "إعادة تشغيل تلقائية" #: scene/main/viewport.cpp #, fuzzy @@ -25615,7 +25629,7 @@ msgstr "تصØÙŠØ الأخطاء" #: scene/main/viewport.cpp #, fuzzy msgid "Render Target" -msgstr "Ù…ÙØØ±Ùƒ الإخراج البصري:" +msgstr "Ù…ÙØØ±Ùƒ الإخراج البصري" #: scene/main/viewport.cpp msgid "V Flip" @@ -25736,7 +25750,7 @@ msgstr "" #: scene/resources/concave_polygon_shape_2d.cpp #, fuzzy msgid "Segments" -msgstr "معاملات المشهد الرئيس:" +msgstr "معاملات المشهد الرئيس" #: scene/resources/curve.cpp #, fuzzy @@ -25779,7 +25793,7 @@ msgstr "القص Clip Ù…ÙØ¹Ø·Ù‘Ù„" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "H Separation" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25849,7 +25863,7 @@ msgstr "عنصر معطّل" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Off" -msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„:" +msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25869,12 +25883,12 @@ msgstr "الاجبار على التعديل الابيض" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Shadow Offset X" -msgstr "معادل الشبكة على المØÙˆØ± الأÙقي X:" +msgstr "معادل الشبكة على المØÙˆØ± الأÙقي X" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Shadow Offset Y" -msgstr "معادل الشبكة على المØÙˆØ± Y:" +msgstr "معادل الشبكة على المØÙˆØ± Y" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25934,12 +25948,12 @@ msgstr "المشهد الرئيس" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Folded" -msgstr "مجلد:" +msgstr "مجلد" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Fold" -msgstr "مجلد:" +msgstr "مجلد" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Readonly" @@ -26060,12 +26074,12 @@ msgstr "الاتجاهات" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Close H Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Close V Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26095,7 +26109,7 @@ msgstr "ÙØ§ØµÙ„ Ù…ÙØ³Ù…ّى" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Font Separator" -msgstr "Ù…ÙØ´ØºÙ‘Ù„ اللون." +msgstr "Ù…ÙØ´ØºÙ‘Ù„ اللون" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26105,12 +26119,12 @@ msgstr "إعادة تسمية عنصر اللون" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Font Color Separator" -msgstr "Ù…ÙØ´ØºÙ‘Ù„ اللون." +msgstr "Ù…ÙØ´ØºÙ‘Ù„ اللون" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "V Separation" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26155,17 +26169,17 @@ msgstr "الألوان" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Title Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Close Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Port Offset" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26277,12 +26291,12 @@ msgstr "أظهر الموجهات" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Scroll Border" -msgstr "شاقولياً:" +msgstr "شاقولياً" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Scroll Speed" -msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة:" +msgstr "مقدار Ø¥Ø²Ø§ØØ© الشبكة" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26292,7 +26306,7 @@ msgstr "ØªØØ¯ÙŠØ¯ الهامش" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Line Separation" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26354,7 +26368,7 @@ msgstr "الهدÙ" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Folder" -msgstr "مجلد:" +msgstr "مجلد" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26394,7 +26408,7 @@ msgstr "بالعرض يساراً" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Screen Picker" -msgstr "Ù…ÙØ´ØºÙ„ الشاشة." +msgstr "Ù…ÙØ´ØºÙ„ الشاشة" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26457,12 +26471,12 @@ msgstr "المشهد الرئيس" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Table H Separation" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Table V Separation" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26557,7 +26571,7 @@ msgstr "مسار التركيز" #: scene/resources/dynamic_font.cpp #, fuzzy msgid "Outline Size" -msgstr "ØØ¬Ù… الخطوط:" +msgstr "ØØ¬Ù… الخطوط" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -26572,12 +26586,12 @@ msgstr "الإشارات" #: scene/resources/dynamic_font.cpp #, fuzzy msgid "Extra Spacing" -msgstr "خيارات إضاÙية:" +msgstr "خيارات إضاÙية" #: scene/resources/dynamic_font.cpp #, fuzzy msgid "Char" -msgstr "Ø§Ù„Ø£ØØ±Ù Ø§Ù„ØµØ§Ù„ØØ©:" +msgstr "Ø§Ù„Ø£ØØ±Ù Ø§Ù„ØµØ§Ù„ØØ©" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -26605,12 +26619,12 @@ msgstr "الوثائق الإلكترونية" #: scene/resources/environment.cpp #, fuzzy msgid "Sky Rotation" -msgstr "خطوة الدوران:" +msgstr "خطوة الدوران" #: scene/resources/environment.cpp #, fuzzy msgid "Sky Rotation Degrees" -msgstr "ÙŠÙØ¯ÙŠØ± %s من الدرجات." +msgstr "ÙŠÙØ¯ÙŠØ± %s من الدرجات" #: scene/resources/environment.cpp msgid "Canvas Max Layer" @@ -26637,12 +26651,12 @@ msgstr "" #: scene/resources/environment.cpp #, fuzzy msgid "Sun Color" -msgstr "تخزين الملÙ:" +msgstr "تخزين الملÙ" #: scene/resources/environment.cpp #, fuzzy msgid "Sun Amount" -msgstr "الكمية:" +msgstr "الكمية" #: scene/resources/environment.cpp #, fuzzy @@ -26733,12 +26747,12 @@ msgstr "الخطوة" #: scene/resources/environment.cpp #, fuzzy msgid "Fade In" -msgstr "تلاشي ÙÙŠ البداية (ثواني):" +msgstr "تلاشي ÙÙŠ البداية (ثواني)" #: scene/resources/environment.cpp #, fuzzy msgid "Fade Out" -msgstr "تلاشي من النهاية (ثواني):" +msgstr "تلاشي من النهاية (ثواني)" #: scene/resources/environment.cpp #, fuzzy @@ -26756,7 +26770,7 @@ msgstr "" #: scene/resources/environment.cpp #, fuzzy msgid "Radius 2" -msgstr "نص٠القطر:" +msgstr "نص٠القطر" #: scene/resources/environment.cpp msgid "Intensity 2" @@ -26787,7 +26801,7 @@ msgstr "" #: scene/resources/environment.cpp scene/resources/material.cpp #, fuzzy msgid "Distance" -msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©:" +msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©" #: scene/resources/environment.cpp msgid "Transition" @@ -26871,17 +26885,17 @@ msgstr "ضوء" #: scene/resources/environment.cpp #, fuzzy msgid "Saturation" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: scene/resources/environment.cpp #, fuzzy msgid "Color Correction" -msgstr "Ø§Ù„ÙˆØ¸ÙŠÙØ© البرمجية للون." +msgstr "Ø§Ù„ÙˆØ¸ÙŠÙØ© البرمجية للون" #: scene/resources/font.cpp #, fuzzy msgid "Ascent" -msgstr "Ø§Ù„ØØ§Ù„ÙŠ:" +msgstr "Ø§Ù„ØØ§Ù„ÙŠ" #: scene/resources/font.cpp #, fuzzy @@ -26896,7 +26910,7 @@ msgstr "العمق" #: scene/resources/gradient.cpp #, fuzzy msgid "Offsets" -msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„:" +msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„" #: scene/resources/height_map_shape.cpp msgid "Map Width" @@ -26960,7 +26974,7 @@ msgstr "Ø§Ù„Ù…Ø³Ø§ÙØ© البادئة يميناً" #: scene/resources/material.cpp #, fuzzy msgid "Ensure Correct Normals" -msgstr "أجهض التØÙˆÙ„." +msgstr "أجهض التØÙˆÙ„" #: scene/resources/material.cpp msgid "Albedo Tex MSDF" @@ -26982,7 +26996,7 @@ msgstr "" #: scene/resources/material.cpp servers/visual_server.cpp #, fuzzy msgid "Parameters" -msgstr "لقد تم تغيير المَعلم:" +msgstr "لقد تم تغيير المَعلم" #: scene/resources/material.cpp #, fuzzy @@ -27026,7 +27040,7 @@ msgstr "" #: scene/resources/material.cpp #, fuzzy msgid "Grow Amount" -msgstr "الكمية:" +msgstr "الكمية" #: scene/resources/material.cpp msgid "Use Alpha Scissor" @@ -27133,7 +27147,7 @@ msgstr "الإنتقال" #: scene/resources/material.cpp #, fuzzy msgid "Refraction" -msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª:" +msgstr "Ø§Ù„ØªØ¨Ø§Ø¹ÙØ¯Ø§Øª" #: scene/resources/material.cpp msgid "Detail" @@ -27198,12 +27212,12 @@ msgstr "Ù…ØÙˆ التَØÙŽÙˆÙ‘Ù„" #: scene/resources/multimesh.cpp #, fuzzy msgid "Color Format" -msgstr "Ù…ÙØ´ØºÙ‘Ù„ اللون." +msgstr "Ù…ÙØ´ØºÙ‘Ù„ اللون" #: scene/resources/multimesh.cpp #, fuzzy msgid "Transform Format" -msgstr "أجهض التØÙˆÙ„." +msgstr "أجهض التØÙˆÙ„" #: scene/resources/multimesh.cpp msgid "Custom Data Format" @@ -27221,7 +27235,7 @@ msgstr "" #: scene/resources/navigation_mesh.cpp #, fuzzy msgid "Sampling" -msgstr "ØªØØ¬ÙŠÙ…:" +msgstr "ØªØØ¬ÙŠÙ…" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -27231,7 +27245,7 @@ msgstr "ØØ¯Ø¯ نوع المتغير" #: scene/resources/navigation_mesh.cpp #, fuzzy msgid "Parsed Geometry Type" -msgstr "توزيع الأشكال الهندسية..." +msgstr "توزيع الأشكال الهندسية" #: scene/resources/navigation_mesh.cpp msgid "Source Geometry Mode" @@ -27249,7 +27263,7 @@ msgstr "" #: scene/resources/navigation_mesh.cpp #, fuzzy msgid "Agents" -msgstr "معاملات المشهد الرئيس:" +msgstr "معاملات المشهد الرئيس" #: scene/resources/navigation_mesh.cpp msgid "Max Climb" @@ -27290,7 +27304,7 @@ msgstr "أظهر Ø§Ù„Ø¥ÙØªØ±Ø§Ø¶ÙŠ" #: scene/resources/navigation_mesh.cpp #, fuzzy msgid "Sample Distance" -msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©:" +msgstr "اختر Ø§Ù„Ù…Ø³Ø§ÙØ©" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -27317,7 +27331,7 @@ msgstr "توليد AABB" #: scene/resources/navigation_mesh.cpp #, fuzzy msgid "Baking AABB Offset" -msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„:" +msgstr "Ø§Ù„Ù…ÙØ¹Ø§Ø¯Ù„" #: scene/resources/occluder_shape.cpp msgid "Spheres" @@ -27362,7 +27376,7 @@ msgstr "Ù…ÙØ¹Ø¯Ù‘Ù„ تباطؤ الرؤية الØÙرة" #: scene/resources/particles_material.cpp #, fuzzy msgid "Point Texture" -msgstr "نقاط الانبعاث:" +msgstr "نقاط الانبعاث" #: scene/resources/particles_material.cpp msgid "Normal Texture" @@ -27381,7 +27395,7 @@ msgstr "Ø£Ø¶Ù Ù…Ù†ÙØ° أدخال" #: scene/resources/particles_material.cpp #, fuzzy msgid "Scale Random" -msgstr "نسبة التكبير:" +msgstr "نسبة التكبير" #: scene/resources/particles_material.cpp #, fuzzy @@ -27399,7 +27413,7 @@ msgstr "" #: scene/resources/plane_shape.cpp #, fuzzy msgid "Plane" -msgstr "التبويت:" +msgstr "التبويت" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -27425,7 +27439,7 @@ msgstr "" #: scene/resources/primitive_meshes.cpp #, fuzzy msgid "Top Radius" -msgstr "نص٠القطر:" +msgstr "نص٠القطر" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -27476,7 +27490,7 @@ msgstr "العظام" #: scene/resources/sky.cpp #, fuzzy msgid "Radiance Size" -msgstr "ØØ¬Ù… الخطوط:" +msgstr "ØØ¬Ù… الخطوط" #: scene/resources/sky.cpp msgid "Panorama" @@ -27490,7 +27504,7 @@ msgstr "الطابق التالي" #: scene/resources/sky.cpp #, fuzzy msgid "Horizon Color" -msgstr "تخزين الملÙ:" +msgstr "تخزين الملÙ" #: scene/resources/sky.cpp #, fuzzy @@ -27601,7 +27615,7 @@ msgstr "التقاط" #: scene/resources/texture.cpp #, fuzzy msgid "From" -msgstr "وضع التشغيل:" +msgstr "وضع التشغيل" #: scene/resources/texture.cpp #, fuzzy @@ -27769,7 +27783,7 @@ msgstr "أختبار" #: scene/resources/world.cpp scene/resources/world_2d.cpp #, fuzzy msgid "Default Edge Connection Margin" -msgstr "تعديل الإتصال:" +msgstr "تعديل الإتصال" #: scene/resources/world_2d.cpp msgid "Canvas" @@ -27805,7 +27819,7 @@ msgstr "عنصر Ø®Ùيار" #: servers/audio/audio_stream.cpp #, fuzzy msgid "Random Pitch" -msgstr "إمالة عشوائية:" +msgstr "إمالة عشوائية" #: servers/audio/effects/audio_effect_capture.cpp #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp @@ -27857,7 +27871,7 @@ msgstr "" #: servers/audio/effects/audio_effect_panner.cpp #, fuzzy msgid "Pan" -msgstr "التبويت:" +msgstr "التبويت" #: servers/audio/effects/audio_effect_compressor.cpp #: servers/audio/effects/audio_effect_filter.cpp @@ -27955,7 +27969,7 @@ msgstr "" #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp #, fuzzy msgid "FFT Size" -msgstr "Ø§Ù„ØØ¬Ù…:" +msgstr "Ø§Ù„ØØ¬Ù…" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Predelay" @@ -27985,7 +27999,7 @@ msgstr "" #: servers/audio/effects/audio_effect_stereo_enhance.cpp #, fuzzy msgid "Time Pullout (ms)" -msgstr "انتهت المهلة." +msgstr "انتهت المهلة" #: servers/audio/effects/audio_effect_stereo_enhance.cpp msgid "Surround" @@ -28053,7 +28067,7 @@ msgstr "" #: servers/physics_2d/physics_2d_server_sw.cpp #, fuzzy msgid "BP Hash Table Size" -msgstr "Ø§Ù„ØØ¬Ù…:" +msgstr "Ø§Ù„ØØ¬Ù…" #: servers/physics_2d/physics_2d_server_sw.cpp msgid "Large Object Surface Threshold In Cells" @@ -28179,7 +28193,7 @@ msgstr "لا يمكن تعديل الثوابت." #: servers/visual/visual_server_scene.cpp #, fuzzy msgid "Spatial Partitioning" -msgstr "تجزئة..." +msgstr "تجزئة" #: servers/visual_server.cpp #, fuzzy @@ -28369,7 +28383,7 @@ msgstr "" #: servers/visual_server.cpp #, fuzzy msgid "Batching" -msgstr "جاري Ø§Ù„Ø¨ØØ«..." +msgstr "جاري Ø§Ù„Ø¨ØØ«" #: servers/visual_server.cpp msgid "Use Batching" @@ -28399,7 +28413,7 @@ msgstr "" #: servers/visual_server.cpp #, fuzzy msgid "Max Join Items" -msgstr "إدارة العناصر..." +msgstr "إدارة العناصر" #: servers/visual_server.cpp msgid "Batch Buffer Size" diff --git a/editor/translations/az.po b/editor/translations/az.po index d4ffe0665e..b6b36d99e5 100644 --- a/editor/translations/az.po +++ b/editor/translations/az.po @@ -12593,9 +12593,10 @@ msgstr "Yapışdır(Snap):" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13952,12 +13953,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22688,6 +22688,15 @@ msgstr "Maks. XÉ™tti XÉ™ta:" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "İnterpolasiya rejimi" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/bg.po b/editor/translations/bg.po index a6a8b72ea5..262a6825a6 100644 --- a/editor/translations/bg.po +++ b/editor/translations/bg.po @@ -17,13 +17,14 @@ # Ivan Gechev <ivan_banov@abv.bg>, 2022. # BigHomieDripDrop <bartu.bali@gmail.com>, 2022. # xaio <xaio666@gmail.com>, 2022. +# Vosh <vosh4k@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-22 15:26+0000\n" -"Last-Translator: xaio <xaio666@gmail.com>\n" +"PO-Revision-Date: 2022-10-25 15:43+0000\n" +"Last-Translator: Vosh <vosh4k@gmail.com>\n" "Language-Team: Bulgarian <https://hosted.weblate.org/projects/godot-engine/" "godot/bg/>\n" "Language: bg\n" @@ -31,7 +32,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.14.2-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -437,19 +438,16 @@ msgid "Button Mask" msgstr "Бутон" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp -#, fuzzy msgid "Global Position" -msgstr "Глобална конÑтанта" +msgstr "Глобална позициÑ" #: core/os/input_event.cpp -#, fuzzy msgid "Factor" -msgstr "Вектор" +msgstr "Фактор" #: core/os/input_event.cpp -#, fuzzy msgid "Button Index" -msgstr "Бутон" +msgstr "Ð˜Ð½Ð´ÐµÐºÑ Ð½Ð° бутона" #: core/os/input_event.cpp msgid "Doubleclick" @@ -485,9 +483,8 @@ msgid "Axis" msgstr "ОÑ" #: core/os/input_event.cpp -#, fuzzy msgid "Axis Value" -msgstr "Закачане на ÑтойноÑтта" +msgstr "СтойноÑÑ‚ на оÑта" #: core/os/input_event.cpp modules/visual_script/visual_script_func_nodes.cpp #, fuzzy @@ -510,14 +507,12 @@ msgid "Delta" msgstr "Делта" #: core/os/input_event.cpp -#, fuzzy msgid "Channel" -msgstr "ПромÑна на филтъра" +msgstr "Канал" #: core/os/input_event.cpp main/main.cpp -#, fuzzy msgid "Message" -msgstr "Съобщение за подаването" +msgstr "Съобщение" #: core/os/input_event.cpp #, fuzzy @@ -527,9 +522,8 @@ msgstr "Скалиране" #: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp #: scene/3d/physics_body.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity" -msgstr "Орбитален изглед отдÑÑно" +msgstr "СкороÑÑ‚" #: core/os/input_event.cpp msgid "Instrument" @@ -547,14 +541,12 @@ msgstr "СтойноÑÑ‚ на контролер" #: core/project_settings.cpp editor/editor_node.cpp main/main.cpp #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Application" -msgstr "ДейÑтвие" +msgstr "Приложение" #: core/project_settings.cpp main/main.cpp -#, fuzzy msgid "Config" -msgstr "ÐаÑтройване на прилепването" +msgstr "КонфигурациÑ" #: core/project_settings.cpp #, fuzzy @@ -617,9 +609,8 @@ msgstr "Име на перÑонална потребителÑка катего #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" -msgstr "Показване на вÑичко" +msgstr "Покажи" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp @@ -669,9 +660,8 @@ msgid "Main Run Args" msgstr "" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" -msgstr "Път на Ñцената:" +msgstr "Ðаименование на Ñцена" #: core/project_settings.cpp msgid "Search In File Extensions" @@ -682,9 +672,8 @@ msgid "Script Templates Search Path" msgstr "Път за търÑене на Ñкриптови шаблони" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "Контрол на верÑиите" +msgstr "Стартирай контрол на верÑиите при Ñтартиране" #: core/project_settings.cpp #, fuzzy @@ -1053,7 +1042,7 @@ msgstr "Скалиране" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Follow Surface" -msgstr "" +msgstr "Следвай повърхноÑÑ‚" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Weight Samples" @@ -1143,9 +1132,8 @@ msgstr "ПромÑна на повикана Ñ„ÑƒÐ½ÐºÑ†Ð¸Ñ (ÐнимациÑ)" #: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Frame" -msgstr "ДобавÑне на кадър" +msgstr "Кадър" #: editor/animation_track_editor.cpp editor/editor_profiler.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp @@ -1156,9 +1144,8 @@ msgstr "Време" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Location" -msgstr "Стъпка при завъртане:" +msgstr "МеÑтоположение" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp @@ -1339,19 +1326,16 @@ msgid "Remove this track." msgstr "Премахване на тази пътечка." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "Време (Ñек): " +msgstr "Време (Ñек):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "Създаване на функциÑ" +msgstr "ПозициÑ:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rotation:" -msgstr "Стъпка при завъртане:" +msgstr "Завъртане:" #: editor/animation_track_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -1646,7 +1630,7 @@ msgstr "" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Clipboard is empty!" -msgstr "" +msgstr "Клипбордът е празен!" #: editor/animation_track_editor.cpp msgid "Paste Tracks" @@ -12795,9 +12779,10 @@ msgstr "ÐаÑтройки за прилепването" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "ОтмеÑтване:" @@ -14158,16 +14143,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Ðеправилен път до проекта (ПроменÑли ли Ñте нещо?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Файлът „project.godot“ не може да бъде зареден от Ð¿ÑŠÑ‚Ñ Ð½Ð° проекта (грешка " "%d). Възможно е той да липÑва или да е повреден." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "" +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Ðе може да бъде отворен проектът в „%s“." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -23350,6 +23336,15 @@ msgstr "Грешка от %s" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Сортиране" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/bn.po b/editor/translations/bn.po index f32a090f27..df79cd5d84 100644 --- a/editor/translations/bn.po +++ b/editor/translations/bn.po @@ -13807,9 +13807,10 @@ msgstr "অà§à¦¯à¦¾à¦¨à¦¿à¦®à§‡à¦¶à¦¨à§‡à¦° সিদà§à¦§à¦¾à¦¨à§à¦¤à¦¸à¦®à§ #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "অফসেট/à¦à¦¾à¦°à¦¸à¦¾à¦®à§à¦¯:" @@ -15277,14 +15278,13 @@ msgstr "অকারà§à¦¯à¦•র পà§à¦°à¦•লà§à¦ªà§‡à¦° পথ (কোনৠ#: editor/project_manager.cpp #, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° পথে engine.cfg তৈরি করা সমà§à¦à¦¬ হয়নি।" #: editor/project_manager.cpp #, fuzzy -msgid "Couldn't edit project.godot in project path." -msgstr "পà§à¦°à¦•লà§à¦ªà§‡à¦° পথে engine.cfg তৈরি করা সমà§à¦à¦¬ হয়নি।" +msgid "Couldn't save project at '%s' (error %d)." +msgstr "সংযোগ..." #: editor/project_manager.cpp #, fuzzy @@ -24888,6 +24888,15 @@ msgstr "সমসà§à¦¯à¦¾/à¦à§à¦²" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "সাজান:" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/br.po b/editor/translations/br.po index 7b92059104..0cfc29b4d1 100644 --- a/editor/translations/br.po +++ b/editor/translations/br.po @@ -12459,9 +12459,10 @@ msgstr "Tro Fiñvskeudenn" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13803,12 +13804,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22459,6 +22459,15 @@ msgstr "Melezour" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Mod Interpoladur" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/ca.po b/editor/translations/ca.po index b08b3be823..d3ced0a876 100644 --- a/editor/translations/ca.po +++ b/editor/translations/ca.po @@ -13232,9 +13232,10 @@ msgstr "Opcions d'Ajustament" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "òfset:" @@ -14752,16 +14753,17 @@ msgid "Invalid project path (changed anything?)." msgstr "El Camà del Projecte no és và lid (S'ha produit algun canvi?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "No es pot carregar el fitxer 'project.godot' en el camà del projecte (error " "%d). Pot ser que falti o que estigui malmès." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "No es pot editar el fitxer 'project.godot' en el camà del projecte." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "No es pot obrir el projecte a '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -24377,6 +24379,15 @@ msgstr "Error" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Ordena" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/cs.po b/editor/translations/cs.po index 01c28b207e..173d38c85c 100644 --- a/editor/translations/cs.po +++ b/editor/translations/cs.po @@ -32,13 +32,14 @@ # JoeMoos <josephmoose13@gmail.com>, 2022. # Mirinek <mirek.nozicka77@gmail.com>, 2022. # LubomÃr Baloun <lubosbaloun@gmail.com>, 2022. +# OndÅ™ej Pavelka <flamekick97@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-19 05:22+0000\n" -"Last-Translator: LubomÃr Baloun <lubosbaloun@gmail.com>\n" +"PO-Revision-Date: 2022-12-12 09:46+0000\n" +"Last-Translator: OndÅ™ej Pavelka <flamekick97@gmail.com>\n" "Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/" "cs/>\n" "Language: cs\n" @@ -46,11 +47,11 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=(n==1) ? 0 : (n>=2 && n<=4) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" -msgstr "OvladaÄ Grafického Tabletu" +msgstr "OvladaÄe grafického tabletu" #: core/bind/core_bind.cpp msgid "Clipboard" @@ -65,9 +66,8 @@ msgid "Exit Code" msgstr "Kód pro ukonÄenà (exit code)" #: core/bind/core_bind.cpp -#, fuzzy msgid "V-Sync Enabled" -msgstr "V-Sync Zapnutý" +msgstr "V-Sync zapnutý" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" @@ -93,22 +93,20 @@ msgstr "Nechat ladÃcà program otevÅ™ený" #: core/bind/core_bind.cpp msgid "Min Window Size" -msgstr "Minimálnà Velikost Okna" +msgstr "Minimálnà velikost okna" #: core/bind/core_bind.cpp msgid "Max Window Size" -msgstr "Maximálnà Velikost Okna" +msgstr "Maximálnà velikost okna" #: core/bind/core_bind.cpp -#, fuzzy msgid "Screen Orientation" -msgstr "Operátor screen." +msgstr "Orientace obrazovky" #: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Window" -msgstr "Nové okno" +msgstr "Okno" #: core/bind/core_bind.cpp core/project_settings.cpp #, fuzzy @@ -127,7 +125,7 @@ msgstr "PÅ™epnout celou obrazovku" #: core/bind/core_bind.cpp msgid "Maximized" -msgstr "" +msgstr "Maximalizováno" #: core/bind/core_bind.cpp #, fuzzy @@ -224,7 +222,7 @@ msgstr "Paměť" #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: servers/visual_server.cpp msgid "Limits" -msgstr "" +msgstr "Limity" #: core/command_queue_mt.cpp #, fuzzy @@ -284,9 +282,8 @@ msgid "Read Chunk Size" msgstr "" #: core/io/marshalls.cpp -#, fuzzy msgid "Object ID" -msgstr "Kreslené objekty:" +msgstr "ID Objektu" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp #, fuzzy @@ -407,7 +404,7 @@ msgstr "Status" #: core/message_queue.cpp msgid "Message Queue" -msgstr "" +msgstr "Fronta zpráv" #: core/message_queue.cpp msgid "Max Size (KB)" @@ -445,7 +442,7 @@ msgstr "Správa verzÃ" #: core/os/input_event.cpp msgid "Meta" -msgstr "" +msgstr "Meta" #: core/os/input_event.cpp #, fuzzy @@ -519,7 +516,7 @@ msgstr "Profil" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "Tužka invertována" #: core/os/input_event.cpp #, fuzzy @@ -589,7 +586,7 @@ msgstr "Inicializovat" #: core/os/input_event.cpp msgid "Instrument" -msgstr "" +msgstr "Nástroj" #: core/os/input_event.cpp #, fuzzy @@ -663,8 +660,9 @@ msgid "Use Hidden Project Data Directory" msgstr "" #: core/project_settings.cpp +#, fuzzy msgid "Use Custom User Dir" -msgstr "" +msgstr "PoužÃt vlastnà uživatelské dir" #: core/project_settings.cpp msgid "Custom User Dir Name" @@ -1054,8 +1052,9 @@ msgstr "Vyrovnávacà PamÄ›ti" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp +#, fuzzy msgid "Canvas Polygon Buffer Size (KB)" -msgstr "" +msgstr "Velikost zásobnÃku polygonového plátna (v KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1108,7 +1107,7 @@ msgstr "" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Max Renderable Lights" -msgstr "" +msgstr "Maximálnà poÄet renderovatelných svÄ›tel" #: drivers/gles3/rasterizer_scene_gles3.cpp #, fuzzy @@ -1116,8 +1115,9 @@ msgid "Max Renderable Reflections" msgstr "Vycentrovat výbÄ›r" #: drivers/gles3/rasterizer_scene_gles3.cpp +#, fuzzy msgid "Max Lights Per Object" -msgstr "" +msgstr "Maximálnà poÄet svÄ›tel na objekt" #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Subsurface Scattering" @@ -1266,7 +1266,7 @@ msgstr "MnožstvÃ:" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Args" -msgstr "" +msgstr "Argumenty" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/script_editor_debugger.cpp modules/gltf/gltf_accessor.cpp @@ -1289,8 +1289,9 @@ msgstr "Nastavit úchyt" #: editor/import/resource_importer_texture.cpp #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp +#, fuzzy msgid "Stream" -msgstr "" +msgstr "Stream" #: editor/animation_track_editor.cpp #, fuzzy @@ -1577,9 +1578,8 @@ msgstr "Odstranit stopu animace" #: editor/plugins/tile_map_editor_plugin.cpp editor/scene_tree_dock.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Editors" -msgstr "Editor" +msgstr "Editory" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #, fuzzy @@ -2323,7 +2323,7 @@ msgstr "OtevÅ™Ãt" #: editor/dependency_editor.cpp msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "VlastnÃci: %s (Dohromady: %d)" #: editor/dependency_editor.cpp msgid "" @@ -2884,8 +2884,9 @@ msgid "Choose" msgstr "Vyberte" #: editor/editor_export.cpp +#, fuzzy msgid "Project export for platform:" -msgstr "" +msgstr "Exportovat projekt pro platformu:" #: editor/editor_export.cpp #, fuzzy @@ -3015,8 +3016,9 @@ msgid "Binary Format" msgstr "Operátor barvy." #: editor/editor_export.cpp +#, fuzzy msgid "64 Bits" -msgstr "" +msgstr "64 Bitů" #: editor/editor_export.cpp msgid "Embed PCK" @@ -3029,19 +3031,19 @@ msgstr "Oblast textury" #: editor/editor_export.cpp msgid "BPTC" -msgstr "" +msgstr "BPTC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "S3TC" -msgstr "" +msgstr "S3TC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC" -msgstr "" +msgstr "ETC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC2" -msgstr "" +msgstr "ETC2" #: editor/editor_export.cpp msgid "No BPTC Fallbacks" @@ -3090,8 +3092,9 @@ msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." msgstr "PÅ™i 32-bitovým exportu vestavÄ›né PCK nemůže být vÄ›tšà než 4 GiB." #: editor/editor_export.cpp +#, fuzzy msgid "Convert Text Resources To Binary On Export" -msgstr "" +msgstr "Konvertovat textové zdroje do binárky pÅ™i exportu" #: editor/editor_feature_profile.cpp msgid "3D Editor" @@ -3414,8 +3417,9 @@ msgid "Show Hidden Files" msgstr "Zobrazit skryté soubory" #: editor/editor_file_dialog.cpp +#, fuzzy msgid "Disable Overwrite Warning" -msgstr "" +msgstr "Vypnout varovánà pÅ™i pÅ™epsánÃ" #: editor/editor_file_dialog.cpp msgid "Go Back" @@ -3517,8 +3521,9 @@ msgid "(Re)Importing Assets" msgstr "(Re)Importovánà assetů" #: editor/editor_file_system.cpp +#, fuzzy msgid "Reimport Missing Imported Files" -msgstr "" +msgstr "Znovu importovat chybÄ›jÃcà importované soubory" #: editor/editor_help.cpp scene/2d/camera_2d.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/resources/dynamic_font.cpp @@ -3620,9 +3625,8 @@ msgstr "" #: editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp #: modules/gdscript/gdscript_editor.cpp -#, fuzzy msgid "Text Editor" -msgstr "OtevÅ™Ãt editor" +msgstr "Editor textu" #: editor/editor_help.cpp editor/editor_node.cpp editor/editor_settings.cpp #: editor/plugins/shader_editor_plugin.cpp @@ -3631,7 +3635,7 @@ msgstr "NápovÄ›da" #: editor/editor_help.cpp msgid "Sort Functions Alphabetically" -msgstr "" +msgstr "TÅ™Ãdit funkce abecednÄ›" #: editor/editor_help_search.cpp editor/editor_node.cpp #: editor/plugins/script_editor_plugin.cpp @@ -3751,10 +3755,12 @@ msgstr "(hodnota)" msgid "" "Pinning a value forces it to be saved even if it's equal to the default." msgstr "" +"PÅ™ipnutà hodnoty vynutà jejà uloženÃ, i když bude shodná s výchozà hodnotou." #: editor/editor_inspector.cpp +#, fuzzy msgid "Pin value [Disabled because '%s' is editor-only]" -msgstr "" +msgstr "PÅ™ipnout hodnotu [vypnuto jelikož '%s' je pouze v editoru]" #: editor/editor_inspector.cpp #: editor/plugins/gradient_texture_2d_editor_plugin.cpp @@ -3771,11 +3777,11 @@ msgstr "Nastavit vÃce:" #: editor/editor_inspector.cpp msgid "Pinned %s" -msgstr "" +msgstr "PÅ™ipnuté %s" #: editor/editor_inspector.cpp msgid "Unpinned %s" -msgstr "" +msgstr "NepÅ™ipnuté %s" #: editor/editor_inspector.cpp #, fuzzy @@ -4415,80 +4421,73 @@ msgstr "%d vÃce souborů" msgid "" "Unable to write to file '%s', file in use, locked or lacking permissions." msgstr "" +"Nenà možné zapisovat do souboru '%s', soubour je použÃván, uzamÄen nebo " +"chybà oprávnÄ›nÃ." #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp -#, fuzzy msgid "Interface" -msgstr "Uživatelské rozhranÃ" +msgstr "RozhranÃ" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Scene Tabs" -msgstr "PÅ™epnout záložku scény" +msgstr "Karty scén" #: editor/editor_node.cpp -#, fuzzy msgid "Always Show Close Button" -msgstr "Vždy zobrazit mřÞku" +msgstr "Vždy zobrazit tlaÄÃtko zavÅ™enÃ" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Resize If Many Tabs" -msgstr "" +msgstr "ZmÄ›nit velikost pÅ™i velkém poÄtu záložek" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Minimum Width" -msgstr "" +msgstr "Minimálnà šÃÅ™ka" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Output" msgstr "Výstup" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Always Clear Output On Play" -msgstr "Vymazat výstup" +msgstr "Vždy vymazat výstup pÅ™i spuÅ¡tÄ›nÃ" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Open Output On Play" -msgstr "" +msgstr "Vždy otevÅ™Ãt výstup pÅ™i spuÅ¡tÄ›nÃ" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Close Output On Stop" -msgstr "" +msgstr "Vždy zavÅ™Ãt výstup pÅ™i ukonÄenÃ" #: editor/editor_node.cpp msgid "Save On Focus Loss" msgstr "" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Save Each Scene On Quit" -msgstr "Uložit vÄ›tev jako scénu" +msgstr "Uložit vÅ¡echny scény pÅ™i vypnutÃ" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Quit Confirmation" -msgstr "Zobrazit informace" +msgstr "Potvrzenà pÅ™i vypnutÃ" #: editor/editor_node.cpp -#, fuzzy msgid "Show Update Spinner" -msgstr "Schovat aktualizaÄnà koleÄko" +msgstr "Zobrazit aktualizaÄnà koleÄko" #: editor/editor_node.cpp msgid "Update Continuously" msgstr "Aktualizovat průběžnÄ›" #: editor/editor_node.cpp -#, fuzzy msgid "Update Vital Only" -msgstr "ZmÄ›ny materiálu:" +msgstr "Aktualizovat pouze důležité" #: editor/editor_node.cpp -#, fuzzy msgid "Localize Settings" -msgstr "Lokalizace" +msgstr "LokalizaÄnà nastavenÃ" #: editor/editor_node.cpp #, fuzzy @@ -4497,7 +4496,7 @@ msgstr "Uzel TimeSeek" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Show Thumbnail On Hover" -msgstr "" +msgstr "Zobrazit náhled pÅ™i pÅ™ekrytÃ" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Inspector" @@ -5399,69 +5398,64 @@ msgid "Did you forget the '_run' method?" msgstr "NezapomÄ›l jste metodu '_run'?" #: editor/editor_settings.cpp -#, fuzzy msgid "Editor Language" -msgstr "Rozloženà editoru" +msgstr "Jazyk editoru" #: editor/editor_settings.cpp -#, fuzzy msgid "Display Scale" -msgstr "Zobrazit vÅ¡echny" +msgstr "Å kálovánà zobrazenÃ" #: editor/editor_settings.cpp msgid "Custom Display Scale" -msgstr "" +msgstr "Vlastnà škálovánà zobrazenÃ" #: editor/editor_settings.cpp msgid "Main Font Size" -msgstr "" +msgstr "Velikost pÃsma editoru" #: editor/editor_settings.cpp msgid "Code Font Size" -msgstr "" +msgstr "Velikost pÃsma kódu" #: editor/editor_settings.cpp msgid "Font Antialiased" -msgstr "" +msgstr "Vyhlazovánà pÃsma" #: editor/editor_settings.cpp msgid "Font Hinting" -msgstr "" +msgstr "Hinting pÃsma" #: editor/editor_settings.cpp -#, fuzzy msgid "Main Font" -msgstr "Hlavnà scéna" +msgstr "Font editoru" #: editor/editor_settings.cpp msgid "Main Font Bold" -msgstr "" +msgstr "TuÄný font editoru" #: editor/editor_settings.cpp -#, fuzzy msgid "Code Font" -msgstr "PÅ™idat bod uzlu" +msgstr "Font kódu" #: editor/editor_settings.cpp msgid "Dim Editor On Dialog Popup" -msgstr "" +msgstr "Ztmavit editor pÅ™i zobrazenà dialogového okna" #: editor/editor_settings.cpp main/main.cpp msgid "Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "Režim spánku s nÃzkým využitÃm procesoru (µs)" #: editor/editor_settings.cpp msgid "Unfocused Low Processor Mode Sleep (µsec)" -msgstr "" +msgstr "Nezaměřený režim spánku s nÃzkým využitÃm procesoru (µs)" #: editor/editor_settings.cpp -#, fuzzy msgid "Separate Distraction Mode" -msgstr "NerozptylujÃcà režitm" +msgstr "OddÄ›lit nerozptylujÃcà režim" #: editor/editor_settings.cpp msgid "Automatically Open Screenshots" -msgstr "" +msgstr "Automaticky otevÅ™Ãt snÃmky obrazovky" #: editor/editor_settings.cpp msgid "Max Array Dictionary Items Per Page" @@ -5475,58 +5469,54 @@ msgstr "Téma" #: editor/editor_settings.cpp editor/import_dock.cpp msgid "Preset" -msgstr "Profil" +msgstr "PÅ™edvolba" #: editor/editor_settings.cpp msgid "Icon And Font Color" -msgstr "" +msgstr "Barva ikon a pÃsma" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Color" -msgstr "Barvy" +msgstr "Základnà barva" #: editor/editor_settings.cpp -#, fuzzy msgid "Accent Color" -msgstr "Vyberte barvu" +msgstr "Barva zvýraznÄ›nÃ" #: editor/editor_settings.cpp scene/resources/environment.cpp msgid "Contrast" -msgstr "" +msgstr "Kontrast" #: editor/editor_settings.cpp +#, fuzzy msgid "Relationship Line Opacity" -msgstr "" +msgstr "Průhlednost linky relace" #: editor/editor_settings.cpp -#, fuzzy msgid "Highlight Tabs" -msgstr "Ukládám svÄ›telné mapy" +msgstr "Zvýraznit karty" #: editor/editor_settings.cpp -#, fuzzy msgid "Border Size" -msgstr "HraniÄnà pixely" +msgstr "Velikost okrajů" #: editor/editor_settings.cpp +#, fuzzy msgid "Use Graph Node Headers" -msgstr "" +msgstr "PoužÃt uzly záhlavà grafů" #: editor/editor_settings.cpp #, fuzzy msgid "Additional Spacing" -msgstr "Opakovánà animace" +msgstr "PÅ™Ãdavné mezerovánÃ" #: editor/editor_settings.cpp -#, fuzzy msgid "Custom Theme" -msgstr "Motiv editoru" +msgstr "Vlastnà téma" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Script Button" -msgstr "Pravé tlaÄÃtko koleÄka" +msgstr "Ukázat tlaÄÃtko skriptu" #: editor/editor_settings.cpp #, fuzzy @@ -5539,9 +5529,8 @@ msgid "Autoscan Project Path" msgstr "Cesta k projektu:" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Project Path" -msgstr "Cesta k projektu:" +msgstr "Výchozà cesta k projektu" #: editor/editor_settings.cpp #, fuzzy @@ -5563,9 +5552,8 @@ msgid "File Dialog" msgstr "XForm dialog" #: editor/editor_settings.cpp -#, fuzzy msgid "Thumbnail Size" -msgstr "Náhled..." +msgstr "Velikost náhledu" #: editor/editor_settings.cpp msgid "Docks" @@ -5578,83 +5566,73 @@ msgstr "Úpravy stromu scény" #: editor/editor_settings.cpp msgid "Start Create Dialog Fully Expanded" -msgstr "" +msgstr "PlnÄ› rozbalit dialog vytvoÅ™enà pÅ™i spuÅ¡tÄ›nÃ" #: editor/editor_settings.cpp -#, fuzzy msgid "Always Show Folders" -msgstr "Vždy zobrazit mřÞku" +msgstr "Vždy zobrazit složky" #: editor/editor_settings.cpp -#, fuzzy msgid "Property Editor" -msgstr "Editor skupin" +msgstr "Editor oblasti" #: editor/editor_settings.cpp msgid "Auto Refresh Interval" -msgstr "" +msgstr "Automatický interval obnovenÃ" #: editor/editor_settings.cpp -#, fuzzy msgid "Subresource Hue Tint" -msgstr "DÃlÄà zdroje" +msgstr "Podzdroj odstÃnu" #: editor/editor_settings.cpp -#, fuzzy msgid "Color Theme" -msgstr "Motiv editoru" +msgstr "Barevné téma" #: editor/editor_settings.cpp scene/3d/label_3d.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Line Spacing" -msgstr "" +msgstr "ŘádkovánÃ" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp -#, fuzzy msgid "Highlighting" -msgstr "PÅ™Ãmé osvÄ›tlenÃ" +msgstr "ZvýrazňovánÃ" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Syntax Highlighting" -msgstr "ZvýrazňovaÄ syntaxe" +msgstr "Zvýrazňovánà syntaxe" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight All Occurrences" -msgstr "" +msgstr "Zvýraznit vÅ¡echny výskyty" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight Current Line" -msgstr "" +msgstr "Zvýraznit aktuálnà řádek" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Highlight Type Safe Lines" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Indent" -msgstr "Odsadit zleva" +msgstr "OdsazenÃ" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Auto Indent" msgstr "Automatické odsazenÃ" #: editor/editor_settings.cpp -#, fuzzy msgid "Convert Indent On Save" -msgstr "PÅ™evést odsazenà na mezery" +msgstr "Konvertovat odsazenà pÅ™i uloženÃ" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Tabs" -msgstr "Vykreslovacà volánÃ:" +msgstr "Vykreslit taby" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Spaces" -msgstr "Vykreslovacà volánÃ:" +msgstr "Vykreslit mezery" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/tile_map.cpp @@ -5665,47 +5643,43 @@ msgstr "Navigace" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Smooth Scrolling" -msgstr "" +msgstr "Plynulé posouvánÃ" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "V Scroll Speed" -msgstr "" +msgstr "Vertikálnà rychlost posouvánÃ" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Minimap" -msgstr "Zobrazit poÄátek" +msgstr "Zobrazit minimapu" #: editor/editor_settings.cpp msgid "Minimap Width" -msgstr "" +msgstr "Å ÃÅ™ka minimapy" #: editor/editor_settings.cpp msgid "Mouse Extra Buttons Navigate History" -msgstr "" +msgstr "NavigaÄnà historie extra tlaÄÃtek myÅ¡i" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "GridMap Vyplnit výbÄ›r" +msgstr "VýbÄ›r pÅ™etaženÃm" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "Zůstat v editoru skriptu pÅ™i výbÄ›ru uzlu" #: editor/editor_settings.cpp msgid "Appearance" -msgstr "" +msgstr "Vzhled" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Show Line Numbers" -msgstr "ÄŒÃslo řádku:" +msgstr "Zobrazit ÄÃsla řádků" #: editor/editor_settings.cpp -#, fuzzy msgid "Line Numbers Zero Padded" -msgstr "ÄŒÃslo řádku:" +msgstr "Vyplnit ÄÃsla řádků nulami" #: editor/editor_settings.cpp msgid "Show Bookmark Gutter" @@ -5722,32 +5696,31 @@ msgstr "" #: editor/editor_settings.cpp msgid "Code Folding" -msgstr "" +msgstr "Složenà kódu" #: editor/editor_settings.cpp msgid "Word Wrap" -msgstr "" +msgstr "ZalamovánÃ" #: editor/editor_settings.cpp msgid "Show Line Length Guidelines" -msgstr "" +msgstr "Zobrazit vodÃcà Äáry délky řádků" #: editor/editor_settings.cpp msgid "Line Length Guideline Soft Column" -msgstr "" +msgstr "MÄ›kký sloupec Äáry délky řádku" #: editor/editor_settings.cpp msgid "Line Length Guideline Hard Column" -msgstr "" +msgstr "Tvrdý sloupec Äáry délky řádku" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Script List" -msgstr "Editor skriptů" +msgstr "Seznam skriptů" #: editor/editor_settings.cpp msgid "Show Members Overview" -msgstr "" +msgstr "Zobrazit pÅ™ehled Älenů" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -5932,9 +5905,8 @@ msgid "Primary Grid Steps" msgstr "Krok mřÞky:" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid Size" -msgstr "Krok mřÞky:" +msgstr "Velikost mřÞky" #: editor/editor_settings.cpp msgid "Grid Division Level Max" @@ -6192,9 +6164,8 @@ msgid "Onion Layers Future Color" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Visual Editors" -msgstr "Editor skupin" +msgstr "Vizuálnà editory" #: editor/editor_settings.cpp msgid "Minimap Opacity" @@ -6279,76 +6250,70 @@ msgstr "PÅ™ejmenovánà složky:" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Symbol Color" -msgstr "" +msgstr "Barva znaků" #: editor/editor_settings.cpp msgid "Keyword Color" -msgstr "" +msgstr "Barva klÃÄových slov" #: editor/editor_settings.cpp msgid "Control Flow Keyword Color" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Type Color" -msgstr "ZmÄ›nit základnà typ" +msgstr "Barva základnÃho typu" #: editor/editor_settings.cpp msgid "Engine Type Color" -msgstr "" +msgstr "Barva typu enginu" #: editor/editor_settings.cpp msgid "User Type Color" -msgstr "" +msgstr "Barva typu uživatele" #: editor/editor_settings.cpp msgid "Comment Color" -msgstr "" +msgstr "Barva komentářů" #: editor/editor_settings.cpp -#, fuzzy msgid "String Color" -msgstr "Ukládám soubor:" +msgstr "Barva Å™etÄ›zců" #: editor/editor_settings.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Background Color" -msgstr "Neplatná barva pozadÃ." +msgstr "Barva pozadÃ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Background Color" -msgstr "Neplatná barva pozadÃ." +msgstr "Barva výplnÄ› pozadÃ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Selected Color" -msgstr "Importovat vybrané" +msgstr "Barva výplnÄ› výbÄ›ru" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +#, fuzzy msgid "Completion Existing Color" -msgstr "" +msgstr "Barva výbÄ›ru existence" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Scroll Color" -msgstr "" +msgstr "Barva výplnÄ› scrollu" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Font Color" -msgstr "" +msgstr "Barva výplnÄ› fontu" #: editor/editor_settings.cpp -#, fuzzy msgid "Text Color" -msgstr "Dalšàpatro" +msgstr "Barva textu" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Line Number Color" -msgstr "ÄŒÃslo řádku:" +msgstr "Barva ÄÃsla řádku" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -6357,82 +6322,73 @@ msgstr "ÄŒÃslo řádku:" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" -msgstr "" +msgstr "Barva vynechávky" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Caret Background Color" -msgstr "Neplatná barva pozadÃ." +msgstr "Barva pozadà vynechávky" #: editor/editor_settings.cpp -#, fuzzy msgid "Text Selected Color" -msgstr "Smazat vybraný" +msgstr "Barva vybraného textu" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Color" -msgstr "Pouze výbÄ›r" +msgstr "Barva výbÄ›ru" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Brace Mismatch Color" -msgstr "" +msgstr "Barva neshody závorek" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Current Line Color" -msgstr "Aktuálnà scéna" +msgstr "Barva aktuálnÃho řádku" #: editor/editor_settings.cpp msgid "Line Length Guideline Color" -msgstr "" +msgstr "Barva Äáry délky řádku" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Word Highlighted Color" -msgstr "ZvýrazňovaÄ syntaxe" +msgstr "Barva zvýraznÄ›ného slova" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Number Color" -msgstr "" +msgstr "Barva ÄÃsel" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Function Color" -msgstr "Funkce" +msgstr "Barva funkcÃ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy msgid "Member Variable Color" -msgstr "PÅ™ejmenovat promÄ›nnou" +msgstr "Barva promÄ›nného Älena" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Mark Color" -msgstr "Vyberte barvu" +msgstr "Barva oznaÄenÃ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Bookmark Color" -msgstr "Záložky" +msgstr "Barva záložky" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Breakpoint Color" -msgstr "Breakpointy" +msgstr "Barva bodu pÅ™eruÅ¡enà (Breakpointu)" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp +#, fuzzy msgid "Executing Line Color" -msgstr "" +msgstr "Barva provádÄ›jÃcà se linky" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Code Folding Color" -msgstr "" +msgstr "Barva složenà kódu" #: editor/editor_settings.cpp -#, fuzzy msgid "Search Result Color" -msgstr "Výsledky hledánÃ" +msgstr "Barva výsledků hledánÃ" #: editor/editor_settings.cpp #, fuzzy @@ -6749,7 +6705,7 @@ msgstr "" #: editor/plugins/version_control_editor_plugin.cpp #: platform/uwp/export/export.cpp platform/windows/export/export.cpp msgid "Password" -msgstr "" +msgstr "Heslo" #: editor/filesystem_dock.cpp msgid "Favorites" @@ -7489,7 +7445,7 @@ msgstr "Pevné pixely" #: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp msgid "Lossy Quality" -msgstr "" +msgstr "Ztrátová kvalita" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7498,14 +7454,14 @@ msgstr "Režim výbÄ›ru" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" -msgstr "" +msgstr "BPTC LDR" #: editor/import/resource_importer_texture.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp #: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp msgid "Normal Map" -msgstr "" +msgstr "Normálová mapa" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7542,7 +7498,7 @@ msgstr "Velikost: " #: editor/import/resource_importer_texture.cpp msgid "Detect 3D" -msgstr "" +msgstr "Detekovat 3D" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7554,6 +7510,8 @@ msgid "" "Warning, no suitable PC VRAM compression enabled in Project Settings. This " "texture will not display correctly on PC." msgstr "" +"UpozornÄ›nÃ, žádná vhodná PC VRAM komprese nenà povolena v nastavenà " +"projektu. Tato textura se na PC nebude zobrazovat správnÄ›." #: editor/import/resource_importer_texture_atlas.cpp #, fuzzy @@ -7571,8 +7529,9 @@ msgid "Crop To Region" msgstr "Nastavit oblast textury" #: editor/import/resource_importer_texture_atlas.cpp +#, fuzzy msgid "Trim Alpha Border From Region" -msgstr "" +msgstr "OÅ™Ãznout ohraniÄenà alfa z oblasti" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp #, fuzzy @@ -7580,8 +7539,9 @@ msgid "Force" msgstr "Vnutit nahrátÃ" #: editor/import/resource_importer_wav.cpp +#, fuzzy msgid "8 Bit" -msgstr "" +msgstr "8 Bit" #: editor/import/resource_importer_wav.cpp main/main.cpp #: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp @@ -7601,7 +7561,7 @@ msgstr "Uzel Mix" #: editor/import/resource_importer_wav.cpp msgid "Trim" -msgstr "" +msgstr "OÅ™Ãznout" #: editor/import/resource_importer_wav.cpp #, fuzzy @@ -7694,6 +7654,8 @@ msgid "" "Select a resource file in the filesystem or in the inspector to adjust " "import settings." msgstr "" +"Vyberte zdrojový soubor v prohlÞeÄi souboru nebo v inspektoru k úpravÄ› " +"nastavenà importu." #: editor/inspector_dock.cpp msgid "Failed to load resource." @@ -7720,7 +7682,7 @@ msgstr "Jazyky" #: editor/inspector_dock.cpp msgid "Localization not available for current language." -msgstr "" +msgstr "Lokalizace nenà dostupná pro aktuálnà jazyk." #: editor/inspector_dock.cpp msgid "Copy Properties" @@ -8592,7 +8554,7 @@ msgstr "Filtry..." #: editor/plugins/asset_library_editor_plugin.cpp scene/main/http_request.cpp msgid "Use Threads" -msgstr "" +msgstr "PoužÃt vlákna" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" @@ -8825,7 +8787,7 @@ msgstr "Testované" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed to get repository configuration." -msgstr "" +msgstr "NepodaÅ™ilo se zÃskat konfiguraci repozitáře." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" @@ -8883,7 +8845,7 @@ msgstr "Zapéct lightmapy" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "LightMap Bake" -msgstr "" +msgstr "Zapéct lightmapu" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Select lightmap bake file:" @@ -9234,7 +9196,7 @@ msgstr "Režim Å¡kálovánÃ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Shift: Scale proportionally." -msgstr "" +msgstr "Shift: ZvÄ›tÅ¡ovat proporÄnÄ›." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -9400,11 +9362,11 @@ msgstr "Zobrazit mřÞku" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy msgid "Show When Snapping" -msgstr "Chytré pÅ™ichcovánÃ" +msgstr "Zobrazit pÅ™i skoku" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Hide" -msgstr "" +msgstr "Schovat" #: editor/plugins/canvas_item_editor_plugin.cpp #, fuzzy @@ -9789,7 +9751,7 @@ msgstr "Ikona" #: editor/plugins/item_list_editor_plugin.cpp msgid "ID" -msgstr "" +msgstr "ID" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp @@ -10916,11 +10878,11 @@ msgstr "Výsledky hledánÃ" #: editor/plugins/script_editor_plugin.cpp msgid "Open Dominant Script On Scene Change" -msgstr "" +msgstr "OtevÅ™Ãt dominantnà skript pÅ™i zmÄ›nÄ› scény" #: editor/plugins/script_editor_plugin.cpp msgid "External" -msgstr "" +msgstr "ExternÃ" #: editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -10933,37 +10895,32 @@ msgid "Exec Path" msgstr "Exportovat cestu" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Script Temperature Enabled" -msgstr "Vybrat soubor Å¡ablony" +msgstr "Povolit teplotu skriptu" #: editor/plugins/script_editor_plugin.cpp msgid "Highlight Current Script" -msgstr "" +msgstr "Zvýraznit aktuálnà skript" #: editor/plugins/script_editor_plugin.cpp msgid "Script Temperature History Size" -msgstr "" +msgstr "Velikost historie teploty skriptu" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Current Script Background Color" -msgstr "Neplatná barva pozadÃ." +msgstr "Barva pozadà momentálnÃho skriptu" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Group Help Pages" -msgstr "Seskupit vybrané" +msgstr "Seskupit stránky s nápovÄ›dou" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort Scripts By" -msgstr "VytvoÅ™it skript" +msgstr "SeÅ™adit skripty podle" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "List Script Names As" -msgstr "Název skriptu:" +msgstr "Zobrazit názvy seznamu skriptů jako" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" @@ -11667,11 +11624,11 @@ msgstr "PÅ™epnout volný pohled" #: editor/plugins/spatial_editor_plugin.cpp msgid "Decrease Field of View" -msgstr "" +msgstr "ZmenÅ¡it zorné pole" #: editor/plugins/spatial_editor_plugin.cpp msgid "Increase Field of View" -msgstr "" +msgstr "ZvÄ›tÅ¡it zorné pole" #: editor/plugins/spatial_editor_plugin.cpp #, fuzzy @@ -12255,9 +12212,8 @@ msgid "Select all Theme items with item data." msgstr "" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Deselect All" -msgstr "Vybrat vÅ¡e" +msgstr "ZruÅ¡it vÅ¡echen výbÄ›r" #: editor/plugins/theme_editor_plugin.cpp msgid "Deselect all Theme items." @@ -13188,9 +13144,10 @@ msgstr "Možnosti pÅ™ichycenÃ" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Offset(Posun):" @@ -14639,16 +14596,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Neplatná cesta k projektu (nÄ›co se zmÄ›nilo?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Nelze naÄÃst project.godot v umÃstÄ›nà projektu (chyba %d). Může chybÄ›t nebo " "být poÅ¡kozený." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "Nelze upravit project.godot v umÃstÄ›nà projektu." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Nelze otevÅ™Ãt projekt v '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -15852,13 +15810,12 @@ msgid "Clear Inheritance? (No Undo!)" msgstr "Vymazat dÄ›diÄnost? (Nelze vrátit zpÄ›t!)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Show Scene Tree Root Selection" -msgstr "Vycentrovat výbÄ›r" +msgstr "Zobrazit výbÄ›r Tree Root ze scény" #: editor/scene_tree_dock.cpp msgid "Derive Script Globals By Name" -msgstr "" +msgstr "NaÄÃtat globálnà promÄ›nné skritpu podle názvu" #: editor/scene_tree_dock.cpp #, fuzzy @@ -16767,7 +16724,7 @@ msgstr "" #: main/main.cpp msgid "Fullsize" -msgstr "" +msgstr "Plná velikost" #: main/main.cpp scene/resources/dynamic_font.cpp #, fuzzy @@ -16805,9 +16762,8 @@ msgid "Emulate Mouse From Touch" msgstr "" #: main/main.cpp -#, fuzzy msgid "Mouse Cursor" -msgstr "TlaÄÃtko myÅ¡i" +msgstr "Kurzor myÅ¡i" #: main/main.cpp #, fuzzy @@ -16881,7 +16837,7 @@ msgstr "PÅ™ichytit ke stranám uzlu" #: main/main.cpp msgid "Dynamic Fonts" -msgstr "" +msgstr "Dynamické fonty" #: main/main.cpp msgid "Use Oversampling" @@ -16921,21 +16877,18 @@ msgid "Calculate Tangents" msgstr "" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Use Collision" -msgstr "Kolize" +msgstr "PoužÃt kolize" #: modules/csg/csg_shape.cpp servers/physics_2d_server.cpp -#, fuzzy msgid "Collision Layer" -msgstr "Koliznà režim" +msgstr "Koliznà vrstva" #: modules/csg/csg_shape.cpp scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp #: scene/3d/ray_cast.cpp scene/3d/spring_arm.cpp #: scene/resources/navigation_mesh.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Mask" -msgstr "Koliznà režim" +msgstr "Koliznà maska" #: modules/csg/csg_shape.cpp #, fuzzy @@ -16950,9 +16903,8 @@ msgstr "ZmÄ›nit velikost pÃsmen" #: scene/resources/cylinder_shape.cpp scene/resources/environment.cpp #: scene/resources/navigation_mesh.cpp scene/resources/primitive_meshes.cpp #: scene/resources/sphere_shape.cpp -#, fuzzy msgid "Radius" -msgstr "PolomÄ›r:" +msgstr "PolomÄ›r" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp #, fuzzy @@ -17278,7 +17230,7 @@ msgstr "" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Use Thread" -msgstr "" +msgstr "PoužÃt vlákno" #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp #, fuzzy @@ -17310,9 +17262,8 @@ msgid "Normalized" msgstr "Formát" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Count" -msgstr "MnožstvÃ:" +msgstr "MnožstvÃ" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp #, fuzzy @@ -17370,9 +17321,8 @@ msgid "Indices" msgstr "VÅ¡echna zaÅ™ÃzenÃ" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "FOV Size" -msgstr "Velikost:" +msgstr "Velikost pohledu" #: modules/gltf/gltf_camera.cpp msgid "Zfar" @@ -19442,9 +19392,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "Neplatné jméno souboru! Android APK vyžaduje pÅ™Ãponu *.apk." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "Nepodporovaný formát exportu!\n" +msgstr "Nepodporovaný formát exportu!" #: platform/android/export/export_plugin.cpp msgid "" @@ -19455,15 +19404,12 @@ msgstr "" "verzi. PÅ™einstalujte jej z nabÃdky \"Projekt\"." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"Neshoda verzà Android buildu:\n" -" Å ablona nainstalována: %s\n" -" Verze Godot: %s\n" -"PÅ™einstalujte Å¡ablonu pro sestavenà systému Android z nabÃdky \"Projekt\"." +"Neshoda verzà Android buildu: Å ablona nainstalována: %s, Verze Godotu: %s. " +"ProsÃm, pÅ™einstalujte Android build Å¡ablonu z nabÃdky \"Projekt\"." #: platform/android/export/export_plugin.cpp msgid "" @@ -19471,9 +19417,8 @@ msgid "" msgstr "" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "Nelze exportovat soubory projektu do projektu gradle\n" +msgstr "Nelze exportovat soubory projektu do projektu gradle." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -19484,12 +19429,11 @@ msgid "Building Android Project (gradle)" msgstr "Buildovánà projektu pro Android (gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"Buildovánà projektu pro Android se nezdaÅ™ilo, zkontrolujte chybový výstup.\n" +"Buildovánà projektu pro Android se nezdaÅ™ilo, zkontrolujte chybový výstup. " "PÅ™ÃpadnÄ› navÅ¡tivte dokumentaci o build pro Android na docs.godotengine.org." #: platform/android/export/export_plugin.cpp @@ -19514,11 +19458,8 @@ msgid "Creating APK..." msgstr "VytvářÃm APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"NepodaÅ™ilo se najÃt Å¡ablonu APK pro export:\n" -"%s" +msgstr "NepodaÅ™ilo se najÃt Å¡ablonu APK pro export: \"%s\"" #: platform/android/export/export_plugin.cpp msgid "" @@ -19640,7 +19581,7 @@ msgstr "" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Info" -msgstr "" +msgstr "Info" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -21384,7 +21325,7 @@ msgstr "MÃstnà projekty" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Draw Order" -msgstr "" +msgstr "PoÅ™adà vykreslovánÃ" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21424,7 +21365,7 @@ msgstr "SmÄ›ry" #: scene/resources/particles_material.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Spread" -msgstr "" +msgstr "RozÅ¡ÃÅ™it" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21442,7 +21383,7 @@ msgstr "Inicializovat" #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Angular Velocity" -msgstr "" +msgstr "Úhlová rychlost" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21494,12 +21435,12 @@ msgstr "" #: scene/resources/particles_material.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Damping" -msgstr "" +msgstr "TlumenÃ" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Damping Random" -msgstr "" +msgstr "Náhodné tlumenÃ" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21510,12 +21451,12 @@ msgstr "RozdÄ›lit kÅ™ivku" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/light.cpp #: scene/resources/particles_material.cpp msgid "Angle" -msgstr "" +msgstr "Úhel" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Angle Random" -msgstr "" +msgstr "Náhodný úhel" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21529,8 +21470,9 @@ msgid "Scale Amount" msgstr "MnožstvÃ:" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp +#, fuzzy msgid "Scale Amount Random" -msgstr "" +msgstr "Å kálovat náhodnou hodnotu" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #, fuzzy @@ -21639,12 +21581,12 @@ msgstr "Deaktivované tlaÄÃtko" #: scene/2d/joints_2d.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "Softness" -msgstr "" +msgstr "MÄ›kkost" #: scene/2d/joints_2d.cpp scene/resources/animation.cpp #: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp msgid "Length" -msgstr "" +msgstr "Délka" #: scene/2d/joints_2d.cpp #, fuzzy @@ -21657,7 +21599,7 @@ msgstr "" #: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp scene/3d/vehicle_body.cpp msgid "Stiffness" -msgstr "" +msgstr "Tuhost" #: scene/2d/light_2d.cpp msgid "" @@ -21679,15 +21621,15 @@ msgstr "Oblast textury" #: scene/3d/light.cpp scene/resources/environment.cpp #: scene/resources/material.cpp scene/resources/sky.cpp msgid "Energy" -msgstr "" +msgstr "Energie" #: scene/2d/light_2d.cpp msgid "Z Min" -msgstr "" +msgstr "Z Min" #: scene/2d/light_2d.cpp msgid "Z Max" -msgstr "" +msgstr "Z Max" #: scene/2d/light_2d.cpp #, fuzzy @@ -21754,8 +21696,9 @@ msgid "Default Color" msgstr "VýchozÃ" #: scene/2d/line_2d.cpp scene/resources/texture.cpp +#, fuzzy msgid "Fill" -msgstr "" +msgstr "Výplň" #: scene/2d/line_2d.cpp scene/resources/texture.cpp #, fuzzy @@ -23678,9 +23621,8 @@ msgid "A RoomGroup should not be a child or grandchild of a Portal." msgstr "" #: scene/3d/portal.cpp -#, fuzzy msgid "Portal Active" -msgstr " [aktivnà portály]" +msgstr "Aktivnà portál" #: scene/3d/portal.cpp scene/resources/occluder_shape_polygon.cpp msgid "Two Way" @@ -23820,8 +23762,9 @@ msgid "There should only be one RoomManager in the SceneTree." msgstr "" #: scene/3d/room_manager.cpp +#, fuzzy msgid "Main" -msgstr "" +msgstr "HlavnÃ" #: scene/3d/room_manager.cpp scene/animation/animation_blend_tree.cpp #: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp @@ -23833,7 +23776,7 @@ msgstr "Akce" #: scene/3d/room_manager.cpp msgid "Roomlist" -msgstr "" +msgstr "Seznam mÃstnostÃ" #: scene/3d/room_manager.cpp servers/visual_server.cpp #, fuzzy @@ -23852,7 +23795,7 @@ msgstr "Soubor ZIP" #: scene/3d/room_manager.cpp servers/visual_server.cpp msgid "Gameplay" -msgstr "" +msgstr "Hratelnost" #: scene/3d/room_manager.cpp #, fuzzy @@ -23909,8 +23852,9 @@ msgid "" msgstr "" #: scene/3d/room_manager.cpp +#, fuzzy msgid "RoomList contains no Rooms, aborting." -msgstr "" +msgstr "Seznam mÃstnostà neobsahuje žádné mÃstnosti, pÅ™eruÅ¡ovánÃ." #: scene/3d/room_manager.cpp msgid "Misnamed nodes detected, check output log for details. Aborting." @@ -24135,6 +24079,15 @@ msgstr "Chyba" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "SeÅ™adit" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" @@ -24711,7 +24664,7 @@ msgstr "Vlastnosti motivu" #: scene/gui/dialogs.cpp msgid "Window Title" -msgstr "" +msgstr "Název okna" #: scene/gui/dialogs.cpp #, fuzzy @@ -24777,7 +24730,7 @@ msgstr "Zobrazit kosti" #: scene/gui/graph_edit.cpp scene/gui/text_edit.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Minimap" -msgstr "" +msgstr "Minimapa" #: scene/gui/graph_edit.cpp msgid "Enable grid minimap." @@ -24830,7 +24783,7 @@ msgstr "Vyplnit výbÄ›r" #: scene/gui/item_list.cpp msgid "Max Text Lines" -msgstr "" +msgstr "Maximálnà poÄet řádků textu" #: scene/gui/item_list.cpp #, fuzzy @@ -24839,15 +24792,15 @@ msgstr "Testované" #: scene/gui/item_list.cpp msgid "Max Columns" -msgstr "" +msgstr "Maximálnà poÄet sloupců" #: scene/gui/item_list.cpp msgid "Same Column Width" -msgstr "" +msgstr "Stejná Å¡ÃÅ™ka sloupce" #: scene/gui/item_list.cpp msgid "Fixed Column Width" -msgstr "" +msgstr "Pevná Å¡ÃÅ™ka sloupce" #: scene/gui/item_list.cpp #, fuzzy @@ -24876,15 +24829,16 @@ msgstr "PÅ™epnout viditelnost" #: scene/gui/label.cpp msgid "Lines Skipped" -msgstr "" +msgstr "PÅ™eskoÄené řádky" #: scene/gui/label.cpp +#, fuzzy msgid "Max Lines Visible" -msgstr "" +msgstr "Maximálnà poÄet viditelných řádků" #: scene/gui/line_edit.cpp scene/resources/navigation_mesh.cpp msgid "Max Length" -msgstr "" +msgstr "Maximálnà délka" #: scene/gui/line_edit.cpp msgid "Secret" @@ -25290,7 +25244,7 @@ msgstr "Složka:" #: scene/gui/text_edit.cpp #, fuzzy msgid "Drag And Drop Selection Enabled" -msgstr "Pouze výbÄ›r" +msgstr "VýbÄ›r pÅ™etaženÃm povolen" #: scene/gui/text_edit.cpp #, fuzzy @@ -25956,9 +25910,8 @@ msgid "H Separation" msgstr "OddÄ›lenÃ:" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Underline Spacing" -msgstr "Opakovánà animace" +msgstr "Mezera podtrženÃ" #: scene/resources/default_theme/default_theme.cpp msgid "Arrow" diff --git a/editor/translations/da.po b/editor/translations/da.po index e83ef150e4..bb158fcada 100644 --- a/editor/translations/da.po +++ b/editor/translations/da.po @@ -18,13 +18,14 @@ # Autowinto <happymansi@hotmail.com>, 2020, 2021. # Mikkel Mouridsen <mikkelmouridsen@me.com>, 2020, 2021, 2022. # snakatk <snaqii@live.dk>, 2021. +# Mattis Møl Kristensen <mattismoel@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-04-08 07:29+0000\n" -"Last-Translator: Mikkel Mouridsen <mikkelmouridsen@me.com>\n" +"PO-Revision-Date: 2022-11-02 18:47+0000\n" +"Last-Translator: Mattis Møl Kristensen <mattismoel@gmail.com>\n" "Language-Team: Danish <https://hosted.weblate.org/projects/godot-engine/" "godot/da/>\n" "Language: da\n" @@ -32,7 +33,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.14.2-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -147,7 +148,7 @@ msgstr "Redaktør" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "" +msgstr "Udskriv fejlmeddelelser" #: core/bind/core_bind.cpp #, fuzzy @@ -13427,9 +13428,10 @@ msgstr "Singleton" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14855,13 +14857,13 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "" +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Kan ikke Ã¥bne projekt" #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -24174,6 +24176,15 @@ msgstr "Fejl!" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Sorter" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/de.po b/editor/translations/de.po index 7244c02cc1..61a5a51b9c 100644 --- a/editor/translations/de.po +++ b/editor/translations/de.po @@ -86,13 +86,14 @@ # Tim <sakul8826@gmail.com>, 2022. # Anonynonymouse <tom.spaine60388@gmail.com>, 2022. # Felix Bitsch <felix.a.bitsch@gmail.com>, 2022. +# miguel <miguel-gonzalez@gmx.de>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-11 22:22+0000\n" -"Last-Translator: So Wieso <sowieso@dukun.de>\n" +"PO-Revision-Date: 2022-12-13 13:21+0000\n" +"Last-Translator: ‎ <artism90@googlemail.com>\n" "Language-Team: German <https://hosted.weblate.org/projects/godot-engine/" "godot/de/>\n" "Language: de\n" @@ -100,7 +101,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -12889,9 +12890,10 @@ msgstr "Einrasteinstellungen" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "Versatz" @@ -13069,7 +13071,7 @@ msgstr "Pfad des privaten SSH-Schlüssels auswählen" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "SSH-Passphrase" +msgstr "SSH Schlüsseltext" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" @@ -14306,16 +14308,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Ungültiger Projektpfad (etwas geändert?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Die Datei project.godot im Projektpfad konnte nicht geladen werden (Fehler " "%d). Sie könnte fehlen oder beschädigt sein." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "project.godot des Projektpfads konnte nicht bearbeitet werden." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Projekt in ‚%s‘ kann nicht geöffnet werden." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -16312,7 +16315,7 @@ msgstr "Ausrichtung" #: main/main.cpp scene/gui/scroll_container.cpp scene/gui/text_edit.cpp #: scene/main/scene_tree.cpp scene/register_scene_types.cpp msgid "Common" -msgstr "Gewöhnlich" +msgstr "Allgemein" #: main/main.cpp msgid "Physics FPS" @@ -23251,6 +23254,16 @@ msgstr "Max Kraft" msgid "AABB" msgstr "AABB" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Sortiere" + +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Use AABB Center" +msgstr "Ambient verwenden" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "Geometrie" diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot index fb76a2c2c7..7b7bfd71cc 100644 --- a/editor/translations/editor.pot +++ b/editor/translations/editor.pot @@ -12352,9 +12352,10 @@ msgstr "" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13683,12 +13684,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22180,6 +22180,14 @@ msgstr "" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +msgid "Sorting" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/el.po b/editor/translations/el.po index 3ab08f3dbd..98873c7d40 100644 --- a/editor/translations/el.po +++ b/editor/translations/el.po @@ -13281,9 +13281,10 @@ msgstr "ΕπιλογÎÏ‚ Î Ïοσκόλλησης" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Μετατόπιση:" @@ -14747,17 +14748,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Μη ÎγκυÏη διαδÏομή ÎÏγου (Αλλάξατε τίποτα;)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "ΑδÏνατη η φόÏτωση του project.godot (σφάλμα %d). ΜποÏεί να λείπει ή να είναι " "κατεστÏαμÎνο." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "" -"Δεν ήταν δυνατή η επεξεÏγασία του project.godot στη διαδÏομή του ÎÏγου." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Αδυνατό το άνοιγμα του ÎÏγου στο «%s»." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -24321,6 +24322,15 @@ msgstr "Σφάλμα" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Ταξινόμηση" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/en_Shaw.po b/editor/translations/en_Shaw.po index 63ce9ca3d5..60caed0d9d 100644 --- a/editor/translations/en_Shaw.po +++ b/editor/translations/en_Shaw.po @@ -12406,9 +12406,10 @@ msgstr "ð‘¨ð‘¯ð‘¦ð‘¥ð‘±ð‘–ð‘©ð‘¯ ð‘¤ð‘µð‘ð‘¦ð‘™" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13745,12 +13746,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22359,6 +22359,15 @@ msgstr "ð‘¥ð‘¦ð‘®ð‘¼" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "ð‘¦ð‘¯ð‘‘ð‘»ð‘ð‘©ð‘¤ð‘±ð‘–ð‘©ð‘¯ ð‘¥ð‘´ð‘›" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/eo.po b/editor/translations/eo.po index 2bcbc62274..04205e10d6 100644 --- a/editor/translations/eo.po +++ b/editor/translations/eo.po @@ -13088,9 +13088,10 @@ msgstr "Opcioj de kaptado" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Krada deÅovo:" @@ -14472,16 +14473,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Nevalida dosierindiko de projekto (ÅanÄis ion ajn?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Ne eblas Åargi project.godot en projekta dosierindiko (eraro %d). Äœi eble " "estas manka aÅ difektita." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "Ne eblas redakti project.godot en projekta dosierindiko." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Ne eblas malfermi projekton ĉe '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -23733,6 +23735,15 @@ msgstr "Eraro!" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Enportas:" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/es.po b/editor/translations/es.po index 629b36eea7..5d683058c3 100644 --- a/editor/translations/es.po +++ b/editor/translations/es.po @@ -43,7 +43,7 @@ # Dario <darlex259@gmail.com>, 2019. # Adolfo Jayme Barrientos <fitojb@ubuntu.com>, 2019. # Julián Luini <jluini@gmail.com>, 2020. -# Victor S. <victorstancioiu@gmail.com>, 2020, 2021. +# Victor S. <victorstancioiu@gmail.com>, 2020, 2021, 2022. # henry rujano herrera <rujhen@gmail.com>, 2020. # Megamega53 <Christopher.Morales21@myhunter.cuny.edu>, 2020. # Serk Lintur <serk.lintur@gmail.com>, 2020. @@ -60,7 +60,7 @@ # Lucasdelpiero <lucasdelpiero98@gmail.com>, 2021. # SteamGoblin <SteamGoblin860@gmail.com>, 2021. # Francisco C <pruebasfrancisco17@gmail.com>, 2021. -# Cam <cameron.toms@gmail.com>, 2021. +# Cam <cameron.toms@gmail.com>, 2021, 2022. # Juan camilo <jugarciago01@gmail.com>, 2021. # Manuel González <mgoopazo@gmail.com>, 2021. # softonicblip <blazeawardspace@gmail.com>, 2021. @@ -89,12 +89,14 @@ # Fernando Joaquin Manzano Lopez <ticantin12@gmail.com>, 2022. # M3CG <cgmario1999@gmail.com>, 2022. # Chalan <Valentin06ch@outlook.com>, 2022. +# Luis Miguel Soto Sánchez <luismiguelsoto@jerez.es>, 2022. +# Victor Stancioiu <victorstancioiu@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-27 21:37+0000\n" +"PO-Revision-Date: 2022-11-16 22:47+0000\n" "Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n" "Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/" "godot/es/>\n" @@ -103,7 +105,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -9706,7 +9708,7 @@ msgstr "" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "Create Simplified Convex Collision Sibling" -msgstr "Crear Forma de Colisión Conexa Hermana" +msgstr "Crear Collider Conexo Hermano" #: editor/plugins/mesh_instance_editor_plugin.cpp msgid "" @@ -12886,9 +12888,10 @@ msgstr "Opciones de Ajuste" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "Offset" @@ -14305,16 +14308,17 @@ msgid "Invalid project path (changed anything?)." msgstr "La ruta del proyecto no es correcta (¿has cambiado algo?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "No se pudo cargar project.godot desde la ruta de proyecto (error %d). La " "ruta no existe o está corrupta." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "No se pudo editar project.godot en la ruta del proyecto." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "No se puede abrir el proyecto en '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -16336,7 +16340,7 @@ msgstr "Imprimir FPS" #: main/main.cpp msgid "Verbose stdout" -msgstr "" +msgstr "Stdout Extendido" #: main/main.cpp scene/main/scene_tree.cpp scene/resources/multimesh.cpp msgid "Physics Interpolation" @@ -16507,7 +16511,7 @@ msgstr "Aceptar Cierre Del Programa Automáticamente" #: main/main.cpp scene/main/scene_tree.cpp msgid "Quit On Go Back" -msgstr "Salir y Regresar" +msgstr "Salir al Ir Atrás" #: main/main.cpp scene/main/viewport.cpp msgid "Snap Controls To Pixels" @@ -19557,7 +19561,7 @@ msgstr "Depuración" #: platform/osx/export/export.cpp msgid "App Sandbox" -msgstr "App Sandbox" +msgstr "Sandbox de App" #: platform/osx/export/export.cpp msgid "Network Server" @@ -19675,6 +19679,8 @@ msgid "" "Could not start codesign executable, make sure Xcode command line tools are " "installed." msgstr "" +"No se ha podido iniciar el ejecutable de codificación, asegúrate de que las " +"herramientas de lÃnea de comandos de Xcode están instaladas." #: platform/osx/export/export.cpp platform/windows/export/export.cpp msgid "No identity found." @@ -19700,11 +19706,11 @@ msgstr "No se ha podido iniciar el ejecutable hdiutil." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." -msgstr "" +msgstr "`hdiutil create` falló - el archivo ya existe." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed." -msgstr "" +msgstr "`hdiutil create` falló." #: platform/osx/export/export.cpp msgid "Creating app bundle" @@ -19918,11 +19924,11 @@ msgstr "" #: platform/osx/export/export.cpp msgid "macOS" -msgstr "" +msgstr "macOS" #: platform/osx/export/export.cpp msgid "Force Builtin Codesign" -msgstr "" +msgstr "Forzar Codificación Integrada" #: platform/uwp/export/export.cpp msgid "Architecture" @@ -19938,7 +19944,7 @@ msgstr "Nombre Corto" #: platform/uwp/export/export.cpp msgid "Publisher" -msgstr "" +msgstr "Editor" #: platform/uwp/export/export.cpp msgid "Publisher Display Name" @@ -19966,11 +19972,11 @@ msgstr "Algoritmo" #: platform/uwp/export/export.cpp msgid "Major" -msgstr "" +msgstr "Mayor" #: platform/uwp/export/export.cpp msgid "Minor" -msgstr "" +msgstr "Menor" #: platform/uwp/export/export.cpp msgid "Build" @@ -19982,7 +19988,7 @@ msgstr "Revisión" #: platform/uwp/export/export.cpp msgid "Landscape" -msgstr "" +msgstr "Landscape" #: platform/uwp/export/export.cpp msgid "Portrait" @@ -19990,11 +19996,11 @@ msgstr "Retrato" #: platform/uwp/export/export.cpp msgid "Landscape Flipped" -msgstr "" +msgstr "Landscape Volteado" #: platform/uwp/export/export.cpp msgid "Portrait Flipped" -msgstr "" +msgstr "Retrato Invertido" #: platform/uwp/export/export.cpp msgid "Store Logo" @@ -20002,23 +20008,23 @@ msgstr "Logo de Tienda" #: platform/uwp/export/export.cpp msgid "Square 44 X 44 Logo" -msgstr "" +msgstr "Logo Cuadrado 44 X 44" #: platform/uwp/export/export.cpp msgid "Square 71 X 71 Logo" -msgstr "" +msgstr "Logo Cuadrado 71 X 71" #: platform/uwp/export/export.cpp msgid "Square 150 X 150 Logo" -msgstr "" +msgstr "Logo Cuadrado 150 X 150" #: platform/uwp/export/export.cpp msgid "Square 310 X 310 Logo" -msgstr "" +msgstr "Logo Cuadrado 310x310" #: platform/uwp/export/export.cpp msgid "Wide 310 X 150 Logo" -msgstr "" +msgstr "Logotipo Panorámico 310 X 150" #: platform/uwp/export/export.cpp msgid "Splash Screen" @@ -20030,15 +20036,15 @@ msgstr "Tiles" #: platform/uwp/export/export.cpp msgid "Show Name On Square 150 X 150" -msgstr "" +msgstr "Mostrar Nombre en Cuadrado 150 X 150" #: platform/uwp/export/export.cpp msgid "Show Name On Wide 310 X 150" -msgstr "" +msgstr "Mostrar Nombre en Panorámico 310 X 150" #: platform/uwp/export/export.cpp msgid "Show Name On Square 310 X 310" -msgstr "" +msgstr "Mostrar Nombre en Cuadrado 310 X 310" #: platform/uwp/export/export.cpp msgid "" @@ -20113,7 +20119,7 @@ msgstr "" #: platform/uwp/export/export.cpp msgid "UWP" -msgstr "" +msgstr "UWP" #: platform/uwp/export/export.cpp platform/windows/export/export.cpp msgid "Signtool" @@ -20121,7 +20127,7 @@ msgstr "Signtool" #: platform/uwp/export/export.cpp msgid "Debug Certificate" -msgstr "" +msgstr "Certificado de Depuración" #: platform/uwp/export/export.cpp msgid "Debug Algorithm" @@ -20133,11 +20139,11 @@ msgstr "Fallo al renombrar el archivo temporal \"%s\"." #: platform/windows/export/export.cpp msgid "Identity Type" -msgstr "" +msgstr "Tipo de Identidad" #: platform/windows/export/export.cpp msgid "Timestamp Server URL" -msgstr "" +msgstr "URL del Servidor de Marcas de Tiempo" #: platform/windows/export/export.cpp msgid "Digest Algorithm" @@ -20169,7 +20175,7 @@ msgstr "Descripción del Archivo" #: platform/windows/export/export.cpp msgid "Trademarks" -msgstr "" +msgstr "Marcas comerciales" #: platform/windows/export/export.cpp msgid "Resources Modification" @@ -20254,7 +20260,7 @@ msgstr "Versión de producto no válida:" #: platform/windows/export/export.cpp msgid "Windows executables cannot be >= 4 GiB." -msgstr "" +msgstr "Los ejecutables de Windows no pueden ser >= 4 GiB." #: platform/windows/export/export.cpp platform/x11/export/export.cpp msgid "Failed to open executable file \"%s\"." @@ -20262,11 +20268,11 @@ msgstr "Fallo al abrir el archivo ejecutable \"%s\"." #: platform/windows/export/export.cpp platform/x11/export/export.cpp msgid "Executable file header corrupted." -msgstr "" +msgstr "La cabecera del archivo ejecutable está corrupta." #: platform/windows/export/export.cpp platform/x11/export/export.cpp msgid "Executable \"pck\" section not found." -msgstr "" +msgstr "No se encuentra la sección ejecutable \"pck\"." #: platform/windows/export/export.cpp msgid "Windows" @@ -20274,19 +20280,19 @@ msgstr "Windows" #: platform/windows/export/export.cpp msgid "Rcedit" -msgstr "" +msgstr "Rcedit" #: platform/windows/export/export.cpp msgid "Osslsigncode" -msgstr "" +msgstr "Osslsigncode" #: platform/windows/export/export.cpp msgid "Wine" -msgstr "" +msgstr "Wine" #: platform/x11/export/export.cpp msgid "32-bit executables cannot have embedded data >= 4 GiB." -msgstr "" +msgstr "Los ejecutables de 32 bits no pueden tener datos embebidos >= 4 GiB." #: scene/2d/animated_sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/texture.cpp @@ -20319,12 +20325,12 @@ msgstr "Centrado" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp msgid "Flip H" -msgstr "" +msgstr "Voltear H" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp msgid "Flip V" -msgstr "" +msgstr "Voltear V" #: scene/2d/area_2d.cpp scene/3d/area.cpp msgid "Monitoring" @@ -20357,7 +20363,7 @@ msgstr "Velocidad de la Gravedad" #: scene/2d/area_2d.cpp scene/2d/cpu_particles_2d.cpp scene/3d/area.cpp #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp msgid "Gravity" -msgstr "" +msgstr "Gravedad" #: scene/2d/area_2d.cpp scene/3d/area.cpp msgid "Linear Damp" @@ -20365,7 +20371,7 @@ msgstr "Amortiguación Lineal" #: scene/2d/area_2d.cpp scene/3d/area.cpp msgid "Angular Damp" -msgstr "" +msgstr "Amortiguación Angular" #: scene/2d/area_2d.cpp scene/3d/area.cpp msgid "Audio Bus" @@ -20394,7 +20400,7 @@ msgstr "Reproducción Automática" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp msgid "Stream Paused" -msgstr "" +msgstr "Stream Pausado" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/3d/light.cpp scene/3d/reflection_probe.cpp @@ -20414,7 +20420,7 @@ msgstr "Bus" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp msgid "Area Mask" -msgstr "" +msgstr "Máscara de Ãrea" #: scene/2d/back_buffer_copy.cpp msgid "Copy Mode" @@ -20489,7 +20495,7 @@ msgstr "Suavizar" #: scene/2d/camera_2d.cpp msgid "H" -msgstr "" +msgstr "H" #: scene/2d/camera_2d.cpp msgid "V" @@ -20526,11 +20532,11 @@ msgstr "Animación de PartÃculas" #: scene/2d/canvas_item.cpp msgid "Particles Anim H Frames" -msgstr "" +msgstr "Animación de partÃculas Fotogramas H" #: scene/2d/canvas_item.cpp msgid "Particles Anim V Frames" -msgstr "" +msgstr "Animación de partÃculas Fotogramas V" #: scene/2d/canvas_item.cpp msgid "Particles Anim Loop" @@ -20551,7 +20557,7 @@ msgstr "Modulación Automática" #: scene/2d/canvas_item.cpp msgid "Show Behind Parent" -msgstr "" +msgstr "Mostrar detrás del padre" #: scene/2d/canvas_item.cpp msgid "Show On Top" @@ -20564,7 +20570,7 @@ msgstr "Máscara de Luz" #: scene/2d/canvas_item.cpp msgid "Use Parent Material" -msgstr "" +msgstr "Usar el material del padre" #: scene/2d/canvas_modulate.cpp msgid "" @@ -20686,7 +20692,7 @@ msgstr "Emitiendo" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Lifetime" -msgstr "" +msgstr "Tiempo de vida" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp scene/main/timer.cpp @@ -20701,7 +20707,7 @@ msgstr "Preproceso" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Explosiveness" -msgstr "" +msgstr "Explosividad" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -20711,7 +20717,7 @@ msgstr "Aleatoriedad" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Lifetime Randomness" -msgstr "" +msgstr "Aleatoriedad para siempre" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -20721,12 +20727,12 @@ msgstr "FPS Fijos" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Fract Delta" -msgstr "" +msgstr "Fracción Delta" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Drawing" -msgstr "" +msgstr "Dibujo" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -20736,7 +20742,7 @@ msgstr "Coordenadas Locales" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Draw Order" -msgstr "" +msgstr "Orden de dibujo" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20770,7 +20776,7 @@ msgstr "Dirección" #: scene/resources/particles_material.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Spread" -msgstr "" +msgstr "Propagación" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20786,7 +20792,7 @@ msgstr "Velocidad Aleatoria" #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Angular Velocity" -msgstr "" +msgstr "Velocidad angular" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20811,7 +20817,7 @@ msgstr "Aceleración" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Accel Random" -msgstr "" +msgstr "Aceleración aleatoria" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20821,12 +20827,12 @@ msgstr "Curva de Aceleración" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Radial Accel" -msgstr "" +msgstr "Aceleración radial" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Tangential Accel" -msgstr "" +msgstr "Aceleración tangencial" #: scene/2d/cpu_particles_2d.cpp scene/2d/joints_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/physics_body.cpp @@ -20834,12 +20840,12 @@ msgstr "" #: scene/resources/particles_material.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Damping" -msgstr "" +msgstr "Amortiguación" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Damping Random" -msgstr "" +msgstr "Amortiguación Aleatoria" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20849,12 +20855,12 @@ msgstr "Curva de Amortiguación" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/light.cpp #: scene/resources/particles_material.cpp msgid "Angle" -msgstr "" +msgstr "Ãngulo" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Angle Random" -msgstr "" +msgstr "Ãngulo aleatorio" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20867,7 +20873,7 @@ msgstr "Cantidad de Escala" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp msgid "Scale Amount Random" -msgstr "" +msgstr "Cantidad de escalado aleatoria" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp msgid "Scale Amount Curve" @@ -20881,7 +20887,7 @@ msgstr "Rampa de Color" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Color Initial Ramp" -msgstr "" +msgstr "Color Rampa Inicial" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20955,7 +20961,7 @@ msgstr "Nodo B" #: scene/3d/light.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp #: scene/resources/environment.cpp msgid "Bias" -msgstr "" +msgstr "Tendencia" #: scene/2d/joints_2d.cpp msgid "Disable Collision" @@ -20963,12 +20969,12 @@ msgstr "Desactivar Colisión" #: scene/2d/joints_2d.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "Softness" -msgstr "" +msgstr "Suavidad" #: scene/2d/joints_2d.cpp scene/resources/animation.cpp #: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp msgid "Length" -msgstr "" +msgstr "Longitud" #: scene/2d/joints_2d.cpp msgid "Initial Offset" @@ -20976,11 +20982,11 @@ msgstr "Offset Inicial" #: scene/2d/joints_2d.cpp scene/3d/vehicle_body.cpp msgid "Rest Length" -msgstr "" +msgstr "Duración de Reposo" #: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp scene/3d/vehicle_body.cpp msgid "Stiffness" -msgstr "" +msgstr "Rigidez" #: scene/2d/light_2d.cpp msgid "" @@ -21002,15 +21008,15 @@ msgstr "Escala de Textura" #: scene/3d/light.cpp scene/resources/environment.cpp #: scene/resources/material.cpp scene/resources/sky.cpp msgid "Energy" -msgstr "" +msgstr "EnergÃa" #: scene/2d/light_2d.cpp msgid "Z Min" -msgstr "" +msgstr "Z MÃn" #: scene/2d/light_2d.cpp msgid "Z Max" -msgstr "" +msgstr "Z Máx" #: scene/2d/light_2d.cpp msgid "Layer Min" @@ -21022,7 +21028,7 @@ msgstr "Capa Máxima" #: scene/2d/light_2d.cpp msgid "Item Cull Mask" -msgstr "" +msgstr "Ãtem Cull Mask" #: scene/2d/light_2d.cpp scene/3d/light.cpp scene/resources/style_box.cpp msgid "Shadow" @@ -21103,11 +21109,11 @@ msgstr "Borde" #: scene/2d/line_2d.cpp msgid "Sharp Limit" -msgstr "" +msgstr "LÃmite de nitidez" #: scene/2d/line_2d.cpp msgid "Round Precision" -msgstr "" +msgstr "Precisión redondeada" #: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp #: scene/resources/dynamic_font.cpp @@ -21122,7 +21128,7 @@ msgstr "Multimesh" #: scene/3d/navigation.cpp scene/animation/root_motion_view.cpp #: scene/resources/world_2d.cpp servers/physics_2d/physics_2d_server_sw.cpp msgid "Cell Size" -msgstr "" +msgstr "Tamaño de la casilla" #: scene/2d/navigation_2d.cpp scene/3d/navigation.cpp msgid "Edge Connection Margin" @@ -21134,6 +21140,9 @@ msgid "" "will be removed in a future version. Use 'Navigation2DServer.map_get_path()' " "instead." msgstr "" +"El nodo 'Navigation2D' y 'Navigation2D.get_simple_path()' están deprecados y " +"serán eliminados en una versión future. En su lugar, usa 'Navigation2DServer." +"map_get_path()'." #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Pathfinding" @@ -21328,7 +21337,7 @@ msgstr "Visibilidad Rect" #: scene/2d/particles_2d.cpp scene/3d/particles.cpp msgid "Process Material" -msgstr "" +msgstr "Material de Proceso" #: scene/2d/path_2d.cpp scene/3d/path.cpp scene/resources/sky.cpp #: scene/resources/texture.cpp @@ -21354,11 +21363,11 @@ msgstr "Offset V" #: scene/2d/path_2d.cpp scene/3d/path.cpp msgid "Cubic Interp" -msgstr "" +msgstr "Interp. Cúbica" #: scene/2d/path_2d.cpp msgid "Lookahead" -msgstr "" +msgstr "Preveer" #: scene/2d/physics_body_2d.cpp scene/3d/visual_instance.cpp msgid "Layers" @@ -21380,11 +21389,11 @@ msgstr "Fricción" #: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp #: scene/resources/physics_material.cpp msgid "Bounce" -msgstr "" +msgstr "Rebotar" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Physics Material Override" -msgstr "" +msgstr "Reemplazar el material de fÃsicas" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: scene/resources/world.cpp scene/resources/world_2d.cpp @@ -21403,7 +21412,7 @@ msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Mass" -msgstr "" +msgstr "Masa" #: scene/2d/physics_body_2d.cpp msgid "Inertia" @@ -21415,7 +21424,7 @@ msgstr "Peso" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Gravity Scale" -msgstr "" +msgstr "Escala de gravedad" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Custom Integrator" @@ -21427,7 +21436,7 @@ msgstr "CD Continuo" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Contacts Reported" -msgstr "" +msgstr "Contactos reportados" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Contact Monitor" @@ -21444,19 +21453,19 @@ msgstr "Puede Dormir" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Damp" -msgstr "" +msgstr "Humedad" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Angular" -msgstr "" +msgstr "Angular" #: scene/2d/physics_body_2d.cpp msgid "Applied Forces" -msgstr "" +msgstr "Fuerzas aplicadas" #: scene/2d/physics_body_2d.cpp msgid "Torque" -msgstr "" +msgstr "Torsión" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Safe Margin" @@ -21472,7 +21481,7 @@ msgstr "Plataforma Móvil" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Apply Velocity On Leave" -msgstr "" +msgstr "Aplicar velocidad al salir" #: scene/2d/physics_body_2d.cpp scene/2d/touch_screen_button.cpp #: scene/3d/physics_body.cpp scene/gui/texture_button.cpp @@ -21497,7 +21506,7 @@ msgstr "Colisionador" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Collider ID" -msgstr "" +msgstr "ID de colisionador" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp @@ -21520,11 +21529,11 @@ msgstr "Velocidad del Colisionador" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Collider Metadata" -msgstr "" +msgstr "Metadatos del colisionador" #: scene/2d/polygon_2d.cpp msgid "Invert" -msgstr "" +msgstr "Invertir" #: scene/2d/polygon_2d.cpp msgid "Vertex Colors" @@ -21540,7 +21549,7 @@ msgstr "Extensión de Gizmos" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp msgid "Exclude Parent" -msgstr "" +msgstr "Excluir Padre" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp msgid "Cast To" @@ -21548,15 +21557,15 @@ msgstr "Lanzar A" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp msgid "Collide With" -msgstr "" +msgstr "Colisionar con" #: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp msgid "Areas" -msgstr "" +msgstr "Ãreas" #: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp msgid "Bodies" -msgstr "" +msgstr "Cuerpos" #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." @@ -21596,11 +21605,11 @@ msgstr "" #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp msgid "Hframes" -msgstr "" +msgstr "Fotogramas H" #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp msgid "Vframes" -msgstr "" +msgstr "Fotogramas V" #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp msgid "Frame Coords" @@ -21658,7 +21667,7 @@ msgstr "Texturas Centradas" #: scene/2d/tile_map.cpp msgid "Cell Clip UV" -msgstr "" +msgstr "Clip de Celda UV" #: scene/2d/tile_map.cpp msgid "Use Parent" @@ -21666,7 +21675,7 @@ msgstr "Usar Padres" #: scene/2d/tile_map.cpp msgid "Use Kinematic" -msgstr "" +msgstr "Usar cinemática" #: scene/2d/touch_screen_button.cpp msgid "Shape Centered" @@ -21678,7 +21687,7 @@ msgstr "Forma Visible" #: scene/2d/touch_screen_button.cpp msgid "Passby Press" -msgstr "" +msgstr "Prensa de paso" #: scene/2d/touch_screen_button.cpp msgid "Visibility Mode" @@ -21698,7 +21707,7 @@ msgstr "Pausar Animaciones" #: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp msgid "Freeze Bodies" -msgstr "" +msgstr "Congelar cuerpos" #: scene/2d/visibility_notifier_2d.cpp msgid "Pause Particles" @@ -21714,11 +21723,11 @@ msgstr "Procesamiento de los Padres" #: scene/2d/visibility_notifier_2d.cpp msgid "Physics Process Parent" -msgstr "" +msgstr "Procesado de FÃsicas Padre" #: scene/3d/area.cpp msgid "Reverb Bus" -msgstr "" +msgstr "Bus de reverberación" #: scene/3d/area.cpp msgid "Uniformity" @@ -21730,11 +21739,11 @@ msgstr "ARVRCamera tiene que tener un nodo ARVROrigin como padre." #: scene/3d/arvr_nodes.cpp msgid "Controller ID" -msgstr "" +msgstr "ID del controlador" #: scene/3d/arvr_nodes.cpp servers/arvr/arvr_positional_tracker.cpp msgid "Rumble" -msgstr "" +msgstr "Retumbar" #: scene/3d/arvr_nodes.cpp msgid "ARVRController must have an ARVROrigin node as its parent." @@ -21778,19 +21787,19 @@ msgstr "Modelo de Atenuación" #: scene/3d/audio_stream_player_3d.cpp msgid "Unit dB" -msgstr "" +msgstr "dB de la unidad" #: scene/3d/audio_stream_player_3d.cpp msgid "Unit Size" -msgstr "" +msgstr "Tamaño de la unidad" #: scene/3d/audio_stream_player_3d.cpp msgid "Max dB" -msgstr "" +msgstr "dB Máx" #: scene/3d/audio_stream_player_3d.cpp msgid "Out Of Range Mode" -msgstr "" +msgstr "Modo fuera de rango" #: scene/3d/audio_stream_player_3d.cpp msgid "Emission Angle" @@ -21806,13 +21815,13 @@ msgstr "Filtro de Atenuación dB" #: scene/3d/audio_stream_player_3d.cpp msgid "Attenuation Filter" -msgstr "" +msgstr "Filtro de atenuación" #: scene/3d/audio_stream_player_3d.cpp #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_filter.cpp msgid "Cutoff Hz" -msgstr "" +msgstr "Hz de cierre" #: scene/3d/audio_stream_player_3d.cpp #: servers/audio/effects/audio_effect_filter.cpp @@ -21830,7 +21839,7 @@ msgstr "Seguimiento" #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp #: scene/3d/reflection_probe.cpp msgid "Interior" -msgstr "" +msgstr "Interior" #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" @@ -21864,15 +21873,15 @@ msgstr "Extensiones" #: scene/3d/baked_lightmap.cpp msgid "Tweaks" -msgstr "" +msgstr "Retoques" #: scene/3d/baked_lightmap.cpp msgid "Bounces" -msgstr "" +msgstr "Rebotes" #: scene/3d/baked_lightmap.cpp msgid "Bounce Indirect Energy" -msgstr "" +msgstr "EnergÃa indirecta del rebote" #: scene/3d/baked_lightmap.cpp msgid "Use Denoiser" @@ -21880,7 +21889,7 @@ msgstr "Usar Eliminador de Ruido" #: scene/3d/baked_lightmap.cpp scene/resources/texture.cpp msgid "Use HDR" -msgstr "" +msgstr "Usar HDR" #: scene/3d/baked_lightmap.cpp msgid "Use Color" @@ -21940,11 +21949,11 @@ msgstr "Nombre del Hueso" #: scene/3d/camera.cpp msgid "Keep Aspect" -msgstr "" +msgstr "Mantener aspecto" #: scene/3d/camera.cpp scene/3d/light.cpp scene/3d/reflection_probe.cpp msgid "Cull Mask" -msgstr "" +msgstr "Cull Mask" #: scene/3d/camera.cpp msgid "Doppler Tracking" @@ -21956,7 +21965,7 @@ msgstr "Proyección" #: scene/3d/camera.cpp msgid "FOV" -msgstr "" +msgstr "FOV" #: scene/3d/camera.cpp msgid "Frustum Offset" @@ -21968,7 +21977,7 @@ msgstr "Cercano" #: scene/3d/camera.cpp msgid "Far" -msgstr "" +msgstr "Lejos" #: scene/3d/camera.cpp scene/3d/collision_polygon.cpp scene/3d/spring_arm.cpp #: scene/gui/control.cpp scene/resources/default_theme/default_theme.cpp @@ -21984,7 +21993,7 @@ msgstr "Recortar A" #: scene/3d/collision_object.cpp scene/3d/soft_body.cpp msgid "Ray Pickable" -msgstr "" +msgstr "Seleccionable por Rayo" #: scene/3d/collision_object.cpp msgid "Capture On Drag" @@ -22089,7 +22098,7 @@ msgstr "Desactivar Z" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp msgid "Flatness" -msgstr "" +msgstr "Llanura" #: scene/3d/cull_instance.cpp servers/visual_server.cpp msgid "Portals" @@ -22101,11 +22110,11 @@ msgstr "Modo Portal" #: scene/3d/cull_instance.cpp msgid "Include In Bound" -msgstr "" +msgstr "Incluir en lÃmite" #: scene/3d/cull_instance.cpp msgid "Allow Merging" -msgstr "" +msgstr "Permitir fusión" #: scene/3d/cull_instance.cpp msgid "Autoplace Priority" @@ -22139,7 +22148,7 @@ msgstr "" #: scene/3d/gi_probe.cpp msgid "Subdiv" -msgstr "" +msgstr "Subdividir" #: scene/3d/gi_probe.cpp msgid "Dynamic Range" @@ -22147,7 +22156,7 @@ msgstr "Rango Dinámico" #: scene/3d/gi_probe.cpp scene/3d/light.cpp msgid "Normal Bias" -msgstr "" +msgstr "Tendencia normal" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp #: scene/resources/primitive_meshes.cpp @@ -22156,7 +22165,7 @@ msgstr "Tamaño de PÃxeles" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp msgid "Billboard" -msgstr "" +msgstr "Billboard" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp msgid "Shaded" @@ -22164,11 +22173,11 @@ msgstr "Sombreado" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp msgid "Double Sided" -msgstr "" +msgstr "Doble cara" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp msgid "No Depth Test" -msgstr "" +msgstr "Sin test de profundidad" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp msgid "Fixed Size" @@ -22176,11 +22185,11 @@ msgstr "Tamaño Fijo" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp msgid "Alpha Cut" -msgstr "" +msgstr "Corte alfa" #: scene/3d/label_3d.cpp scene/resources/material.cpp msgid "Alpha Scissor Threshold" -msgstr "" +msgstr "Umbral de recorte alfa" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp msgid "Render Priority" @@ -22266,7 +22275,7 @@ msgstr "Rango de Profundidad" #: scene/3d/light.cpp msgid "Omni" -msgstr "" +msgstr "Omni" #: scene/3d/light.cpp msgid "Shadow Mode" @@ -22283,7 +22292,7 @@ msgstr "" #: scene/3d/light.cpp msgid "Spot" -msgstr "" +msgstr "Ubicar" #: scene/3d/light.cpp msgid "Angle Attenuation" @@ -22303,6 +22312,9 @@ msgid "" "be removed in a future version. Use 'NavigationServer.map_get_path()' " "instead." msgstr "" +"El nodo 'Navigation' y 'Navigation.get_simple_path()' están obsoletos y " +"serán eliminados en una futura versión. Utiliza en su lugar " +"'NavigationServer.map_get_path()'." #: scene/3d/navigation.cpp scene/resources/curve.cpp msgid "Up Vector" @@ -22471,7 +22483,7 @@ msgstr "Restringir Articulaciones" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "Impulse Clamp" -msgstr "" +msgstr "Restricción de Impulso" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "Swing Span" @@ -22479,7 +22491,7 @@ msgstr "Expansión de Swing" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "Twist Span" -msgstr "" +msgstr "Extensión de Torsión" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp #: scene/3d/vehicle_body.cpp @@ -22632,7 +22644,7 @@ msgstr "El nodo A y el nodo B deben ser diferentes PhysicsBody" #: scene/3d/physics_joint.cpp msgid "Solver" -msgstr "" +msgstr "Resolver" #: scene/3d/physics_joint.cpp msgid "Exclude Nodes" @@ -22644,7 +22656,7 @@ msgstr "Parámetros" #: scene/3d/physics_joint.cpp msgid "Angular Limit" -msgstr "" +msgstr "LÃmite Angular" #: scene/3d/physics_joint.cpp msgid "Upper" @@ -22724,15 +22736,15 @@ msgstr "Amortiguación Lineal X" #: scene/3d/physics_joint.cpp msgid "Equilibrium Point" -msgstr "" +msgstr "Punto de Equilibrio" #: scene/3d/physics_joint.cpp msgid "Angular Limit X" -msgstr "" +msgstr "LÃmite Angular X" #: scene/3d/physics_joint.cpp msgid "Angular Motor X" -msgstr "" +msgstr "Motor Angular X" #: scene/3d/physics_joint.cpp msgid "Angular Spring X" @@ -22752,11 +22764,11 @@ msgstr "Amortiguación Lineal Y" #: scene/3d/physics_joint.cpp msgid "Angular Limit Y" -msgstr "" +msgstr "LÃmite Angular Y" #: scene/3d/physics_joint.cpp msgid "Angular Motor Y" -msgstr "" +msgstr "Motor Angular Y" #: scene/3d/physics_joint.cpp msgid "Angular Spring Y" @@ -22776,11 +22788,11 @@ msgstr "Amortiguación Lineal Z" #: scene/3d/physics_joint.cpp msgid "Angular Limit Z" -msgstr "" +msgstr "LÃmite Angular Z" #: scene/3d/physics_joint.cpp msgid "Angular Motor Z" -msgstr "" +msgstr "Motor Angular Z" #: scene/3d/physics_joint.cpp msgid "Angular Spring Z" @@ -22804,7 +22816,7 @@ msgstr "Portal Activo" #: scene/3d/portal.cpp scene/resources/occluder_shape_polygon.cpp msgid "Two Way" -msgstr "" +msgstr "Doble VÃa" #: scene/3d/portal.cpp msgid "Linked Room" @@ -22820,7 +22832,7 @@ msgstr "Nombre del Grupo" #: scene/3d/proximity_group.cpp msgid "Dispatch Mode" -msgstr "" +msgstr "Modo de Entrega" #: scene/3d/proximity_group.cpp msgid "Grid Radius" @@ -22832,7 +22844,7 @@ msgstr "Depurar Shape" #: scene/3d/ray_cast.cpp scene/resources/style_box.cpp msgid "Thickness" -msgstr "" +msgstr "Espesor" #: scene/3d/reflection_probe.cpp scene/main/viewport.cpp msgid "Update Mode" @@ -22897,11 +22909,11 @@ msgstr "Usar Simplificación Predeterminada" #: scene/3d/room.cpp scene/3d/room_manager.cpp msgid "Room Simplify" -msgstr "" +msgstr "Simplificar Room" #: scene/3d/room.cpp msgid "Bound" -msgstr "" +msgstr "Conectado" #: scene/3d/room_group.cpp msgid "Roomgroup Priority" @@ -22933,7 +22945,7 @@ msgstr "Sólo debe haber un RoomManager en el SceneTree." #: scene/3d/room_manager.cpp msgid "Main" -msgstr "" +msgstr "Principal" #: scene/3d/room_manager.cpp scene/animation/animation_blend_tree.cpp #: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp @@ -22960,7 +22972,7 @@ msgstr "Nombre del Archivo PVS" #: scene/3d/room_manager.cpp servers/visual_server.cpp msgid "Gameplay" -msgstr "" +msgstr "Gameplay" #: scene/3d/room_manager.cpp msgid "Gameplay Monitor" @@ -22984,7 +22996,7 @@ msgstr "Depurar Extensión" #: scene/3d/room_manager.cpp msgid "Overlap Warning Threshold" -msgstr "" +msgstr "Umbral de Advertencia de Solapamiento" #: scene/3d/room_manager.cpp msgid "Preview Camera" @@ -22992,7 +23004,7 @@ msgstr "Vista previa de la Cámara" #: scene/3d/room_manager.cpp msgid "Portal Depth Limit" -msgstr "" +msgstr "LÃmite de Profundidad del Portal" #: scene/3d/room_manager.cpp msgid "Default Portal Margin" @@ -23074,7 +23086,7 @@ msgstr "Ãndice de Puntos" #: scene/3d/soft_body.cpp msgid "Spatial Attachment Path" -msgstr "" +msgstr "Ruta del Adjunto Espacial" #: scene/3d/soft_body.cpp msgid "Physics Enabled" @@ -23094,31 +23106,31 @@ msgstr "Masa Total" #: scene/3d/soft_body.cpp msgid "Linear Stiffness" -msgstr "" +msgstr "Rigidez Lineal" #: scene/3d/soft_body.cpp msgid "Areaangular Stiffness" -msgstr "" +msgstr "Rigidez Ãrea-angular" #: scene/3d/soft_body.cpp msgid "Volume Stiffness" -msgstr "" +msgstr "Rigidez de volumen" #: scene/3d/soft_body.cpp msgid "Pressure Coefficient" -msgstr "" +msgstr "Coeficiente de presión" #: scene/3d/soft_body.cpp msgid "Damping Coefficient" -msgstr "" +msgstr "Coeficiente de amortización" #: scene/3d/soft_body.cpp msgid "Drag Coefficient" -msgstr "" +msgstr "Coeficiente de resistencia" #: scene/3d/soft_body.cpp msgid "Pose Matching Coefficient" -msgstr "" +msgstr "Coeficiente de Adaptación de la Pose" #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." @@ -23156,7 +23168,7 @@ msgstr "Cantidad de Amortiguación" #: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp msgid "Opacity" -msgstr "" +msgstr "Opacidad" #: scene/3d/sprite_3d.cpp scene/resources/material.cpp msgid "Transparent" @@ -23188,15 +23200,15 @@ msgstr "Fuerza del Motor" #: scene/3d/vehicle_body.cpp msgid "Brake" -msgstr "" +msgstr "Freno" #: scene/3d/vehicle_body.cpp msgid "Steering" -msgstr "" +msgstr "Dirección" #: scene/3d/vehicle_body.cpp msgid "VehicleBody Motion" -msgstr "" +msgstr "Movimiento del VehicleBody" #: scene/3d/vehicle_body.cpp msgid "Use As Traction" @@ -23204,7 +23216,7 @@ msgstr "Usar Como Tracción" #: scene/3d/vehicle_body.cpp msgid "Use As Steering" -msgstr "" +msgstr "Usar Como Dirección" #: scene/3d/vehicle_body.cpp msgid "Wheel" @@ -23212,7 +23224,7 @@ msgstr "Rueda" #: scene/3d/vehicle_body.cpp msgid "Roll Influence" -msgstr "" +msgstr "Influencia del Rodaje" #: scene/3d/vehicle_body.cpp msgid "Friction Slip" @@ -23230,6 +23242,16 @@ msgstr "Fuerza Máxima" msgid "AABB" msgstr "AABB" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Ordenar" + +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Use AABB Center" +msgstr "Usar Ambiente" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "GeometrÃa" @@ -23260,7 +23282,7 @@ msgstr "Generar Lightmap" #: scene/3d/visual_instance.cpp msgid "Lightmap Scale" -msgstr "" +msgstr "Escala de Lightmap" #: scene/3d/visual_instance.cpp msgid "LOD" @@ -23273,11 +23295,11 @@ msgstr "Distancia MÃnima" #: scene/3d/visual_instance.cpp msgid "Min Hysteresis" -msgstr "" +msgstr "Histéresis MÃnima" #: scene/3d/visual_instance.cpp msgid "Max Hysteresis" -msgstr "" +msgstr "Histéresis Máxima" #: scene/3d/world_environment.cpp msgid "" @@ -23333,7 +23355,7 @@ msgstr "Reinicio Automático" #: scene/animation/animation_blend_tree.cpp msgid "Delay" -msgstr "" +msgstr "Retraso" #: scene/animation/animation_blend_tree.cpp msgid "Random Delay" @@ -23386,7 +23408,7 @@ msgstr "Animación Asignada" #: scene/animation/animation_player.cpp msgid "Reset On Save" -msgstr "" +msgstr "Restablecer Al Guardar" #: scene/animation/animation_player.cpp msgid "Current Animation Length" @@ -23406,7 +23428,7 @@ msgstr "Tiempo de Mezcla Predeterminado" #: scene/animation/animation_player.cpp msgid "Method Call Mode" -msgstr "" +msgstr "Modo de Llamada de Método" #: scene/animation/animation_tree.cpp msgid "In node '%s', invalid animation: '%s'." @@ -23448,7 +23470,7 @@ msgstr "Reproductor de Animación" #: scene/animation/animation_tree.cpp msgid "Root Motion" -msgstr "" +msgstr "Movimiento de la RaÃz" #: scene/animation/animation_tree.cpp msgid "Track" @@ -23496,11 +23518,11 @@ msgstr "Anular Base de la Punta" #: scene/animation/skeleton_ik.cpp msgid "Use Magnet" -msgstr "" +msgstr "Usar Imán" #: scene/animation/skeleton_ik.cpp msgid "Magnet" -msgstr "" +msgstr "Imán" #: scene/animation/skeleton_ik.cpp msgid "Target Node" @@ -23512,7 +23534,7 @@ msgstr "Iteraciones Máximas" #: scene/animation/tween.cpp msgid "Playback Process Mode" -msgstr "" +msgstr "Modo de Proceso de Reproducción" #: scene/animation/tween.cpp msgid "Playback Speed" @@ -23534,7 +23556,7 @@ msgstr "Modo de Estiramiento" #: scene/gui/aspect_ratio_container.cpp scene/gui/box_container.cpp msgid "Alignment" -msgstr "" +msgstr "Alineamiento" #: scene/gui/base_button.cpp msgid "Shortcut In Tooltip" @@ -23546,11 +23568,11 @@ msgstr "Modo de Acción" #: scene/gui/base_button.cpp msgid "Enabled Focus Mode" -msgstr "" +msgstr "Modo de Concentración Activado" #: scene/gui/base_button.cpp msgid "Keep Pressed Outside" -msgstr "" +msgstr "Mantener presionado al exterior" #: scene/gui/base_button.cpp scene/gui/shortcut.cpp msgid "Shortcut" @@ -23677,7 +23699,7 @@ msgstr "Contenido del Clip" #: scene/gui/control.cpp scene/resources/visual_shader_nodes.cpp msgid "Hint" -msgstr "" +msgstr "Indicio" #: scene/gui/control.cpp msgid "Tooltip" @@ -23713,7 +23735,7 @@ msgstr "Anterior" #: scene/gui/control.cpp msgid "Mouse" -msgstr "" +msgstr "Ratón" #: scene/gui/control.cpp msgid "Default Cursor Shape" @@ -23721,7 +23743,7 @@ msgstr "Forma del Cursor Predeterminado" #: scene/gui/control.cpp msgid "Pass On Modal Close Click" -msgstr "" +msgstr "Pasar Clic Al Cerrar Modal" #: scene/gui/control.cpp msgid "Size Flags" @@ -23737,7 +23759,7 @@ msgstr "Propiedades del Tema" #: scene/gui/dialogs.cpp msgid "Window Title" -msgstr "" +msgstr "TÃtulo de Ventana" #: scene/gui/dialogs.cpp msgid "Dialog" @@ -23745,7 +23767,7 @@ msgstr "Diálogo" #: scene/gui/dialogs.cpp msgid "Hide On OK" -msgstr "" +msgstr "Ocultar Al Aceptar" #: scene/gui/dialogs.cpp msgid "Alert!" @@ -23794,7 +23816,7 @@ msgstr "Mostrar Etiqueta Zoom" #: scene/gui/graph_edit.cpp scene/gui/text_edit.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Minimap" -msgstr "" +msgstr "Minimapa" #: scene/gui/graph_edit.cpp msgid "Enable grid minimap." @@ -23815,7 +23837,7 @@ msgstr "Comentario" #: scene/gui/graph_node.cpp msgid "Overlay" -msgstr "" +msgstr "Overlay" #: scene/gui/grid_container.cpp scene/gui/item_list.cpp scene/gui/tree.cpp msgid "Columns" @@ -23828,19 +23850,19 @@ msgstr "Temporizadores" #: scene/gui/item_list.cpp scene/gui/popup_menu.cpp scene/gui/tree.cpp msgid "Incremental Search Max Interval Msec" -msgstr "" +msgstr "Intervalo Máx. de Búsqueda Incremental Msec" #: scene/gui/item_list.cpp scene/gui/tree.cpp msgid "Allow Reselect" -msgstr "Permitir Volver A Seleccionar" +msgstr "Permitir Reselección" #: scene/gui/item_list.cpp scene/gui/tree.cpp msgid "Allow RMB Select" -msgstr "Permitir Selección Con Botón Derecho Del Ratón" +msgstr "Permitir Selección Con Botón Derecho Del Mouse" #: scene/gui/item_list.cpp msgid "Max Text Lines" -msgstr "" +msgstr "LÃneas de Texto Máximas" #: scene/gui/item_list.cpp msgid "Auto Height" @@ -23848,15 +23870,15 @@ msgstr "Altura Automática" #: scene/gui/item_list.cpp msgid "Max Columns" -msgstr "" +msgstr "Columnas Máximas" #: scene/gui/item_list.cpp msgid "Same Column Width" -msgstr "" +msgstr "Misma Anchura de Columna" #: scene/gui/item_list.cpp msgid "Fixed Column Width" -msgstr "" +msgstr "Anchura de Columna Fija" #: scene/gui/item_list.cpp msgid "Icon Scale" @@ -23880,19 +23902,19 @@ msgstr "Porcentaje Visible" #: scene/gui/label.cpp msgid "Lines Skipped" -msgstr "" +msgstr "LÃneas Omitidas" #: scene/gui/label.cpp msgid "Max Lines Visible" -msgstr "" +msgstr "Máximo de LÃneas Visibles" #: scene/gui/line_edit.cpp scene/resources/navigation_mesh.cpp msgid "Max Length" -msgstr "" +msgstr "Máxima Longitud" #: scene/gui/line_edit.cpp msgid "Secret" -msgstr "" +msgstr "Secreto" #: scene/gui/line_edit.cpp msgid "Secret Character" @@ -23900,7 +23922,7 @@ msgstr "Caracter Secreto" #: scene/gui/line_edit.cpp msgid "Expand To Text Length" -msgstr "" +msgstr "Expandir a la Longitud del Texto" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Context Menu Enabled" @@ -23929,7 +23951,7 @@ msgstr "Selección Activada" #: scene/gui/line_edit.cpp scene/gui/rich_text_label.cpp #: scene/gui/text_edit.cpp msgid "Deselect On Focus Loss Enabled" -msgstr "" +msgstr "Deselección al perder el focus activada" #: scene/gui/line_edit.cpp msgid "Right Icon" @@ -23941,15 +23963,15 @@ msgstr "Marcador" #: scene/gui/line_edit.cpp msgid "Alpha" -msgstr "" +msgstr "Alpha" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "" +msgstr "Caret" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" -msgstr "" +msgstr "Parpardeo" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink Speed" @@ -23957,7 +23979,7 @@ msgstr "Velocidad de Parpadeo" #: scene/gui/link_button.cpp msgid "Underline" -msgstr "" +msgstr "Subrayar" #: scene/gui/menu_button.cpp msgid "Switch On Hover" @@ -23977,7 +23999,7 @@ msgstr "Parche de Margen" #: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp msgid "Axis Stretch" -msgstr "" +msgstr "Estiramiento de Eje" #: scene/gui/nine_patch_rect.cpp msgid "" @@ -24023,7 +24045,7 @@ msgstr "Ocultar Al Seleccionar Elemento de Estado" #: scene/gui/popup_menu.cpp msgid "Submenu Popup Delay" -msgstr "" +msgstr "Retraso en la Aparición del Submenú" #: scene/gui/popup_menu.cpp msgid "Allow Search" @@ -24059,11 +24081,11 @@ msgstr "Redondeado" #: scene/gui/range.cpp msgid "Allow Greater" -msgstr "" +msgstr "Permitir Más" #: scene/gui/range.cpp msgid "Allow Lesser" -msgstr "" +msgstr "Permitir Menos" #: scene/gui/reference_rect.cpp msgid "Border Color" @@ -24095,11 +24117,11 @@ msgstr "Carácter" #: scene/gui/rich_text_label.cpp msgid "BBCode" -msgstr "" +msgstr "BBCode" #: scene/gui/rich_text_label.cpp msgid "Meta Underlined" -msgstr "" +msgstr "Meta Subrayados" #: scene/gui/rich_text_label.cpp msgid "Tab Size" @@ -24111,11 +24133,11 @@ msgstr "Ajustar Altura Del Contenido" #: scene/gui/rich_text_label.cpp msgid "Scroll Active" -msgstr "" +msgstr "Scroll Activo" #: scene/gui/rich_text_label.cpp msgid "Scroll Following" -msgstr "" +msgstr "Seguir el Scroll" #: scene/gui/rich_text_label.cpp msgid "Selection Enabled" @@ -24161,15 +24183,15 @@ msgstr "Zona Muerta Predeterminada del Scroll" #: scene/gui/slider.cpp msgid "Scrollable" -msgstr "" +msgstr "Desplazable" #: scene/gui/slider.cpp msgid "Tick Count" -msgstr "Cantidad De Marcas" +msgstr "Contador de Marcas" #: scene/gui/slider.cpp msgid "Ticks On Borders" -msgstr "Ticks En Bordes" +msgstr "Marcas En Los Bordes" #: scene/gui/spin_box.cpp msgid "Prefix" @@ -24193,7 +24215,7 @@ msgstr "Visibilidad de los Arrastradores" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp msgid "Tab Align" -msgstr "" +msgstr "Alineamiento de Pestaña" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp msgid "Current Tab" @@ -24205,7 +24227,7 @@ msgstr "Pestañas Visibles" #: scene/gui/tab_container.cpp msgid "All Tabs In Front" -msgstr "" +msgstr "Todas las Pestañas al Frente" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp msgid "Drag To Rearrange Enabled" @@ -24213,31 +24235,31 @@ msgstr "Arrastrar Para Reordenar Habilitado" #: scene/gui/tab_container.cpp msgid "Use Hidden Tabs For Min Size" -msgstr "" +msgstr "Usar Pestañas Ocultas Para Tamaño MÃnimo" #: scene/gui/tabs.cpp msgid "Tab Close Display Policy" -msgstr "" +msgstr "PolÃtica de Botón de Cerrar Pestaña" #: scene/gui/tabs.cpp msgid "Scrolling Enabled" -msgstr "" +msgstr "Desplazamiento Activado" #: scene/gui/text_edit.cpp msgid "Readonly" -msgstr "" +msgstr "Solo Lectura" #: scene/gui/text_edit.cpp msgid "Bookmark Gutter" -msgstr "Canalón de Marcadores" +msgstr "Marca del Umbral" #: scene/gui/text_edit.cpp msgid "Breakpoint Gutter" -msgstr "Canalón de Puntos de Ruptura" +msgstr "Umbral de Ruptura" #: scene/gui/text_edit.cpp msgid "Fold Gutter" -msgstr "Canalón Plegable" +msgstr "Pliegue del Umbral" #: scene/gui/text_edit.cpp msgid "Drag And Drop Selection Enabled" @@ -24269,19 +24291,19 @@ msgstr "Modo Bloque" #: scene/gui/text_edit.cpp msgid "Moving By Right Click" -msgstr "" +msgstr "Mover Con Clic Derecho" #: scene/gui/text_edit.cpp msgid "Text Edit Idle Detect (sec)" -msgstr "" +msgstr "Detección de Inactividad en la Edición de Texto (seg.)" #: scene/gui/text_edit.cpp msgid "Text Edit Undo Stack Max Size" -msgstr "" +msgstr "Número máximo de acciones recordados para deshacer" #: scene/gui/texture_button.cpp scene/resources/default_theme/default_theme.cpp msgid "Hover" -msgstr "" +msgstr "Hover" #: scene/gui/texture_button.cpp msgid "Focused" @@ -24298,7 +24320,7 @@ msgstr "Expandir" #: scene/gui/texture_progress.cpp msgid "Under" -msgstr "" +msgstr "Debajo" #: scene/gui/texture_progress.cpp msgid "Over" @@ -24318,11 +24340,11 @@ msgstr "Modo de Relleno" #: scene/gui/texture_progress.cpp scene/resources/material.cpp msgid "Tint" -msgstr "" +msgstr "Tinte" #: scene/gui/texture_progress.cpp msgid "Radial Fill" -msgstr "" +msgstr "Relleno Radial" #: scene/gui/texture_progress.cpp msgid "Initial Angle" @@ -24358,7 +24380,7 @@ msgstr "Estiramiento de Margen Inferior" #: scene/gui/tree.cpp msgid "Custom Minimum Height" -msgstr "" +msgstr "Altura MÃnima Personalizada" #: scene/gui/tree.cpp msgid "(Other)" @@ -24378,7 +24400,7 @@ msgstr "Ocultar RaÃz" #: scene/gui/tree.cpp msgid "Drop Mode Flags" -msgstr "" +msgstr "Indicadores del Modo de CaÃda" #: scene/gui/video_player.cpp msgid "Audio Track" @@ -24414,11 +24436,11 @@ msgstr "Descargar Tamaño del Fragmento" #: scene/main/http_request.cpp msgid "Body Size Limit" -msgstr "" +msgstr "LÃmite del Tamaño del Cuerpo" #: scene/main/http_request.cpp msgid "Max Redirects" -msgstr "" +msgstr "Redireccionamientos Máximos" #: scene/main/http_request.cpp msgid "Timeout" @@ -24429,6 +24451,8 @@ msgid "" "Setting node name '%s' to be unique within scene for '%s', but it's already " "claimed by '%s'. This node is no longer set unique." msgstr "" +"El nombre de nodo '%s' fue establecido como único en la escena de '%s', pero " +"ya está en uso por '%s'. Éste nodo ya no está como único." #: scene/main/node.cpp msgid "Name Num Separator" @@ -24436,7 +24460,7 @@ msgstr "Separador Numérico del Nombre" #: scene/main/node.cpp msgid "Name Casing" -msgstr "" +msgstr "Capitalización de Nombre" #: scene/main/node.cpp msgid "Editor Description" @@ -24488,7 +24512,7 @@ msgstr "Sugerencia de Depuración de Navegación" #: scene/main/scene_tree.cpp msgid "Use Font Oversampling" -msgstr "" +msgstr "Usar Sobremuestreo de Fuente" #: scene/main/scene_tree.cpp msgid "Edited Scene Root" @@ -24496,7 +24520,7 @@ msgstr "Escena RaÃz Editada" #: scene/main/scene_tree.cpp msgid "Root" -msgstr "" +msgstr "RaÃz" #: scene/main/scene_tree.cpp msgid "Multiplayer Poll" @@ -24505,11 +24529,11 @@ msgstr "Encuesta Multijugador" #: scene/main/scene_tree.cpp scene/resources/mesh_library.cpp #: scene/resources/shape_2d.cpp msgid "Shapes" -msgstr "" +msgstr "Formas" #: scene/main/scene_tree.cpp msgid "Shape Color" -msgstr "" +msgstr "Color de la Forma" #: scene/main/scene_tree.cpp msgid "Contact Color" @@ -24517,7 +24541,7 @@ msgstr "Color de Contacto" #: scene/main/scene_tree.cpp msgid "Geometry Color" -msgstr "" +msgstr "Color de la GeometrÃa" #: scene/main/scene_tree.cpp msgid "Disabled Geometry Color" @@ -24525,7 +24549,7 @@ msgstr "Color de la GeometrÃa Desactivada" #: scene/main/scene_tree.cpp msgid "Max Contacts Displayed" -msgstr "" +msgstr "Núm. Máx. de Contactos Mostrados" #: scene/main/scene_tree.cpp scene/resources/shape_2d.cpp msgid "Draw 2D Outlines" @@ -24541,27 +24565,27 @@ msgstr "Tamaño de Atlas" #: scene/main/scene_tree.cpp msgid "Atlas Subdiv" -msgstr "" +msgstr "Subdivisión del Atlas" #: scene/main/scene_tree.cpp scene/main/viewport.cpp msgid "MSAA" -msgstr "" +msgstr "MSAA" #: scene/main/scene_tree.cpp msgid "Use FXAA" -msgstr "" +msgstr "Usar FXAA" #: scene/main/scene_tree.cpp msgid "Use Debanding" -msgstr "" +msgstr "Usar Debanding" #: scene/main/scene_tree.cpp scene/main/viewport.cpp msgid "HDR" -msgstr "" +msgstr "HDR" #: scene/main/scene_tree.cpp scene/main/viewport.cpp msgid "Use 32 BPC Depth" -msgstr "" +msgstr "Usar Profundidad de 32 BPC" #: scene/main/scene_tree.cpp msgid "Default Environment" @@ -24681,7 +24705,7 @@ msgstr "Objetivo de Renderizado" #: scene/main/viewport.cpp msgid "V Flip" -msgstr "" +msgstr "Reflejo V" #: scene/main/viewport.cpp msgid "Clear Mode" @@ -24709,19 +24733,19 @@ msgstr "Sombra del Atlas" #: scene/main/viewport.cpp msgid "Quad 0" -msgstr "" +msgstr "Cuadrángulo 0" #: scene/main/viewport.cpp msgid "Quad 1" -msgstr "" +msgstr "Cuadrángulo 1" #: scene/main/viewport.cpp msgid "Quad 2" -msgstr "" +msgstr "Cuadrángulo 2" #: scene/main/viewport.cpp msgid "Quad 3" -msgstr "" +msgstr "Cuadrángulo 3" #: scene/main/viewport.cpp msgid "Canvas Transform" @@ -24737,7 +24761,7 @@ msgstr "Retraso del Tooltip (sec)" #: scene/register_scene_types.cpp msgid "Swap OK Cancel" -msgstr "Cancelar" +msgstr "Intercambiar Aceptar con Cancelar" #: scene/register_scene_types.cpp msgid "Layer Names" @@ -24769,7 +24793,7 @@ msgstr "Navegación 3D" #: scene/register_scene_types.cpp msgid "Use hiDPI" -msgstr "" +msgstr "Usar hiDPI" #: scene/register_scene_types.cpp msgid "Custom" @@ -24786,7 +24810,7 @@ msgstr "Tasa de Mezcla" #: scene/resources/audio_stream_sample.cpp msgid "Stereo" -msgstr "" +msgstr "Estéreo" #: scene/resources/concave_polygon_shape_2d.cpp msgid "Segments" @@ -24798,11 +24822,11 @@ msgstr "Bakear Resolución" #: scene/resources/curve.cpp msgid "Bake Interval" -msgstr "" +msgstr "Intervalo de Bakeado" #: scene/resources/default_theme/default_theme.cpp msgid "Panel" -msgstr "" +msgstr "Panel" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color" @@ -24834,7 +24858,7 @@ msgstr "Espaciado del Subrayado" #: scene/resources/default_theme/default_theme.cpp msgid "Arrow" -msgstr "" +msgstr "Flecha" #: scene/resources/default_theme/default_theme.cpp msgid "Arrow Margin" @@ -24866,19 +24890,19 @@ msgstr "Radio Marcado Desactivado" #: scene/resources/default_theme/default_theme.cpp msgid "Radio Unchecked" -msgstr "" +msgstr "Radio Desmarcado" #: scene/resources/default_theme/default_theme.cpp msgid "Radio Unchecked Disabled" -msgstr "" +msgstr "Radio Desmarcado Desactivado" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Hover Pressed" -msgstr "" +msgstr "Color de Fuente Hover Pulsado" #: scene/resources/default_theme/default_theme.cpp msgid "Check V Adjust" -msgstr "" +msgstr "Comprobar Ajuste V" #: scene/resources/default_theme/default_theme.cpp msgid "On Disabled" @@ -24918,7 +24942,7 @@ msgstr "Color de Fuente Seleccionada" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Uneditable" -msgstr "" +msgstr "Color de Fuente No Editable" #: scene/resources/default_theme/default_theme.cpp msgid "Cursor Color" @@ -24942,7 +24966,7 @@ msgstr "BG" #: scene/resources/default_theme/default_theme.cpp msgid "FG" -msgstr "" +msgstr "FG" #: scene/resources/default_theme/default_theme.cpp msgid "Tab" @@ -24964,7 +24988,7 @@ msgstr "Plegar" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Readonly" -msgstr "" +msgstr "Color de Fuente de Sólo LeÃda" #: scene/resources/default_theme/default_theme.cpp msgid "Completion Lines" @@ -24984,7 +25008,7 @@ msgstr "Enfoque de Scroll" #: scene/resources/default_theme/default_theme.cpp msgid "Grabber" -msgstr "" +msgstr "Grabber" #: scene/resources/default_theme/default_theme.cpp msgid "Grabber Highlight" @@ -25004,11 +25028,11 @@ msgstr "Incremento Resaltado" #: scene/resources/default_theme/default_theme.cpp msgid "Increment Pressed" -msgstr "" +msgstr "Incremento Pulsado" #: scene/resources/default_theme/default_theme.cpp msgid "Decrement" -msgstr "" +msgstr "Decremento" #: scene/resources/default_theme/default_theme.cpp msgid "Decrement Highlight" @@ -25016,7 +25040,7 @@ msgstr "Decremento Resaltado" #: scene/resources/default_theme/default_theme.cpp msgid "Decrement Pressed" -msgstr "" +msgstr "Decremento Pulsado" #: scene/resources/default_theme/default_theme.cpp msgid "Slider" @@ -25024,11 +25048,11 @@ msgstr "Deslizador" #: scene/resources/default_theme/default_theme.cpp msgid "Grabber Area" -msgstr "" +msgstr "Ãrea de Grabber" #: scene/resources/default_theme/default_theme.cpp msgid "Grabber Area Highlight" -msgstr "" +msgstr "Resaltado del Ãrea de Grabber" #: scene/resources/default_theme/default_theme.cpp msgid "Grabber Disabled" @@ -25036,7 +25060,7 @@ msgstr "Agarre Desactivado" #: scene/resources/default_theme/default_theme.cpp msgid "Tick" -msgstr "" +msgstr "Marcar" #: scene/resources/default_theme/default_theme.cpp msgid "Updown" @@ -25160,7 +25184,7 @@ msgstr "Enfoque Seleccionado" #: scene/resources/default_theme/default_theme.cpp msgid "Cursor Unfocused" -msgstr "" +msgstr "Cursor Desenfocado" #: scene/resources/default_theme/default_theme.cpp msgid "Button Pressed" @@ -25220,7 +25244,7 @@ msgstr "Color de la LÃnea de Relación" #: scene/resources/default_theme/default_theme.cpp msgid "Custom Button Font Highlight" -msgstr "" +msgstr "Fuente Personalizada de Botón Resaltado" #: scene/resources/default_theme/default_theme.cpp msgid "Item Margin" @@ -25268,7 +25292,7 @@ msgstr "Pestaña Desactivada" #: scene/resources/default_theme/default_theme.cpp msgid "Menu" -msgstr "" +msgstr "Menú" #: scene/resources/default_theme/default_theme.cpp msgid "Menu Highlight" @@ -25292,15 +25316,15 @@ msgstr "Margen Superior" #: scene/resources/default_theme/default_theme.cpp msgid "Label V Align FG" -msgstr "" +msgstr "Etiqueta V Alinear FG" #: scene/resources/default_theme/default_theme.cpp msgid "Label V Align BG" -msgstr "" +msgstr "Etiqueta V Alinear BG" #: scene/resources/default_theme/default_theme.cpp msgid "Large" -msgstr "Largo" +msgstr "Grande" #: scene/resources/default_theme/default_theme.cpp msgid "Folder" @@ -25356,11 +25380,11 @@ msgstr "Preset BG" #: scene/resources/default_theme/default_theme.cpp msgid "Overbright Indicator" -msgstr "" +msgstr "Indicador de Exceso de Brillo" #: scene/resources/default_theme/default_theme.cpp msgid "Preset FG" -msgstr "Preset FG" +msgstr "FG Preestablecido" #: scene/resources/default_theme/default_theme.cpp msgid "Preset BG Icon" @@ -25416,11 +25440,11 @@ msgstr "Ocultar Automáticamente" #: scene/resources/default_theme/default_theme.cpp msgid "Minus" -msgstr "" +msgstr "Menos" #: scene/resources/default_theme/default_theme.cpp msgid "More" -msgstr "" +msgstr "Más" #: scene/resources/default_theme/default_theme.cpp msgid "Grid Minor" @@ -25452,7 +25476,7 @@ msgstr "Bezier Len Neg" #: scene/resources/default_theme/default_theme.cpp msgid "Port Grab Distance Horizontal" -msgstr "" +msgstr "Distancia de Agarre Horizontal del Puerto" #: scene/resources/default_theme/default_theme.cpp msgid "Port Grab Distance Vertical" @@ -25460,7 +25484,7 @@ msgstr "Distancia Vertical del Puerto de Agarre" #: scene/resources/dynamic_font.cpp msgid "Hinting" -msgstr "" +msgstr "Hinting" #: scene/resources/dynamic_font.cpp msgid "Override Oversampling" @@ -25496,11 +25520,11 @@ msgstr "Datos de la Fuente" #: scene/resources/environment.cpp msgid "Background" -msgstr "" +msgstr "Fondo" #: scene/resources/environment.cpp scene/resources/sky.cpp msgid "Sky" -msgstr "" +msgstr "Cielo" #: scene/resources/environment.cpp msgid "Sky Custom FOV" @@ -25536,7 +25560,7 @@ msgstr "Contribución del Cielo" #: scene/resources/environment.cpp msgid "Fog" -msgstr "" +msgstr "Niebla" #: scene/resources/environment.cpp msgid "Sun Color" @@ -25596,19 +25620,19 @@ msgstr "Exposición" #: scene/resources/environment.cpp msgid "White" -msgstr "" +msgstr "Blanco" #: scene/resources/environment.cpp msgid "Auto Exposure" -msgstr "" +msgstr "Exposición Auto" #: scene/resources/environment.cpp msgid "Min Luma" -msgstr "" +msgstr "Luma MÃnimo" #: scene/resources/environment.cpp msgid "Max Luma" -msgstr "" +msgstr "Luma Máximo" #: scene/resources/environment.cpp msgid "SS Reflections" @@ -25632,11 +25656,11 @@ msgstr "Tolerancia de Profundidad" #: scene/resources/environment.cpp scene/resources/material.cpp msgid "Roughness" -msgstr "" +msgstr "Aspereza" #: scene/resources/environment.cpp msgid "SSAO" -msgstr "" +msgstr "SSAO" #: scene/resources/environment.cpp msgid "Radius 2" @@ -25644,7 +25668,7 @@ msgstr "Radio 2" #: scene/resources/environment.cpp msgid "Intensity 2" -msgstr "" +msgstr "Intensidad 2" #: scene/resources/environment.cpp scene/resources/material.cpp msgid "Light Affect" @@ -25656,11 +25680,11 @@ msgstr "Influencia del Canal AO" #: scene/resources/environment.cpp msgid "Blur" -msgstr "" +msgstr "Blur" #: scene/resources/environment.cpp msgid "Edge Sharpness" -msgstr "" +msgstr "Nitidez de Borde" #: scene/resources/environment.cpp msgid "DOF Far Blur" @@ -25680,7 +25704,7 @@ msgstr "" #: scene/resources/environment.cpp msgid "Glow" -msgstr "" +msgstr "Brillo" #: scene/resources/environment.cpp msgid "Levels" @@ -25720,15 +25744,15 @@ msgstr "7" #: scene/resources/environment.cpp msgid "Bloom" -msgstr "" +msgstr "Resplandor" #: scene/resources/environment.cpp msgid "HDR Threshold" -msgstr "" +msgstr "Umbral de HDR" #: scene/resources/environment.cpp msgid "HDR Luminance Cap" -msgstr "" +msgstr "Luminancia de HDR Máxima" #: scene/resources/environment.cpp msgid "HDR Scale" @@ -25740,7 +25764,7 @@ msgstr "" #: scene/resources/environment.cpp msgid "Adjustments" -msgstr "" +msgstr "Ajustes" #: scene/resources/environment.cpp msgid "Brightness" @@ -25772,7 +25796,7 @@ msgstr "Offsets" #: scene/resources/height_map_shape.cpp msgid "Map Width" -msgstr "" +msgstr "Anchura del Mapa" #: scene/resources/height_map_shape.cpp msgid "Map Depth" @@ -25784,7 +25808,7 @@ msgstr "Datos del Mapa" #: scene/resources/line_shape_2d.cpp msgid "D" -msgstr "" +msgstr "D" #: scene/resources/material.cpp msgid "Next Pass" @@ -25812,11 +25836,11 @@ msgstr "" #: scene/resources/material.cpp msgid "Albedo Tex Force sRGB" -msgstr "" +msgstr "Forzar sRGB en Textura Albedo" #: scene/resources/material.cpp msgid "Do Not Receive Shadows" -msgstr "" +msgstr "No Recibir Sombras" #: scene/resources/material.cpp msgid "Disable Ambient Light" @@ -25828,7 +25852,7 @@ msgstr "Asegurar Normales Correctas" #: scene/resources/material.cpp msgid "Albedo Tex MSDF" -msgstr "" +msgstr "MSDF en Textura Albedo" #: scene/resources/material.cpp msgid "Vertex Color" @@ -25836,11 +25860,11 @@ msgstr "Color del Vértice" #: scene/resources/material.cpp msgid "Use As Albedo" -msgstr "" +msgstr "Usar Como Albedo" #: scene/resources/material.cpp msgid "Is sRGB" -msgstr "" +msgstr "Es sRGB" #: scene/resources/material.cpp servers/visual_server.cpp msgid "Parameters" @@ -25876,15 +25900,15 @@ msgstr "Mantener Escala del Billboard" #: scene/resources/material.cpp msgid "Grow" -msgstr "" +msgstr "Expandir" #: scene/resources/material.cpp msgid "Grow Amount" -msgstr "Cantidad de Crecimiento" +msgstr "Cantidad de Expansión" #: scene/resources/material.cpp msgid "Use Alpha Scissor" -msgstr "" +msgstr "Usar Corte Alpha" #: scene/resources/material.cpp msgid "Particles Anim" @@ -25900,11 +25924,11 @@ msgstr "Cuadros V" #: scene/resources/material.cpp msgid "Albedo" -msgstr "" +msgstr "Albedo" #: scene/resources/material.cpp msgid "Metallic" -msgstr "" +msgstr "Metálico" #: scene/resources/material.cpp msgid "Texture Channel" @@ -25916,15 +25940,15 @@ msgstr "Emisión" #: scene/resources/material.cpp msgid "On UV2" -msgstr "" +msgstr "En UV2" #: scene/resources/material.cpp msgid "NormalMap" -msgstr "" +msgstr "Mapa Normal" #: scene/resources/material.cpp msgid "Rim" -msgstr "" +msgstr "Borde" #: scene/resources/material.cpp msgid "Clearcoat" @@ -25932,15 +25956,15 @@ msgstr "Transparencia" #: scene/resources/material.cpp msgid "Gloss" -msgstr "" +msgstr "Brillo" #: scene/resources/material.cpp msgid "Anisotropy" -msgstr "" +msgstr "AnisotropÃa" #: scene/resources/material.cpp msgid "Flowmap" -msgstr "" +msgstr "Flowmap" #: scene/resources/material.cpp msgid "Ambient Occlusion" @@ -25948,7 +25972,7 @@ msgstr "Oclusión Ambiental" #: scene/resources/material.cpp msgid "Deep Parallax" -msgstr "" +msgstr "Paralaje Profundo" #: scene/resources/material.cpp msgid "Min Layers" @@ -25960,7 +25984,7 @@ msgstr "Capas Máximas" #: scene/resources/material.cpp msgid "Flip Tangent" -msgstr "" +msgstr "Voltear Tangente" #: scene/resources/material.cpp msgid "Flip Binormal" @@ -25980,7 +26004,7 @@ msgstr "Refracción" #: scene/resources/material.cpp msgid "Detail" -msgstr "" +msgstr "Detalle" #: scene/resources/material.cpp msgid "UV Layer" @@ -25992,11 +26016,11 @@ msgstr "UV1" #: scene/resources/material.cpp msgid "Triplanar" -msgstr "" +msgstr "Triplanar" #: scene/resources/material.cpp msgid "Triplanar Sharpness" -msgstr "" +msgstr "Nitidez Triplanar" #: scene/resources/material.cpp msgid "UV2" @@ -26008,7 +26032,7 @@ msgstr "Desvanecimiento de Proximidad" #: scene/resources/material.cpp msgid "Distance Fade" -msgstr "" +msgstr "Fade al Distanciarse" #: scene/resources/material.cpp msgid "Async Mode" @@ -26020,7 +26044,7 @@ msgstr "Sugerencia de Tamaño del Lightmap" #: scene/resources/mesh.cpp scene/resources/primitive_meshes.cpp msgid "Custom AABB" -msgstr "" +msgstr "AABB Personalizado" #: scene/resources/mesh_library.cpp msgid "Mesh Transform" @@ -26040,7 +26064,7 @@ msgstr "Formato de Transformación" #: scene/resources/multimesh.cpp msgid "Custom Data Format" -msgstr "" +msgstr "Formato de Datos Personalizado" #: scene/resources/multimesh.cpp msgid "Instance Count" @@ -26048,7 +26072,7 @@ msgstr "Conteo de Instancias" #: scene/resources/multimesh.cpp msgid "Visible Instance Count" -msgstr "" +msgstr "Número de Instancias Visible" #: scene/resources/navigation_mesh.cpp msgid "Sampling" @@ -26064,7 +26088,7 @@ msgstr "Tipo de GeometrÃa Parseada" #: scene/resources/navigation_mesh.cpp msgid "Source Geometry Mode" -msgstr "" +msgstr "Modo de GeometrÃa de Origen" #: scene/resources/navigation_mesh.cpp msgid "Source Group Name" @@ -26072,7 +26096,7 @@ msgstr "Nombre del Grupo de Origen" #: scene/resources/navigation_mesh.cpp msgid "Cells" -msgstr "" +msgstr "Celdas" #: scene/resources/navigation_mesh.cpp msgid "Agents" @@ -26080,11 +26104,11 @@ msgstr "Agentes" #: scene/resources/navigation_mesh.cpp msgid "Max Climb" -msgstr "" +msgstr "Escalada Máxima" #: scene/resources/navigation_mesh.cpp msgid "Max Slope" -msgstr "" +msgstr "Pendiente Máxima" #: scene/resources/navigation_mesh.cpp msgid "Regions" @@ -26096,7 +26120,7 @@ msgstr "Tamaño de Unión" #: scene/resources/navigation_mesh.cpp msgid "Edges" -msgstr "" +msgstr "Aristas" #: scene/resources/navigation_mesh.cpp msgid "Max Error" @@ -26104,7 +26128,7 @@ msgstr "Error Máximo" #: scene/resources/navigation_mesh.cpp msgid "Verts Per Poly" -msgstr "" +msgstr "Vértices por Poly" #: scene/resources/navigation_mesh.cpp msgid "Details" @@ -26120,7 +26144,7 @@ msgstr "Error Máximo de Muestra" #: scene/resources/navigation_mesh.cpp msgid "Low Hanging Obstacles" -msgstr "" +msgstr "Obstáculos Colgando Bajo" #: scene/resources/navigation_mesh.cpp msgid "Ledge Spans" @@ -26140,7 +26164,7 @@ msgstr "Bakear Offset AABB" #: scene/resources/occluder_shape.cpp msgid "Spheres" -msgstr "" +msgstr "Esferas" #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" @@ -26156,11 +26180,11 @@ msgstr "Puntos de Rotura" #: scene/resources/packed_scene.cpp msgid "Bundled" -msgstr "" +msgstr "Empaquetado" #: scene/resources/particles_material.cpp msgid "Trail" -msgstr "" +msgstr "Rastro" #: scene/resources/particles_material.cpp msgid "Divisor" @@ -26200,11 +26224,11 @@ msgstr "Curva de Escala" #: scene/resources/physics_material.cpp msgid "Rough" -msgstr "" +msgstr "Ãspero" #: scene/resources/physics_material.cpp msgid "Absorbent" -msgstr "" +msgstr "Absorbente" #: scene/resources/plane_shape.cpp msgid "Plane" @@ -26216,19 +26240,19 @@ msgstr "Voltear Caras" #: scene/resources/primitive_meshes.cpp msgid "Mid Height" -msgstr "" +msgstr "Altura Mediana" #: scene/resources/primitive_meshes.cpp msgid "Subdivide Width" -msgstr "" +msgstr "Anchura de Subdivisión" #: scene/resources/primitive_meshes.cpp msgid "Subdivide Height" -msgstr "" +msgstr "Altura de Subdivisión" #: scene/resources/primitive_meshes.cpp msgid "Subdivide Depth" -msgstr "" +msgstr "Profundidad de Subdivisión" #: scene/resources/primitive_meshes.cpp msgid "Top Radius" @@ -26244,7 +26268,7 @@ msgstr "De Izquierda a Derecha" #: scene/resources/primitive_meshes.cpp msgid "Is Hemisphere" -msgstr "" +msgstr "Es Hemisfera" #: scene/resources/primitive_meshes.cpp msgid "Curve Step" @@ -26252,15 +26276,15 @@ msgstr "Paso de Curva" #: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp msgid "Slips On Slope" -msgstr "" +msgstr "Resbala en Pendiente" #: scene/resources/segment_shape_2d.cpp msgid "A" -msgstr "" +msgstr "A" #: scene/resources/shape_2d.cpp msgid "Custom Solver Bias" -msgstr "" +msgstr "Bias de Solución Personalizado" #: scene/resources/skin.cpp msgid "Bind Count" @@ -26280,7 +26304,7 @@ msgstr "Tamaño de Resplandor" #: scene/resources/sky.cpp msgid "Panorama" -msgstr "" +msgstr "Panorama" #: scene/resources/sky.cpp msgid "Top Color" @@ -26308,15 +26332,15 @@ msgstr "Latitud" #: scene/resources/sky.cpp msgid "Longitude" -msgstr "" +msgstr "Longitud" #: scene/resources/sky.cpp msgid "Angle Min" -msgstr "" +msgstr "Ãngulo MÃnimo" #: scene/resources/sky.cpp msgid "Angle Max" -msgstr "" +msgstr "Ãngulo Máximo" #: scene/resources/style_box.cpp msgid "Content Margin" @@ -26328,7 +26352,7 @@ msgstr "Expandir Margen" #: scene/resources/style_box.cpp msgid "Skew" -msgstr "" +msgstr "Sesgo" #: scene/resources/style_box.cpp msgid "Corner Radius" @@ -26336,19 +26360,19 @@ msgstr "Radio de Esquina" #: scene/resources/style_box.cpp msgid "Corner Detail" -msgstr "" +msgstr "Detalle de Esquina" #: scene/resources/style_box.cpp msgid "Anti Aliasing" -msgstr "" +msgstr "Antialias" #: scene/resources/style_box.cpp msgid "Grow Begin" -msgstr "" +msgstr "Inicio de Expansión" #: scene/resources/style_box.cpp msgid "Grow End" -msgstr "" +msgstr "Fin de Expansión" #: scene/resources/texture.cpp msgid "Load Path" @@ -26404,7 +26428,7 @@ msgstr "Pausa" #: scene/resources/texture.cpp msgid "Which Feed" -msgstr "" +msgstr "Cuál Feed" #: scene/resources/texture.cpp msgid "Camera Is Active" @@ -26416,7 +26440,7 @@ msgstr "Fuente Predeterminada" #: scene/resources/visual_shader.cpp msgid "Output Port For Preview" -msgstr "" +msgstr "Puerto de Salida para Previsualización" #: scene/resources/visual_shader.cpp msgid "Depth Draw" @@ -26468,7 +26492,7 @@ msgstr "Tipo de Textura" #: scene/resources/visual_shader_nodes.cpp msgid "Cube Map" -msgstr "" +msgstr "Mapa de Cubo" #: scene/resources/visual_shader_nodes.cpp msgid "Default Value Enabled" @@ -26500,7 +26524,7 @@ msgstr "Mapa de Navegación" #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Direct Space State" -msgstr "" +msgstr "Estado de Espacio Directo" #: scene/resources/world.cpp scene/resources/world_2d.cpp msgid "Default Gravity Vector" @@ -26536,7 +26560,7 @@ msgstr "Lienzo" #: servers/arvr/arvr_interface.cpp msgid "Is Primary" -msgstr "" +msgstr "Es Primario" #: servers/arvr/arvr_interface.cpp msgid "Is Initialized" @@ -26544,11 +26568,11 @@ msgstr "Inicializado" #: servers/arvr/arvr_interface.cpp msgid "AR" -msgstr "" +msgstr "AR" #: servers/arvr/arvr_interface.cpp msgid "Is Anchor Detection Enabled" -msgstr "" +msgstr "Detección de Anclaje Está Activada" #: servers/arvr_server.cpp msgid "Primary Interface" @@ -26566,36 +26590,36 @@ msgstr "Tono Aleatorio" #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp #: servers/audio/effects/audio_stream_generator.cpp msgid "Buffer Length" -msgstr "" +msgstr "Longitud de Buffer" #: servers/audio/effects/audio_effect_chorus.cpp msgid "Voice Count" -msgstr "" +msgstr "Número de Voces" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Dry" -msgstr "" +msgstr "Seco" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Wet" -msgstr "" +msgstr "Mojado" #: servers/audio/effects/audio_effect_chorus.cpp msgid "Voice" -msgstr "" +msgstr "Voz" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp msgid "Delay (ms)" -msgstr "" +msgstr "Retraso (ms)" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_phaser.cpp msgid "Rate Hz" -msgstr "" +msgstr "Velocidad en Hz" #: servers/audio/effects/audio_effect_chorus.cpp msgid "Depth (ms)" @@ -26604,7 +26628,7 @@ msgstr "Profundidad (ms)" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp msgid "Level dB" -msgstr "" +msgstr "Nivel en dB" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp @@ -26615,11 +26639,11 @@ msgstr "Pan" #: servers/audio/effects/audio_effect_compressor.cpp #: servers/audio/effects/audio_effect_filter.cpp msgid "Gain" -msgstr "" +msgstr "Ganancia" #: servers/audio/effects/audio_effect_compressor.cpp msgid "Attack (µs)" -msgstr "" +msgstr "Ataque (µs)" #: servers/audio/effects/audio_effect_compressor.cpp msgid "Release (ms)" @@ -26635,11 +26659,11 @@ msgstr "" #: servers/audio/effects/audio_effect_delay.cpp msgid "Tap 1" -msgstr "" +msgstr "Toque 1" #: servers/audio/effects/audio_effect_delay.cpp msgid "Tap 2" -msgstr "" +msgstr "Toque 2" #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_phaser.cpp @@ -26653,15 +26677,15 @@ msgstr "Paso Bajo" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Pre Gain" -msgstr "" +msgstr "Pre-Ganancia" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Keep Hf Hz" -msgstr "" +msgstr "Mantener Hz Altas" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Drive" -msgstr "" +msgstr "Drive" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Post Gain" @@ -26673,11 +26697,11 @@ msgstr "Resonancia" #: servers/audio/effects/audio_effect_limiter.cpp msgid "Ceiling dB" -msgstr "" +msgstr "dB Tope" #: servers/audio/effects/audio_effect_limiter.cpp msgid "Threshold dB" -msgstr "" +msgstr "Umbral dB" #: servers/audio/effects/audio_effect_limiter.cpp msgid "Soft Clip dB" @@ -26689,15 +26713,15 @@ msgstr "" #: servers/audio/effects/audio_effect_phaser.cpp msgid "Range Min Hz" -msgstr "" +msgstr "Rango Hz MÃnimo" #: servers/audio/effects/audio_effect_phaser.cpp msgid "Range Max Hz" -msgstr "" +msgstr "Rango Hz Máximo" #: servers/audio/effects/audio_effect_pitch_shift.cpp msgid "Oversampling" -msgstr "" +msgstr "Sobremuestreo" #: servers/audio/effects/audio_effect_pitch_shift.cpp #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp @@ -26710,11 +26734,11 @@ msgstr "" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Msec" -msgstr "" +msgstr "Mseg" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Room Size" -msgstr "" +msgstr "Tamaño de Habitación" #: servers/audio/effects/audio_effect_reverb.cpp msgid "High-pass" @@ -26734,7 +26758,7 @@ msgstr "Tiempo de Extracción (ms)" #: servers/audio/effects/audio_effect_stereo_enhance.cpp msgid "Surround" -msgstr "" +msgstr "Envolvente" #: servers/audio_server.cpp msgid "Enable Audio Input" @@ -26746,7 +26770,7 @@ msgstr "Latencia de Salida" #: servers/audio_server.cpp msgid "Channel Disable Threshold dB" -msgstr "" +msgstr "Umbral dB de Deactivación de Canal" #: servers/audio_server.cpp msgid "Channel Disable Time" @@ -26754,7 +26778,7 @@ msgstr "Tiempo de Desconexión del Canal" #: servers/audio_server.cpp msgid "Video Delay Compensation (ms)" -msgstr "" +msgstr "Compensación de Retraso de VÃdeo (ms)" #: servers/audio_server.cpp msgid "Bus Count" @@ -26770,7 +26794,7 @@ msgstr "Escala Global de Porcentajes" #: servers/camera/camera_feed.cpp msgid "Feed" -msgstr "" +msgstr "Feed" #: servers/camera/camera_feed.cpp msgid "Is Active" @@ -26778,15 +26802,15 @@ msgstr "Activo" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Sleep Threshold Linear" -msgstr "" +msgstr "Umbral de Sueño Lineal" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Sleep Threshold Angular" -msgstr "" +msgstr "Umbral de Sueño Angular" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Time Before Sleep" -msgstr "" +msgstr "Tiempo Antes de Sueño" #: servers/physics_2d/physics_2d_server_sw.cpp msgid "BP Hash Table Size" @@ -26794,11 +26818,11 @@ msgstr "Tamaño de Tabla Hash BP" #: servers/physics_2d/physics_2d_server_sw.cpp msgid "Large Object Surface Threshold In Cells" -msgstr "" +msgstr "Umbral de Superficie de Objeto Grande en Celdas" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Inverse Mass" -msgstr "" +msgstr "Masa Inversa" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Inverse Inertia" @@ -26822,11 +26846,11 @@ msgstr "Velocidad Lineal" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Exclude" -msgstr "" +msgstr "Excluir" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Shape RID" -msgstr "" +msgstr "RID de Forma" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Collide With Bodies" @@ -26834,7 +26858,7 @@ msgstr "Colisión de Cuerpos" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Collide With Areas" -msgstr "" +msgstr "Colisionar Con Ãreas" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Motion Remainder" @@ -26870,7 +26894,7 @@ msgstr "Centro de la Masa" #: servers/physics_server.cpp msgid "Principal Inertia Axes" -msgstr "" +msgstr "Ejes de Inercia Principal" #: servers/visual/shader_language.cpp msgid "Varying may not be assigned in the '%s' function." @@ -26938,7 +26962,7 @@ msgstr "Importar PVRTC" #: servers/visual_server.cpp msgid "Lossless Compression" -msgstr "" +msgstr "Compresión Sin Pérdidas" #: servers/visual_server.cpp msgid "Force PNG" @@ -26946,7 +26970,7 @@ msgstr "Forzar PNG" #: servers/visual_server.cpp msgid "WebP Compression Level" -msgstr "" +msgstr "Nivel de Compresión WebP" #: servers/visual_server.cpp msgid "Time Rollover Secs" @@ -26958,19 +26982,19 @@ msgstr "Tamaño del Cubemap" #: servers/visual_server.cpp msgid "Quadrant 0 Subdiv" -msgstr "" +msgstr "Subdivisión del Cuadrante 0" #: servers/visual_server.cpp msgid "Quadrant 1 Subdiv" -msgstr "" +msgstr "Subdivisión del Cuadrante 1" #: servers/visual_server.cpp msgid "Quadrant 2 Subdiv" -msgstr "" +msgstr "Subdivisión del Cuadrante 2" #: servers/visual_server.cpp msgid "Quadrant 3 Subdiv" -msgstr "" +msgstr "Subdivisión del Cuadrante 3" #: servers/visual_server.cpp msgid "Shadows" @@ -26986,11 +27010,11 @@ msgstr "Reflejos del Array de Texturas" #: servers/visual_server.cpp msgid "High Quality GGX" -msgstr "" +msgstr "GGX de Alta Calidad" #: servers/visual_server.cpp msgid "Irradiance Max Size" -msgstr "" +msgstr "Tamaño Máximo de Irradiancia" #: servers/visual_server.cpp msgid "Shading" @@ -26998,19 +27022,19 @@ msgstr "Sombreado" #: servers/visual_server.cpp msgid "Force Vertex Shading" -msgstr "" +msgstr "Forzar Sombreado de Vértice" #: servers/visual_server.cpp msgid "Force Lambert Over Burley" -msgstr "" +msgstr "Forzar Lambert en Lugar de Burley" #: servers/visual_server.cpp msgid "Force Blinn Over GGX" -msgstr "" +msgstr "Forzar Blinn en Lugar de GGX" #: servers/visual_server.cpp msgid "Mesh Storage" -msgstr "" +msgstr "Almacenamiento de Malla" #: servers/visual_server.cpp msgid "Split Stream" @@ -27018,7 +27042,7 @@ msgstr "Stream Dividido" #: servers/visual_server.cpp msgid "Use Physical Light Attenuation" -msgstr "" +msgstr "Usar Atenuación de Luz FÃsica" #: servers/visual_server.cpp msgid "Depth Prepass" @@ -27030,11 +27054,11 @@ msgstr "" #: servers/visual_server.cpp msgid "Anisotropic Filter Level" -msgstr "" +msgstr "Nivel de Filtro Anisotrópico" #: servers/visual_server.cpp msgid "Use Nearest Mipmap Filter" -msgstr "" +msgstr "Usar Filtro de Mapa MIP más Cercano" #: servers/visual_server.cpp msgid "Skinning" @@ -27090,7 +27114,7 @@ msgstr "Usar División en Lotes en el Editor" #: servers/visual_server.cpp msgid "Single Rect Fallback" -msgstr "" +msgstr "Alternativa de Rect Único" #: servers/visual_server.cpp msgid "Max Join Item Commands" @@ -27098,11 +27122,11 @@ msgstr "" #: servers/visual_server.cpp msgid "Colored Vertex Format Threshold" -msgstr "" +msgstr "Umbral de Formato de Vértice Coloreado" #: servers/visual_server.cpp msgid "Scissor Area Threshold" -msgstr "" +msgstr "Umbral de Ãrea de Corte" #: servers/visual_server.cpp msgid "Max Join Items" @@ -27110,7 +27134,7 @@ msgstr "Elementos de Unión Máximos" #: servers/visual_server.cpp msgid "Batch Buffer Size" -msgstr "" +msgstr "Tamaño de Lote de Buffer" #: servers/visual_server.cpp msgid "Item Reordering Lookahead" @@ -27126,7 +27150,7 @@ msgstr "Diagnosticar Cuadro" #: servers/visual_server.cpp msgid "GLES2" -msgstr "" +msgstr "GLES2" #: servers/visual_server.cpp msgid "Compatibility" @@ -27134,7 +27158,7 @@ msgstr "Compatibilidad" #: servers/visual_server.cpp msgid "Disable Half Float" -msgstr "" +msgstr "Desactivar Float Medio" #: servers/visual_server.cpp msgid "Enable High Float" @@ -27146,11 +27170,11 @@ msgstr "Precisión" #: servers/visual_server.cpp msgid "UV Contract" -msgstr "" +msgstr "Contracción UV" #: servers/visual_server.cpp msgid "UV Contract Amount" -msgstr "" +msgstr "Cantidad de Contracción UV" #: servers/visual_server.cpp msgid "Use Simple PVS" @@ -27194,7 +27218,7 @@ msgstr "Compilaciones Simultáneas Máximas" #: servers/visual_server.cpp msgid "Log Active Async Compiles Count" -msgstr "" +msgstr "Anotar Número de Compilaciones AsÃncronas Activas" #: servers/visual_server.cpp msgid "Shader Cache Size (MB)" diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po index 5babe4ff23..fdb6b4f00d 100644 --- a/editor/translations/es_AR.po +++ b/editor/translations/es_AR.po @@ -21,13 +21,14 @@ # Manuel González <mgoopazo@gmail.com>, 2021. # emnrx <emanuelermancia@gmail.com>, 2022. # Mau_Restor <restor@gmail.com>, 2022. +# Leonardo MartÃnez <leonardomartinez85@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-07-23 03:57+0000\n" -"Last-Translator: Mau_Restor <restor@gmail.com>\n" +"PO-Revision-Date: 2022-11-26 14:36+0000\n" +"Last-Translator: emnrx <emanuelermancia@gmail.com>\n" "Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/" "godot-engine/godot/es_AR/>\n" "Language: es_AR\n" @@ -35,7 +36,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -71,7 +72,7 @@ msgstr "Modo de Bajo Uso del Procesador" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "" +msgstr "Modo de Baja Utilización del Procesador en Reposo (µseg)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" @@ -141,7 +142,7 @@ msgstr "Tamaño" #: core/bind/core_bind.cpp msgid "Endian Swap" -msgstr "" +msgstr "Intercambio Endiano" #: core/bind/core_bind.cpp msgid "Editor Hint" @@ -248,20 +249,19 @@ msgstr "Conección" #: core/io/http_client.cpp msgid "Read Chunk Size" -msgstr "" +msgstr "Tamaño de fragmento de lectura" #: core/io/marshalls.cpp msgid "Object ID" msgstr "ID de Objeto" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp -#, fuzzy msgid "Allow Object Decoding" -msgstr "Activar Onion Skinning" +msgstr "Permitir decodificación de objetos" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Refuse New Network Connections" -msgstr "" +msgstr "Rechazar Nuevas Conexiones de Red" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp #, fuzzy @@ -309,9 +309,8 @@ msgid "Blocking Handshake" msgstr "" #: core/io/udp_server.cpp -#, fuzzy msgid "Max Pending Connections" -msgstr "Editar Conexión:" +msgstr "Máximo de Conexiones Pendientes" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -364,7 +363,6 @@ msgid "Seed" msgstr "Semilla" #: core/math/random_number_generator.cpp -#, fuzzy msgid "State" msgstr "Estado" @@ -381,9 +379,8 @@ msgid "Mouse Mode" msgstr "Modo Mouse" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "Eliminar Entrada" +msgstr "Usar entrada acumulada" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -411,9 +408,8 @@ msgid "Command" msgstr "Comando" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" -msgstr " (FÃsica)" +msgstr "FÃsica" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp @@ -757,9 +753,8 @@ msgstr "Al Final de la interfaz de usuario" #: servers/physics_2d/physics_2d_server_wrap_mt.h #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp -#, fuzzy msgid "Physics" -msgstr " (FÃsica)" +msgstr "(FÃsica)" #: core/project_settings.cpp editor/editor_settings.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -1073,7 +1068,7 @@ msgstr "" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp msgid "Free" -msgstr "Gratis" +msgstr "Libre" #: editor/animation_bezier_editor.cpp msgid "Balanced" @@ -13119,9 +13114,10 @@ msgstr "Opciones de Ajuste" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Offset:" @@ -14563,16 +14559,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Ruta de proyecto inválida (cambiaste algo?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "No se pudo cargar project.godot desde la ruta de proyecto (error %d). La " "ruta no existe o está corrupta." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "No se pudo editar project.godot en la ruta de proyecto." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "No se puede abrir el proyecto en '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -19323,15 +19320,13 @@ msgid "Code Signing" msgstr "Firmando código de DMG" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." msgstr "" -"No se ha encontrado 'apksigner'.\n" -"Por favor, comprobá que el comando esté disponible en el directorio Android " -"SDK build-tools.\n" -"El %s resultante está sin firmar." +"No se ha encontrado 'apksigner'. Por favor, comprobá que el comando esté " +"disponible en el directorio Android SDK build-tools. El %s resultante está " +"sin firmar." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -19380,9 +19375,8 @@ msgid "Invalid filename! Android APK requires the *.apk extension." msgstr "¡Nombre de archivo inválido! Android APK requiere la extensión *.apk." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "¡Formato de exportación no soportado!\n" +msgstr "¡Formato de exportación no soportado!" #: platform/android/export/export_plugin.cpp msgid "" @@ -19394,16 +19388,13 @@ msgstr "" "'Proyecto'." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"La versión de compilación de Android no coincide:\n" -" Plantilla instalada: %s\n" -" Versión de Godot: %s\n" -"Por favor, reinstalá la plantilla de compilación de Android desde el menú " -"'Proyecto'." +"La versión de compilación de Android no coincide: Plantilla instalada: %s, " +"Versión de Godot: %s. Por favor, reinstalá la plantilla de compilación de " +"Android desde el menú 'Proyecto'." #: platform/android/export/export_plugin.cpp #, fuzzy @@ -19414,10 +19405,9 @@ msgstr "" "el nombre del proyecto" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." msgstr "" -"No se pudieron exportar los archivos del proyecto a un proyecto gradle\n" +"No se pudieron exportar los archivos del proyecto a un proyecto gradle." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -19428,12 +19418,11 @@ msgid "Building Android Project (gradle)" msgstr "Construir Proyecto Android (gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"La construcción del proyecto Android falló, comprueba la salida del error.\n" +"La construcción del proyecto Android falló, comprueba la salida del error. " "También podés visitar docs.godotengine.org para consultar la documentación " "de compilación de Android." @@ -19459,23 +19448,19 @@ msgid "Creating APK..." msgstr "Creando APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"No se pudo encontrar la plantilla APK para exportar:\n" -"%s" +msgstr "No se pudo encontrar la plantilla APK para exportar: %s" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Missing libraries in the export template for the selected architectures: %s. " "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" "Bibliotecas faltantes en la plantilla de exportación para las arquitecturas " -"seleccionadas: %s.\n" -"Por favor, construya una plantilla con todas las bibliotecas necesarias, o " -"desmarque las arquitecturas faltantes en el preset de exportación." +"seleccionadas: %s. Por favor, construya una plantilla con todas las " +"bibliotecas necesarias, o desmarque las arquitecturas faltantes en el preset " +"de exportación." #: platform/android/export/export_plugin.cpp msgid "Adding files..." @@ -20350,10 +20335,8 @@ msgid "ZIP Creation" msgstr "Proyección" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "" -"No se pudieron exportar los archivos del proyecto a un proyecto gradle\n" +msgstr "No se pudieron exportar los archivos del proyecto a un proyecto gradle" #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -22186,9 +22169,8 @@ msgid "Safe Margin" msgstr "Margen Seguro" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Sync To Physics" -msgstr " (FÃsica)" +msgstr "(FÃsica)" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -23667,9 +23649,8 @@ msgid "A RoomGroup should not be a child or grandchild of a Portal." msgstr "Un RoomGroup no debe ser hijo o nieto de un Portal." #: scene/3d/portal.cpp -#, fuzzy msgid "Portal Active" -msgstr " [portales activos]" +msgstr "[portales activos]" #: scene/3d/portal.cpp scene/resources/occluder_shape_polygon.cpp msgid "Two Way" @@ -24135,6 +24116,15 @@ msgstr "Error" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Ordenar" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "GeometrÃa" @@ -25863,14 +25853,12 @@ msgid "3D Render" msgstr "Renderizador:" #: scene/register_scene_types.cpp -#, fuzzy msgid "2D Physics" -msgstr " (FÃsica)" +msgstr "(FÃsica)" #: scene/register_scene_types.cpp -#, fuzzy msgid "3D Physics" -msgstr " (FÃsica)" +msgstr "(FÃsica)" #: scene/register_scene_types.cpp #, fuzzy diff --git a/editor/translations/et.po b/editor/translations/et.po index 0a4ab2fe0b..dc36ae0b94 100644 --- a/editor/translations/et.po +++ b/editor/translations/et.po @@ -12713,9 +12713,10 @@ msgstr "Intervall:" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14086,12 +14087,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -23119,6 +23119,15 @@ msgstr "Viga:" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Salvestan faili:" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/eu.po b/editor/translations/eu.po index c0f1953269..79da3d56fb 100644 --- a/editor/translations/eu.po +++ b/editor/translations/eu.po @@ -2,7 +2,7 @@ # Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. # Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). # This file is distributed under the same license as the Godot source code. -# Julen Irazoki <rktzbkr.julen@gmail.com>, 2019. +# Julen Irazoki <rktzbkr.julen@gmail.com>, 2019, 2022. # Osoitz <oelkoro@gmail.com>, 2019, 2020. # Erik Zubiria <erik@ezsd.net>, 2021. # Sergio Varela <sergitroll9@gmail.com>, 2021. @@ -11,15 +11,15 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-05-23 21:52+0000\n" -"Last-Translator: Gorka Egino <gorkainventor@gmail.com>\n" +"PO-Revision-Date: 2022-11-06 03:12+0000\n" +"Last-Translator: Julen Irazoki <rktzbkr.julen@gmail.com>\n" "Language-Team: Basque <https://hosted.weblate.org/projects/godot-engine/" "godot/eu/>\n" "Language: eu\n" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.14.2\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -2064,7 +2064,7 @@ msgstr "" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" -msgstr "" +msgstr "Seinaleak" #: editor/connections_dialog.cpp msgid "Filter signals" @@ -3676,7 +3676,7 @@ msgstr "" #: editor/editor_network_profiler.cpp editor/editor_node.cpp #: scene/main/node.cpp scene/resources/default_theme/default_theme.cpp msgid "Node" -msgstr "" +msgstr "Nodoa" #: editor/editor_network_profiler.cpp msgid "Incoming RPC" @@ -12662,9 +12662,10 @@ msgstr "Atxikitze aukerak" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14022,12 +14023,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22940,6 +22940,15 @@ msgstr "Ispilua" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Atxikitze ezarpenak" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/fa.po b/editor/translations/fa.po index 28371fdd50..ad2a56e408 100644 --- a/editor/translations/fa.po +++ b/editor/translations/fa.po @@ -32,13 +32,14 @@ # John Smith <pkafsharix@gmail.com>, 2022. # Ali Jafari <ali.jafari.sn@gmail.com>, 2022. # Ali Almasi <A710almasi@gmail.com>, 2022. +# 2g.2d.2t <2g.2d.2t@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-19 05:22+0000\n" -"Last-Translator: Ali Jafari <ali.jafari.sn@gmail.com>\n" +"PO-Revision-Date: 2022-11-16 22:47+0000\n" +"Last-Translator: 2g.2d.2t <2g.2d.2t@gmail.com>\n" "Language-Team: Persian <https://hosted.weblate.org/projects/godot-engine/" "godot/fa/>\n" "Language: fa\n" @@ -46,7 +47,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -314,9 +315,8 @@ msgid "Data Array" msgstr "آرایه داده" #: core/io/stream_peer_ssl.cpp -#, fuzzy msgid "Blocking Handshake" -msgstr "مسدود کردن دست دادن" +msgstr "مسدود کردن تکان دادن دست" #: core/io/udp_server.cpp msgid "Max Pending Connections" @@ -533,7 +533,6 @@ msgid "Velocity" msgstr "سرعت" #: core/os/input_event.cpp -#, fuzzy msgid "Instrument" msgstr "ابزار" @@ -699,9 +698,8 @@ msgid "UI Select" msgstr "انتخاب رابط کاربری" #: core/project_settings.cpp -#, fuzzy msgid "UI Cancel" -msgstr "لغو" +msgstr "لغو رابط کاربری" #: core/project_settings.cpp #, fuzzy @@ -13185,9 +13183,10 @@ msgstr "تنها در قسمت انتخاب شده" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14613,13 +14612,13 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "" +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "ناتوان در گشودن پروژه" #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -23946,6 +23945,15 @@ msgstr "بازتاب" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "مرتب‌سازی:" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/fi.po b/editor/translations/fi.po index bb73facb22..8aeba71bff 100644 --- a/editor/translations/fi.po +++ b/editor/translations/fi.po @@ -13,13 +13,14 @@ # Matti Niskanen <matti.t.niskanen@gmail.com>, 2020. # Severi Vidnäs <severi.vidnas@gmail.com>, 2021. # Akseli Pihlajamaa <akselijuhanipihlajamaa@gmail.com>, 2022. +# Hannu Lammi <hpl@kapsi.fi>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-11 22:22+0000\n" -"Last-Translator: Akseli Pihlajamaa <akselijuhanipihlajamaa@gmail.com>\n" +"PO-Revision-Date: 2022-10-27 01:11+0000\n" +"Last-Translator: Hannu Lammi <hpl@kapsi.fi>\n" "Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/" "godot/fi/>\n" "Language: fi\n" @@ -27,7 +28,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.14.2-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -137,9 +138,8 @@ msgstr "Telakan sijainti" #: scene/resources/primitive_meshes.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp #: scene/resources/visual_shader.cpp servers/visual_server.cpp -#, fuzzy msgid "Size" -msgstr "Koko:" +msgstr "Koko" #: core/bind/core_bind.cpp msgid "Endian Swap" @@ -152,7 +152,7 @@ msgstr "Editori" #: core/bind/core_bind.cpp msgid "Print Error Messages" -msgstr "" +msgstr "Tulosta virheilmoitukset" #: core/bind/core_bind.cpp #, fuzzy @@ -195,7 +195,7 @@ msgstr "Haun tulokset" #: core/command_queue_mt.cpp core/message_queue.cpp main/main.cpp msgid "Memory" -msgstr "" +msgstr "Muisti" #: core/command_queue_mt.cpp core/message_queue.cpp #: core/register_core_types.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp @@ -458,7 +458,7 @@ msgstr "Fyysinen avain" #: core/os/input_event.cpp msgid "Unicode" -msgstr "" +msgstr "Unicode" #: core/os/input_event.cpp msgid "Echo" @@ -486,7 +486,7 @@ msgstr "Hiiren painikkeen indeksi:" #: core/os/input_event.cpp msgid "Doubleclick" -msgstr "" +msgstr "Kaksoisnapsautus" #: core/os/input_event.cpp msgid "Tilt" @@ -510,9 +510,8 @@ msgstr "Suhteellinen tarttuminen" #: scene/3d/cpu_particles.cpp scene/3d/interpolated_camera.cpp #: scene/animation/animation_player.cpp scene/resources/environment.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed" -msgstr "Nopeus:" +msgstr "Nopeus" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: scene/3d/sprite_3d.cpp @@ -525,9 +524,8 @@ msgid "Axis Value" msgstr "Kiinnitä arvo" #: core/os/input_event.cpp modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Index" -msgstr "Indeksi:" +msgstr "Indeksi" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -639,15 +637,15 @@ msgstr "Toimintakyvytön osanen" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "" +msgstr "Käytä piilotettua projektin datahakemistoa" #: core/project_settings.cpp msgid "Use Custom User Dir" -msgstr "" +msgstr "Käytä mukautettua käyttäjähakemistoa" #: core/project_settings.cpp msgid "Custom User Dir Name" -msgstr "" +msgstr "Mukautetun käyttäjähakemiston nimi" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp @@ -660,7 +658,7 @@ msgstr "Näytä kaikki" #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "Leveys" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -674,7 +672,7 @@ msgstr "Valo" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "Aina päällimmäisenä" #: core/project_settings.cpp #, fuzzy @@ -818,7 +816,7 @@ msgstr " (fyysinen)" #: scene/3d/physics_body.cpp scene/resources/world.cpp #: servers/physics/space_sw.cpp servers/physics_server.cpp msgid "3D" -msgstr "" +msgstr "3D" #: core/project_settings.cpp #, fuzzy @@ -846,7 +844,7 @@ msgstr "Renderöijä:" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "Laatu" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp @@ -915,15 +913,15 @@ msgstr "" #: core/project_settings.cpp msgid "Zlib" -msgstr "" +msgstr "Zlib" #: core/project_settings.cpp msgid "Gzip" -msgstr "" +msgstr "Gzip" #: core/project_settings.cpp platform/android/export/export.cpp msgid "Android" -msgstr "" +msgstr "Android" #: core/project_settings.cpp msgid "Modules" @@ -931,7 +929,7 @@ msgstr "" #: core/register_core_types.cpp msgid "TCP" -msgstr "" +msgstr "TCP" #: core/register_core_types.cpp #, fuzzy @@ -948,7 +946,7 @@ msgstr "" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" -msgstr "" +msgstr "SSL" #: core/register_core_types.cpp main/main.cpp #, fuzzy @@ -1047,7 +1045,7 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -1126,7 +1124,7 @@ msgstr "" #: drivers/gles3/rasterizer_scene_gles3.cpp scene/resources/environment.cpp msgid "High Quality" -msgstr "" +msgstr "Korkea laatu" #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Blend Shape Max Buffer Size (KB)" @@ -1399,9 +1397,8 @@ msgid "Remove this track." msgstr "Poista tämä raita." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "Aika (s): " +msgstr "Aika (s):" #: editor/animation_track_editor.cpp #, fuzzy @@ -1680,9 +1677,8 @@ msgid "Add Method Track Key" msgstr "Lisää metodikutsuraidan avainruutu" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" -msgstr "Metodia ei löydy objektista: " +msgstr "Metodia ei löydy objektista:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -1702,7 +1698,7 @@ msgstr "Metodit" #: editor/animation_track_editor.cpp msgid "Bezier" -msgstr "" +msgstr "Bezier" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp @@ -2857,7 +2853,7 @@ msgstr "Valitse" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "" +msgstr "Projektin vienti alustalle:" #: editor/editor_export.cpp #, fuzzy @@ -2865,14 +2861,12 @@ msgid "Completed with warnings." msgstr "Kopioi solmun polku" #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "Paketti asennettu onnistuneesti!" +msgstr "Paketti asennettu onnistuneesti." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "Epäonnistui:" +msgstr "Epäonnistui." #: editor/editor_export.cpp msgid "Storing File:" @@ -2897,14 +2891,12 @@ msgid "Cannot create file \"%s\"." msgstr "Kansiota ei voitu luoda." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "Ei voitu viedä projektin tiedostoja" +msgstr "Ei voitu viedä projektin tiedostoja." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "Ei voida avata tiedostoa kirjoitettavaksi:" +msgstr "Ei voida avata tiedostoa luettavaksi polulta \"%s\"." #: editor/editor_export.cpp #, fuzzy @@ -2986,7 +2978,7 @@ msgstr "Värioperaattori." #: editor/editor_export.cpp msgid "64 Bits" -msgstr "" +msgstr "64 bittiä" #: editor/editor_export.cpp msgid "Embed PCK" @@ -2999,19 +2991,19 @@ msgstr "Tekstuurialue" #: editor/editor_export.cpp msgid "BPTC" -msgstr "" +msgstr "BPTC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "S3TC" -msgstr "" +msgstr "S3TC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC" -msgstr "" +msgstr "ETC" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "ETC2" -msgstr "" +msgstr "ETC2" #: editor/editor_export.cpp #, fuzzy @@ -3036,19 +3028,16 @@ msgid "Prepare Template" msgstr "Hallinnoi malleja" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "Annettu vientipolku ei ole olemassa:" +msgstr "Annettu vientipolku ei ole olemassa." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "Mallitiedostoa ei löytynyt:" +msgstr "Mallitiedostoa \"%s\" ei löytynyt." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "Virheellinen vientimalli:" +msgstr "Vientimallin kopiointi epäonnistui." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp @@ -5253,9 +5242,8 @@ msgid "Size:" msgstr "Koko:" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "Page:" -msgstr "Sivu: " +msgstr "Sivu:" #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -5548,9 +5536,8 @@ msgid "File Dialog" msgstr "XForm-ikkuna" #: editor/editor_settings.cpp -#, fuzzy msgid "Thumbnail Size" -msgstr "Pienoiskuva..." +msgstr "Pienoiskuvan koko" #: editor/editor_settings.cpp msgid "Docks" @@ -6212,9 +6199,8 @@ msgid "Auto Save" msgstr "Jaa automaattisesti" #: editor/editor_settings.cpp -#, fuzzy msgid "Save Before Running" -msgstr "Tallenna kohtaus ennen suorittamista..." +msgstr "Tallenna kohtaus ennen suorittamista" #: editor/editor_settings.cpp #, fuzzy @@ -6300,9 +6286,8 @@ msgstr "Varastoidaan tiedostoa:" #: editor/editor_settings.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Background Color" -msgstr "Virheellinen taustaväri." +msgstr "Taustaväri" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -8450,9 +8435,8 @@ msgid "Set the end animation. This is useful for sub-transitions." msgstr "Aseta loppuanimaatio. Tämä on hyödyllistä alisiirtymiä varten." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition:" -msgstr "Siirtymä: " +msgstr "Siirtymä:" #: editor/plugins/animation_state_machine_editor.cpp msgid "Play Mode:" @@ -10226,9 +10210,8 @@ msgid "Volume" msgstr "Tilavuus" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source:" -msgstr "Emission lähde: " +msgstr "Emission lähde:" #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." @@ -11879,19 +11862,16 @@ msgid "Sprite" msgstr "Sprite" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Simplification:" -msgstr "Yksinkertaistus: " +msgstr "Yksinkertaistus:" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels):" -msgstr "Kutista (pikseleissä): " +msgstr "Kutista (pikseleissä):" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Grow (Pixels):" -msgstr "Suurrennus (pikseleissä): " +msgstr "Suurrennus (pikseleissä):" #: editor/plugins/sprite_editor_plugin.cpp msgid "Update Preview" @@ -13150,9 +13130,10 @@ msgstr "Tarttumisen asetukset" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Siirtymä:" @@ -14481,14 +14462,12 @@ msgid "More Info..." msgstr "Siirrä..." #: editor/project_export.cpp -#, fuzzy msgid "Export PCK/Zip..." -msgstr "Vie PCK/Zip" +msgstr "Vie PCK/Zip..." #: editor/project_export.cpp -#, fuzzy msgid "Export Project..." -msgstr "Vie projekti" +msgstr "Vie projekti..." #: editor/project_export.cpp msgid "Export All" @@ -14500,9 +14479,8 @@ msgid "Choose an export mode:" msgstr "Ole hyvä ja valitse tyhjä kansio." #: editor/project_export.cpp -#, fuzzy msgid "Export All..." -msgstr "Vie kaikki" +msgstr "Vie kaikki..." #: editor/project_export.cpp editor/project_manager.cpp msgid "ZIP File" @@ -14586,16 +14564,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Virheellinen projektin polku (muuttuiko mikään?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Tiedoston project.godot lataus projektin polusta epäonnistui (virhe %d). Se " "saattaa puuttua tai olla vioittunut." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "Ei voitu muokata project.godot tiedostoa projektin polussa." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Ei voida avata projektia kohteesta '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -17139,9 +17118,8 @@ msgid "Disabled GDNative Singleton" msgstr "GDNative singleton on poistettu käytöstä" #: modules/gdnative/gdnative_library_singleton_editor.cpp -#, fuzzy msgid "Libraries:" -msgstr "Kirjastot: " +msgstr "Kirjastot:" #: modules/gdnative/nativescript/nativescript.cpp #, fuzzy @@ -18063,18 +18041,16 @@ msgstr "" "korjaa solmusi." #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Node returned an invalid sequence output:" -msgstr "Solmu palautti virheellisen jakson tulosteen: " +msgstr "Solmu palautti virheellisen jakson tulosteen:" #: modules/visual_script/visual_script.cpp msgid "Found sequence bit but not the node in the stack, report bug!" msgstr "Jaksobitti löytyi, mutta solmua ei löydy pinosta, raportoi bugi!" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Stack overflow with stack depth:" -msgstr "Pinon ylivuoto pinosyvyydellä: " +msgstr "Pinon ylivuoto pinosyvyydellä:" #: modules/visual_script/visual_script.cpp #, fuzzy @@ -18444,18 +18420,16 @@ msgid "for (elem) in (input):" msgstr "kullekin (elementille) (syötteessä):" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Input type not iterable:" -msgstr "Syötetyyppi ei ole iteroitavissa: " +msgstr "Syötetyyppi ei ole iteroitavissa:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid" msgstr "Iteraattori muuttui epäkelvoksi" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Iterator became invalid:" -msgstr "Iteraattori muuttui epäkelvoksi: " +msgstr "Iteraattori muuttui epäkelvoksi:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" @@ -18613,19 +18587,16 @@ msgstr "Laadi taulukko" #: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Operator" -msgstr "Iteraattori" +msgstr "Operaattori" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Invalid argument of type:" -msgstr ": Virheellinen argumentti tyyppiä: " +msgstr "Virheellinen argumentti tyyppiä:" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Invalid arguments:" -msgstr ": Virheelliset argumentit: " +msgstr "Virheelliset argumentit:" #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" @@ -18637,14 +18608,12 @@ msgid "Var Name" msgstr "Nimi" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "VariableGet not found in script:" -msgstr "VariableGet ei löytynyt skriptistä: " +msgstr "VariableGet ei löytynyt skriptistä:" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "VariableSet not found in script:" -msgstr "VariableSet ei löytynyt skriptistä: " +msgstr "VariableSet ei löytynyt skriptistä:" #: modules/visual_script/visual_script_nodes.cpp msgid "Preload" @@ -19341,15 +19310,13 @@ msgid "Code Signing" msgstr "Allekirjoitetaan DMG-koodi" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." msgstr "" -"'apksigner' ei löydy.\n" -"Ole hyvä ja tarkista, että komento on saatavilla Android SDK build-tools " -"hakemistossa.\n" -"Tuloksena syntynyt %s on allekirjoittamaton." +"'apksigner' ei löydy. Ole hyvä ja tarkista, että komento on saatavilla " +"Android SDK build-tools hakemistossa. Tuloksena syntynyt %s on " +"allekirjoittamaton." #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." @@ -19364,9 +19331,8 @@ msgid "Could not find keystore, unable to export." msgstr "Keystorea ei löytynyt, ei voida viedä." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." -msgstr "Aliprosessia ei voitu käynnistää!" +msgstr "apkgsigner-käynnistystiedostoa ei voitu käynnistää." #: platform/android/export/export_plugin.cpp msgid "'apksigner' returned with error #%d" @@ -19400,9 +19366,8 @@ msgstr "" "Virheellinen tiedostonimi! Android APK tarvitsee *.apk tiedostopäätteen." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Unsupported export format!" -msgstr "Vientiformaatti ei ole tuettu!\n" +msgstr "Vientiformaatti ei ole tuettu!" #: platform/android/export/export_plugin.cpp msgid "" @@ -19413,28 +19378,24 @@ msgstr "" "versiotietoa. Ole hyvä ja uudelleenasenna se 'Projekti'-valikosta." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"Androidin käännösversion epäyhteensopivuus:\n" -" Malli asennettu: %s\n" -" Godotin versio: %s\n" -"Ole hyvä ja uudelleenasenna Androidin käännösmalli 'Projekti'-valikosta." +"Androidin käännösversion epäyhteensopivuus: Malli asennettu: %s, Godotin " +"versio: %s. Ole hyvä ja uudelleenasenna Androidin käännösmalli 'Projekti'-" +"valikosta." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." msgstr "" "Ei voitu ylikirjoittaa res://android/build/res/*.xml tiedostoja projektin " -"nimellä" +"nimellä." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." -msgstr "Ei voitu viedä projektitiedostoja gradle-projektiksi.\n" +msgstr "Ei voitu viedä projektitiedostoja gradle-projektiksi." #: platform/android/export/export_plugin.cpp msgid "Could not write expansion package file!" @@ -19445,12 +19406,11 @@ msgid "Building Android Project (gradle)" msgstr "Käännetään Android-projektia (gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." msgstr "" -"Android-projektin käännös epäonnistui, tarkista virhe tulosteesta.\n" +"Android-projektin käännös epäonnistui, tarkista virhe tulosteesta. " "Vaihtoehtoisesti, lue docs.godotengine.org sivustolta Androidin " "käännösdokumentaatio." @@ -19467,30 +19427,25 @@ msgstr "" "tulosteet gradle-projektin hakemistosta." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "Pakettia ei löytynyt: %s" +msgstr "Pakettia ei löytynyt: \"%s\"." #: platform/android/export/export_plugin.cpp msgid "Creating APK..." msgstr "Luodaan APK:ta..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." -msgstr "" -"Ei löydetty APK-vientimallia vientiä varten:\n" -"%s" +msgstr "Ei löydetty APK-vientimallia vientiä varten: \"%s\"." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Missing libraries in the export template for the selected architectures: %s. " "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" -"Vientimalleista puuttuu kirjastoja valituille arkkitehtuureille: %s.\n" -"Ole hyvä ja kokoa malli, jossa on kaikki tarvittavat kirjastot, tai poista " +"Vientimalleista puuttuu kirjastoja valituille arkkitehtuureille: %s. Ole " +"hyvä ja kokoa malli, jossa on kaikki tarvittavat kirjastot, tai poista " "puuttuvien arkkitehtuurien valinta viennin esiasetuksista." #: platform/android/export/export_plugin.cpp @@ -19498,9 +19453,8 @@ msgid "Adding files..." msgstr "Lisätään tiedostoja..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "Ei voitu viedä projektin tiedostoja" +msgstr "Ei voitu viedä projektin tiedostoja." #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19779,19 +19733,16 @@ msgid "Run exported HTML in the system's default browser." msgstr "Suorita viety HTML järjestelmän oletusselaimessa." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "Mallin avaus vientiin epäonnistui:" +msgstr "Mallin avaus vientiin epäonnistui: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "Virheellinen vientimalli:" +msgstr "Virheellinen vientimalli: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file: \"%s\"." -msgstr "Ei voitu kirjoittaa tiedostoa:" +msgstr "Ei voitu kirjoittaa tiedostoa: \"%s\"." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #, fuzzy @@ -19799,9 +19750,8 @@ msgid "Icon Creation" msgstr "Aseta marginaali" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "Ei voitu lukea tiedostoa:" +msgstr "Ei voitu lukea tiedostoa: \"%s\"." #: platform/javascript/export/export.cpp msgid "PWA" @@ -19882,19 +19832,16 @@ msgid "Icon 512 X 512" msgstr "" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "Ei voitu lukea HTML tulkkia:" +msgstr "Ei voitu lukea HTML tulkkia: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "Ei voitu luoda HTTP-palvelimen hakemistoa:" +msgstr "Ei voitu luoda HTTP-palvelimen hakemistoa: %s." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server: %d." -msgstr "Virhe käynnistettäessä HTTP-palvelinta:" +msgstr "Virhe käynnistettäessä HTTP-palvelinta: %d." #: platform/javascript/export/export.cpp msgid "Web" @@ -20191,9 +20138,8 @@ msgid "Could not open icon file \"%s\"." msgstr "Ei voitu viedä projektin tiedostoja" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start xcrun executable." -msgstr "Aliprosessia ei voitu käynnistää!" +msgstr "xcrun-käynnistystiedostoa ei voitu käynnistää." #: platform/osx/export/export.cpp #, fuzzy @@ -20280,9 +20226,8 @@ msgid "DMG Creation" msgstr "Suunnat" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not start hdiutil executable." -msgstr "Aliprosessia ei voitu käynnistää!" +msgstr "hkiutil-käynnistystiedostoa ei voitu käynnistää." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." @@ -20302,9 +20247,8 @@ msgid "Could not find template app to export: \"%s\"." msgstr "Ei löydetty app-vientimallia vientiä varten:" #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid export format." -msgstr "Virheellinen vientimalli:" +msgstr "Virheellinen vientimalli." #: platform/osx/export/export.cpp msgid "" @@ -20369,9 +20313,8 @@ msgid "ZIP Creation" msgstr "Projekti" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open file to read from path \"%s\"." -msgstr "Ei voitu viedä projektitiedostoja gradle-projektiksi.\n" +msgstr "Ei voitu avata luettavaksi tiedostoa polulta \"%s\"." #: platform/osx/export/export.cpp msgid "Invalid bundle identifier:" @@ -20839,9 +20782,8 @@ msgid "Signtool failed to sign executable: %s." msgstr "Virheellinen käynnistystiedosto." #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to remove temporary file \"%s\"." -msgstr "Väliaikaista tiedosta ei voida poistaa:" +msgstr "Väliaikaista tiedosta ei voida poistaa: \"%s\"." #: platform/windows/export/export.cpp msgid "" @@ -21944,9 +21886,8 @@ msgstr "Matkaa" #: scene/2d/node_2d.cpp scene/2d/polygon_2d.cpp scene/3d/spatial.cpp #: scene/main/canvas_layer.cpp -#, fuzzy msgid "Rotation Degrees" -msgstr "Kierto %s astetta." +msgstr "Kierto asteina" #: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy @@ -24204,6 +24145,15 @@ msgstr "Virhe" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Lajittele" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" @@ -25137,9 +25087,8 @@ msgid "Max Value" msgstr "Arvo" #: scene/gui/range.cpp -#, fuzzy msgid "Page" -msgstr "Sivu: " +msgstr "Sivu" #: scene/gui/range.cpp #, fuzzy @@ -25575,9 +25524,8 @@ msgid "Max Redirects" msgstr "" #: scene/main/http_request.cpp -#, fuzzy msgid "Timeout" -msgstr "Aikakatkaisu." +msgstr "Aikakatkaisu" #: scene/main/node.cpp msgid "" @@ -27045,9 +26993,8 @@ msgid "Distance" msgstr "Poimintaetäisyys:" #: scene/resources/environment.cpp -#, fuzzy msgid "Transition" -msgstr "Siirtymä: " +msgstr "Siirtymä" #: scene/resources/environment.cpp msgid "DOF Near Blur" @@ -28401,9 +28348,8 @@ msgid "Physics Engine" msgstr "Fysiikkaruutujen %" #: servers/physics_server.cpp -#, fuzzy msgid "Center Of Mass" -msgstr "Keskitä vasemmalle" +msgstr "Massakeskipiste" #: servers/physics_server.cpp msgid "Principal Inertia Axes" @@ -28459,29 +28405,24 @@ msgid "VRAM Compression" msgstr "Lauseke" #: servers/visual_server.cpp -#, fuzzy msgid "Import BPTC" -msgstr "Tuo" +msgstr "Tuo BPTC" #: servers/visual_server.cpp -#, fuzzy msgid "Import S3TC" -msgstr "Tuo" +msgstr "Tuo S3TC" #: servers/visual_server.cpp -#, fuzzy msgid "Import ETC" -msgstr "Tuo" +msgstr "Tuo ETC" #: servers/visual_server.cpp -#, fuzzy msgid "Import ETC2" -msgstr "Tuo" +msgstr "Tuo ETC2" #: servers/visual_server.cpp -#, fuzzy msgid "Import PVRTC" -msgstr "Tuo teema" +msgstr "Tuo PVRTC" #: servers/visual_server.cpp msgid "Lossless Compression" @@ -28612,9 +28553,8 @@ msgid "Ninepatch Mode" msgstr "Interpolaatiotila" #: servers/visual_server.cpp -#, fuzzy msgid "OpenGL" -msgstr "Avaa" +msgstr "OpenGL" #: servers/visual_server.cpp msgid "Batching Send Null" diff --git a/editor/translations/fil.po b/editor/translations/fil.po index e6d675f5ca..71673d8255 100644 --- a/editor/translations/fil.po +++ b/editor/translations/fil.po @@ -12,7 +12,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-08-30 03:11+0000\n" +"PO-Revision-Date: 2022-12-03 04:48+0000\n" "Last-Translator: Marco Santos <enum.scima@gmail.com>\n" "Language-Team: Filipino <https://hosted.weblate.org/projects/godot-engine/" "godot/fil/>\n" @@ -21,7 +21,7 @@ msgstr "" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n != 1 && n != 2 && n != 3 && (n % 10 == 4 " "|| n % 10 == 6 || n % 10 == 9);\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -300,7 +300,7 @@ msgstr "Max na Nakabinbing Koneksyon" #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Invalid type argument to convert(), use TYPE_* constants." msgstr "" -"Invalid na argumento ng type sa convert(), gumamit ng mga TYPE_* constant." +"Invalid na type argument sa convert(), gamitin ang mga TYPE_* constant." #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp msgid "Expected a string of length 1 (a character)." @@ -310,7 +310,7 @@ msgstr "Inaasahan ang isang string na may habang 1 (karakter)." #: modules/mono/glue/gd_glue.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." -msgstr "Kulang sa bytes para i-decode ang bytes, o invalid na format." +msgstr "Kulang sa espasyo para ma-decode ang bytes, o invalid na format." #: core/math/expression.cpp msgid "Invalid input %d (not passed) in expression" @@ -318,23 +318,23 @@ msgstr "Invalid na input na %d (di pinasa) sa expression" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "Di magagamit ang self dahil null ang instance (di pinasa)" +msgstr "Hindi magagamit ang self dahil null ang instance (di pinasa)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." -msgstr "Mga invalid na operand sa operator %s, %s, at %s." +msgstr "Mga invalid na operand aa operator %s, %s, at %s." #: core/math/expression.cpp msgid "Invalid index of type %s for base type %s" -msgstr "Invalid na index ng type na %s para sa base type na %s" +msgstr "Invalid na index ng type %s para sa base type %s" #: core/math/expression.cpp msgid "Invalid named index '%s' for base type %s" -msgstr "Invalid na napangalanang index na '%s' para sa base type na %s" +msgstr "Invalid na may pangalang index '%s' para sa base type %s" #: core/math/expression.cpp msgid "Invalid arguments to construct '%s'" -msgstr "Mga invalid na argumento para i-construct ang '%s'" +msgstr "Mga invalid na argument para i-construct ang '%s'" #: core/math/expression.cpp msgid "On call to '%s':" @@ -1033,7 +1033,7 @@ msgstr "Max na Laki ng Buffer ng Blend Shape (KB)" #. TRANSLATORS: Adjective, refers to the mode for Bezier handles (Free, Balanced, Mirror). #: editor/animation_bezier_editor.cpp msgid "Free" -msgstr "Libre" +msgstr "Malaya" #: editor/animation_bezier_editor.cpp msgid "Balanced" @@ -1053,51 +1053,51 @@ msgstr "Value:" #: editor/animation_bezier_editor.cpp msgid "Insert Key Here" -msgstr "Magpasok ng Key Rito" +msgstr "Mag-key rito" #: editor/animation_bezier_editor.cpp msgid "Duplicate Selected Key(s)" -msgstr "Doblehin ang (mga) Napiling Key" +msgstr "Doblehin ang (mga) napiling key" #: editor/animation_bezier_editor.cpp msgid "Delete Selected Key(s)" -msgstr "Burahin ang (mga) Napiling Key" +msgstr "Burahin ang (mga) napiling key" #: editor/animation_bezier_editor.cpp msgid "Add Bezier Point" -msgstr "Magdagdag ng Bezier Point" +msgstr "Magdagdag ng bezier point" #: editor/animation_bezier_editor.cpp msgid "Move Bezier Points" -msgstr "Maglipat ng (mga) Bezier Point" +msgstr "Maglipat ng (mga) bezier point" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Duplicate Keys" -msgstr "Anim Duplicate Keys" +msgstr "I-anim ang mga key sa pagdoble" #: editor/animation_bezier_editor.cpp editor/animation_track_editor.cpp msgid "Anim Delete Keys" -msgstr "Anim Delete Keys" +msgstr "I-anim ang mga key sa pagbura" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Time" -msgstr "Anim Change Keyframe Time" +msgstr "I-anim ang oras ng pagpalit keyframe" #: editor/animation_track_editor.cpp msgid "Anim Change Transition" -msgstr "Anim Change Transition" +msgstr "I-anim ang pagpalit transition" #: editor/animation_track_editor.cpp msgid "Anim Change Transform" -msgstr "Anim Change Transform" +msgstr "I-anim ang pagpalit transform" #: editor/animation_track_editor.cpp msgid "Anim Change Keyframe Value" -msgstr "Anim Change Keyframe Value" +msgstr "I-anim ang value ng pagpalit keyframe" #: editor/animation_track_editor.cpp msgid "Anim Change Call" -msgstr "Anim Change Call" +msgstr "I-anim ang pagpalit call" #: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp @@ -1207,36 +1207,36 @@ msgstr "Anim Multi Change Call" #: editor/animation_track_editor.cpp msgid "Change Animation Length" -msgstr "Baguhin ang Haba ng Animation" +msgstr "Baguhin ang haba ng animation" #: editor/animation_track_editor.cpp #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Change Animation Loop" -msgstr "Baguhin ang Animation Loop" +msgstr "Baguhin ang loop sa animation" #: editor/animation_track_editor.cpp msgid "Property Track" -msgstr "Property Track" +msgstr "Katangian" #: editor/animation_track_editor.cpp msgid "3D Transform Track" -msgstr "3D Transform Track" +msgstr "3D Transform" #: editor/animation_track_editor.cpp msgid "Call Method Track" -msgstr "Call Method Track" +msgstr "Call Method" #: editor/animation_track_editor.cpp msgid "Bezier Curve Track" -msgstr "Bezier Curve Track" +msgstr "Kurbang Bezier" #: editor/animation_track_editor.cpp msgid "Audio Playback Track" -msgstr "Audio Playback Track" +msgstr "Pag-play ng tunog" #: editor/animation_track_editor.cpp msgid "Animation Playback Track" -msgstr "Animation Playback Track" +msgstr "Pag-play sa animation" #: editor/animation_track_editor.cpp msgid "Animation length (frames)" @@ -1248,28 +1248,28 @@ msgstr "Haba ng animation (segundo)" #: editor/animation_track_editor.cpp msgid "Add Track" -msgstr "Magdagdag ng Track" +msgstr "Magdagdag ng track" #: editor/animation_track_editor.cpp msgid "Animation Looping" -msgstr "Pag-loop sa Animation" +msgstr "I-loop ang animation" #: editor/animation_track_editor.cpp #: modules/visual_script/visual_script_editor.cpp msgid "Functions:" -msgstr "Mga Function:" +msgstr "Mga function:" #: editor/animation_track_editor.cpp msgid "Audio Clips:" -msgstr "Mga Audio Clip:" +msgstr "Mga tunog:" #: editor/animation_track_editor.cpp msgid "Anim Clips:" -msgstr "Mga Anim Clip:" +msgstr "Mga anim clip:" #: editor/animation_track_editor.cpp msgid "Change Track Path" -msgstr "Baguhin ang Track Path" +msgstr "Baguhin ang track path" #: editor/animation_track_editor.cpp msgid "Toggle this track on/off." @@ -1277,15 +1277,15 @@ msgstr "Buksan/isara ang track na ito." #: editor/animation_track_editor.cpp msgid "Update Mode (How this property is set)" -msgstr "Update Mode (kung paano itinatakda ang property na ito)" +msgstr "Update Mode (Kung paano tinakda ang katangian na ito)" #: editor/animation_track_editor.cpp scene/resources/gradient.cpp msgid "Interpolation Mode" -msgstr "Interpolation Mode" +msgstr "Interpolation" #: editor/animation_track_editor.cpp msgid "Loop Wrap Mode (Interpolate end with beginning on loop)" -msgstr "Loop Wrap Mode (ini-interpolate ang dulo sa simula ng loop)" +msgstr "Paikot-ikot (i-interpolate ang dulo sa simula ng loop)" #: editor/animation_track_editor.cpp msgid "Remove this track." @@ -1358,7 +1358,7 @@ msgstr "Mga Anim Clip:" #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" -msgstr "Nakabukas ang Toggle Track" +msgstr "Nakabukas ang toggle track" #: editor/animation_track_editor.cpp msgid "Continuous" @@ -1378,7 +1378,7 @@ msgstr "I-capture" #: editor/animation_track_editor.cpp msgid "Nearest" -msgstr "Pinakamalapit" +msgstr "Malapit" #: editor/animation_track_editor.cpp editor/plugins/curve_editor_plugin.cpp #: editor/property_editor.cpp scene/2d/physics_body_2d.cpp @@ -1392,20 +1392,20 @@ msgstr "Cubic" #: editor/animation_track_editor.cpp msgid "Clamp Loop Interp" -msgstr "Clamp Loop Interp" +msgstr "I-clamp ang loop interp" #: editor/animation_track_editor.cpp msgid "Wrap Loop Interp" -msgstr "Wrap Loop Interp" +msgstr "I-wrap ang loop interp" #: editor/animation_track_editor.cpp #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert Key" -msgstr "Magpasok ng Key" +msgstr "Magsingit ng key" #: editor/animation_track_editor.cpp msgid "Duplicate Key(s)" -msgstr "Doblehin ang (mga) Key" +msgstr "Doblehin ang (mga) key" #: editor/animation_track_editor.cpp msgid "Add RESET Value(s)" @@ -1413,23 +1413,23 @@ msgstr "Magdagdag ng (mga) RESET value" #: editor/animation_track_editor.cpp msgid "Delete Key(s)" -msgstr "Burahin ang (mga) Key" +msgstr "Burahin ang (mga) key" #: editor/animation_track_editor.cpp msgid "Change Animation Update Mode" -msgstr "Baguhin ang Animation Update Mode" +msgstr "Baguhin ang pag-update sa animation" #: editor/animation_track_editor.cpp msgid "Change Animation Interpolation Mode" -msgstr "Baguhin ang Animation Interpolation Mode" +msgstr "Baguhin ang interpolation ng animation" #: editor/animation_track_editor.cpp msgid "Change Animation Loop Mode" -msgstr "Baguhin ang Animation Loop Mode" +msgstr "Baguhin ang pag-loop sa animation" #: editor/animation_track_editor.cpp msgid "Remove Anim Track" -msgstr "Tanggalin ang Anim Track" +msgstr "Tanggalin ang anim track" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/plugins/path_editor_plugin.cpp @@ -1448,7 +1448,7 @@ msgstr "" #. TRANSLATORS: %s will be replaced by a phrase describing the target of track. #: editor/animation_track_editor.cpp msgid "Create NEW track for %s and insert key?" -msgstr "" +msgstr "Gumawa ng BAGONG track para sa %s at magsingit ng key?" #: editor/animation_track_editor.cpp msgid "Create %d NEW tracks and insert keys?" @@ -12480,9 +12480,10 @@ msgstr "Pag-snap" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13833,12 +13834,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22508,6 +22508,15 @@ msgstr "Salamin" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Pagsasaayos" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/fr.po b/editor/translations/fr.po index e19c856222..17063caae8 100644 --- a/editor/translations/fr.po +++ b/editor/translations/fr.po @@ -105,13 +105,14 @@ # SCHUTZ Lucas <lucas.schutz0954@gmail.com>, 2022. # EGuillemot <Elouen.Guillemot@gmail.com>, 2022. # Entiz <maxime.salido@gmail.com>, 2022. +# Callim Ethee <callimethee@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-27 21:37+0000\n" -"Last-Translator: Entiz <maxime.salido@gmail.com>\n" +"PO-Revision-Date: 2022-10-10 18:06+0000\n" +"Last-Translator: Helix Sir <vincentbarkmann@gmail.com>\n" "Language-Team: French <https://hosted.weblate.org/projects/godot-engine/" "godot/fr/>\n" "Language: fr\n" @@ -3904,7 +3905,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Could not save one or more scenes!" -msgstr "Impossible de sauver la (les) scènes(s) !" +msgstr "Impossible d'enregistrer la ou les scènes !" #: editor/editor_node.cpp msgid "Save All Scenes" @@ -12942,9 +12943,10 @@ msgstr "Options de magnétisme" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "Décalage" @@ -14366,16 +14368,14 @@ msgstr "Chemin de projet non valide (avez-vous changé quelque chose ?)." #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" -"Impossible de charger le fichier project.godot dans le chemin du projet " -"(erreur %d). Le fichier est manquant ou corrompu." +"Impossible de charger le project à \"%s\" (erreur %d). Il peut être manquant " +"ou corrompu." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "" -"Impossible de modifier le fichier project.godot dans le chemin du projet." +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Impossible d'enregistrer le projet à \"%s\" (erreur %d)." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -19384,7 +19384,7 @@ msgstr "Shell HTML personnalisé" #: platform/javascript/export/export.cpp msgid "Head Include" -msgstr "" +msgstr "Inclure la tête de fichier" #: platform/javascript/export/export.cpp msgid "Canvas Resize Policy" @@ -19392,7 +19392,7 @@ msgstr "Politique de redimensionnement du canevas" #: platform/javascript/export/export.cpp msgid "Focus Canvas On Start" -msgstr "" +msgstr "Sélectionner le canevas au démarrage" #: platform/javascript/export/export.cpp msgid "Experimental Virtual Keyboard" @@ -19499,9 +19499,8 @@ msgid "Failed to get CodeResources hash." msgstr "La récupération du hachage de CodeResources a échouée." #: platform/osx/export/codesign.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Invalid entitlements file." -msgstr "Extension invalide." +msgstr "Fichier de permissions invalide." #: platform/osx/export/codesign.cpp msgid "Invalid executable file." @@ -19582,16 +19581,15 @@ msgstr "Horodatage" #: platform/osx/export/export.cpp msgid "Hardened Runtime" -msgstr "" +msgstr "Environnement d'exécution Renforcé" #: platform/osx/export/export.cpp msgid "Replace Existing Signature" msgstr "Remplacer la signature existante" #: platform/osx/export/export.cpp -#, fuzzy msgid "Entitlements" -msgstr "Gadgets" +msgstr "Permissions" #: platform/osx/export/export.cpp msgid "Custom File" @@ -19607,7 +19605,7 @@ msgstr "Autoriser la mémoire exécutable non signée" #: platform/osx/export/export.cpp msgid "Allow Dyld Environment Variables" -msgstr "" +msgstr "Autoriser les variables d'environnement Dyld" #: platform/osx/export/export.cpp msgid "Disable Library Validation" @@ -19662,28 +19660,24 @@ msgid "Files Downloads" msgstr "Téléchargement de fichiers" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Pictures" -msgstr "Fonctionnalités" +msgstr "Fichiers Images" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Music" -msgstr "Fichier" +msgstr "Fichiers Musicaux" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Movies" -msgstr "Filtrer les tuiles" +msgstr "Fichiers Vidéo" #: platform/osx/export/export.cpp platform/windows/export/export.cpp msgid "Custom Options" msgstr "Options personnalisées" #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization" -msgstr "Localisation" +msgstr "Notarisation" #: platform/osx/export/export.cpp msgid "Apple ID Name" @@ -19711,7 +19705,7 @@ msgstr "Notarisation échouée." #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" -msgstr "" +msgstr "UUID de la requête de notarisation : \"%s\"" #: platform/osx/export/export.cpp msgid "" @@ -19747,10 +19741,12 @@ msgstr "" msgid "" "Hardened Runtime is not compatible with ad-hoc signature, and was disabled!" msgstr "" +"L'Environnement d'exécution Renforcé n'est pas compatible avec la signature " +"ad-hoc et a été désactivé !" #: platform/osx/export/export.cpp msgid "Built-in CodeSign failed with error \"%s\"." -msgstr "" +msgstr "CodeSign intégré a échoué avec l'erreur : \"%s\"." #: platform/osx/export/export.cpp msgid "Built-in CodeSign require regex module." @@ -19908,33 +19904,32 @@ msgid "Notarization: Hardened runtime is required for notarization." msgstr "Notarisation : exécution renforcée nécessaire pour la notarisation." #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization: Timestamp runtime is required for notarization." -msgstr "Certification : exécution renforcée requise." +msgstr "Notarisation : Horodatage nécessaire à la notarisation." #: platform/osx/export/export.cpp msgid "Notarization: Apple ID name not specified." -msgstr "Certification : Identifiant Apple ID non spécifié." +msgstr "Notarisation : Identifiant Apple ID non spécifié." #: platform/osx/export/export.cpp msgid "Notarization: Apple ID password not specified." -msgstr "Certification : Mot de passe Apple ID non spécifié." +msgstr "Notarisation : Mot de passe Apple ID non spécifié." #: platform/osx/export/export.cpp msgid "" "Warning: Notarization is disabled. The exported project will be blocked by " "Gatekeeper if it's downloaded from an unknown source." msgstr "" -"Attention : La certification est désactivé. Le projet exporté sera bloqué " -"par Gatekeeper si il est téléchargé depuis une source inconnue." +"Attention : La notarisation est désactivée. Le projet exporté sera bloqué " +"par Gatekeeper s'il est téléchargé depuis une source inconnue." #: platform/osx/export/export.cpp msgid "" "Code signing is disabled. The exported project will not run on Macs with " "enabled Gatekeeper and Apple Silicon powered Macs." msgstr "" -"La signature du code est désactivé. Le projet exporté ne fonctionnera pas " -"sur les Macs avec Gatekeeper activé et sous les Macs fonctionnant sous Apple " +"La signature du code est désactivée. Le projet exporté ne fonctionnera pas " +"sur les Macs avec Gatekeeper activé ni sur les Macs fonctionnant sous Apple " "Silicon." #: platform/osx/export/export.cpp @@ -19942,12 +19937,14 @@ msgid "" "Hardened Runtime is not compatible with ad-hoc signature, and will be " "disabled!" msgstr "" +"L'Environnement d'éxécution renforcé n'est pas compatible avec la signature " +"ad-hoc et va être désactivé !" #: platform/osx/export/export.cpp msgid "" "Timestamping is not compatible with ad-hoc signature, and will be disabled!" msgstr "" -"L'horodatage n'est pas compatible avec la signature ad-hoc et a été " +"L'horodatage n'est pas compatible avec la signature ad-hoc et va être " "désactivé !" #: platform/osx/export/export.cpp @@ -19955,7 +19952,7 @@ msgid "" "Warning: Notarization is not supported from this OS. The exported project " "will be blocked by Gatekeeper if it's downloaded from an unknown source." msgstr "" -"Attention : La certification n'est pas compatible avec ce système " +"Attention : La notarisation n'est pas compatible avec ce système " "d'exploitation. Le projet exporté sera bloqué par Gatekeeper si il est " "téléchargé depuis une source inconnue." @@ -19964,7 +19961,7 @@ msgid "" "Privacy: Microphone access is enabled, but usage description is not " "specified." msgstr "" -"Confidentialité : L'accès au microphone est actif, mais son usage n'a pas " +"Confidentialité : L'accès au microphone est activé, mais son usage n'a pas " "été spécifié." #: platform/osx/export/export.cpp @@ -20371,11 +20368,11 @@ msgstr "Rcedit" #: platform/windows/export/export.cpp msgid "Osslsigncode" -msgstr "Osslsigncode" +msgstr "Code Signature OpenSSL" #: platform/windows/export/export.cpp msgid "Wine" -msgstr "Wine" +msgstr "Vin" #: platform/x11/export/export.cpp msgid "32-bit executables cannot have embedded data >= 4 GiB." @@ -20454,13 +20451,12 @@ msgid "Gravity" msgstr "Gravité" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Linear Damp" -msgstr "Linéaire" +msgstr "Amorti Linéaire" #: scene/2d/area_2d.cpp scene/3d/area.cpp msgid "Angular Damp" -msgstr "" +msgstr "Amorti Angulaire" #: scene/2d/area_2d.cpp scene/3d/area.cpp msgid "Audio Bus" @@ -20539,9 +20535,8 @@ msgstr "Vue personnalisée" #: scene/2d/camera_2d.cpp scene/3d/camera.cpp scene/3d/interpolated_camera.cpp #: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp #: scene/animation/animation_tree_player.cpp scene/main/timer.cpp -#, fuzzy msgid "Process Mode" -msgstr "Mode déplacement" +msgstr "Mode de traitement" #: scene/2d/camera_2d.cpp msgid "Limit" @@ -20564,9 +20559,8 @@ msgid "Bottom" msgstr "Bas" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Smoothed" -msgstr "Progression douce" +msgstr "Adouci" #: scene/2d/camera_2d.cpp msgid "Draw Margin" @@ -20583,9 +20577,8 @@ msgid "Drag Margin V Enabled" msgstr "Définir la marge" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Smoothing" -msgstr "Progression douce" +msgstr "Adoucissement" #: scene/2d/camera_2d.cpp msgid "H" @@ -20648,9 +20641,8 @@ msgid "Visible" msgstr "Visible" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Self Modulate" -msgstr "Peupler" +msgstr "Auto-modulation" #: scene/2d/canvas_item.cpp msgid "Show Behind Parent" @@ -20822,12 +20814,12 @@ msgstr "FPS fixes" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Fract Delta" -msgstr "" +msgstr "Delta Fraction" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Drawing" -msgstr "" +msgstr "Dessin" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -20850,9 +20842,8 @@ msgid "Sphere Radius" msgstr "Rayon de la Sphère" #: scene/2d/cpu_particles_2d.cpp -#, fuzzy msgid "Rect Extents" -msgstr "Gadgets" +msgstr "Étendue du rectangle" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp msgid "Normals" @@ -20964,18 +20955,16 @@ msgid "Angle Curve" msgstr "Courbe d'angle" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp -#, fuzzy msgid "Scale Amount" msgstr "Valeur d'échelle" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp msgid "Scale Amount Random" -msgstr "" +msgstr "Valeur d'échelle aléatoire" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp -#, fuzzy msgid "Scale Amount Curve" -msgstr "Agrandir/Rétrécir à partir du curseur" +msgstr "Courbe de valeur d'échelle" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21080,7 +21069,7 @@ msgstr "Décalage initial" #: scene/2d/joints_2d.cpp scene/3d/vehicle_body.cpp msgid "Rest Length" -msgstr "" +msgstr "Longueur au repos" #: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp scene/3d/vehicle_body.cpp msgid "Stiffness" @@ -21126,7 +21115,7 @@ msgstr "Calque max" #: scene/2d/light_2d.cpp msgid "Item Cull Mask" -msgstr "" +msgstr "Masque d'élagage d'élément" #: scene/2d/light_2d.cpp scene/3d/light.cpp scene/resources/style_box.cpp msgid "Shadow" @@ -21141,18 +21130,16 @@ msgid "Gradient Length" msgstr "Longueur du dégradé" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Filter Smooth" -msgstr "Filtrer les méthodes" +msgstr "Filtre de lissage" #: scene/2d/light_occluder_2d.cpp msgid "Closed" msgstr "Fermé" #: scene/2d/light_occluder_2d.cpp scene/resources/material.cpp -#, fuzzy msgid "Cull Mode" -msgstr "Mode Règle" +msgstr "Mode Élagage" #: scene/2d/light_occluder_2d.cpp msgid "" @@ -21196,13 +21183,12 @@ msgid "Joint Mode" msgstr "Mode de jointure" #: scene/2d/line_2d.cpp -#, fuzzy msgid "Begin Cap Mode" -msgstr "Mode Région" +msgstr "Lancer le mode capuchon" #: scene/2d/line_2d.cpp msgid "End Cap Mode" -msgstr "Mode du capuchon de fin" +msgstr "Terminer le mode capuchon" #: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp scene/resources/style_box.cpp msgid "Border" @@ -21210,7 +21196,7 @@ msgstr "Bordure" #: scene/2d/line_2d.cpp msgid "Sharp Limit" -msgstr "" +msgstr "Limite Nette" #: scene/2d/line_2d.cpp msgid "Round Precision" @@ -21222,9 +21208,8 @@ msgid "Antialiased" msgstr "Anticrénelé" #: scene/2d/multimesh_instance_2d.cpp scene/3d/multimesh_instance.cpp -#, fuzzy msgid "Multimesh" -msgstr "Multiplier %s" +msgstr "Multimaillage" #: scene/2d/navigation_2d.cpp scene/3d/baked_lightmap.cpp #: scene/3d/navigation.cpp scene/animation/root_motion_view.cpp @@ -21247,9 +21232,8 @@ msgstr "" "Navigation2DServer.map_get_path() » à la place." #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Pathfinding" -msgstr "Pathfinding" +msgstr "Recherche de chemin" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Path Desired Distance" @@ -21280,9 +21264,8 @@ msgid "Max Neighbors" msgstr "Maximum de voisins" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Time Horizon" -msgstr "Retourner horizontalement" +msgstr "Horizon temporel" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp msgid "Max Speed" @@ -21587,7 +21570,7 @@ msgstr "Plateforme mobile" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Apply Velocity On Leave" -msgstr "" +msgstr "Appliquer la vélocité à la sortie" #: scene/2d/physics_body_2d.cpp scene/2d/touch_screen_button.cpp #: scene/3d/physics_body.cpp scene/gui/texture_button.cpp @@ -21726,9 +21709,8 @@ msgid "Frame Coords" msgstr "Coordonnées de trame" #: scene/2d/sprite.cpp scene/resources/texture.cpp -#, fuzzy msgid "Filter Clip" -msgstr "Filtrer les scripts" +msgstr "Filtrer les clips" #: scene/2d/tile_map.cpp msgid "" @@ -21749,9 +21731,8 @@ msgid "Quadrant Size" msgstr "Taille de quadrant" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Custom Transform" -msgstr "Transformation" +msgstr "Transformation Personalisée" #: scene/2d/tile_map.cpp msgid "Half Offset" @@ -21779,7 +21760,7 @@ msgstr "Textures Centrées" #: scene/2d/tile_map.cpp msgid "Cell Clip UV" -msgstr "" +msgstr "Cellule Clip UV" #: scene/2d/tile_map.cpp msgid "Use Parent" @@ -21799,7 +21780,7 @@ msgstr "Forme Visible" #: scene/2d/touch_screen_button.cpp msgid "Passby Press" -msgstr "" +msgstr "Activation en passant" #: scene/2d/touch_screen_button.cpp msgid "Visibility Mode" @@ -21839,7 +21820,7 @@ msgstr "Parent du Processus Physique" #: scene/3d/area.cpp msgid "Reverb Bus" -msgstr "" +msgstr "Bus de Réverb" #: scene/3d/area.cpp msgid "Uniformity" @@ -21870,9 +21851,8 @@ msgstr "" "aucun contrôleur." #: scene/3d/arvr_nodes.cpp -#, fuzzy msgid "Anchor ID" -msgstr "Uniquement les ancres" +msgstr "ID de l'ancre" #: scene/3d/arvr_nodes.cpp msgid "ARVRAnchor must have an ARVROrigin node as its parent." @@ -21912,7 +21892,7 @@ msgstr "Max (dB)" #: scene/3d/audio_stream_player_3d.cpp msgid "Out Of Range Mode" -msgstr "" +msgstr "Mode Hors-de-plage" #: scene/3d/audio_stream_player_3d.cpp msgid "Emission Angle" @@ -21934,7 +21914,7 @@ msgstr "Filtre d’atténuation" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_filter.cpp msgid "Cutoff Hz" -msgstr "" +msgstr "Hz de coupure" #: scene/3d/audio_stream_player_3d.cpp #: servers/audio/effects/audio_effect_filter.cpp @@ -21946,9 +21926,8 @@ msgid "Doppler" msgstr "Doppler" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Tracking" -msgstr "Empaquetage" +msgstr "Suivi" #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp #: scene/3d/reflection_probe.cpp @@ -21982,9 +21961,8 @@ msgstr "Terminé" #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp #: scene/3d/reflection_probe.cpp scene/resources/box_shape.cpp #: scene/resources/rectangle_shape_2d.cpp -#, fuzzy msgid "Extents" -msgstr "Gadgets" +msgstr "Étendues" #: scene/3d/baked_lightmap.cpp msgid "Tweaks" @@ -22043,9 +22021,8 @@ msgid "Custom Energy" msgstr "Énergie personnalisée" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Min Light" -msgstr "Indenter vers la droite" +msgstr "Lumière Min" #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp msgid "Propagation" @@ -22069,12 +22046,11 @@ msgstr "Garder l'aspect" #: scene/3d/camera.cpp scene/3d/light.cpp scene/3d/reflection_probe.cpp msgid "Cull Mask" -msgstr "" +msgstr "Masque d'élagage" #: scene/3d/camera.cpp -#, fuzzy msgid "Doppler Tracking" -msgstr "Piste de propriété" +msgstr "Effet Doppler de Suivi" #: scene/3d/camera.cpp msgid "Projection" @@ -22105,18 +22081,16 @@ msgid "Margin" msgstr "Marge" #: scene/3d/camera.cpp -#, fuzzy msgid "Clip To" -msgstr "Agrafe ci-dessus" +msgstr "Agrafer à " #: scene/3d/collision_object.cpp scene/3d/soft_body.cpp msgid "Ray Pickable" -msgstr "" +msgstr "Sélectionnable par rayon" #: scene/3d/collision_object.cpp -#, fuzzy msgid "Capture On Drag" -msgstr "Capturer" +msgstr "Capturer lors du glissement" #: scene/3d/collision_object.cpp msgid "" @@ -22187,9 +22161,8 @@ msgstr "" "Particles » activé." #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Box Extents" -msgstr "Gadgets" +msgstr "Étendues de la boîte" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp msgid "Ring Radius" @@ -22229,10 +22202,9 @@ msgstr "Mode portail" #: scene/3d/cull_instance.cpp msgid "Include In Bound" -msgstr "" +msgstr "Inclure dans la frontière" #: scene/3d/cull_instance.cpp -#, fuzzy msgid "Allow Merging" msgstr "Autoriser la fusion" @@ -22363,37 +22335,32 @@ msgid "Contact" msgstr "Contact" #: scene/3d/light.cpp -#, fuzzy msgid "Reverse Cull Face" -msgstr "Réinitialiser le volume de bus" +msgstr "Élagage inversé de la face" #: scene/3d/light.cpp servers/visual_server.cpp msgid "Directional Shadow" msgstr "Ombre directionnelle" #: scene/3d/light.cpp -#, fuzzy msgid "Split 1" -msgstr "Divisé" +msgstr "Séparation 1" #: scene/3d/light.cpp -#, fuzzy msgid "Split 2" -msgstr "Divisé" +msgstr "Séparation 2" #: scene/3d/light.cpp -#, fuzzy msgid "Split 3" -msgstr "Divisé" +msgstr "Séparation 3" #: scene/3d/light.cpp msgid "Blend Splits" -msgstr "Mélanger les écarts" +msgstr "Mélanger les séparations" #: scene/3d/light.cpp -#, fuzzy msgid "Bias Split Scale" -msgstr "Utiliser le magnétisme d'échelle" +msgstr "Échelle du biais de séparation" #: scene/3d/light.cpp msgid "Depth Range" @@ -22427,7 +22394,7 @@ msgstr "Atténuation d'angle" #: scene/3d/mesh_instance.cpp msgid "Software Skinning" -msgstr "" +msgstr "Habillage Logiciel" #: scene/3d/mesh_instance.cpp msgid "Transform Normals" @@ -22596,15 +22563,15 @@ msgstr "Z angulaire" #: scene/3d/physics_body.cpp msgid "Motion X" -msgstr "X mouvement" +msgstr "Mouvement X" #: scene/3d/physics_body.cpp msgid "Motion Y" -msgstr "Y mouvement" +msgstr "Mouvement Y" #: scene/3d/physics_body.cpp msgid "Motion Z" -msgstr "Z mouvement" +msgstr "Mouvement Z" #: scene/3d/physics_body.cpp msgid "Joint Constraints" @@ -22729,7 +22696,7 @@ msgstr "Amortissement angulaire" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "ERP" -msgstr "" +msgstr "ERP" #: scene/3d/physics_body.cpp msgid "Angular Spring Enabled" @@ -22961,7 +22928,7 @@ msgstr "Nom de groupe" #: scene/3d/proximity_group.cpp msgid "Dispatch Mode" -msgstr "" +msgstr "Mode Répartition" #: scene/3d/proximity_group.cpp msgid "Grid Radius" @@ -23000,9 +22967,8 @@ msgid "Ambient Energy" msgstr "Énergie ambiante" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Ambient Contrib" -msgstr "Indenter vers la droite" +msgstr "Contribution Ambiante" #: scene/3d/remote_transform.cpp msgid "" @@ -23036,20 +23002,19 @@ msgstr "" #: scene/3d/room.cpp msgid "Use Default Simplify" -msgstr "" +msgstr "Utiliser la simplification par défaut" #: scene/3d/room.cpp scene/3d/room_manager.cpp msgid "Room Simplify" -msgstr "" +msgstr "Simplifier la pièce" #: scene/3d/room.cpp msgid "Bound" -msgstr "" +msgstr "Frontière" #: scene/3d/room_group.cpp -#, fuzzy msgid "Roomgroup Priority" -msgstr "Priorité" +msgstr "Priorité du groupe de pièces" #: scene/3d/room_group.cpp msgid "The RoomManager should not be placed inside a RoomGroup." @@ -23077,67 +23042,58 @@ msgstr "Il ne doit y avoir qu'un seul RoomManager dans le SceneTree." #: scene/3d/room_manager.cpp msgid "Main" -msgstr "" +msgstr "Principal" #: scene/3d/room_manager.cpp scene/animation/animation_blend_tree.cpp #: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp #: scene/animation/animation_tree_player.cpp #: servers/audio/effects/audio_effect_delay.cpp -#, fuzzy msgid "Active" -msgstr "Action" +msgstr "Actif" #: scene/3d/room_manager.cpp msgid "Roomlist" -msgstr "" +msgstr "Liste des pièces" #: scene/3d/room_manager.cpp servers/visual_server.cpp -#, fuzzy msgid "PVS" -msgstr "IPS" +msgstr "PVS" #: scene/3d/room_manager.cpp -#, fuzzy msgid "PVS Mode" -msgstr "Mode navigation" +msgstr "Mode PVS" #: scene/3d/room_manager.cpp -#, fuzzy msgid "PVS Filename" -msgstr "Fichier ZIP" +msgstr "Nom de ficher PVS" #: scene/3d/room_manager.cpp servers/visual_server.cpp msgid "Gameplay" -msgstr "" +msgstr "Jouabilité" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Gameplay Monitor" -msgstr "Moniteur" +msgstr "Moniteur de jouabilité" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Use Secondary PVS" -msgstr "Utiliser le magnétisme d'échelle" +msgstr "Utiliser PVS secondaire" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Merge Meshes" -msgstr "Maillages" +msgstr "Unifier les maillages" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Show Margins" -msgstr "Afficher l'origine" +msgstr "Afficher les marges" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Debug Sprawl" -msgstr "Débogage" +msgstr "Déboger le sprawl" #: scene/3d/room_manager.cpp msgid "Overlap Warning Threshold" -msgstr "" +msgstr "Seuil d'avertissement de superposition" #: scene/3d/room_manager.cpp msgid "Preview Camera" @@ -23145,17 +23101,15 @@ msgstr "Aperçu de caméra" #: scene/3d/room_manager.cpp msgid "Portal Depth Limit" -msgstr "" +msgstr "Limite de profondeur du portail" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Default Portal Margin" -msgstr "Définir la marge" +msgstr "Marge de portail par défaut" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Roaming Expansion Margin" -msgstr "Développer tout" +msgstr "Marge d'expansion roaming" #: scene/3d/room_manager.cpp msgid "" @@ -23210,43 +23164,36 @@ msgstr "" "manuelles." #: scene/3d/skeleton.cpp scene/resources/skin.cpp -#, fuzzy msgid "Pose" -msgstr "Copier la pose" +msgstr "Pose" #: scene/3d/skeleton.cpp -#, fuzzy msgid "Bound Children" -msgstr "Enfants modifiables" +msgstr "Enfants liés" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Pinned Points" -msgstr "Épinglé %s" +msgstr "Points épinglés" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Attachments" -msgstr "Gadgets" +msgstr "Attachements" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Point Index" -msgstr "Récupérer la position" +msgstr "Index de point" #: scene/3d/soft_body.cpp msgid "Spatial Attachment Path" -msgstr "" +msgstr "Chemin de la pièce jointe spatiale" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Physics Enabled" -msgstr "Image physique %" +msgstr "Physique active" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Parent Collision Ignore" -msgstr "Créer le polygone de collision" +msgstr "Ignorer les collisions avec le parent" #: scene/3d/soft_body.cpp msgid "Simulation Precision" @@ -23258,32 +23205,31 @@ msgstr "Masse totale" #: scene/3d/soft_body.cpp msgid "Linear Stiffness" -msgstr "" +msgstr "Rigidité Linéaire" #: scene/3d/soft_body.cpp msgid "Areaangular Stiffness" -msgstr "" +msgstr "Rigidité Aire Angulaire" #: scene/3d/soft_body.cpp msgid "Volume Stiffness" -msgstr "" +msgstr "Rigidité de volume" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Pressure Coefficient" msgstr "Coefficient de pression" #: scene/3d/soft_body.cpp msgid "Damping Coefficient" -msgstr "" +msgstr "Coefficient d'amortissement" #: scene/3d/soft_body.cpp msgid "Drag Coefficient" -msgstr "" +msgstr "Coefficient de traînée" #: scene/3d/soft_body.cpp msgid "Pose Matching Coefficient" -msgstr "" +msgstr "Coefficient d'alignement de pose" #: scene/3d/soft_body.cpp msgid "This body will be ignored until you set a mesh." @@ -23300,9 +23246,8 @@ msgstr "" "Modifiez les tailles dans les formes de collision enfants à la place." #: scene/3d/spatial.cpp -#, fuzzy msgid "Global Translation" -msgstr "Transformation Globale" +msgstr "Position globale" #: scene/3d/spatial.cpp msgid "Matrix" @@ -23397,6 +23342,14 @@ msgstr "Force max" msgid "AABB" msgstr "AABB" +#: scene/3d/visual_instance.cpp +msgid "Sorting" +msgstr "Arrangement" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "Utiliser le centre de l'AABB" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "Géométrie" @@ -23528,9 +23481,8 @@ msgid "Xfade Time" msgstr "Durée du fondu croisé" #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Switch Mode" -msgstr "Mode de Switch" +msgstr "Changer de mode" #: scene/animation/animation_node_state_machine.cpp msgid "Auto Advance" @@ -23628,14 +23580,12 @@ msgid "This node has been deprecated. Use AnimationTree instead." msgstr "Ce nÅ“ud est désormais déprécié. Utilisez AnimationTree à la place." #: scene/animation/animation_tree_player.cpp -#, fuzzy msgid "Playback" -msgstr "Jouer" +msgstr "Lecture" #: scene/animation/animation_tree_player.cpp -#, fuzzy msgid "Master Player" -msgstr "Coller les paramètres" +msgstr "Lecteur principal" #: scene/animation/animation_tree_player.cpp msgid "Base Path" @@ -23690,9 +23640,8 @@ msgid "Playback Speed" msgstr "Vitesse de lecture" #: scene/audio/audio_stream_player.cpp -#, fuzzy msgid "Mix Target" -msgstr "Cible" +msgstr "Cible Mixte" #: scene/gui/aspect_ratio_container.cpp scene/gui/range.cpp #: servers/audio/effects/audio_effect_compressor.cpp @@ -23718,11 +23667,11 @@ msgstr "Mode d'action" #: scene/gui/base_button.cpp msgid "Enabled Focus Mode" -msgstr "" +msgstr "Mode Concentration activé" #: scene/gui/base_button.cpp msgid "Keep Pressed Outside" -msgstr "" +msgstr "Garder pressé à l'extérieur" #: scene/gui/base_button.cpp scene/gui/shortcut.cpp msgid "Shortcut" @@ -23859,9 +23808,8 @@ msgid "Tooltip" msgstr "Info-bulle" #: scene/gui/control.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Focus" -msgstr "Focaliser le chemin" +msgstr "Focus" #: scene/gui/control.cpp msgid "Neighbour Left" @@ -23922,7 +23870,7 @@ msgstr "Boîte de dialogue" #: scene/gui/dialogs.cpp msgid "Hide On OK" -msgstr "" +msgstr "Cacher quand OK" #: scene/gui/dialogs.cpp msgid "Alert!" @@ -23955,29 +23903,25 @@ msgid "Snap Distance" msgstr "Distance d'arrondissage" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Min" -msgstr "Zoomer" +msgstr "Zoom Min" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Max" -msgstr "Zoomer" +msgstr "Zoom Max" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom Step" -msgstr "Dézoomer" +msgstr "Pas de Zoom" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Show Zoom Label" -msgstr "Afficher les os" +msgstr "Afficher le label de zoom" #: scene/gui/graph_edit.cpp scene/gui/text_edit.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Minimap" -msgstr "" +msgstr "Mini-carte" #: scene/gui/graph_edit.cpp msgid "Enable grid minimap." @@ -23990,33 +23934,29 @@ msgstr "Afficher les os" #: scene/gui/graph_node.cpp scene/gui/option_button.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selected" -msgstr "Sélectionner" +msgstr "Sélectionné" #: scene/gui/graph_node.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Comment" -msgstr "Enregistrer" +msgstr "Commentaire" #: scene/gui/graph_node.cpp msgid "Overlay" -msgstr "" +msgstr "Surcouche" #: scene/gui/grid_container.cpp scene/gui/item_list.cpp scene/gui/tree.cpp -#, fuzzy msgid "Columns" -msgstr "Volume" +msgstr "Colonnes" #: scene/gui/item_list.cpp scene/gui/popup_menu.cpp scene/gui/text_edit.cpp #: scene/gui/tree.cpp scene/main/viewport.cpp -#, fuzzy msgid "Timers" -msgstr "Temps" +msgstr "Chronomètres" #: scene/gui/item_list.cpp scene/gui/popup_menu.cpp scene/gui/tree.cpp msgid "Incremental Search Max Interval Msec" -msgstr "" +msgstr "Intervalle max de recherche incrémentale (ms)" #: scene/gui/item_list.cpp scene/gui/tree.cpp #, fuzzy @@ -24030,7 +23970,7 @@ msgstr "Remplir la sélection" #: scene/gui/item_list.cpp msgid "Max Text Lines" -msgstr "" +msgstr "Lignes de texte max" #: scene/gui/item_list.cpp #, fuzzy @@ -24039,15 +23979,15 @@ msgstr "En période de test" #: scene/gui/item_list.cpp msgid "Max Columns" -msgstr "" +msgstr "Colonnes Max" #: scene/gui/item_list.cpp msgid "Same Column Width" -msgstr "" +msgstr "Même Largeur de Colonne" #: scene/gui/item_list.cpp msgid "Fixed Column Width" -msgstr "" +msgstr "Largeur de Colonne Fixe" #: scene/gui/item_list.cpp msgid "Icon Scale" @@ -24074,19 +24014,19 @@ msgstr "Rendre visible" #: scene/gui/label.cpp msgid "Lines Skipped" -msgstr "" +msgstr "Lignes Ignorées" #: scene/gui/label.cpp msgid "Max Lines Visible" -msgstr "" +msgstr "Lignes Visibles Max" #: scene/gui/line_edit.cpp scene/resources/navigation_mesh.cpp msgid "Max Length" -msgstr "" +msgstr "Longueur Max" #: scene/gui/line_edit.cpp msgid "Secret" -msgstr "" +msgstr "Secret" #: scene/gui/line_edit.cpp msgid "Secret Character" @@ -24094,7 +24034,7 @@ msgstr "Caractère secret" #: scene/gui/line_edit.cpp msgid "Expand To Text Length" -msgstr "" +msgstr "Etendre à la longueur du texte" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp #, fuzzy @@ -24129,7 +24069,7 @@ msgstr "Sélection uniquement" #: scene/gui/line_edit.cpp scene/gui/rich_text_label.cpp #: scene/gui/text_edit.cpp msgid "Deselect On Focus Loss Enabled" -msgstr "" +msgstr "Déselection à la perte de focus activée" #: scene/gui/line_edit.cpp #, fuzzy @@ -24143,7 +24083,7 @@ msgstr "Charger en tant qu'instance temporaire" #: scene/gui/line_edit.cpp msgid "Alpha" -msgstr "" +msgstr "Alpha" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" @@ -24151,7 +24091,7 @@ msgstr "Caret" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" -msgstr "" +msgstr "Clignoter" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink Speed" @@ -24159,7 +24099,7 @@ msgstr "Vitesse de Clignotement" #: scene/gui/link_button.cpp msgid "Underline" -msgstr "" +msgstr "Souligner" #: scene/gui/menu_button.cpp #, fuzzy @@ -24183,7 +24123,7 @@ msgstr "Définir la marge" #: scene/gui/nine_patch_rect.cpp scene/resources/style_box.cpp msgid "Axis Stretch" -msgstr "" +msgstr "Etirer les Axes" #: scene/gui/nine_patch_rect.cpp msgid "" @@ -24373,11 +24313,11 @@ msgstr "Filtrer les signaux" #: scene/gui/scroll_container.cpp msgid "Default Scroll Deadzone" -msgstr "" +msgstr "Zone morte par défaut du défilement" #: scene/gui/slider.cpp msgid "Scrollable" -msgstr "" +msgstr "Défilant" #: scene/gui/slider.cpp #, fuzzy @@ -24412,7 +24352,7 @@ msgstr "Basculer la visibilité" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp msgid "Tab Align" -msgstr "" +msgstr "Alignement de l'onglet" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp msgid "Current Tab" @@ -24425,7 +24365,7 @@ msgstr "Rendre visible" #: scene/gui/tab_container.cpp msgid "All Tabs In Front" -msgstr "" +msgstr "Tous les Onglets au Premier Plan" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp msgid "Drag To Rearrange Enabled" @@ -24433,11 +24373,11 @@ msgstr "Glisser pour Réorganiser Activé" #: scene/gui/tab_container.cpp msgid "Use Hidden Tabs For Min Size" -msgstr "" +msgstr "Utiliser des onglets cachés pour la taille minimum" #: scene/gui/tabs.cpp msgid "Tab Close Display Policy" -msgstr "" +msgstr "Stratégie d'affichage pour la fermeture d'onglet" #: scene/gui/tabs.cpp msgid "Scrolling Enabled" @@ -24445,7 +24385,7 @@ msgstr "Défilement activé" #: scene/gui/text_edit.cpp msgid "Readonly" -msgstr "" +msgstr "Lecture Seule" #: scene/gui/text_edit.cpp #, fuzzy @@ -24495,19 +24435,20 @@ msgstr "Déverrouiller le nÅ“ud" #: scene/gui/text_edit.cpp msgid "Moving By Right Click" -msgstr "" +msgstr "Déplacer avec clic droit" #: scene/gui/text_edit.cpp msgid "Text Edit Idle Detect (sec)" -msgstr "" +msgstr "Détéction d'inactivité du champ de texte (s)" #: scene/gui/text_edit.cpp msgid "Text Edit Undo Stack Max Size" msgstr "" +"Nombre d'actions max dans le champ de texte à mémoriser pour l'annulation" #: scene/gui/texture_button.cpp scene/resources/default_theme/default_theme.cpp msgid "Hover" -msgstr "" +msgstr "Survoler" #: scene/gui/texture_button.cpp #, fuzzy @@ -24527,7 +24468,7 @@ msgstr "Développer tout" #: scene/gui/texture_progress.cpp msgid "Under" -msgstr "" +msgstr "Sous" #: scene/gui/texture_progress.cpp #, fuzzy @@ -24541,7 +24482,7 @@ msgstr "Propriétés du thème" #: scene/gui/texture_progress.cpp msgid "Progress Offset" -msgstr "" +msgstr "Décalage de la Progression" #: scene/gui/texture_progress.cpp msgid "Fill Mode" @@ -24549,11 +24490,11 @@ msgstr "Mode de Remplissage" #: scene/gui/texture_progress.cpp scene/resources/material.cpp msgid "Tint" -msgstr "" +msgstr "Teinte" #: scene/gui/texture_progress.cpp msgid "Radial Fill" -msgstr "" +msgstr "Remplissage Radial" #: scene/gui/texture_progress.cpp #, fuzzy @@ -24596,7 +24537,7 @@ msgstr "Mode sélection" #: scene/gui/tree.cpp msgid "Custom Minimum Height" -msgstr "" +msgstr "Taille Minimum Personnalisée" #: scene/gui/tree.cpp msgid "(Other)" @@ -24618,7 +24559,7 @@ msgstr "Masquer la Racine" #: scene/gui/tree.cpp msgid "Drop Mode Flags" -msgstr "" +msgstr "Options du Mode Abandon" #: scene/gui/video_player.cpp #, fuzzy @@ -24627,7 +24568,7 @@ msgstr "Ajouter une piste" #: scene/gui/video_player.cpp scene/main/scene_tree.cpp scene/main/timer.cpp msgid "Paused" -msgstr "" +msgstr "En Pause" #: scene/gui/video_player.cpp #, fuzzy @@ -24661,11 +24602,11 @@ msgstr "Téléchargement en cours" #: scene/main/http_request.cpp msgid "Body Size Limit" -msgstr "" +msgstr "Taille Limite du Corps" #: scene/main/http_request.cpp msgid "Max Redirects" -msgstr "" +msgstr "Redirections Max" #: scene/main/http_request.cpp msgid "Timeout" @@ -24676,6 +24617,8 @@ msgid "" "Setting node name '%s' to be unique within scene for '%s', but it's already " "claimed by '%s'. This node is no longer set unique." msgstr "" +"Impossible de déclarer le nom de nÅ“ud '%s' comme unique dans la scène pour " +"'%s', car ce nom est déjà attribué à '%s'. Ce nÅ“ud n'est donc plus unique." #: scene/main/node.cpp #, fuzzy @@ -24684,7 +24627,7 @@ msgstr "Séparateur nommé" #: scene/main/node.cpp msgid "Name Casing" -msgstr "" +msgstr "Convention de Nommage" #: scene/main/node.cpp #, fuzzy @@ -24746,7 +24689,7 @@ msgstr "Mode Navigation" #: scene/main/scene_tree.cpp msgid "Use Font Oversampling" -msgstr "" +msgstr "Utiliser le Suréchantillonnage de Police" #: scene/main/scene_tree.cpp #, fuzzy @@ -24812,7 +24755,7 @@ msgstr "Utiliser FXAA" #: scene/main/scene_tree.cpp msgid "Use Debanding" -msgstr "" +msgstr "Utiliser le Debanding" #: scene/main/scene_tree.cpp scene/main/viewport.cpp msgid "HDR" @@ -25063,7 +25006,7 @@ msgstr "Demi résolution" #: scene/resources/curve.cpp msgid "Bake Interval" -msgstr "" +msgstr "Intervalle de Précalcul" #: scene/resources/default_theme/default_theme.cpp msgid "Panel" @@ -25304,7 +25247,7 @@ msgstr "Poignée quand désactivée" #: scene/resources/default_theme/default_theme.cpp msgid "Tick" -msgstr "" +msgstr "Signet" #: scene/resources/default_theme/default_theme.cpp msgid "Updown" @@ -25502,7 +25445,7 @@ msgstr "Couleur des lignes de relation" #: scene/resources/default_theme/default_theme.cpp msgid "Custom Button Font Highlight" -msgstr "" +msgstr "Surlignage Personnalisé de la Police du Bouton" #: scene/resources/default_theme/default_theme.cpp msgid "Item Margin" @@ -25736,7 +25679,7 @@ msgstr "Déplacer des points de Bézier" #: scene/resources/default_theme/default_theme.cpp msgid "Bezier Len Neg" -msgstr "" +msgstr "Longueur Négative Courbe de Bézier" #: scene/resources/default_theme/default_theme.cpp msgid "Port Grab Distance Horizontal" @@ -25808,7 +25751,7 @@ msgstr "Degrés de Rotation du Ciel" #: scene/resources/environment.cpp msgid "Canvas Max Layer" -msgstr "" +msgstr "Calque Max du Canvas" #: scene/resources/environment.cpp scene/resources/texture.cpp msgid "Camera Feed ID" @@ -26083,7 +26026,7 @@ msgstr "Passe suivante" #: scene/resources/material.cpp msgid "Use Shadow To Opacity" -msgstr "" +msgstr "Utiliser l'ombre pour l'opacité" #: scene/resources/material.cpp msgid "Unshaded" @@ -26240,7 +26183,7 @@ msgstr "Occlusion ambiante" #: scene/resources/material.cpp msgid "Deep Parallax" -msgstr "" +msgstr "Parallaxe Profonde" #: scene/resources/material.cpp #, fuzzy @@ -26254,7 +26197,7 @@ msgstr "Calque" #: scene/resources/material.cpp msgid "Flip Tangent" -msgstr "" +msgstr "Inverser la Tangente" #: scene/resources/material.cpp #, fuzzy @@ -26291,7 +26234,7 @@ msgstr "Triplanaire" #: scene/resources/material.cpp msgid "Triplanar Sharpness" -msgstr "" +msgstr "Netteté Triplanaire" #: scene/resources/material.cpp msgid "UV2" @@ -26304,7 +26247,7 @@ msgstr "Mode prioritaire" #: scene/resources/material.cpp msgid "Distance Fade" -msgstr "" +msgstr "Fondu de Distance" #: scene/resources/material.cpp msgid "Async Mode" @@ -26317,7 +26260,7 @@ msgstr "LightMap Bake" #: scene/resources/mesh.cpp scene/resources/primitive_meshes.cpp msgid "Custom AABB" -msgstr "" +msgstr "AABB Personnalisé" #: scene/resources/mesh_library.cpp msgid "Mesh Transform" @@ -26337,7 +26280,7 @@ msgstr "Format de transformation" #: scene/resources/multimesh.cpp msgid "Custom Data Format" -msgstr "" +msgstr "Format de Données Personnalisé" #: scene/resources/multimesh.cpp msgid "Instance Count" @@ -26361,7 +26304,7 @@ msgstr "Type de la géométrie analysée" #: scene/resources/navigation_mesh.cpp msgid "Source Geometry Mode" -msgstr "" +msgstr "Mode Géométrie Source" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26378,7 +26321,7 @@ msgstr "Agents" #: scene/resources/navigation_mesh.cpp msgid "Max Climb" -msgstr "" +msgstr "Escalade Max" #: scene/resources/navigation_mesh.cpp msgid "Max Slope" @@ -26404,7 +26347,7 @@ msgstr "Erreur" #: scene/resources/navigation_mesh.cpp msgid "Verts Per Poly" -msgstr "" +msgstr "Sommets par Poly" #: scene/resources/navigation_mesh.cpp msgid "Details" @@ -26421,15 +26364,15 @@ msgstr "Échantillonneur" #: scene/resources/navigation_mesh.cpp msgid "Low Hanging Obstacles" -msgstr "" +msgstr "Obstacles Suspendus Bas" #: scene/resources/navigation_mesh.cpp msgid "Ledge Spans" -msgstr "" +msgstr "Etendue de Rebord" #: scene/resources/navigation_mesh.cpp msgid "Walkable Low Height Spans" -msgstr "" +msgstr "Etendues de faible hauteur praticables" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -26507,7 +26450,7 @@ msgstr "Fermer la courbe" #: scene/resources/physics_material.cpp msgid "Rough" -msgstr "" +msgstr "Rugueux" #: scene/resources/physics_material.cpp msgid "Absorbent" @@ -26523,7 +26466,7 @@ msgstr "Retourner les faces" #: scene/resources/primitive_meshes.cpp msgid "Mid Height" -msgstr "" +msgstr "Mi-hauteur" #: scene/resources/primitive_meshes.cpp msgid "Subdivide Width" @@ -26568,7 +26511,7 @@ msgstr "A" #: scene/resources/shape_2d.cpp msgid "Custom Solver Bias" -msgstr "" +msgstr "Biais Personnalisé du Solveur" #: scene/resources/skin.cpp msgid "Bind Count" @@ -26646,7 +26589,7 @@ msgstr "Changer le rayon intérieur de la tour" #: scene/resources/style_box.cpp msgid "Corner Detail" -msgstr "" +msgstr "Détail des Coins" #: scene/resources/style_box.cpp msgid "Anti Aliasing" @@ -26654,11 +26597,11 @@ msgstr "Anticrénelage" #: scene/resources/style_box.cpp msgid "Grow Begin" -msgstr "" +msgstr "Début d'Expansion" #: scene/resources/style_box.cpp msgid "Grow End" -msgstr "" +msgstr "Fin d'Expansion" #: scene/resources/texture.cpp #, fuzzy @@ -26715,7 +26658,7 @@ msgstr "Pause" #: scene/resources/texture.cpp msgid "Which Feed" -msgstr "" +msgstr "Quel Flux" #: scene/resources/texture.cpp msgid "Camera Is Active" @@ -27523,7 +27466,7 @@ msgstr "Nombre de compilations simultanées" #: servers/visual_server.cpp msgid "Log Active Async Compiles Count" -msgstr "" +msgstr "Noter le nombre de compilations asynchrones actives" #: servers/visual_server.cpp msgid "Shader Cache Size (MB)" diff --git a/editor/translations/ga.po b/editor/translations/ga.po index 246c04dc63..01810bb059 100644 --- a/editor/translations/ga.po +++ b/editor/translations/ga.po @@ -12451,9 +12451,10 @@ msgstr "Cruthaigh" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13796,12 +13797,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22473,6 +22473,15 @@ msgstr "" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Nód Beochana" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/gl.po b/editor/translations/gl.po index 2445ec4783..1d2fbb333a 100644 --- a/editor/translations/gl.po +++ b/editor/translations/gl.po @@ -13135,9 +13135,10 @@ msgstr "Opcións de Axuste de CuadrÃcula" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Offset:" @@ -14561,17 +14562,18 @@ msgid "Invalid project path (changed anything?)." msgstr "A ruta ao proxecto non é valida. Cambiaches algo?" #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Non se pudo cargar o arquivo de configuración 'project.godot' na ruta do " "proxecto (erro %d). Pode ser que o arquivo non exista; ou que esté " "corrompido." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "Non se pudo editar o arquivo 'project.godot' na ruta do proxecto." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Non se pode abrir proxecto en '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -23866,6 +23868,15 @@ msgstr "Erro" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Ordenar" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/he.po b/editor/translations/he.po index e0a690c9b4..57b2386570 100644 --- a/editor/translations/he.po +++ b/editor/translations/he.po @@ -23,13 +23,16 @@ # Shailee Eliyahu <dev.sle.il@gmail.com>, 2021. # Mati Borlak <matiborlak@gmail.com>, 2022. # Tamir Livneh <fkeyzuwu@gmail.com>, 2022. +# Tomer Ben Rachel <tomerpacific@gmail.com>, 2022. +# moshe mil <milgmoshe@gmail.com>, 2022. +# Blawnode <blawnode@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-05 11:17+0000\n" -"Last-Translator: Tamir Livneh <fkeyzuwu@gmail.com>\n" +"PO-Revision-Date: 2022-11-23 20:47+0000\n" +"Last-Translator: Blawnode <blawnode@gmail.com>\n" "Language-Team: Hebrew <https://hosted.weblate.org/projects/godot-engine/" "godot/he/>\n" "Language: he\n" @@ -38,7 +41,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=4; plural=(n == 1) ? 0 : ((n == 2) ? 1 : ((n > 10 && " "n % 10 == 0) ? 2 : 3));\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -57,26 +60,24 @@ msgid "Exit Code" msgstr "קוד יצי××”" #: core/bind/core_bind.cpp -#, fuzzy msgid "V-Sync Enabled" -msgstr "הפעלה" +msgstr "V-Sync מופעל" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" -msgstr "" +msgstr "V-Sync דרך Compositor" #: core/bind/core_bind.cpp main/main.cpp msgid "Delta Smoothing" -msgstr "" +msgstr "החלקת דלט×" #: core/bind/core_bind.cpp -#, fuzzy msgid "Low Processor Usage Mode" -msgstr "×™×™×¦×•× ×ž×™×–×" +msgstr "מצב שימוש × ×ž×•×š של מעבד" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "" +msgstr "מצב ×©×™× ×” שימוש × ×ž×•×š במעבד (מיקרו ×©× ×™×•×ª)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" @@ -105,7 +106,7 @@ msgstr "בלי קצה" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" -msgstr "" +msgstr "שקיפות-פר-פיקסל מופעלת" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Fullscreen" @@ -146,7 +147,7 @@ msgstr "גודל" #: core/bind/core_bind.cpp msgid "Endian Swap" -msgstr "" +msgstr "החלפת סדר ×‘×ª×™× (Byte Order)" #: core/bind/core_bind.cpp msgid "Editor Hint" @@ -161,28 +162,24 @@ msgid "Iterations Per Second" msgstr "×יטרציות ×œ×©× ×™×”" #: core/bind/core_bind.cpp -#, fuzzy msgid "Target FPS" -msgstr "× ×ª×™×‘ המש×ב" +msgstr "יעד קצב פריימי×" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "מפרק TimeScale" +msgstr "ציר זמן" #: core/bind/core_bind.cpp main/main.cpp -#, fuzzy msgid "Physics Jitter Fix" -msgstr "שקופית פיזיקלית %" +msgstr "תיקון רטט בפיזיקה" #: core/bind/core_bind.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Error" msgstr "שגי××”" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error String" -msgstr "שגי××” בשמירה" +msgstr "מחרוזת שגויה" #: core/bind/core_bind.cpp msgid "Error Line" @@ -213,7 +210,7 @@ msgstr "תור פיקוד" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" -msgstr "" +msgstr "גודל תור תהליכי ×ž×©× ×” (KB)" #: core/func_ref.cpp modules/visual_script/visual_script_builtin_funcs.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -236,9 +233,8 @@ msgid "Network" msgstr "רשת" #: core/io/file_access_network.cpp -#, fuzzy msgid "Remote FS" -msgstr "מרוחק " +msgstr "שרת ×§×‘×¦×™× ×ž×¨×•×—×§" #: core/io/file_access_network.cpp msgid "Page Size" @@ -246,11 +242,11 @@ msgstr "גודל דף" #: core/io/file_access_network.cpp msgid "Page Read Ahead" -msgstr "" +msgstr "קרי××” מר×ש של דף" #: core/io/http_client.cpp msgid "Blocking Mode Enabled" -msgstr "" +msgstr "מצב חסימה מ×ופשר" #: core/io/http_client.cpp msgid "Connection" @@ -258,25 +254,24 @@ msgstr "חיבור" #: core/io/http_client.cpp msgid "Read Chunk Size" -msgstr "" +msgstr "גודל קרי×ת × ×ª×—" #: core/io/marshalls.cpp msgid "Object ID" msgstr "זהות ×וביקט" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp -#, fuzzy msgid "Allow Object Decoding" -msgstr "הפעלת שכבות בצל" +msgstr "×פשר ×¤×¢× ×•×— ×ובייקט" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Refuse New Network Connections" -msgstr "" +msgstr "סירוב ×—×™×‘×•×¨×™× ×—×“×©×™× ×œ×¨×©×ª" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp #, fuzzy msgid "Network Peer" -msgstr "מ×פיין רשת" +msgstr "מ×פיין\\עמית רשת" #: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp #, fuzzy @@ -284,26 +279,24 @@ msgid "Root Node" msgstr "×©×™× ×•×™ ×©× ×ž×¤×¨×§ השורש" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Refuse New Connections" -msgstr "התחברות" +msgstr "דחה ×—×™×‘×•×¨×™× ×—×“×©×™×" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Transfer Mode" -msgstr "מפרק מעברון" +msgstr "מצב מעבר" #: core/io/packet_peer.cpp msgid "Encode Buffer Max Size" -msgstr "" +msgstr "קודד גודל מקסימלי של החוצץ" #: core/io/packet_peer.cpp msgid "Input Buffer Max Size" -msgstr "" +msgstr "×”×›× ×¡ גודל מירבי של החוצץ" #: core/io/packet_peer.cpp msgid "Output Buffer Max Size" -msgstr "" +msgstr "פלוט גודל מירבי של החוצץ" #: core/io/packet_peer.cpp msgid "Stream Peer" @@ -314,17 +307,17 @@ msgid "Big Endian" msgstr "" #: core/io/stream_peer.cpp +#, fuzzy msgid "Data Array" -msgstr "" +msgstr "מערך מידע" #: core/io/stream_peer_ssl.cpp msgid "Blocking Handshake" -msgstr "" +msgstr "לחיצת ×™×“×™×™× ×—×•×¡×ž×ª" #: core/io/udp_server.cpp -#, fuzzy msgid "Max Pending Connections" -msgstr "עריכת חיבור:" +msgstr "×ž×§×¡×™×ž×•× ×—×™×‘×•×¨×™× ×ž×ž×ª×™× ×™×" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -342,9 +335,8 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "×ין מספיק ×‘×ª×™× ×œ×¤×¢× ×•×— בתי×, ×ו פורמט ×œ× ×ª×§×™×Ÿâ€â€." #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "קלט שגוי %i (×œ× ×”×•×¢×‘×¨) בתוך הביטוי" +msgstr "קלט שגוי %d (×œ× ×”×•×¢×‘×¨) בתוך הביטוי" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -373,7 +365,7 @@ msgstr "בקרי××” ל־‚%s’:" #: core/math/random_number_generator.cpp #: modules/opensimplex/open_simplex_noise.cpp msgid "Seed" -msgstr "" +msgstr "גרעין" #: core/math/random_number_generator.cpp msgid "State" @@ -381,7 +373,7 @@ msgstr "מצב" #: core/message_queue.cpp msgid "Message Queue" -msgstr "תור הור×ות" +msgstr "תור הודעות" #: core/message_queue.cpp msgid "Max Size (KB)" @@ -409,7 +401,7 @@ msgstr "הכל" #: core/os/input_event.cpp msgid "Shift" -msgstr "" +msgstr "הסט" #: core/os/input_event.cpp #, fuzzy @@ -418,11 +410,11 @@ msgstr "בקרת גירס×ות" #: core/os/input_event.cpp msgid "Meta" -msgstr "" +msgstr "מט×" #: core/os/input_event.cpp msgid "Command" -msgstr "פיקוד" +msgstr "פקודה" #: core/os/input_event.cpp #, fuzzy @@ -442,11 +434,11 @@ msgstr "סריקת מקורות" #: core/os/input_event.cpp msgid "Physical Scancode" -msgstr "" +msgstr "קוד סריקה פיזי" #: core/os/input_event.cpp msgid "Unicode" -msgstr "" +msgstr "×™×•× ×™×§×•×“" #: core/os/input_event.cpp msgid "Echo" @@ -473,11 +465,11 @@ msgstr "מפתח כפתורי עכבר:" #: core/os/input_event.cpp msgid "Doubleclick" -msgstr "" +msgstr "לחיצת עכבר כפולה" #: core/os/input_event.cpp msgid "Tilt" -msgstr "" +msgstr "הטייה" #: core/os/input_event.cpp msgid "Pressure" @@ -539,7 +531,7 @@ msgstr "מסר" #: core/os/input_event.cpp #, fuzzy msgid "Pitch" -msgstr "×§× ×” מידה:" +msgstr "גובה צליל" #: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp @@ -608,14 +600,12 @@ msgid "Main Scene" msgstr "" #: core/project_settings.cpp -#, fuzzy msgid "Disable stdout" -msgstr "כפתור ×מצעי" +msgstr "בטל stdout" #: core/project_settings.cpp -#, fuzzy msgid "Disable stderr" -msgstr "מושבת" +msgstr "השבת stderr" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" @@ -857,9 +847,8 @@ msgid "Max Functions" msgstr "יצירת ×¤×•× ×§×¦×™×”" #: core/project_settings.cpp scene/3d/vehicle_body.cpp -#, fuzzy msgid "Compression" -msgstr "גרסה × ×•×›×—×™×ª:" +msgstr "כיווץ" #: core/project_settings.cpp #, fuzzy @@ -900,12 +889,12 @@ msgstr "" #: core/register_core_types.cpp msgid "TCP" -msgstr "" +msgstr "TCP" #: core/register_core_types.cpp #, fuzzy msgid "Connect Timeout Seconds" -msgstr "התחברות למפרק:" +msgstr "×©× ×™×•×ª קצובות להתחברות" #: core/register_core_types.cpp msgid "Packet Peer Stream" @@ -917,12 +906,11 @@ msgstr "" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" -msgstr "" +msgstr "SSL" #: core/register_core_types.cpp main/main.cpp -#, fuzzy msgid "Certificates" -msgstr "קודקודי×" +msgstr "תעודות" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_resource_picker.cpp @@ -931,9 +919,8 @@ msgid "Resource" msgstr "מש×ב" #: core/resource.cpp -#, fuzzy msgid "Local To Scene" -msgstr "סגירת ×¡×¦× ×”" +msgstr "ייחודי ×œ×¡×¦× ×”" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp @@ -943,13 +930,12 @@ msgid "Path" msgstr "× ×ª×™×‘" #: core/script_language.cpp -#, fuzzy msgid "Source Code" -msgstr "מש×ב" +msgstr "קוד מקור" #: core/translation.cpp editor/project_settings_editor.cpp msgid "Locale" -msgstr "" +msgstr "מקומי" #: core/translation.cpp msgid "Test" @@ -3430,7 +3416,7 @@ msgstr "×™×™×‘×•× ×ž×©××‘×™× (מחדש)" #: editor/editor_file_system.cpp msgid "Reimport Missing Imported Files" -msgstr "" +msgstr "×™×™×‘×•× ×§×‘×¦×™× ×—×¡×¨×™× ×ž×—×“×©" #: editor/editor_help.cpp scene/2d/camera_2d.cpp scene/gui/control.cpp #: scene/gui/nine_patch_rect.cpp scene/resources/dynamic_font.cpp @@ -4324,11 +4310,11 @@ msgstr "החלפת ×œ×©×•× ×™×ª ×¡×¦× ×”" #: editor/editor_node.cpp msgid "Always Show Close Button" -msgstr "" +msgstr "תמיד הר××” כפתור סגירה" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Resize If Many Tabs" -msgstr "" +msgstr "×©×™× ×•×™ גודל כשט××‘×™× ×ž×¨×•×‘×™×" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Minimum Width" @@ -4353,7 +4339,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Save On Focus Loss" -msgstr "" +msgstr "שמור ב×יבוד פוקוס" #: editor/editor_node.cpp editor/editor_settings.cpp #, fuzzy @@ -4385,13 +4371,12 @@ msgid "Localize Settings" msgstr "הגדרות" #: editor/editor_node.cpp -#, fuzzy msgid "Restore Scenes On Load" -msgstr "מפרק TimeSeek" +msgstr "שיחזור ×¡×¦× ×” כשמבוצע ×˜×¢×™× ×”" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Show Thumbnail On Hover" -msgstr "" +msgstr "הר××” דוגמית בריחוף מעל" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Inspector" @@ -4435,7 +4420,7 @@ msgstr "פתיחה במפקח" #: editor/editor_node.cpp msgid "Default Color Picker Mode" -msgstr "" +msgstr "מצב ברירת מחדל לבחירת צבעי×" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" @@ -5364,7 +5349,7 @@ msgstr "ערכה מוגדרת…" #: editor/editor_settings.cpp msgid "Icon And Font Color" -msgstr "" +msgstr "צבע ×יקון ×•×¤×•× ×˜" #: editor/editor_settings.cpp #, fuzzy @@ -5524,9 +5509,8 @@ msgid "Auto Indent" msgstr "×”×–×—×” ×וטומטית" #: editor/editor_settings.cpp -#, fuzzy msgid "Convert Indent On Save" -msgstr "המרת הזחות לרווחי×" +msgstr "המרת הזחות בשמירה" #: editor/editor_settings.cpp scene/gui/text_edit.cpp #, fuzzy @@ -5586,7 +5570,6 @@ msgid "Show Line Numbers" msgstr "שורה מספר:" #: editor/editor_settings.cpp -#, fuzzy msgid "Line Numbers Zero Padded" msgstr "שורה מספר:" @@ -5613,7 +5596,7 @@ msgstr "" #: editor/editor_settings.cpp msgid "Show Line Length Guidelines" -msgstr "" +msgstr "הר××” מדריך ×ורך קו" #: editor/editor_settings.cpp msgid "Line Length Guideline Soft Column" @@ -5647,7 +5630,7 @@ msgstr "" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Restore Scripts On Load" -msgstr "" +msgstr "שיחזור ×¡×§×¨×™×¤×˜×™× ×‘×¢×ª ×˜×¢×™× ×”" #: editor/editor_settings.cpp msgid "Auto Reload And Parse Scripts On Save" @@ -5887,7 +5870,7 @@ msgstr "" #: editor/editor_settings.cpp msgid "Emulate 3 Button Mouse" -msgstr "" +msgstr "דמה עכבר בעל 3 כפתורי×" #: editor/editor_settings.cpp msgid "Orbit Modifier" @@ -12414,23 +12397,20 @@ msgid "Edit Items" msgstr "עריכת ×ž×¡× × ×™×" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Types:" -msgstr "סוג" +msgstr "סוגי×:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Type:" -msgstr "סוג" +msgstr "הוסף סוג:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Item:" -msgstr "הוספת קלט" +msgstr "הוסף פריט:" #: editor/plugins/theme_editor_plugin.cpp msgid "Add StyleBox Item" -msgstr "" +msgstr "הוסף פריט StyleBox" #: editor/plugins/theme_editor_plugin.cpp #, fuzzy @@ -13243,9 +13223,10 @@ msgstr "הגדרות הצמדה" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "היסט רשת:" @@ -13451,7 +13432,7 @@ msgstr "" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "סיסמת SSH" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -14667,13 +14648,13 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "" +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "×œ× × ×™×ª×Ÿ לפתוח ×ת ‚%s’." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -18440,7 +18421,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "כל עוד" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" @@ -20462,16 +20443,15 @@ msgstr "" #: platform/osx/export/export.cpp msgid "macOS" -msgstr "" +msgstr "macOS" #: platform/osx/export/export.cpp msgid "Force Builtin Codesign" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Architecture" -msgstr "הוספת ערך ×רכיטקטורה" +msgstr "×רכיטקטורה" #: platform/uwp/export/export.cpp #, fuzzy @@ -20508,14 +20488,12 @@ msgid "Signing" msgstr "×ות" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Certificate" -msgstr "קודקודי×" +msgstr "תעודה" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Algorithm" -msgstr "× ×™×¤×•×™ שגי×ות" +msgstr "×לגורית×" #: platform/uwp/export/export.cpp msgid "Major" @@ -20845,7 +20823,7 @@ msgstr "" #: platform/windows/export/export.cpp msgid "Wine" -msgstr "" +msgstr "Wine" #: platform/x11/export/export.cpp msgid "32-bit executables cannot have embedded data >= 4 GiB." @@ -20886,12 +20864,12 @@ msgstr "×”×–×—×” משמ×ל" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp msgid "Flip H" -msgstr "" +msgstr "הפוך ×ופקית" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp msgid "Flip V" -msgstr "" +msgstr "הפוך ×× ×›×™×ª" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20931,7 +20909,7 @@ msgstr "תצוגה מקדימה:" #: scene/2d/area_2d.cpp scene/2d/cpu_particles_2d.cpp scene/3d/area.cpp #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp msgid "Gravity" -msgstr "" +msgstr "כוח כבידה" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20955,20 +20933,18 @@ msgstr "דריסה" #: scene/2d/audio_stream_player_2d.cpp scene/audio/audio_stream_player.cpp #: scene/gui/video_player.cpp servers/audio/effects/audio_effect_amplify.cpp msgid "Volume dB" -msgstr "" +msgstr "×•×•×œ×™×•× ×‘×“×¦×™×‘×œ×™×" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp #: servers/audio/effects/audio_effect_pitch_shift.cpp -#, fuzzy msgid "Pitch Scale" -msgstr "×§× ×” מידה:" +msgstr "גובל צליל" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp -#, fuzzy msgid "Autoplay" -msgstr "הפעלת/ביטול הפעלה ×וטומטית" +msgstr "הפעלה ×וטומטית" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp @@ -21861,9 +21837,8 @@ msgid "Rotation Degrees" msgstr "הטיה של %s מעלות." #: scene/2d/node_2d.cpp scene/3d/spatial.cpp -#, fuzzy msgid "Global Rotation" -msgstr "קבוע" +msgstr "רוטציה גלובלית" #: scene/2d/node_2d.cpp #, fuzzy @@ -21887,12 +21862,11 @@ msgstr "" #: scene/2d/parallax_background.cpp scene/gui/scroll_container.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Scroll" -msgstr "" +msgstr "גלול" #: scene/2d/parallax_background.cpp -#, fuzzy msgid "Base Offset" -msgstr "היסט רשת:" +msgstr "סטייה מהבסיס" #: scene/2d/parallax_background.cpp #, fuzzy @@ -21910,7 +21884,7 @@ msgstr "בסוף" #: scene/2d/parallax_background.cpp msgid "Ignore Camera Zoom" -msgstr "" +msgstr "×”×ª×¢×œ× ×ž×–×•× ×”×ž×¦×œ×ž×”" #: scene/2d/parallax_layer.cpp msgid "" @@ -22215,15 +22189,15 @@ msgstr "יצירת תיקייה" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp msgid "Collide With" -msgstr "" +msgstr "×ž×ª× ×’×© ×¢×" #: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp msgid "Areas" -msgstr "" +msgstr "×זורי×" #: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp msgid "Bodies" -msgstr "" +msgstr "גופי×" #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." @@ -22264,11 +22238,11 @@ msgstr "×œ×¢×¦× ×–×• ×ין ×ª× ×•×—×ª REST ר×ויה. עבור למפרק ×”- #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp msgid "Hframes" -msgstr "" +msgstr "שקופיות ×ופקיות" #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp msgid "Vframes" -msgstr "" +msgstr "שקופיות ×× ×›×™×•×ª" #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #, fuzzy @@ -22315,9 +22289,8 @@ msgid "Tile Origin" msgstr "" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Y Sort" -msgstr "מיון" +msgstr "מיון ×× ×›×™" #: scene/2d/tile_map.cpp #, fuzzy @@ -22339,13 +22312,12 @@ msgid "Cell Clip UV" msgstr "" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Use Parent" -msgstr "עריכת מצולע" +msgstr "השתמש בהורה" #: scene/2d/tile_map.cpp msgid "Use Kinematic" -msgstr "" +msgstr "השתמש בפיזיקה ×§×™× ×ž×˜×™×ª" #: scene/2d/touch_screen_button.cpp msgid "Shape Centered" @@ -22380,7 +22352,7 @@ msgstr "הדבקת ×”× ×¤×©×”" #: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp msgid "Freeze Bodies" -msgstr "" +msgstr "×”×§×¤× ×’×•×¤×™×" #: scene/2d/visibility_notifier_2d.cpp #, fuzzy @@ -22576,7 +22548,7 @@ msgstr "×ž×¡× × ×™×..." #: scene/3d/baked_lightmap.cpp scene/resources/texture.cpp msgid "Use HDR" -msgstr "" +msgstr "השתמש בHDR" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22598,14 +22570,12 @@ msgid "Generate" msgstr "כללי" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Max Size" -msgstr "מבט קדמי" +msgstr "גודל מקסימלי" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Custom Sky" -msgstr "גזירת מפרקי×" +msgstr "×©×ž×™×™× ×ž×•×ª××ž×™× ×ישית" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22613,9 +22583,8 @@ msgid "Custom Sky Rotation Degrees" msgstr "הטיה של %s מעלות." #: scene/3d/baked_lightmap.cpp scene/3d/ray_cast.cpp -#, fuzzy msgid "Custom Color" -msgstr "גזירת מפרקי×" +msgstr "צבע מות×× ×ישית" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22642,9 +22611,8 @@ msgid "Light Data" msgstr "ימין" #: scene/3d/bone_attachment.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Bone Name" -msgstr "×©× ×”×ž×¤×¨×§:" +msgstr "×©× ×ž×¤×¨×§" #: scene/3d/camera.cpp msgid "Keep Aspect" @@ -22666,12 +22634,11 @@ msgstr "מיז×" #: scene/3d/camera.cpp msgid "FOV" -msgstr "" +msgstr "קוטר ר××™×™×”" #: scene/3d/camera.cpp -#, fuzzy msgid "Frustum Offset" -msgstr "היסט רשת:" +msgstr "היסט רשת" #: scene/3d/camera.cpp #, fuzzy @@ -23427,7 +23394,7 @@ msgstr "×ותיות ×§×˜× ×•×ª" #: scene/3d/physics_joint.cpp msgid "Motor" -msgstr "" +msgstr "מוטורי" #: scene/3d/physics_joint.cpp #, fuzzy @@ -24047,6 +24014,15 @@ msgstr "שגי××”!" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "מיון" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" @@ -24350,7 +24326,7 @@ msgstr "" #: scene/animation/skeleton_ik.cpp msgid "Magnet" -msgstr "" +msgstr "×ž×’× ×˜" #: scene/animation/skeleton_ik.cpp #, fuzzy @@ -25346,7 +25322,7 @@ msgstr "הוספת רצועה" #: scene/gui/video_player.cpp scene/main/scene_tree.cpp scene/main/timer.cpp msgid "Paused" -msgstr "" +msgstr "עצור" #: scene/gui/video_player.cpp #, fuzzy @@ -25368,9 +25344,8 @@ msgid "Follow Viewport" msgstr "" #: scene/main/http_request.cpp -#, fuzzy msgid "Download File" -msgstr "הורדה" +msgstr "הורדת קובץ" #: scene/main/http_request.cpp #, fuzzy @@ -25435,14 +25410,12 @@ msgid "Owner" msgstr "×‘×¢×œ×™× ×©×œ:" #: scene/main/node.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Multiplayer" -msgstr "קביעה מרובה:" +msgstr "רב-משתתפי×" #: scene/main/node.cpp -#, fuzzy msgid "Custom Multiplayer" -msgstr "קביעה מרובה:" +msgstr "רב-×ž×©×ª×ª×¤×™× ×ž×•×ª×× ×ישית" #: scene/main/node.cpp #, fuzzy @@ -25475,7 +25448,7 @@ msgstr "שורש ×¡×¦×™× ×” חדש" #: scene/main/scene_tree.cpp msgid "Root" -msgstr "" +msgstr "שורש" #: scene/main/scene_tree.cpp #, fuzzy @@ -25540,7 +25513,7 @@ msgstr "" #: scene/main/scene_tree.cpp scene/main/viewport.cpp msgid "HDR" -msgstr "" +msgstr "HDR" #: scene/main/scene_tree.cpp scene/main/viewport.cpp msgid "Use 32 BPC Depth" @@ -25573,9 +25546,8 @@ msgid "" msgstr "" #: scene/main/timer.cpp -#, fuzzy msgid "Autostart" -msgstr "התחלה מחדש ×וטומטית:" +msgstr "התחלה ×וטומטית" #: scene/main/viewport.cpp #, fuzzy @@ -25638,14 +25610,12 @@ msgid "Debanding" msgstr "קישור" #: scene/main/viewport.cpp -#, fuzzy msgid "Disable 3D" -msgstr "מושבת" +msgstr "השבת תלת מימד" #: scene/main/viewport.cpp -#, fuzzy msgid "Keep 3D Linear" -msgstr "×œ×™× ×™×רי" +msgstr "הש×ר תלת מימד ×œ×™× ×רי" #: scene/main/viewport.cpp msgid "Render Direct To Screen" @@ -25735,11 +25705,11 @@ msgstr "ש×" #: scene/register_scene_types.cpp msgid "2D Render" -msgstr "" +msgstr "×¨× ×“×•×¨ בדו-מימד" #: scene/register_scene_types.cpp msgid "3D Render" -msgstr "" +msgstr "×¨× ×“×•×¨ בתלת-מימד" #: scene/register_scene_types.cpp #, fuzzy @@ -25783,11 +25753,11 @@ msgstr "מפרק ערבוב" #: scene/resources/audio_stream_sample.cpp msgid "Stereo" -msgstr "" +msgstr "סטרי×ו" #: scene/resources/concave_polygon_shape_2d.cpp msgid "Segments" -msgstr "" +msgstr "חלקי×" #: scene/resources/curve.cpp #, fuzzy @@ -25796,11 +25766,11 @@ msgstr "חצי רזולוציה" #: scene/resources/curve.cpp msgid "Bake Interval" -msgstr "" +msgstr "זמן בין ×פייה" #: scene/resources/default_theme/default_theme.cpp msgid "Panel" -msgstr "" +msgstr "לוח" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25839,7 +25809,7 @@ msgstr "לול×ת ×”× ×¤×©×”" #: scene/resources/default_theme/default_theme.cpp msgid "Arrow" -msgstr "" +msgstr "×—×¥" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25958,7 +25928,7 @@ msgstr "×¡× ×Ÿ ×ותות" #: scene/resources/default_theme/default_theme.cpp msgid "Minimum Spaces" -msgstr "" +msgstr "×ž×™× ×™×ž×•× ×¨×•×•×—×™×" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25967,11 +25937,11 @@ msgstr "B" #: scene/resources/default_theme/default_theme.cpp msgid "FG" -msgstr "" +msgstr "FG" #: scene/resources/default_theme/default_theme.cpp msgid "Tab" -msgstr "" +msgstr "×œ×©×•× ×™×ª" #: scene/resources/default_theme/default_theme.cpp #: scene/resources/dynamic_font.cpp scene/resources/world.cpp @@ -26044,7 +26014,7 @@ msgstr "" #: scene/resources/default_theme/default_theme.cpp msgid "Decrement" -msgstr "" +msgstr "הורדה ב1" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26355,7 +26325,7 @@ msgstr "מושבת" #: scene/resources/default_theme/default_theme.cpp msgid "Menu" -msgstr "" +msgstr "תפריט" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26392,7 +26362,7 @@ msgstr "" #: scene/resources/default_theme/default_theme.cpp msgid "Large" -msgstr "" +msgstr "גדול" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26436,7 +26406,7 @@ msgstr "מבט שמ×לי" #: scene/resources/default_theme/default_theme.cpp msgid "Screen Picker" -msgstr "" +msgstr "בוחר מהמסך" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26489,7 +26459,7 @@ msgstr "×ª×›×•× ×•×ª מרכזיות:" #: scene/resources/default_theme/default_theme.cpp msgid "Bold Italics Font" -msgstr "" +msgstr "גופן מודגש ומוטה" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26533,11 +26503,11 @@ msgstr "×”×–×—×” ×וטומטית" #: scene/resources/default_theme/default_theme.cpp msgid "Minus" -msgstr "" +msgstr "×ž×™× ×•×¡" #: scene/resources/default_theme/default_theme.cpp msgid "More" -msgstr "" +msgstr "עוד" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26584,7 +26554,7 @@ msgstr "עותק" #: scene/resources/dynamic_font.cpp msgid "Hinting" -msgstr "" +msgstr "רמיזה" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -26598,7 +26568,7 @@ msgstr "מיקוד × ×ª×™×‘" #: scene/resources/dynamic_font.cpp msgid "Outline Size" -msgstr "" +msgstr "גודל קו מת×ר" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -26627,11 +26597,11 @@ msgstr "קישור × ×ª×•× ×™ ‫מפרק" #: scene/resources/environment.cpp msgid "Background" -msgstr "" +msgstr "רקע" #: scene/resources/environment.cpp scene/resources/sky.cpp msgid "Sky" -msgstr "" +msgstr "שמיי×" #: scene/resources/environment.cpp #, fuzzy @@ -26673,7 +26643,7 @@ msgstr "×”× ×¤×©×”" #: scene/resources/environment.cpp msgid "Fog" -msgstr "" +msgstr "×ובך" #: scene/resources/environment.cpp #, fuzzy @@ -26746,7 +26716,7 @@ msgstr "ייצו×" #: scene/resources/environment.cpp msgid "White" -msgstr "" +msgstr "לבן" #: scene/resources/environment.cpp msgid "Auto Exposure" @@ -26787,11 +26757,11 @@ msgstr "עומק" #: scene/resources/environment.cpp scene/resources/material.cpp msgid "Roughness" -msgstr "" +msgstr "חספוס" #: scene/resources/environment.cpp msgid "SSAO" -msgstr "" +msgstr "SSAO" #: scene/resources/environment.cpp #, fuzzy @@ -26813,7 +26783,7 @@ msgstr "" #: scene/resources/environment.cpp msgid "Blur" -msgstr "" +msgstr "טשטוש" #: scene/resources/environment.cpp msgid "Edge Sharpness" @@ -26849,7 +26819,7 @@ msgstr "מפתחי×" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp msgid "1" -msgstr "" +msgstr "1" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp @@ -28502,7 +28472,7 @@ msgstr "עריכת מצולע" #: servers/visual_server.cpp msgid "Max Active Spheres" -msgstr "" +msgstr "×ž×§×¡×™×ž×•× ×›×“×•×¨×™× ×קטיביי×" #: servers/visual_server.cpp #, fuzzy diff --git a/editor/translations/hi.po b/editor/translations/hi.po index 5e3b28ff79..657ee0ff41 100644 --- a/editor/translations/hi.po +++ b/editor/translations/hi.po @@ -16,13 +16,14 @@ # harvinder rathor <harvinderr09@gmail.com>, 2021. # Sumanyu Aggarwal <sumanyu.code@gmail.com>, 2021. # Arin <upadhyay.arin@gmail.com>, 2022. +# Anime Fanz <accc1431@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-06-08 06:48+0000\n" -"Last-Translator: Arin <upadhyay.arin@gmail.com>\n" +"PO-Revision-Date: 2022-12-05 04:25+0000\n" +"Last-Translator: Anime Fanz <accc1431@gmail.com>\n" "Language-Team: Hindi <https://hosted.weblate.org/projects/godot-engine/godot/" "hi/>\n" "Language: hi\n" @@ -30,7 +31,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.13-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -242,72 +243,71 @@ msgid "Connection" msgstr "संबंध" #: core/io/http_client.cpp +#, fuzzy msgid "Read Chunk Size" -msgstr "" +msgstr "चंक आकार पढ़ें" #: core/io/marshalls.cpp msgid "Object ID" -msgstr "" +msgstr "वसà¥à¤¤à¥ आईडी" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp +#, fuzzy msgid "Allow Object Decoding" -msgstr "" +msgstr "ऑबà¥à¤œà¥‡à¤•à¥à¤Ÿ डिकोडिंग की अनà¥à¤®à¤¤à¤¿ दें" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Refuse New Network Connections" -msgstr "" +msgstr "नठनेटवरà¥à¤• कनेकà¥à¤¶à¤¨ को मना करें" #: core/io/multiplayer_api.cpp scene/main/scene_tree.cpp msgid "Network Peer" -msgstr "" +msgstr "नेटवरà¥à¤• सहकरà¥à¤®à¥€" #: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp -#, fuzzy msgid "Root Node" -msgstr "à¤à¤• नया बनाà¤à¤‚" +msgstr "रूट नोड" #: core/io/networked_multiplayer_peer.cpp -#, fuzzy msgid "Refuse New Connections" -msgstr "जोड़िये" +msgstr "नठकनेकà¥à¤¶à¤¨à¥‹à¤‚ को मना करें" #: core/io/networked_multiplayer_peer.cpp #, fuzzy msgid "Transfer Mode" -msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚" +msgstr "रीति का अंतरण करें" #: core/io/packet_peer.cpp msgid "Encode Buffer Max Size" -msgstr "" +msgstr "à¤à¤¨à¤•ोड बफर अधिकतम आकार" #: core/io/packet_peer.cpp msgid "Input Buffer Max Size" -msgstr "" +msgstr "इनपà¥à¤Ÿ बफर अधिकतम आकार" #: core/io/packet_peer.cpp msgid "Output Buffer Max Size" -msgstr "" +msgstr "आउटपà¥à¤Ÿ बफर अधिकतम आकार" #: core/io/packet_peer.cpp msgid "Stream Peer" -msgstr "" +msgstr "सà¥à¤Ÿà¥à¤°à¥€à¤® पीयर" #: core/io/stream_peer.cpp msgid "Big Endian" -msgstr "" +msgstr "बड़े à¤à¤‚डियन" #: core/io/stream_peer.cpp msgid "Data Array" -msgstr "" +msgstr "डेटा à¤à¤°à¥‡" #: core/io/stream_peer_ssl.cpp msgid "Blocking Handshake" -msgstr "" +msgstr "हैंडशेक बà¥à¤²à¥‰à¤• करना" #: core/io/udp_server.cpp -#, fuzzy msgid "Max Pending Connections" -msgstr "कनेकà¥à¤¶à¤¨ संपादित करें:" +msgstr "अधिकतम लंबित कनेकà¥à¤¶à¤¨" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -325,9 +325,8 @@ msgid "Not enough bytes for decoding bytes, or invalid format." msgstr "अमानà¥à¤¯ फ़ोरà¥à¤®à¥ˆà¤Ÿ, या बाइटà¥à¤¸ डिकोडिंग के लिठपरà¥à¤¯à¤¾à¤ªà¥à¤¤ बाइटà¥à¤¸ नहीं।" #: core/math/expression.cpp -#, fuzzy msgid "Invalid input %d (not passed) in expression" -msgstr "à¤à¤•à¥à¤¸à¤ªà¥à¤°à¥‡à¤¶à¤¨ मे अमानà¥à¤¯ इनपà¥à¤Ÿ %i (पास नहीं हो पाया)" +msgstr "वà¥à¤¯à¤‚जक में अमानà¥à¤¯ इनपà¥à¤Ÿ %d (पास नहीं हà¥à¤†)" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" @@ -355,144 +354,141 @@ msgstr "'%s ' को कॉल करने पर:" #: core/math/random_number_generator.cpp #: modules/opensimplex/open_simplex_noise.cpp +#, fuzzy msgid "Seed" -msgstr "" +msgstr "बीज" #: core/math/random_number_generator.cpp +#, fuzzy msgid "State" -msgstr "" +msgstr "राजà¥à¤¯" #: core/message_queue.cpp +#, fuzzy msgid "Message Queue" -msgstr "" +msgstr "संदेश कतार" #: core/message_queue.cpp msgid "Max Size (KB)" -msgstr "" +msgstr "अधिकतम आकार (केबी)" #: core/os/input.cpp -#, fuzzy msgid "Mouse Mode" -msgstr "दृशà¥à¤¯ रोकें" +msgstr "माउस मोड" #: core/os/input.cpp msgid "Use Accumulated Input" -msgstr "" +msgstr "संचित इनपà¥à¤Ÿ का पà¥à¤°à¤¯à¥‹à¤— करें" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp msgid "Device" -msgstr "" +msgstr "उपकरण" #: core/os/input_event.cpp +#, fuzzy msgid "Alt" -msgstr "" +msgstr "ऑलà¥à¤Ÿ" #: core/os/input_event.cpp msgid "Shift" -msgstr "" +msgstr "शिफà¥à¤Ÿ" #: core/os/input_event.cpp -#, fuzzy msgid "Control" -msgstr "वरà¥à¤œà¤¨ कंटà¥à¤°à¥‹à¤²" +msgstr "कंटà¥à¤°à¥‹à¤²" #: core/os/input_event.cpp msgid "Meta" -msgstr "" +msgstr "मेटा" #: core/os/input_event.cpp -#, fuzzy msgid "Command" -msgstr "समà¥à¤¦à¤¾à¤¯" +msgstr "कमांड" #: core/os/input_event.cpp #, fuzzy msgid "Physical" -msgstr "फिजिकà¥à¤¸ फà¥à¤°à¥‡à¤® %" +msgstr "शारीरिक" #: core/os/input_event.cpp scene/2d/touch_screen_button.cpp #: scene/gui/base_button.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Pressed" msgstr "पà¥à¤°à¥€à¤¸à¥‡à¤Ÿ" #: core/os/input_event.cpp -#, fuzzy msgid "Scancode" -msgstr "सà¥à¤°à¥‹à¤¤à¤¸à¥à¤•ैन कीजिये" +msgstr "सà¥à¤•ैनकोड" #: core/os/input_event.cpp msgid "Physical Scancode" -msgstr "" +msgstr "à¤à¥Œà¤¤à¤¿à¤• सà¥à¤•ैनकोड" #: core/os/input_event.cpp msgid "Unicode" -msgstr "" +msgstr "यूनिकोड" #: core/os/input_event.cpp msgid "Echo" -msgstr "" +msgstr "इको" #: core/os/input_event.cpp scene/gui/base_button.cpp msgid "Button Mask" -msgstr "" +msgstr "बटन मासà¥à¤•" #: core/os/input_event.cpp scene/2d/node_2d.cpp scene/gui/control.cpp -#, fuzzy msgid "Global Position" -msgstr "कोनà¥à¤¸à¥à¤Ÿà¤¨à¥à¤Ÿ" +msgstr "वैशà¥à¤µà¤¿à¤• सà¥à¤¥à¤¿à¤¤à¤¿" #: core/os/input_event.cpp msgid "Factor" -msgstr "" +msgstr "फैकà¥à¤Ÿà¤°" #: core/os/input_event.cpp msgid "Button Index" -msgstr "" +msgstr "बटन अनà¥à¤•à¥à¤°à¤®à¤£à¤¿à¤•ा" #: core/os/input_event.cpp msgid "Doubleclick" -msgstr "" +msgstr "डबलकà¥à¤²à¤¿à¤•" #: core/os/input_event.cpp msgid "Tilt" -msgstr "" +msgstr "टिलà¥à¤Ÿ" #: core/os/input_event.cpp -#, fuzzy msgid "Pressure" -msgstr "पà¥à¤°à¥€à¤¸à¥‡à¤Ÿ" +msgstr "पà¥à¤°à¥‡à¤¶à¤°" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "पेन उलà¥à¤Ÿà¤¾" #: core/os/input_event.cpp +#, fuzzy msgid "Relative" -msgstr "" +msgstr "रिशà¥à¤¤à¥‡à¤¦à¤¾à¤°" #: core/os/input_event.cpp scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/interpolated_camera.cpp #: scene/animation/animation_player.cpp scene/resources/environment.cpp #: scene/resources/particles_material.cpp msgid "Speed" -msgstr "" +msgstr "सà¥à¤ªà¥€à¤¡" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: scene/3d/sprite_3d.cpp msgid "Axis" -msgstr "" +msgstr "अकà¥à¤·" #: core/os/input_event.cpp -#, fuzzy msgid "Axis Value" -msgstr "(मूलà¥à¤¯)" +msgstr "à¤à¤•à¥à¤¸à¤¿à¤¸ वैलà¥à¤¯à¥‚" #: core/os/input_event.cpp modules/visual_script/visual_script_func_nodes.cpp msgid "Index" -msgstr "" +msgstr "इंडेकà¥à¤¸" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -503,60 +499,55 @@ msgstr "कारà¥à¤¯" #: core/os/input_event.cpp scene/resources/environment.cpp #: scene/resources/material.cpp msgid "Strength" -msgstr "" +msgstr "शकà¥à¤¤à¤¿" #: core/os/input_event.cpp msgid "Delta" -msgstr "" +msgstr "डेलà¥à¤Ÿà¤¾" #: core/os/input_event.cpp -#, fuzzy msgid "Channel" -msgstr "बदली" +msgstr "चैनल" #: core/os/input_event.cpp main/main.cpp -#, fuzzy msgid "Message" -msgstr "समà¥à¤¦à¤¾à¤¯" +msgstr "मैसेज" #: core/os/input_event.cpp msgid "Pitch" -msgstr "" +msgstr "पिच" #: core/os/input_event.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/physics_body_2d.cpp scene/3d/cpu_particles.cpp #: scene/3d/physics_body.cpp scene/resources/particles_material.cpp msgid "Velocity" -msgstr "" +msgstr "वेग" #: core/os/input_event.cpp msgid "Instrument" -msgstr "" +msgstr "साधन" #: core/os/input_event.cpp -#, fuzzy msgid "Controller Number" -msgstr "लाइन कà¥à¤°.:" +msgstr "नियंतà¥à¤°à¤• संखà¥à¤¯à¤¾" #: core/os/input_event.cpp msgid "Controller Value" -msgstr "" +msgstr "नियंतà¥à¤°à¤• मान" #: core/project_settings.cpp editor/editor_node.cpp main/main.cpp #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Application" -msgstr "कारà¥à¤¯" +msgstr "अनà¥à¤ªà¥à¤°à¤¯à¥‹à¤—" #: core/project_settings.cpp main/main.cpp msgid "Config" -msgstr "" +msgstr "कॉनà¥à¤«à¤¼à¤¿à¤—" #: core/project_settings.cpp -#, fuzzy msgid "Project Settings Override" -msgstr "पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ सेटिंग ..." +msgstr "पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ सेटिंगà¥à¤¸ ओवरराइड" #: core/project_settings.cpp core/resource.cpp #: editor/animation_track_editor.cpp editor/editor_autoload_settings.cpp @@ -582,47 +573,44 @@ msgstr "विवरण" #: main/main.cpp platform/android/export/export_plugin.cpp #: platform/javascript/export/export.cpp msgid "Run" -msgstr "" +msgstr "रन" #: core/project_settings.cpp editor/editor_node.cpp #: editor/run_settings_dialog.cpp main/main.cpp msgid "Main Scene" -msgstr "" +msgstr "मà¥à¤–à¥à¤¯ दृशà¥à¤¯" #: core/project_settings.cpp -#, fuzzy msgid "Disable stdout" msgstr "बंद कर दिया गया है" #: core/project_settings.cpp -#, fuzzy msgid "Disable stderr" msgstr "बंद कर दिया गया है" #: core/project_settings.cpp msgid "Use Hidden Project Data Directory" -msgstr "" +msgstr "छिपी हà¥à¤ˆ पà¥à¤°à¥‹à¤œà¥‡à¤•à¥à¤Ÿ डेटा निरà¥à¤¦à¥‡à¤¶à¤¿à¤•ा का उपयोग करें" #: core/project_settings.cpp msgid "Use Custom User Dir" -msgstr "" +msgstr "कसà¥à¤Ÿà¤® उपयोगकरà¥à¤¤à¤¾ डायरेकà¥à¤Ÿà¤°à¥€ का उपयोग करें" #: core/project_settings.cpp msgid "Custom User Dir Name" -msgstr "" +msgstr "कसà¥à¤Ÿà¤® उपयोगकरà¥à¤¤à¤¾ का नाम" #: core/project_settings.cpp main/main.cpp #: platform/javascript/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/os_uwp.cpp -#, fuzzy msgid "Display" -msgstr "सब दिखाइà¤" +msgstr "डिसà¥à¤ªà¥à¤²à¥‡" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/opensimplex/noise_texture.cpp scene/2d/line_2d.cpp #: scene/3d/label_3d.cpp scene/gui/text_edit.cpp scene/resources/texture.cpp msgid "Width" -msgstr "" +msgstr "चौड़ाई" #: core/project_settings.cpp main/main.cpp modules/csg/csg_shape.cpp #: modules/gltf/gltf_node.cpp modules/opensimplex/noise_texture.cpp @@ -631,19 +619,19 @@ msgstr "" #: scene/resources/font.cpp scene/resources/navigation_mesh.cpp #: scene/resources/primitive_meshes.cpp scene/resources/texture.cpp msgid "Height" -msgstr "" +msgstr "ऊंचाई" #: core/project_settings.cpp msgid "Always On Top" -msgstr "" +msgstr "हमेशा शीरà¥à¤· पर" #: core/project_settings.cpp msgid "Test Width" -msgstr "" +msgstr "परीकà¥à¤·à¤£ चौड़ाई" #: core/project_settings.cpp msgid "Test Height" -msgstr "" +msgstr "परीकà¥à¤·à¤£ ऊंचाई" #: core/project_settings.cpp editor/animation_track_editor.cpp #: editor/editor_audio_buses.cpp main/main.cpp servers/audio_server.cpp @@ -651,9 +639,8 @@ msgid "Audio" msgstr "ऑडियो" #: core/project_settings.cpp -#, fuzzy msgid "Default Bus Layout" -msgstr "पà¥à¤°à¤¾à¤¯à¤¿à¤• बस लेआउट लोड कीजिये." +msgstr "डिफ़ॉलà¥à¤Ÿ बस लेआउट" #: core/project_settings.cpp editor/editor_export.cpp #: editor/editor_file_system.cpp editor/editor_node.cpp @@ -664,93 +651,84 @@ msgstr "संपादक" #: core/project_settings.cpp msgid "Main Run Args" -msgstr "" +msgstr "मà¥à¤–à¥à¤¯ रन तरà¥à¤•" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" -msgstr "दृशà¥à¤¯ पथ:" +msgstr "दृशà¥à¤¯ नामकरण" #: core/project_settings.cpp msgid "Search In File Extensions" -msgstr "" +msgstr "फ़ाइल à¤à¤•à¥à¤¸à¤Ÿà¥‡à¤‚शन में खोजें" #: core/project_settings.cpp msgid "Script Templates Search Path" -msgstr "" +msgstr "सà¥à¤•à¥à¤°à¤¿à¤ªà¥à¤Ÿ टेमà¥à¤ªà¤²à¥‡à¤Ÿ खोज पथ" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Autoload On Startup" -msgstr "वरà¥à¤œà¤¨ कंटà¥à¤°à¥‹à¤²" +msgstr "सà¥à¤Ÿà¤¾à¤°à¥à¤Ÿà¤…प पर संसà¥à¤•रण नियंतà¥à¤°à¤£ ऑटोलोड" #: core/project_settings.cpp -#, fuzzy msgid "Version Control Plugin Name" -msgstr "वरà¥à¤œà¤¨ कंटà¥à¤°à¥‹à¤²" +msgstr "संसà¥à¤•रण नियंतà¥à¤°à¤£ पà¥à¤²à¤—इन का नाम" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp msgid "Input" -msgstr "" +msgstr "इनपà¥à¤Ÿ" #: core/project_settings.cpp msgid "UI Accept" -msgstr "" +msgstr "उपयोगकरà¥à¤¤à¤¾ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª सà¥à¤µà¥€à¤•ार करें" #: core/project_settings.cpp -#, fuzzy msgid "UI Select" -msgstr "चà¥à¤¨à¥‡à¤‚" +msgstr "उपयोगकरà¥à¤¤à¤¾ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª का चयन करें" #: core/project_settings.cpp -#, fuzzy msgid "UI Cancel" -msgstr "रदà¥à¤¦ करें" +msgstr "उपयोगकरà¥à¤¤à¤¾ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª रदà¥à¤¦ करें" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Next" -msgstr "फ़ोकस पाथ" +msgstr "उपयोगकरà¥à¤¤à¤¾ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª फोकस अगला" #: core/project_settings.cpp -#, fuzzy msgid "UI Focus Prev" -msgstr "फ़ोकस पाथ" +msgstr "उपयोगकरà¥à¤¤à¤¾ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª फ़ोकस पिछला" #: core/project_settings.cpp msgid "UI Left" -msgstr "" +msgstr "उपयोगकरà¥à¤¤à¤¾ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª छोड़ दिया गया" #: core/project_settings.cpp msgid "UI Right" -msgstr "" +msgstr "उपयोगकरà¥à¤¤à¤¾ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª अधिकार" #: core/project_settings.cpp msgid "UI Up" -msgstr "" +msgstr "उपयोगकरà¥à¤¤à¤¾ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª बढ़ा" #: core/project_settings.cpp -#, fuzzy msgid "UI Down" -msgstr "नीचे" +msgstr "उपयोगकरà¥à¤¤à¤¾ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª कम" #: core/project_settings.cpp -#, fuzzy msgid "UI Page Up" -msgstr "पृषà¥à¤ : " +msgstr "उपयोगकरà¥à¤¤à¤¾ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª पृषà¥à¤ अप" #: core/project_settings.cpp msgid "UI Page Down" -msgstr "" +msgstr "उपयोगकरà¥à¤¤à¤¾ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª पृषà¥à¤ नीचे" #: core/project_settings.cpp msgid "UI Home" -msgstr "" +msgstr "उपयोगकरà¥à¤¤à¤¾ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª घर" #: core/project_settings.cpp msgid "UI End" -msgstr "" +msgstr "उपयोगकरà¥à¤¤à¤¾ हसà¥à¤¤à¤•à¥à¤·à¥‡à¤ª समापà¥à¤¤ होता है" #: core/project_settings.cpp main/main.cpp modules/bullet/register_types.cpp #: modules/bullet/space_bullet.cpp scene/2d/physics_body_2d.cpp @@ -760,9 +738,8 @@ msgstr "" #: servers/physics_2d/physics_2d_server_wrap_mt.h #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp -#, fuzzy msgid "Physics" -msgstr "फिजिकà¥à¤¸ फà¥à¤°à¥‡à¤® %" +msgstr "फिजिकà¥à¤¸" #: core/project_settings.cpp editor/editor_settings.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -772,11 +749,11 @@ msgstr "फिजिकà¥à¤¸ फà¥à¤°à¥‡à¤® %" #: scene/3d/physics_body.cpp scene/resources/world.cpp #: servers/physics/space_sw.cpp servers/physics_server.cpp msgid "3D" -msgstr "" +msgstr "3 डी" #: core/project_settings.cpp msgid "Smooth Trimesh Collision" -msgstr "" +msgstr "तà¥à¤°à¤¿à¤®à¥‡à¤¶ की टकà¥à¤•र" #: core/project_settings.cpp drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles2/rasterizer_scene_gles2.cpp @@ -788,7 +765,7 @@ msgstr "" #: scene/main/viewport.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Rendering" -msgstr "" +msgstr "रेंडरिंग" #: core/project_settings.cpp drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp @@ -798,18 +775,17 @@ msgstr "" #: scene/resources/multimesh.cpp servers/visual/visual_server_scene.cpp #: servers/visual_server.cpp msgid "Quality" -msgstr "" +msgstr "कà¥à¤µà¤¾à¤²à¤¿à¤Ÿà¥€" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Filters" -msgstr "फिलà¥à¤Ÿà¤°:" +msgstr "फ़िलà¥à¤Ÿà¤°à¥à¤¸" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" -msgstr "" +msgstr "शॉरà¥à¤ª गहनता" #: core/project_settings.cpp editor/editor_export.cpp editor/editor_node.cpp #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp @@ -825,86 +801,81 @@ msgstr "डीबग करें" #: core/project_settings.cpp main/main.cpp modules/gdscript/gdscript.cpp #: modules/visual_script/visual_script.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Settings" -msgstr "à¤à¤¡à¥€à¤Ÿà¤° सेटिनà¥à¤—स..." +msgstr "सेटिंगà¥à¤¸" #: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Profiler" -msgstr "" +msgstr "पà¥à¤°à¥‹à¤«à¤¾à¤‡à¤²à¤°" #: core/project_settings.cpp -#, fuzzy msgid "Max Functions" -msgstr "कारà¥à¤¯à¥‹à¤‚:" +msgstr "मैकà¥à¤¸ फ़ंकà¥à¤¶à¤¨" #: core/project_settings.cpp scene/3d/vehicle_body.cpp -#, fuzzy msgid "Compression" -msgstr "सदसà¥à¤¯à¤¤à¤¾ बनाà¤à¤‚" +msgstr "कंपà¥à¤°à¥‡à¤¶à¤¨" #: core/project_settings.cpp msgid "Formats" -msgstr "" +msgstr "फारà¥à¤®à¥‡à¤Ÿ" #: core/project_settings.cpp msgid "Zstd" -msgstr "" +msgstr "Zstd" #: core/project_settings.cpp msgid "Long Distance Matching" -msgstr "" +msgstr "लंबी दूरी का मिलान" #: core/project_settings.cpp msgid "Compression Level" -msgstr "" +msgstr "संपीड़न सà¥à¤¤à¤°" #: core/project_settings.cpp msgid "Window Log Size" -msgstr "" +msgstr "विंडो लॉग आकार" #: core/project_settings.cpp msgid "Zlib" -msgstr "" +msgstr "Zlib" #: core/project_settings.cpp msgid "Gzip" -msgstr "" +msgstr "Gzip" #: core/project_settings.cpp platform/android/export/export.cpp msgid "Android" -msgstr "" +msgstr "à¤à¤‚डà¥à¤°à¥‰à¤¯à¤¡" #: core/project_settings.cpp msgid "Modules" -msgstr "" +msgstr "मॉडà¥à¤¯à¥‚ल" #: core/register_core_types.cpp msgid "TCP" -msgstr "" +msgstr "टीसीपी" #: core/register_core_types.cpp -#, fuzzy msgid "Connect Timeout Seconds" -msgstr "Node से कनेकà¥à¤Ÿ करें:" +msgstr "कनेकà¥à¤Ÿ टाइमआउट सेकंड" #: core/register_core_types.cpp msgid "Packet Peer Stream" -msgstr "" +msgstr "पैकेट पीयर सà¥à¤Ÿà¥à¤°à¥€à¤®" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" -msgstr "" +msgstr "मैकà¥à¤¸ बफर (2 की शकà¥à¤¤à¤¿)" #: core/register_core_types.cpp editor/editor_settings.cpp main/main.cpp msgid "SSL" -msgstr "" +msgstr "à¤à¤¸à¤à¤¸à¤à¤²" #: core/register_core_types.cpp main/main.cpp -#, fuzzy msgid "Certificates" -msgstr "विशेषता" +msgstr "पà¥à¤°à¤®à¤¾à¤£à¤ªà¤¤à¥à¤°" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_resource_picker.cpp @@ -913,9 +884,8 @@ msgid "Resource" msgstr "संसाधन" #: core/resource.cpp -#, fuzzy msgid "Local To Scene" -msgstr "कà¥à¤²à¥‹à¤œ सीन" +msgstr "सà¥à¤¥à¤¾à¤¨à¥€à¤¯ से दृशà¥à¤¯" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp @@ -925,21 +895,20 @@ msgid "Path" msgstr "पथ" #: core/script_language.cpp -#, fuzzy msgid "Source Code" -msgstr "संसाधन" +msgstr "सà¥à¤°à¥‹à¤¤ कोड" #: core/translation.cpp editor/project_settings_editor.cpp msgid "Locale" -msgstr "" +msgstr "लोकेल" #: core/translation.cpp msgid "Test" -msgstr "" +msgstr "टेसà¥à¤Ÿ" #: core/translation.cpp scene/resources/font.cpp msgid "Fallback" -msgstr "" +msgstr "फ़ॉलबैक" #: core/ustring.cpp scene/resources/segment_shape_2d.cpp msgid "B" @@ -975,17 +944,17 @@ msgstr "EiB" #: drivers/gles3/rasterizer_scene_gles3.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp modules/gltf/gltf_state.cpp msgid "Buffers" -msgstr "" +msgstr "बफ़रà¥à¤¸" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Buffer Size (KB)" -msgstr "" +msgstr "कैनवास बहà¥à¤à¥à¤œ बफर आकार (KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Canvas Polygon Index Buffer Size (KB)" -msgstr "" +msgstr "कैनवास बहà¥à¤à¥à¤œ सूचकांक बफर आकार (KB)" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp editor/editor_settings.cpp @@ -997,28 +966,27 @@ msgstr "" #: servers/physics_2d/space_2d_sw.cpp servers/physics_2d_server.cpp #: servers/visual_server.cpp msgid "2D" -msgstr "" +msgstr "2डी" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp -#, fuzzy msgid "Snapping" -msgstr "आकसà¥à¤®à¤¿à¤•:" +msgstr "सà¥à¤¨à¥ˆà¤ªà¤¿à¤‚ग" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Use GPU Pixel Snap" -msgstr "" +msgstr "GPU Pixel Snap का उपयोग करें" #: drivers/gles2/rasterizer_scene_gles2.cpp #: drivers/gles3/rasterizer_scene_gles3.cpp msgid "Immediate Buffer Size (KB)" -msgstr "" +msgstr "ततà¥à¤•ाल बफर आकार (KB)" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp msgid "Lightmapping" -msgstr "" +msgstr "लाइटमैपिंग" #: drivers/gles2/rasterizer_storage_gles2.cpp #: drivers/gles3/rasterizer_storage_gles3.cpp @@ -13001,9 +12969,10 @@ msgstr "आकसà¥à¤®à¤¿à¤•:" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14399,12 +14368,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -23488,6 +23456,15 @@ msgstr "पà¥à¤°à¤¤à¤¿à¤®à¤¾" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "आयात:" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/hr.po b/editor/translations/hr.po index 21a20978a6..85fcb184f3 100644 --- a/editor/translations/hr.po +++ b/editor/translations/hr.po @@ -12654,9 +12654,10 @@ msgstr "Opcije Klase" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14032,12 +14033,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22925,6 +22925,15 @@ msgstr "GreÅ¡ka!" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Zalijepi Animaciju" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/hu.po b/editor/translations/hu.po index 996249e619..b8bab10568 100644 --- a/editor/translations/hu.po +++ b/editor/translations/hu.po @@ -13160,9 +13160,10 @@ msgstr "Illesztési beállÃtások" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Rács Eltolás:" @@ -14544,13 +14545,13 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "" +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "A projekt nem nyitható meg a(z) %s helyen." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -23781,6 +23782,15 @@ msgstr "Hiba!" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Rendezés" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/id.po b/editor/translations/id.po index ee7e21c0c0..89153d88d3 100644 --- a/editor/translations/id.po +++ b/editor/translations/id.po @@ -13105,9 +13105,10 @@ msgstr "Opsi-opsi Snap" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Pengimbangan:" @@ -14569,16 +14570,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Lokasi proyek tidak valid (mengubah sesuatu?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Tidak dapat memuat project.godot dalam lokasi proyek (galat %d). Mungkin " "berkas itu tidak ada atau rusak." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "Tidak dapat menyunting project.godot dalam lokasi proyek." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Tidak dapat membuka proyek di '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -23964,6 +23966,16 @@ msgstr "Galat" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Urutkan" + +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Use AABB Center" +msgstr "Gunakan Sebagai Kemudi" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/ig.po b/editor/translations/ig.po index 8d96de35f3..e0c1a85c99 100644 --- a/editor/translations/ig.po +++ b/editor/translations/ig.po @@ -12357,9 +12357,10 @@ msgstr "" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13688,12 +13689,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22185,6 +22185,14 @@ msgstr "" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +msgid "Sorting" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/is.po b/editor/translations/is.po index 8514155c68..7551598f22 100644 --- a/editor/translations/is.po +++ b/editor/translations/is.po @@ -12635,9 +12635,10 @@ msgstr "Val á kvarða" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14004,12 +14005,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22783,6 +22783,15 @@ msgstr "" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Stillið breyting á:" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/it.po b/editor/translations/it.po index 027f4609f8..f1ff871a69 100644 --- a/editor/translations/it.po +++ b/editor/translations/it.po @@ -61,7 +61,7 @@ # Daniele Basso <tiziodcaio@gmail.com>, 2021. # Riteo Siuga <riteo@posteo.net>, 2021, 2022. # Luigi <luibass92@live.it>, 2021. -# Micky <micheledevita2@gmail.com>, 2021. +# Micky <micheledevita2@gmail.com>, 2021, 2022. # Fabio Plos <altre0cose@gmail.com>, 2021. # Theraloss <danilo.polani@gmail.com>, 2021. # Pietro Grungo <pietro.grungo@libero.it>, 2021. @@ -73,13 +73,17 @@ # ale piccia <picciatialessio2@gmail.com>, 2022. # Simone Starace <simone.starace93@gmail.com>, 2022. # Daniele Giunta <danielegiunta2007@gmail.com>, 2022. +# Damiano Guida <damiano.guida22@gmail.com>, 2022. +# Silvia Scaglione <sissisoad@gmail.com>, 2022. +# Cosimo Davide Viggiano <cosimod089@gmail.com>, 2022. +# Francesco Cammarata <francescocammarata.fr@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-27 21:37+0000\n" -"Last-Translator: Daniele Giunta <danielegiunta2007@gmail.com>\n" +"PO-Revision-Date: 2022-11-22 20:37+0000\n" +"Last-Translator: Francesco Cammarata <francescocammarata.fr@gmail.com>\n" "Language-Team: Italian <https://hosted.weblate.org/projects/godot-engine/" "godot/it/>\n" "Language: it\n" @@ -87,7 +91,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -213,7 +217,7 @@ msgstr "Target FPS" #: core/bind/core_bind.cpp msgid "Time Scale" -msgstr "Scala Temporale" +msgstr "Scala temporale" #: core/bind/core_bind.cpp main/main.cpp msgid "Physics Jitter Fix" @@ -456,7 +460,6 @@ msgid "Command" msgstr "Comando" #: core/os/input_event.cpp -#, fuzzy msgid "Physical" msgstr "Fisico" @@ -468,14 +471,13 @@ msgstr "Premuto" #: core/os/input_event.cpp msgid "Scancode" -msgstr "Codice di Scansione" +msgstr "Codice di scansione" #: core/os/input_event.cpp msgid "Physical Scancode" msgstr "Codice di Scansione Fisico" #: core/os/input_event.cpp -#, fuzzy msgid "Unicode" msgstr "Unicode" @@ -1020,7 +1022,7 @@ msgstr "2D" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp msgid "Snapping" -msgstr "Ancoraggio" +msgstr "Scatto" #: drivers/gles2/rasterizer_canvas_base_gles2.cpp #: drivers/gles3/rasterizer_canvas_base_gles3.cpp @@ -2802,9 +2804,8 @@ msgid "Choose" msgstr "Scegli" #: editor/editor_export.cpp -#, fuzzy msgid "Project export for platform:" -msgstr "Esportazione del progetto per la piattaforma:" +msgstr "Esportazione del progetto per piattaforma:" #: editor/editor_export.cpp msgid "Completed with warnings." @@ -2953,7 +2954,6 @@ msgid "ETC2" msgstr "ETC2" #: editor/editor_export.cpp -#, fuzzy msgid "No BPTC Fallbacks" msgstr "Nessun fallback per BPTC" @@ -2970,7 +2970,6 @@ msgid "Custom release template not found." msgstr "Modello di rilascio personalizzato non trovato." #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" msgstr "Prepara Modello" @@ -2988,9 +2987,8 @@ msgstr "Copiatura del modello di esportazione fallita." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp -#, fuzzy msgid "PCK Embedding" -msgstr "PCK Incorporazione" +msgstr "Incorporazione PCK" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." @@ -3167,7 +3165,7 @@ msgstr "Rendi attuale" #: editor/plugins/theme_editor_plugin.cpp editor/project_manager.cpp #: modules/fbx/editor_scene_importer_fbx.cpp msgid "Import" -msgstr "Importa" +msgstr "Importare" #: editor/editor_feature_profile.cpp editor/project_export.cpp #: platform/android/export/export.cpp platform/android/export/export_plugin.cpp @@ -3289,7 +3287,7 @@ msgstr "Accedi" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp msgid "Display Mode" -msgstr "Modalità Visualizzazione" +msgstr "Modalità di visualizzazione" #: editor/editor_file_dialog.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -5304,11 +5302,11 @@ msgstr "Lingua dell'Editor" #: editor/editor_settings.cpp msgid "Display Scale" -msgstr "Dimensione Display" +msgstr "Scala di visualizzazione" #: editor/editor_settings.cpp msgid "Custom Display Scale" -msgstr "Dimensione Display Personalizzata" +msgstr "Scala di visualizzazione personalizzata" #: editor/editor_settings.cpp msgid "Main Font Size" @@ -5554,14 +5552,12 @@ msgid "Mouse Extra Buttons Navigate History" msgstr "Uso dei tasti aggiuntivi del mouse per navigare la cronologia" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" msgstr "Selezione Drag And Drop" #: editor/editor_settings.cpp -#, fuzzy msgid "Stay In Script Editor On Node Selected" -msgstr "Rimani nell'Editor degli Script quando un Nodo è selezionato" +msgstr "Rimani nell'editor degli script quando un nodo è selezionato" #: editor/editor_settings.cpp msgid "Appearance" @@ -5601,7 +5597,7 @@ msgstr "Mostra Linee Guida della Lunghezza della Linea" #: editor/editor_settings.cpp msgid "Line Length Guideline Soft Column" -msgstr "" +msgstr "Margine suggerito per lunghezza riga" #: editor/editor_settings.cpp msgid "Line Length Guideline Hard Column" @@ -5719,7 +5715,6 @@ msgid "Help Font Size" msgstr "Dimensione Carattere della Guida" #: editor/editor_settings.cpp -#, fuzzy msgid "Help Source Font Size" msgstr "Dimensione dei caratteri della sezione d'assistenza codice sorgente" @@ -5829,7 +5824,6 @@ msgid "Lightmap Baking Number Of CPU Threads" msgstr "Numero di Threads CPU del Baking di Lightmap" #: editor/editor_settings.cpp -#, fuzzy msgid "Navigation Scheme" msgstr "Schema di Navigazione" @@ -5858,9 +5852,8 @@ msgid "Orbit Modifier" msgstr "Modificatore Orbita" #: editor/editor_settings.cpp -#, fuzzy msgid "Pan Modifier" -msgstr "Modificatore di Pan" +msgstr "Modificatore Pan" #: editor/editor_settings.cpp msgid "Zoom Modifier" @@ -5871,9 +5864,8 @@ msgid "Warped Mouse Panning" msgstr "Panning Continuo Del Mouse" #: editor/editor_settings.cpp -#, fuzzy msgid "Navigation Feel" -msgstr "Sensazione Navigazione" +msgstr "Sensazione della Navigazione" #: editor/editor_settings.cpp msgid "Orbit Sensitivity" @@ -5929,7 +5921,7 @@ msgstr "Colore Guide" #: editor/editor_settings.cpp msgid "Smart Snapping Line Color" -msgstr "Colore Linea Agganciamento Intelligente" +msgstr "Colore della linea dello scatto intelligente" #: editor/editor_settings.cpp msgid "Bone Width" @@ -5948,9 +5940,8 @@ msgid "Bone Selected Color" msgstr "Colore Osso Selezionato" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone IK Color" -msgstr "Colore IK Osso" +msgstr "Colore Osso IK" #: editor/editor_settings.cpp msgid "Bone Outline Color" @@ -5986,7 +5977,6 @@ msgid "Poly Editor" msgstr "Editor Poly" #: editor/editor_settings.cpp -#, fuzzy msgid "Point Grab Radius" msgstr "Raggio Afferramento Punti" @@ -6099,9 +6089,8 @@ msgid "Keyword Color" msgstr "Colore Parola Chiave" #: editor/editor_settings.cpp -#, fuzzy msgid "Control Flow Keyword Color" -msgstr "Colore Parola Chiave Controllo Flusso" +msgstr "Colore della Parola Chiave del Controllo Flusso" #: editor/editor_settings.cpp msgid "Base Type Color" @@ -6973,7 +6962,7 @@ msgstr "Filtro" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "Mipmaps" -msgstr "Mipmaps" +msgstr "Mappe errate" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp @@ -7079,7 +7068,7 @@ msgstr "Nome Root" #: editor/import/resource_importer_scene.cpp msgid "Root Scale" -msgstr "Scala Root" +msgstr "Scala di radice" #: editor/import/resource_importer_scene.cpp msgid "Custom Script" @@ -8010,7 +7999,7 @@ msgstr "Posizione animazione (in secondi)." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Scale animation playback globally for the node." -msgstr "Scala playback dell'animazione globalmente per il nodo." +msgstr "Scala la riproduzione dell'animazione globalmente per il nodo." #: editor/plugins/animation_player_editor_plugin.cpp msgid "Animation Tools" @@ -8214,7 +8203,6 @@ msgid "Set the end animation. This is useful for sub-transitions." msgstr "Assegna l'animazione finale. Utile per le sotto-transizioni." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition:" msgstr "Transizione:" @@ -8328,12 +8316,13 @@ msgid "Blend4 Node" msgstr "Nodo Blend4" #: editor/plugins/animation_tree_player_editor_plugin.cpp +#, fuzzy msgid "TimeScale Node" msgstr "Nodo TimeScale" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "TimeSeek Node" -msgstr "Nodo TimeScale" +msgstr "Nodo TimeSeek" #: editor/plugins/animation_tree_player_editor_plugin.cpp msgid "Transition Node" @@ -8465,7 +8454,7 @@ msgstr "Errore nel fare richiesta" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Idle" -msgstr "Inattivo" +msgstr "Inattività " #: editor/plugins/asset_library_editor_plugin.cpp msgid "Install..." @@ -8655,7 +8644,7 @@ msgstr "Anteprima" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Configure Snap" -msgstr "Configura Agganciamento" +msgstr "Configura scatto" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Grid Offset:" @@ -8731,7 +8720,7 @@ msgstr "Sposta Ancora CanvasItem \"%s\"" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale Node2D \"%s\" to (%s, %s)" -msgstr "Scala Node2D \"%s\" a (%s, %s)" +msgstr "Ridimensiona Node2D \"%s\" a (%s, %s)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Resize Control \"%s\" to (%d, %d)" @@ -8739,11 +8728,11 @@ msgstr "Ridimensiona Control \"%s\" a (%d, %d)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale %d CanvasItems" -msgstr "Scala %d CanvasItem" +msgstr "Ridimensiona %d CanvasItem" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale CanvasItem \"%s\" to (%s, %s)" -msgstr "Scala CanvasItem \"%s\" a (%s, %s)" +msgstr "Ridimensiona CanvasItem \"%s\" a (%s, %s)" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Move %d CanvasItems" @@ -8960,7 +8949,7 @@ msgstr "Alt+Trascina: Muovi nodo selezionato." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Alt+Drag: Scale selected node." -msgstr "Alt+Trascina: Ridimensiona il nodo selezionato." +msgstr "Alt+Trascinamento: Ridimensiona il nodo selezionato." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "V: Set selected node's pivot position." @@ -8994,7 +8983,7 @@ msgstr "Modalità scala" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Shift: Scale proportionally." -msgstr "Shift: Ridimensiona proporzionalmente." +msgstr "Maiusc: Ridimensiona proporzionalmente." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -9019,7 +9008,7 @@ msgstr "Modalità Righello" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Toggle smart snapping." -msgstr "Commuta l'agganciamento intelligente." +msgstr "Commuta lo scatto intelligente." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Smart Snap" @@ -9035,7 +9024,7 @@ msgstr "Usa la griglia magnetica" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snapping Options" -msgstr "Opzioni Agganciamento" +msgstr "Opzioni dello scatto" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Rotation Snap" @@ -9043,19 +9032,19 @@ msgstr "Aggancia Rotazione" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Scale Snap" -msgstr "Aggancia Ridimensionamento" +msgstr "Scatta la scala" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Snap Relative" -msgstr "Agganciamento Relativo" +msgstr "Scatto relativo" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Use Pixel Snap" -msgstr "Agganciamento su Pixel" +msgstr "Scatta sui pixel" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Smart Snapping" -msgstr "Agganciamento Intelligente" +msgstr "Scatto intelligente" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -9154,7 +9143,7 @@ msgstr "Mostra" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Show When Snapping" -msgstr "Mostra Se Agganciamento" +msgstr "Mostra durante lo scatto" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Hide" @@ -9219,7 +9208,7 @@ msgstr "Maschera di rotazione per l'inserimento delle chiavi." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Scale mask for inserting keys." -msgstr "Maschera di scala per l'inserimento delle chiavi." +msgstr "Scala maschera per l'inserimento delle chiavi." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Insert keys (based on mask)." @@ -9345,8 +9334,8 @@ msgid "" "Drag & drop + Shift : Add node as sibling\n" "Drag & drop + Alt : Change node type" msgstr "" -"Trascina & Rilascia + Shift : Aggiungi nodo come fratello\n" -"Trascina & Rilascia + Alt : Cambia tipo del nodo" +"Trascina e Rilascia + Shift : Aggiungi nodo come fratello\n" +"Trascina e Rilascia + Alt : Cambia tipo del nodo" #: editor/plugins/collision_polygon_editor_plugin.cpp msgid "Create Polygon3D" @@ -9442,7 +9431,7 @@ msgstr "Flat 0" #: editor/plugins/curve_editor_plugin.cpp msgid "Flat 1" -msgstr "Flat 1" +msgstr "Flat 1Flat 1" #: editor/plugins/curve_editor_plugin.cpp editor/property_editor.cpp msgid "Ease In" @@ -9522,7 +9511,7 @@ msgstr "Scambia Punti di Riempimento del Gradiente" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Toggle Grid Snap" -msgstr "Commuta Agganciamento Griglia" +msgstr "Commuta scatto sulla griglia" #: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp #: scene/3d/label_3d.cpp scene/gui/button.cpp scene/gui/dialogs.cpp @@ -9540,7 +9529,6 @@ msgid "Icon" msgstr "Icona" #: editor/plugins/item_list_editor_plugin.cpp -#, fuzzy msgid "ID" msgstr "ID" @@ -9709,7 +9697,6 @@ msgstr "" "collisioni." #: editor/plugins/mesh_instance_editor_plugin.cpp -#, fuzzy msgid "Create Simplified Convex Collision Sibling" msgstr "Crea Fratello di Collisione Convessa Semplificato" @@ -9909,7 +9896,7 @@ msgstr "Inclinazione Casuale:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Random Scale:" -msgstr "Scala Casuale:" +msgstr "Scala casuale:" #: editor/plugins/multimesh_editor_plugin.cpp msgid "Populate" @@ -10169,7 +10156,7 @@ msgstr "" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create Polygon & UV" -msgstr "Crea Poligono & UV" +msgstr "Crea Poligono e UV" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create Internal Vertex" @@ -10265,7 +10252,7 @@ msgstr "Ruota poligono" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Scale Polygon" -msgstr "Scala poligono" +msgstr "Ridimensiona poligono" #: editor/plugins/polygon_2d_editor_plugin.cpp msgid "Create a custom polygon. Enables custom polygon rendering." @@ -10406,7 +10393,6 @@ msgid "Flip Portal" msgstr "Ribalta Portale" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Occluder Set Transform" msgstr "Imposta Trasformazione dell' Occlusore" @@ -10758,7 +10744,7 @@ msgstr "[Ignora]" #: editor/plugins/script_text_editor.cpp msgid "Line" -msgstr "Linea" +msgstr "Riga" #: editor/plugins/script_text_editor.cpp msgid "Go to Function" @@ -11006,7 +10992,7 @@ msgstr "Ortogonale dal Basso" #: editor/plugins/spatial_editor_plugin.cpp msgid "Bottom Perspective" -msgstr "Prospettica dal Basso" +msgstr "Prospettica dal basso" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left Orthogonal" @@ -11014,7 +11000,7 @@ msgstr "Ortogonale a Sinistra" #: editor/plugins/spatial_editor_plugin.cpp msgid "Left Perspective" -msgstr "Prospettica a Sinistra" +msgstr "Prospettica da sinistra" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right Orthogonal" @@ -11022,7 +11008,7 @@ msgstr "Ortogonale a Destra" #: editor/plugins/spatial_editor_plugin.cpp msgid "Right Perspective" -msgstr "Prospettica a Destra" +msgstr "Prospettica da destra" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front Orthogonal" @@ -11030,7 +11016,7 @@ msgstr "Ortogonale di Fronte" #: editor/plugins/spatial_editor_plugin.cpp msgid "Front Perspective" -msgstr "Prospettica di Fronte" +msgstr "Prospettica di fronte" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear Orthogonal" @@ -11038,7 +11024,7 @@ msgstr "Ortogonale da Dietro" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rear Perspective" -msgstr "Prospettica da Dietro" +msgstr "Prospettica da dietro" #. TRANSLATORS: This will be appended to the view name when Auto Orthogonal is enabled. #: editor/plugins/spatial_editor_plugin.cpp @@ -11140,7 +11126,6 @@ msgid "Vertices:" msgstr "Vertici:" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "FPS: %d (%s ms)" msgstr "FPS: %d (%s ms)" @@ -11186,31 +11171,31 @@ msgstr "Questa operazione richiede un solo nodo selezionato." #: editor/plugins/spatial_editor_plugin.cpp msgid "Auto Orthogonal Enabled" -msgstr "Ortogonale Automatico Abilitato" +msgstr "Ortogonale automatica abilitata" #: editor/plugins/spatial_editor_plugin.cpp msgid "Lock View Rotation" -msgstr "Blocca Rotazione Vista" +msgstr "Blocca la rotazione della vista" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Normal" -msgstr "Mostra Normale" +msgstr "Visualizzazione predefinita" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Wireframe" -msgstr "Mostra Wireframe" +msgstr "Visualizzazione fildiferro" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Overdraw" -msgstr "Mostra Overdraw" +msgstr "Visualizza Overdraw" #: editor/plugins/spatial_editor_plugin.cpp msgid "Display Unshaded" -msgstr "Mostra Unshaded" +msgstr "Visualizzazione senza ombre" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Environment" -msgstr "Mostra Ambiente" +msgstr "Visualizza ambiente" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Gizmos" @@ -11388,12 +11373,10 @@ msgid "Orbit View Right" msgstr "Orbita la visuale a destra" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Orbit View Up" msgstr "Orbita la visuale in sù" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Orbit View 180" msgstr "Orbita la visuale 180" @@ -11426,7 +11409,6 @@ msgid "Increase Field of View" msgstr "Aumenta il Campo Visivo" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Reset Field of View to Default" msgstr "Ripristina il Campo Visivo alle impostazioni predefinite" @@ -11436,7 +11418,7 @@ msgstr "Scatta l'oggetto sul suolo" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Dialog..." -msgstr "Finestra di Transform..." +msgstr "Modale di trasformazione..." #: editor/plugins/spatial_editor_plugin.cpp msgid "1 Viewport" @@ -11468,11 +11450,11 @@ msgstr "Gizmos" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" -msgstr "Visualizza Origine" +msgstr "Visualizza l'origine" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Grid" -msgstr "Visualizza Griglia" +msgstr "Visualizza la griglia" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Portal Culling" @@ -11489,19 +11471,19 @@ msgstr "Impostazioni…" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Settings" -msgstr "Impostazioni Agganciamento" +msgstr "Impostazioni dello scatto" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate Snap:" -msgstr "Agganciamento Traslazione:" +msgstr "Scatto di traslazione:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotate Snap (deg.):" -msgstr "Agganciamento Rotazione (gradi):" +msgstr "Scatto di rotazione (gradi):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Scale Snap (%):" -msgstr "Agganciamento Ridimensionamento (%):" +msgstr "Scatto della scala (%):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Viewport Settings" @@ -11521,7 +11503,7 @@ msgstr "Visualizza Z-Far:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Change" -msgstr "Cambiamento Transform" +msgstr "Cambio di trasformazione" #: editor/plugins/spatial_editor_plugin.cpp msgid "Translate:" @@ -11537,7 +11519,7 @@ msgstr "Scala (rapporto):" #: editor/plugins/spatial_editor_plugin.cpp msgid "Transform Type" -msgstr "Tipo Transform" +msgstr "Tipo di trasformazione" #: editor/plugins/spatial_editor_plugin.cpp msgid "Pre" @@ -11548,14 +11530,12 @@ msgid "Post" msgstr "Post" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Manipulator Gizmo Size" msgstr "Dimensione Gizmo Di Controllo" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Manipulator Gizmo Opacity" -msgstr "Opacità Gizmo Di Controllo" +msgstr "Opacità Gizmo Manipolatore" #: editor/plugins/spatial_editor_plugin.cpp msgid "Show Viewport Rotation Gizmo" @@ -11716,9 +11696,8 @@ msgid "New Animation" msgstr "Nuova Animazione" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "Modalità di filtraggio animazioni" +msgstr "Filtraggio animazioni" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -11809,11 +11788,11 @@ msgstr "Modalità dello scatto:" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Pixel Snap" -msgstr "Agganciamento Pixel" +msgstr "Scatto sui pixel" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Grid Snap" -msgstr "Agganciamento Griglia" +msgstr "Scatto sulla griglia" #: editor/plugins/texture_region_editor_plugin.cpp msgid "Auto Slice" @@ -12387,7 +12366,7 @@ msgstr "Elemento Modificabile" #: editor/plugins/theme_editor_preview.cpp msgid "Subtree" -msgstr "Sottoalbero" +msgstr "Subtree" #: editor/plugins/theme_editor_preview.cpp msgid "Has,Many,Options" @@ -12550,7 +12529,7 @@ msgstr "Lato Editor" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Display Grid" -msgstr "Mostra Griglia" +msgstr "Visualizza griglia" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Axis Color" @@ -12706,7 +12685,7 @@ msgstr "Abilita lo scatto e mostra la griglia (configurabile dall'ispettore)." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Display Tile Names (Hold Alt Key)" -msgstr "Mostra i Nomi delle Tile (Tenere Premuto Tasto Alt)" +msgstr "Visualizza i nomi dei tasselli (tenere premuto il tasto alt)" #: editor/plugins/tile_set_editor_plugin.cpp msgid "" @@ -12895,7 +12874,7 @@ msgstr "Questa proprietà non può essere cambiata." #: editor/plugins/tile_set_editor_plugin.cpp msgid "Snap Options" -msgstr "Opzioni Agganciamento" +msgstr "Opzioni dello scatto" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/animated_sprite.cpp #: scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp @@ -12903,9 +12882,10 @@ msgstr "Opzioni Agganciamento" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "Scostamento" @@ -13083,9 +13063,8 @@ msgid "Select SSH private key path" msgstr "Seleziona il percorso della chiave privata SSH" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "SSH Passphrase" -msgstr "Frase di accesso SSH" +msgstr "SSH Passphrase" #: editor/plugins/version_control_editor_plugin.cpp msgid "Detect new changes" @@ -13157,11 +13136,11 @@ msgstr "URL Remoto" #: editor/plugins/version_control_editor_plugin.cpp msgid "Fetch" -msgstr "" +msgstr "Fetch" #: editor/plugins/version_control_editor_plugin.cpp msgid "Pull" -msgstr "" +msgstr "Pull" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -14328,16 +14307,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Percorso del progetto invalido (cambiato qualcosa?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Impossibile caricare project.godot nel percorso del progetto (errore %d). " "Può essere mancante o corrotto." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "Impossibile modificare project.godot nel percorso del progetto." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Impossibile aprire il progetto a \"%s\"." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -14365,7 +14345,7 @@ msgstr "Importa Progetto Esistente" #: editor/project_manager.cpp msgid "Import & Edit" -msgstr "Importa & Modifica" +msgstr "Importa e Modifica" #: editor/project_manager.cpp msgid "Create New Project" @@ -14373,7 +14353,7 @@ msgstr "Crea Nuovo Progetto" #: editor/project_manager.cpp msgid "Create & Edit" -msgstr "Crea & Modifica" +msgstr "Crea e Modifica" #: editor/project_manager.cpp msgid "Install Project:" @@ -14381,7 +14361,7 @@ msgstr "Installa Progetto:" #: editor/project_manager.cpp msgid "Install & Edit" -msgstr "Installa & Modifica" +msgstr "Installa e Modifica" #: editor/project_manager.cpp msgid "Project Name:" @@ -15180,7 +15160,7 @@ msgstr "Mantieni Transform Globale" #: editor/reparent_dialog.cpp editor/scene_tree_dock.cpp msgid "Reparent" -msgstr "Cambia Genitore" +msgstr "Riaccoppiare" #: editor/run_settings_dialog.cpp msgid "Run Mode:" @@ -15928,7 +15908,7 @@ msgstr "Monitor" #: editor/script_editor_debugger.cpp msgid "Pick one or more items from the list to display the graph." -msgstr "Scegli uno o più elementi dall'elenco per mostrare il grafico." +msgstr "Scegliere uno o più elementi dall'elenco per mostrare il grafico." #: editor/script_editor_debugger.cpp msgid "List of Video Memory Usage by Resource:" @@ -16234,7 +16214,6 @@ msgid "Flush stdout On Print" msgstr "Svuota stdout Alla Stampa" #: main/main.cpp servers/visual_server.cpp -#, fuzzy msgid "Logging" msgstr "Logging" @@ -16316,11 +16295,11 @@ msgstr "Modello Thread" #: main/main.cpp msgid "Thread Safe BVH" -msgstr "" +msgstr "Thread sicuro BVH" #: main/main.cpp msgid "Handheld" -msgstr "" +msgstr "Maneggiato" #: main/main.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp @@ -16342,7 +16321,7 @@ msgstr "Forza FPS" #: main/main.cpp msgid "Enable Pause Aware Picking" -msgstr "" +msgstr "Abilita Picking Allerta Pausa" #: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp #: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp @@ -16352,7 +16331,7 @@ msgstr "Interfaccia Grafica" #: main/main.cpp msgid "Drop Mouse On GUI Input Disabled" -msgstr "" +msgstr "Rilascio del mouse sull'Input della GUI Disabilitato" #: main/main.cpp msgid "stdout" @@ -16399,7 +16378,6 @@ msgid "Input Devices" msgstr "Dispositivi Input" #: main/main.cpp -#, fuzzy msgid "Pointing" msgstr "Puntamento" @@ -16426,7 +16404,6 @@ msgid "Environment" msgstr "Ambiente" #: main/main.cpp -#, fuzzy msgid "Default Clear Color" msgstr "Colore Di Sfondo Di Default" @@ -16468,7 +16445,7 @@ msgstr "Buffering" #: main/main.cpp msgid "Agile Event Flushing" -msgstr "" +msgstr "Svuotamento degli eventi usando l'algoritmo Agile" #: main/main.cpp msgid "Emulate Touch From Mouse" @@ -16656,16 +16633,15 @@ msgstr "Gradi di Rotazione" #: modules/csg/csg_shape.cpp msgid "Spin Sides" -msgstr "" +msgstr "Lati rotazione" #: modules/csg/csg_shape.cpp msgid "Path Node" msgstr "Percorso Nodo" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Interval Type" -msgstr "Crea Vertice Interno" +msgstr "Tipo di intervallo del Percorso" #: modules/csg/csg_shape.cpp msgid "Path Interval" @@ -16673,7 +16649,7 @@ msgstr "Intervallo Percorso" #: modules/csg/csg_shape.cpp msgid "Path Simplify Angle" -msgstr "" +msgstr "Angolo di semplificazione Percorso" #: modules/csg/csg_shape.cpp msgid "Path Rotation" @@ -16694,7 +16670,6 @@ msgid "Path U Distance" msgstr "Scegli la Distanza:" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Joined" msgstr "Percorsi Uniti" @@ -16716,15 +16691,15 @@ msgstr "Sempre In Ordine" #: modules/enet/networked_multiplayer_enet.cpp msgid "Server Relay" -msgstr "" +msgstr "Rimbalzo Server" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Verify" -msgstr "" +msgstr "Verifica DTLS" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Hostname" -msgstr "" +msgstr "Nome host DTLS" #: modules/enet/networked_multiplayer_enet.cpp msgid "Use DTLS" @@ -16732,7 +16707,7 @@ msgstr "Usa DTLS" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "FBX" -msgstr "" +msgstr "FBX" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "Use FBX" @@ -16810,7 +16785,6 @@ msgid "Disabled GDNative Singleton" msgstr "Singleton GDNative disabilitato" #: modules/gdnative/gdnative_library_singleton_editor.cpp -#, fuzzy msgid "Libraries:" msgstr "Librerie:" @@ -16956,11 +16930,11 @@ msgstr "Conteggio Sparso" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Buffer View" -msgstr "" +msgstr "Vista indici sparsi dei buffer" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Byte Offset" -msgstr "" +msgstr "Scostamento Byte degli Indici Sparsi" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Component Type" @@ -16968,11 +16942,11 @@ msgstr "Tipo di Componente degli Indici Sparsi" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Buffer View" -msgstr "" +msgstr "Vista buffer dei valori sparsi" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Byte Offset" -msgstr "" +msgstr "Scostamento Byte dei Valori Sparsi" #: modules/gltf/gltf_buffer_view.cpp msgid "Buffer" @@ -16996,11 +16970,11 @@ msgstr "Dimensione Campo VIsivo" #: modules/gltf/gltf_camera.cpp msgid "Zfar" -msgstr "" +msgstr "Z Lontano" #: modules/gltf/gltf_camera.cpp msgid "Znear" -msgstr "Znear" +msgstr "Z Vicino" #: modules/gltf/gltf_light.cpp scene/2d/canvas_modulate.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp scene/2d/polygon_2d.cpp @@ -17048,11 +17022,11 @@ msgstr "Xform" #: modules/gltf/gltf_node.cpp scene/3d/mesh_instance.cpp msgid "Skin" -msgstr "" +msgstr "Skin" #: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp msgid "Translation" -msgstr "Traslazione" +msgstr "Traduzione" #: modules/gltf/gltf_node.cpp msgid "Children" @@ -17075,18 +17049,18 @@ msgid "Godot Bone Node" msgstr "Nodo Osso Godot" #: modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Skin Root" -msgstr "Nuova Scena Radice" +msgstr "Radice della Skin" #: modules/gltf/gltf_skin.cpp #, fuzzy msgid "Joints Original" -msgstr "Centra Origine" +msgstr "Articolazioni Originali" #: modules/gltf/gltf_skin.cpp +#, fuzzy msgid "Inverse Binds" -msgstr "" +msgstr "Inverti Legamenti" #: modules/gltf/gltf_skin.cpp msgid "Non Joints" @@ -17094,11 +17068,11 @@ msgstr "Non Articolazioni" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Bone I" -msgstr "" +msgstr "Articolazione I ad Osso I" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Name" -msgstr "" +msgstr "Articolazione I a Nome" #: modules/gltf/gltf_skin.cpp msgid "Godot Skin" @@ -17126,7 +17100,7 @@ msgstr "Immagine Gloss Speculare" #: modules/gltf/gltf_state.cpp msgid "Json" -msgstr "" +msgstr "Json" #: modules/gltf/gltf_state.cpp msgid "Major Version" @@ -17141,13 +17115,13 @@ msgid "GLB Data" msgstr "Dati GLB" #: modules/gltf/gltf_state.cpp +#, fuzzy msgid "Use Named Skin Binds" -msgstr "" +msgstr "Usa associazioni skin con nome" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Buffer Views" -msgstr "Vista dal retro" +msgstr "Viste dei Buffer" #: modules/gltf/gltf_state.cpp msgid "Accessors" @@ -17237,17 +17211,15 @@ msgid "Mask" msgstr "Maschera" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp -#, fuzzy msgid "Bake Navigation" -msgstr "Navigazione" +msgstr "Preprocessa Navigazione" #: modules/gridmap/grid_map.cpp scene/2d/navigation_2d.cpp #: scene/2d/navigation_agent_2d.cpp scene/2d/navigation_polygon.cpp #: scene/2d/tile_map.cpp scene/3d/navigation.cpp scene/3d/navigation_agent.cpp #: scene/3d/navigation_mesh_instance.cpp -#, fuzzy msgid "Navigation Layers" -msgstr "Sensazione Navigazione" +msgstr "Livelli Navigazione" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Plane" @@ -17282,9 +17254,8 @@ msgid "GridMap Fill Selection" msgstr "GridMap Riempi Selezione" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "GridMap Paste Selection" -msgstr "Sezione GridMap incolla" +msgstr "Incolla Selezione GridMap" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "GridMap Paint" @@ -17299,9 +17270,8 @@ msgid "Snap View" msgstr "Scatta Visuale" #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Clip Disabled" -msgstr "Clip Disabilitata" +msgstr "Clip Disabilitato" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Clip Above" @@ -17409,9 +17379,8 @@ msgid "Plotting lightmaps" msgstr "Stampando le lightmap" #: modules/lightmapper_cpu/register_types.cpp -#, fuzzy msgid "CPU Lightmapper" -msgstr "Preprocessa Lightmaps" +msgstr "CPU Mappatore Della Luce" #: modules/lightmapper_cpu/register_types.cpp msgid "Low Quality Ray Count" @@ -17442,28 +17411,27 @@ msgstr "Altezza Occhio" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "IOD" -msgstr "" +msgstr "IOD" #: modules/mobile_vr/mobile_vr_interface.cpp +#, fuzzy msgid "Display Width" msgstr "Larghezza Display" #: modules/mobile_vr/mobile_vr_interface.cpp #, fuzzy msgid "Display To Lens" -msgstr "Mostra Unshaded" +msgstr "Mostra alle Lenti" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Oversample" -msgstr "" +msgstr "Sovracampionamento" #: modules/mobile_vr/mobile_vr_interface.cpp -#, fuzzy msgid "K1" msgstr "K1" #: modules/mobile_vr/mobile_vr_interface.cpp -#, fuzzy msgid "K2" msgstr "K2" @@ -17482,20 +17450,17 @@ msgstr "Auto-Aggiorna Progetto" #: modules/mono/godotsharp_dirs.cpp #, fuzzy msgid "Assembly Name" -msgstr "Nome Display" +msgstr "Nome Assemblaggio" #: modules/mono/godotsharp_dirs.cpp -#, fuzzy msgid "Solution Directory" -msgstr "Scegli una cartella" +msgstr "Cartella di Soluzione" #: modules/mono/godotsharp_dirs.cpp -#, fuzzy msgid "C# Project Directory" -msgstr "Scegli una cartella" +msgstr "Cartella Progetto C#" #: modules/mono/mono_gd/gd_mono_utils.cpp -#, fuzzy msgid "End of inner exception stack trace" msgstr "Fine dell'analisi dell’eccezione interna dello stack" @@ -17620,11 +17585,11 @@ msgstr "" #: modules/upnp/upnp.cpp msgid "Discover Local Port" -msgstr "" +msgstr "Rileva Porta Locale" #: modules/upnp/upnp.cpp msgid "Discover IPv6" -msgstr "" +msgstr "Rilevamento IPv6" #: modules/upnp/upnp_device.cpp msgid "Description URL" @@ -17636,21 +17601,19 @@ msgstr "Tipo Di Servizio" #: modules/upnp/upnp_device.cpp msgid "IGD Control URL" -msgstr "" +msgstr "URL di controllo IGD" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "IGD Service Type" -msgstr "Imposta Tipo di Variabile" +msgstr "Tipo Servizio IGD" #: modules/upnp/upnp_device.cpp msgid "IGD Our Addr" -msgstr "" +msgstr "Indirizzo locale IGD" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "IGD Status" -msgstr "Stato" +msgstr "Stato IGD" #: modules/visual_script/visual_script.cpp msgid "" @@ -17677,7 +17640,6 @@ msgstr "" "memoria di lavoro del nodo! Si prega di correggere il nodo." #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Node returned an invalid sequence output:" msgstr "Il nodo ha ritornato una sequenza di output invalida:" @@ -17686,14 +17648,13 @@ msgid "Found sequence bit but not the node in the stack, report bug!" msgstr "Trovato bit di sequenza ma non il nodo nello stack, segnalare il bug!" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Stack overflow with stack depth:" msgstr "Overflow dello stack con profondità dello stack:" #: modules/visual_script/visual_script.cpp #, fuzzy msgid "Visual Script" -msgstr "Ricerca VisualScript" +msgstr "Script Visivo" #: modules/visual_script/visual_script_editor.cpp msgid "Change Signal Arguments" @@ -18014,7 +17975,6 @@ msgstr "Modifica membro" #: modules/visual_script/visual_script_expression.cpp #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Expression" msgstr "Espressione" @@ -18023,9 +17983,8 @@ msgid "Return" msgstr "Ritorno" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Return Enabled" -msgstr "Eseguibile" +msgstr "Ritorno Abilitato" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return Type" @@ -18038,27 +17997,26 @@ msgstr "Condizione" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" -msgstr "if (cond) is:" +msgstr "se (cond) è:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "While" -msgstr "While" +msgstr "Mentre" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" -msgstr "" +msgstr "mentre (cond):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" msgstr "Iteratore" #: modules/visual_script/visual_script_flow_control.cpp +#, fuzzy msgid "for (elem) in (input):" -msgstr "" +msgstr "per (elem) in (input):" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Input type not iterable:" msgstr "Il tipo di input non è iterabile:" @@ -18067,7 +18025,6 @@ msgid "Iterator became invalid" msgstr "L'iteratore è diventato invalido" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Iterator became invalid:" msgstr "L'iteratore è diventato invalido:" @@ -18080,9 +18037,8 @@ msgid "in order:" msgstr "in ordine:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Steps" -msgstr "Passo" +msgstr "Passi" #: modules/visual_script/visual_script_flow_control.cpp msgid "Switch" @@ -18095,7 +18051,7 @@ msgstr "'input' è:" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy msgid "Type Cast" -msgstr "Tipo:" +msgstr "Conversione Tipo" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" @@ -18139,9 +18095,8 @@ msgid "Validate" msgstr "Valida" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "RPC Call Mode" -msgstr "Modalità scala" +msgstr "Modalità Chiamata RPC" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Subtract %s" @@ -18160,34 +18115,38 @@ msgid "Mod %s" msgstr "Modulo %s" #: modules/visual_script/visual_script_func_nodes.cpp +#, fuzzy msgid "ShiftLeft %s" -msgstr "ShiftLeft %s" +msgstr "SpostaSinistra %s" #: modules/visual_script/visual_script_func_nodes.cpp +#, fuzzy msgid "ShiftRight %s" -msgstr "" +msgstr "SpostaDestra %s" #: modules/visual_script/visual_script_func_nodes.cpp +#, fuzzy msgid "BitAnd %s" -msgstr "BitAnd %s" +msgstr "Bit E %s" #: modules/visual_script/visual_script_func_nodes.cpp +#, fuzzy msgid "BitOr %s" -msgstr "" +msgstr "Bit O %s" #: modules/visual_script/visual_script_func_nodes.cpp +#, fuzzy msgid "BitXor %s" -msgstr "" +msgstr "Bit XO %s" #: modules/visual_script/visual_script_func_nodes.cpp #, fuzzy msgid "Set Mode" -msgstr "Modalità di Selezione" +msgstr "Modalità di Impostazione" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Assign Op" -msgstr "Assegna" +msgstr "Operatore Assegna" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -18204,7 +18163,6 @@ msgid "Base object is not a Node!" msgstr "L'oggetto base non è un Nodo!" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Path does not lead to Node!" msgstr "Il percorso non conduce a un Nodo!" @@ -18213,14 +18171,13 @@ msgid "Invalid index property name '%s' in node %s." msgstr "Nome proprietà indice invalido \"%s\" nel nodo %s." #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Emit %s" -msgstr "Imposta %s" +msgstr "Emetti %s" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy msgid "Compose Array" -msgstr "Ridimensiona lista" +msgstr "Componi Lista" #: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp #: scene/resources/visual_shader_nodes.cpp @@ -18228,12 +18185,10 @@ msgid "Operator" msgstr "Operatore" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Invalid argument of type:" msgstr "Argomento invalido di tipo:" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Invalid arguments:" msgstr "Argomenti invalidi:" @@ -18246,12 +18201,10 @@ msgid "Var Name" msgstr "Var Nome" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "VariableGet not found in script:" msgstr "VariableGet non trovato nello script:" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "VariableSet not found in script:" msgstr "VariableSet non trovato nello script:" @@ -18318,46 +18271,40 @@ msgstr "" "oppure una stringa (errore)." #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "SubCall" -msgstr "Chiamate" +msgstr "SottoChiamata" #: modules/visual_script/visual_script_nodes.cpp scene/gui/graph_node.cpp msgid "Title" msgstr "Titolo" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Construct %s" -msgstr "Costanti" +msgstr "Costruisci %s" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Get Local Var" -msgstr "Usa Spazio Locale" +msgstr "Ottieni Variabile Locale" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Set Local Var" -msgstr "Usa Spazio Locale" +msgstr "Imposta Variabile Locale" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Action %s" -msgstr "Azione" +msgstr "Azione %s" #: modules/visual_script/visual_script_nodes.cpp msgid "Deconstruct %s" -msgstr "" +msgstr "Decostruisci %s" #: modules/visual_script/visual_script_property_selector.cpp msgid "Search VisualScript" msgstr "Ricerca VisualScript" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Yield" -msgstr "Yield" +msgstr "Rendi (Yield)" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" @@ -18382,31 +18329,31 @@ msgstr "Tempo Di Attesa" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy msgid "WaitSignal" -msgstr "WaitSignal" +msgstr "SegnaleAspetta" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy msgid "WaitNodeSignal" -msgstr "WaitNodeSignal" +msgstr "SegnaleAspettaNodo" #: modules/visual_script/visual_script_yield_nodes.cpp #, fuzzy msgid "WaitInstanceSignal" -msgstr "WaitInstanceSignal" +msgstr "SegnaleAspettaIstanza" #: modules/webrtc/webrtc_data_channel.cpp #, fuzzy msgid "Write Mode" -msgstr "Modalità Priorità " +msgstr "Modalità Scrittura" #: modules/webrtc/webrtc_data_channel.h +#, fuzzy msgid "WebRTC" -msgstr "" +msgstr "RTCWeb" #: modules/webrtc/webrtc_data_channel.h -#, fuzzy msgid "Max Channel In Buffer (KB)" -msgstr "Dimensione Index Buffer dei Poligoni nel Canvas (KB)" +msgstr "Canali In Buffer Massimi (KB)" #: modules/websocket/websocket_client.cpp msgid "Verify SSL" @@ -18417,36 +18364,36 @@ msgid "Trusted SSL Certificate" msgstr "Certificato SSL Fidato" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "WebSocket Client" -msgstr "Peer di Rete" +msgstr "Cliente WebSocket" #: modules/websocket/websocket_macros.h #, fuzzy msgid "Max In Buffer (KB)" -msgstr "Dimensione Massima (KB)" +msgstr "In Buffer Massimi (KB)" #: modules/websocket/websocket_macros.h +#, fuzzy msgid "Max In Packets" -msgstr "" +msgstr "Pacchetti In Massimi" #: modules/websocket/websocket_macros.h #, fuzzy msgid "Max Out Buffer (KB)" -msgstr "Dimensione Massima (KB)" +msgstr "Out Buffer Massimi (KB)" #: modules/websocket/websocket_macros.h +#, fuzzy msgid "Max Out Packets" -msgstr "" +msgstr "Pacchetti Out Massimi" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "WebSocket Server" -msgstr "Peer di Rete" +msgstr "Server WebSocket" #: modules/websocket/websocket_server.cpp msgid "Bind IP" -msgstr "" +msgstr "Collega IP" #: modules/websocket/websocket_server.cpp msgid "Private Key" @@ -18457,9 +18404,8 @@ msgid "SSL Certificate" msgstr "Certificato SSL" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "CA Chain" -msgstr "Elimina Catena IK" +msgstr "Catena CA" #: modules/websocket/websocket_server.cpp msgid "Handshake Timeout" @@ -18478,12 +18424,14 @@ msgid "Optional Features" msgstr "Funzionalità Opzionali" #: modules/webxr/webxr_interface.cpp +#, fuzzy msgid "Requested Reference Space Types" -msgstr "" +msgstr "Tipi di Riferimento Spazio Richiesti" #: modules/webxr/webxr_interface.cpp +#, fuzzy msgid "Reference Space Type" -msgstr "" +msgstr "Tipi di Riferimento Spazio" #: modules/webxr/webxr_interface.cpp msgid "Visibility State" @@ -18494,26 +18442,25 @@ msgid "Bounds Geometry" msgstr "Confini Geometria" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "XR Standard Mapping" -msgstr "Agganciamento Intelligente" +msgstr "Mappamento Standard XR" #: platform/android/export/export.cpp msgid "Android SDK Path" msgstr "Percorso SDK Android" #: platform/android/export/export.cpp -#, fuzzy msgid "Debug Keystore" -msgstr "Debugger" +msgstr "Keystore di Debug" #: platform/android/export/export.cpp msgid "Debug Keystore User" -msgstr "" +msgstr "Keystore di Debug Utente" #: platform/android/export/export.cpp +#, fuzzy msgid "Debug Keystore Pass" -msgstr "" +msgstr "Keystore di Debug Pass" #: platform/android/export/export.cpp msgid "Force System User" @@ -18521,23 +18468,23 @@ msgstr "Forza Utente System" #: platform/android/export/export.cpp msgid "Shutdown ADB On Exit" -msgstr "" +msgstr "Spegni ADB In Uscita" #: platform/android/export/export_plugin.cpp msgid "Launcher Icons" -msgstr "" +msgstr "Icone del Launcher" #: platform/android/export/export_plugin.cpp msgid "Main 192 X 192" -msgstr "" +msgstr "Principale 192 X 192" #: platform/android/export/export_plugin.cpp msgid "Adaptive Foreground 432 X 432" -msgstr "" +msgstr "Primo Piano Adattivo 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Adaptive Background 432 X 432" -msgstr "" +msgstr "Sfondo Adattivo 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -18569,9 +18516,8 @@ msgid "The package must have at least one '.' separator." msgstr "Il pacchetto deve avere almeno un \".\" separatore." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Custom Build" -msgstr "Utilizza Build Personalizzata" +msgstr "Build Personalizzata" #: platform/android/export/export_plugin.cpp msgid "Use Custom Build" @@ -18590,22 +18536,20 @@ msgid "Target SDK" msgstr "Target SDK" #: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp -#, fuzzy msgid "Architectures" -msgstr "Architettura" +msgstr "Architetture" #: platform/android/export/export_plugin.cpp msgid "Keystore" msgstr "Archivio Chiavi" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Debug User" -msgstr "Debugger" +msgstr "User di Debug" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp msgid "Debug Password" -msgstr "" +msgstr "Password di Debug" #: platform/android/export/export_plugin.cpp msgid "Release User" @@ -18617,7 +18561,7 @@ msgstr "Password Di Rilascio" #: platform/android/export/export_plugin.cpp msgid "One Click Deploy" -msgstr "" +msgstr "Distribuzione con un Click" #: platform/android/export/export_plugin.cpp msgid "Clear Previous Install" @@ -18636,9 +18580,8 @@ msgid "Unique Name" msgstr "Nome Unico" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signed" -msgstr "Segnale" +msgstr "Firmato" #: platform/android/export/export_plugin.cpp msgid "Classify As Game" @@ -18669,50 +18612,45 @@ msgid "XR Mode" msgstr "Modalità XR" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Hand Tracking" -msgstr "Impacchettando" +msgstr "Tracciamento della Mano" #: platform/android/export/export_plugin.cpp msgid "Hand Tracking Frequency" -msgstr "" +msgstr "Frequenza Tracciamento della Mano" #: platform/android/export/export_plugin.cpp msgid "Passthrough" -msgstr "Passthrough" +msgstr "Passaggio" #: platform/android/export/export_plugin.cpp msgid "Immersive Mode" msgstr "Modalità Immersiva" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Small" -msgstr "Supporta" +msgstr "Supporta Piccolo" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Normal" -msgstr "Supporta" +msgstr "Supporta Normale" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Large" -msgstr "Supporta" +msgstr "Supporta Grande" #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Support Xlarge" -msgstr "Supporta" +msgstr "Supporta Extra-Grande" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "User Data Backup" -msgstr "Interfaccia Utente" +msgstr "Backup Dati Utente" #: platform/android/export/export_plugin.cpp msgid "Allow" -msgstr "" +msgstr "Permetti" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp msgid "Command Line" @@ -18728,7 +18666,7 @@ msgstr "Espansione APK" #: platform/android/export/export_plugin.cpp msgid "Salt" -msgstr "" +msgstr "Sale" #: platform/android/export/export_plugin.cpp msgid "Public Key" @@ -18852,6 +18790,7 @@ msgid "Invalid package name:" msgstr "Nome del pacchetto non valido:" #: platform/android/export/export_plugin.cpp +#, fuzzy msgid "" "Invalid \"GodotPaymentV3\" module included in the \"android/modules\" " "project setting (changed in Godot 3.2.2).\n" @@ -18859,26 +18798,29 @@ msgid "" "Note that the singleton was also renamed from \"GodotPayments\" to " "\"GodotGooglePlayBilling\"." msgstr "" +"Invalido modulo \"GodotPaymentV3\" incluso nelle impostazioni progetto " +"\"android/modules\" (cambiato in Godot 3.2.2).\n" +"Rimpiazzalo con il plugin di prime parti \"GodotGooglePlayBilling\".\n" +"Da notare che il singleton è stato rinominato da \"GodotPayments\" a " +"\"GodotGooglePlayBilling\"." #: platform/android/export/export_plugin.cpp msgid "\"Use Custom Build\" must be enabled to use the plugins." msgstr "Per utilizzare i plugin \"Use Custom Build\" deve essere abilitato." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "\"Hand Tracking\" is only valid when \"XR Mode\" is \"Oculus Mobile VrApi\" " "or \"OpenXR\"." msgstr "" -"\"Hand Tracking\" è valido solo quando \"Xr Mode\" è impostato su \"Oculus " -"Mobile VR\"." +"\"Tracciamento della Mano\" è valido solo quando \"Modalità XR\" è impostato " +"su \"Oculus Mobile VrApi\" o \"OpenXR\"." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." msgstr "" -"\"Hand Tracking\" è valido solo quando \"Xr Mode\" è impostato su \"Oculus " -"Mobile VR\"." +"\"Oltrepassaggio\" è valido solo quando \"Modalità XR\" è impostato su " +"\"OpenXR\"." #: platform/android/export/export_plugin.cpp msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." @@ -18886,52 +18828,60 @@ msgstr "" "\"Export AAB\" è valido soltanto quanto \"Use Custom Build\" è abilitato." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled." msgstr "" -"\"Export AAB\" è valido soltanto quanto \"Use Custom Build\" è abilitato." +"\"Min SDK\" può essere sovrascritto solo se \"Utilizza Build " +"Personalizzata\" è abilitato." #: platform/android/export/export_plugin.cpp msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"\"Min SDK\" dovrebbe essere un intero valido, ma si è ottenuto \"%s\" che è " +"invalido." #: platform/android/export/export_plugin.cpp msgid "" "\"Min SDK\" cannot be lower than %d, which is the version needed by the " "Godot library." msgstr "" +"\"Min SDK\" non può essere più basso di %d, che è la versione richiesta " +"dalla libreria Godot." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled." msgstr "" -"\"Export AAB\" è valido soltanto quanto \"Use Custom Build\" è abilitato." +"\"Target SDK\" può essere sovrascritto solo se \"Utilizza Build " +"Personalizzata\" è abilitato." #: platform/android/export/export_plugin.cpp msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"\"Target SDK\" dovrebbe essere un intero valido, ma si è ottenuto \"%s\" che " +"è invalido." #: platform/android/export/export_plugin.cpp msgid "" "\"Target SDK\" %d is higher than the default version %d. This may work, but " "wasn't tested and may be unstable." msgstr "" +"\"Target SDK\" %d è più alto della versione di default %d. Questo potrebbe " +"funzionare, ma non è stato testato e potrebbe essere instabile." #: platform/android/export/export_plugin.cpp msgid "\"Target SDK\" version must be greater or equal to \"Min SDK\" version." msgstr "" +"La versione di \"Target SDK\" dovrebbe essere maggiore o uguale della " +"versione di \"Min SDK\"." #: platform/android/export/export_plugin.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Code Signing" -msgstr "Segnale" +msgstr "Firmatura Codice" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "'apksigner' could not be found. Please check that the command is available " "in the Android SDK build-tools directory. The resulting %s is unsigned." @@ -18941,7 +18891,7 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "Signing debug %s..." -msgstr "" +msgstr "Firmando debug %s..." #: platform/android/export/export_plugin.cpp msgid "Signing release %s..." @@ -18952,7 +18902,6 @@ msgid "Could not find keystore, unable to export." msgstr "Non è stato possibile trovare keystore, impossible esportare." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not start apksigner executable." msgstr "Non è stato possibile avviare l'eseguibile apksigner." @@ -18969,7 +18918,6 @@ msgid "'apksigner' verification of %s failed." msgstr "Verifica 'apksigner' di %s non riuscita." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Exporting for Android" msgstr "Esportazione per Android" @@ -19000,25 +18948,22 @@ msgstr "" "\"Progetto\"." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." msgstr "" -"Versione build di Android non coerente: Template installato: %s, Versione " -"Godot: %s. Per favore, reinstalla il build template di Android dal menu " -"\"Progetto\"." +"La Versione build di Android non corrisponde: Template installato: %s, " +"Versione Godot: %s. Per favore, reinstalla il build template di Android dal " +"menu \"Progetto\"." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." msgstr "" "Impossibile sovrascrivere i file res://android/build/res/*.xml con il nome " -"del progetto" +"del progetto." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files to gradle project." msgstr "Impossibile esportare i file del progetto in un progetto gradle." @@ -19031,7 +18976,6 @@ msgid "Building Android Project (gradle)" msgstr "Compilazione di un progetto Android (gradle)" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Building of Android project failed, check output for the error. " "Alternatively visit docs.godotengine.org for Android build documentation." @@ -19053,38 +18997,35 @@ msgstr "" "directory del progetto gradle per gli output." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "Pacchetto non trovato: \"%s\"" +msgstr "Pacchetto non trovato: \"%s\"." #: platform/android/export/export_plugin.cpp msgid "Creating APK..." msgstr "Creazione APK..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not find template APK to export: \"%s\"." msgstr "Impossibile trovare il template APK per l'esportazione: \"%s\"." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Missing libraries in the export template for the selected architectures: %s. " "Please build a template with all required libraries, or uncheck the missing " "architectures in the export preset." msgstr "" "Librerie mancanti nel modello di esportazione per le architetture " -"selezionate: %s. Creare un modello con tutte le librerie richieste o " -"deselezionare le architetture mancanti nella preimpostazione di esportazione." +"selezionate: %s. Per favore creare un modello con tutte le librerie " +"richieste, o deselezionare le architetture mancanti nella preimpostazione di " +"esportazione." #: platform/android/export/export_plugin.cpp msgid "Adding files..." msgstr "Aggiungendo file..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "Impossibile esportare i file del progetto" +msgstr "Impossibile esportare i file del progetto." #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19104,243 +19045,225 @@ msgstr "Il carattere \"%s\" non è consentito nell'Identificatore." #: platform/iphone/export/export.cpp msgid "Landscape Launch Screens" -msgstr "" +msgstr "Schermate di avvio Panorama" #: platform/iphone/export/export.cpp msgid "iPhone 2436 X 1125" -msgstr "" +msgstr "iPhone 2436 x 1125" #: platform/iphone/export/export.cpp msgid "iPhone 2208 X 1242" -msgstr "" +msgstr "iPhone 2208 x 1242" #: platform/iphone/export/export.cpp msgid "iPad 1024 X 768" -msgstr "" +msgstr "iPad 1024 x 768" #: platform/iphone/export/export.cpp msgid "iPad 2048 X 1536" -msgstr "" +msgstr "iPad 2048 x 1536" #: platform/iphone/export/export.cpp msgid "Portrait Launch Screens" -msgstr "" +msgstr "Schermate di avvio Ritratto" #: platform/iphone/export/export.cpp msgid "iPhone 640 X 960" -msgstr "" +msgstr "iPhone 640 x 960" #: platform/iphone/export/export.cpp msgid "iPhone 640 X 1136" -msgstr "" +msgstr "iPhone 640 x 1136" #: platform/iphone/export/export.cpp msgid "iPhone 750 X 1334" -msgstr "" +msgstr "iPhone 750 x 1334" #: platform/iphone/export/export.cpp msgid "iPhone 1125 X 2436" -msgstr "" +msgstr "iPhone 1125 x 2436" #: platform/iphone/export/export.cpp msgid "iPad 768 X 1024" -msgstr "" +msgstr "iPad 768 x 1024" #: platform/iphone/export/export.cpp msgid "iPad 1536 X 2048" -msgstr "" +msgstr "iPad 1536 x 2048" #: platform/iphone/export/export.cpp msgid "iPhone 1242 X 2208" -msgstr "" +msgstr "iPhone 1242 x 2208" #: platform/iphone/export/export.cpp +#, fuzzy msgid "App Store Team ID" -msgstr "" +msgstr "ID App Store Team" #: platform/iphone/export/export.cpp msgid "Provisioning Profile UUID Debug" -msgstr "" +msgstr "Profilo di provisioning UUID Debug" #: platform/iphone/export/export.cpp +#, fuzzy msgid "Code Sign Identity Debug" -msgstr "" +msgstr "Firma Codice Identità di Debug" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Export Method Debug" -msgstr "Esporta Con Debug" +msgstr "Metodo di Esportazione Debug" #: platform/iphone/export/export.cpp msgid "Provisioning Profile UUID Release" -msgstr "" +msgstr "Profilo di provisioning UUID Release" #: platform/iphone/export/export.cpp msgid "Code Sign Identity Release" -msgstr "" +msgstr "Identità firma del codice Release" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Export Method Release" -msgstr "Modalità d'Esportazione:" +msgstr "Metodo di Esportazione Rilascio" #: platform/iphone/export/export.cpp msgid "Targeted Device Family" -msgstr "" +msgstr "Famiglia di dispositivi selezionata" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp msgid "Info" -msgstr "" +msgstr "Info" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Identifier" -msgstr "Identificatore non valido:" +msgstr "Identificatore" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Signature" -msgstr "Segnale" +msgstr "Firma" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Short Version" -msgstr "Versione" +msgstr "Versione Corta" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Copyright" -msgstr "In Alto A Destra" +msgstr "Copyright" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Capabilities" -msgstr "Compatibilità " +msgstr "Possibilità " #: platform/iphone/export/export.cpp -#, fuzzy msgid "Access Wi-Fi" -msgstr "Accedi" +msgstr "Accesso al Wi-Fi" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Push Notifications" -msgstr "Rotazione Casuale:" +msgstr "Notifiche Push" #: platform/iphone/export/export.cpp -#, fuzzy msgid "User Data" -msgstr "Interfaccia Utente" +msgstr "Dati Utente" #: platform/iphone/export/export.cpp msgid "Accessible From Files App" -msgstr "" +msgstr "Accessibile dall'Applicazione File" #: platform/iphone/export/export.cpp msgid "Accessible From iTunes Sharing" -msgstr "" +msgstr "Accessibile dalla condivisione di iTunes" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Privacy" -msgstr "Tasto Fisico" +msgstr "Privacy" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Camera Usage Description" -msgstr "Descrizione" +msgstr "Descrizione Utilizzo Camera" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Microphone Usage Description" -msgstr "Descrizioni delle proprietà " +msgstr "Descrizione Utilizzo Microfono" #: platform/iphone/export/export.cpp #, fuzzy msgid "Photolibrary Usage Description" -msgstr "Descrizioni delle proprietà " +msgstr "Descrizione Utilizzo Fotolibreria" #: platform/iphone/export/export.cpp msgid "iPhone 120 X 120" -msgstr "" +msgstr "iPhone 120 x 120" #: platform/iphone/export/export.cpp msgid "iPhone 180 X 180" -msgstr "" +msgstr "iPhone 180 x 180" #: platform/iphone/export/export.cpp msgid "iPad 76 X 76" -msgstr "" +msgstr "iPad 76 x 76" #: platform/iphone/export/export.cpp msgid "iPad 152 X 152" -msgstr "" +msgstr "iPad 152 x 152" #: platform/iphone/export/export.cpp msgid "iPad 167 X 167" -msgstr "" +msgstr "iPad 167 x 167" #: platform/iphone/export/export.cpp msgid "App Store 1024 X 1024" -msgstr "" +msgstr "App Store 1024 x 1024" #: platform/iphone/export/export.cpp msgid "Spotlight 40 X 40" -msgstr "" +msgstr "Spotlight 40 X 40" #: platform/iphone/export/export.cpp msgid "Spotlight 80 X 80" -msgstr "" +msgstr "Spotlight 80 X 80" #: platform/iphone/export/export.cpp msgid "Storyboard" -msgstr "" +msgstr "Storyboard" #: platform/iphone/export/export.cpp msgid "Use Launch Screen Storyboard" -msgstr "" +msgstr "Usa schermata di avvio Storyboard" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Image Scale Mode" -msgstr "Modalità scala" +msgstr "Modalità di ridimensionamento dell'immagine" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Custom Image @2x" -msgstr "Immagine Personalizzata" +msgstr "Immagine Personalizzata @2x" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Custom Image @3x" -msgstr "Immagine Personalizzata" +msgstr "Immagine Personalizzata @3x" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Use Custom BG Color" -msgstr "Taglia nodi" +msgstr "Utilizza Colore di Sfondo Personalizzato" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Custom BG Color" -msgstr "Taglia nodi" +msgstr "Colore di Sfondo Personalizzato" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Export Icons" -msgstr "Espandi Tutto" +msgstr "Icone Esportazione" #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp #, fuzzy msgid "Prepare Templates" -msgstr "Gestisci i modelli d'esportazione" +msgstr "Prepara i modelli d'esportazione" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Export template not found." -msgstr "Modello di rilascio personalizzato non trovato." +msgstr "Modello di esportazione non trovato." #: platform/iphone/export/export.cpp msgid "App Store Team ID not specified - cannot configure the project." @@ -19364,122 +19287,110 @@ msgid "Run exported HTML in the system's default browser." msgstr "Esegui il codice HTML esportato nel browser di sistema predefinito." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "Impossibile aprire il template per l'esportazione:" +msgstr "Non è stato possibile aprire il modello per l'esportazione: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "Template di esportazione non valido:" +msgstr "Modello di esportazione non valido: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file: \"%s\"." -msgstr "Impossibile scrivere il file:" +msgstr "Non è stato possibile scrivere il file: \"%s\"." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Icon Creation" -msgstr "Imposta Margine" +msgstr "Creazione Icona" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "Impossibile leggere il file:" +msgstr "Non è stato possibile leggere il file: \"%s\"." #: platform/javascript/export/export.cpp msgid "PWA" -msgstr "" +msgstr "PWA" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Variant" -msgstr "Separazione:" +msgstr "Variante" #: platform/javascript/export/export.cpp #, fuzzy msgid "Export Type" -msgstr "Esporta" +msgstr "Tipo di Esportazione" #: platform/javascript/export/export.cpp -#, fuzzy msgid "VRAM Texture Compression" -msgstr "Cambia espressione" +msgstr "Compressione Texture VRAM" #: platform/javascript/export/export.cpp msgid "For Desktop" -msgstr "" +msgstr "Per il Desktop" #: platform/javascript/export/export.cpp msgid "For Mobile" -msgstr "" +msgstr "Per dispositivi mobile" #: platform/javascript/export/export.cpp msgid "HTML" -msgstr "" +msgstr "HTML" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Export Icon" -msgstr "Espandi Tutto" +msgstr "Icona di Esportazione" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Custom HTML Shell" -msgstr "Taglia nodi" +msgstr "Shell HTML Personalizzato" #: platform/javascript/export/export.cpp msgid "Head Include" -msgstr "" +msgstr "Includi head" #: platform/javascript/export/export.cpp msgid "Canvas Resize Policy" -msgstr "" +msgstr "Regole di ridimensionamento canvas" #: platform/javascript/export/export.cpp msgid "Focus Canvas On Start" -msgstr "" +msgstr "Evidenzia Canvas all'avvio" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Experimental Virtual Keyboard" -msgstr "Filtra segnali" +msgstr "Tastiera Virtuale Sperimentale" #: platform/javascript/export/export.cpp msgid "Progressive Web App" -msgstr "" +msgstr "Applicazione Web progressiva" #: platform/javascript/export/export.cpp msgid "Offline Page" -msgstr "" +msgstr "Pagina Offline" #: platform/javascript/export/export.cpp msgid "Icon 144 X 144" -msgstr "" +msgstr "Icona 144 x 144" #: platform/javascript/export/export.cpp msgid "Icon 180 X 180" -msgstr "" +msgstr "Icona 180 x 180" #: platform/javascript/export/export.cpp msgid "Icon 512 X 512" -msgstr "" +msgstr "Icona 512 x 512" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "Impossibile leggere la shell HTML:" +msgstr "Non è stato possibile leggere lo shell HTML: \"%s\"." #: platform/javascript/export/export.cpp #, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "Impossibile creare la directory per il server HTTP:" +msgstr "Impossibile creare la cartella per il server HTTP: %s." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server: %d." -msgstr "Errore all'avvio del server HTTP:" +msgstr "Errore all'avvio del server HTTP: %d." #: platform/javascript/export/export.cpp msgid "Web" @@ -19487,69 +19398,63 @@ msgstr "Web" #: platform/javascript/export/export.cpp msgid "HTTP Host" -msgstr "" +msgstr "Host HTTP" #: platform/javascript/export/export.cpp msgid "HTTP Port" -msgstr "" +msgstr "Porta HTTP" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Use SSL" -msgstr "Usa Scatto" +msgstr "Usa SSL" #: platform/javascript/export/export.cpp msgid "SSL Key" -msgstr "" +msgstr "Chiave SSL" #: platform/osx/export/codesign.cpp msgid "Can't get filesystem access." -msgstr "" +msgstr "Non si può avere accesso al filesystem." #: platform/osx/export/codesign.cpp msgid "Failed to get Info.plist hash." -msgstr "" +msgstr "Recupero dell'hash di Info.plist fallito." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Invalid Info.plist, no exe name." -msgstr "Nome del progetto non valido." +msgstr "Invalido Info.plist, nessun nome exe." #: platform/osx/export/codesign.cpp msgid "Invalid Info.plist, no bundle id." -msgstr "" +msgstr "Info.plist invalido, nessun bundle id." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Invalid Info.plist, can't load." -msgstr "Geometria non valida, impossibile creare il poligono." +msgstr "Info.plist non valido, impossibile caricare." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Failed to create \"%s\" subfolder." -msgstr "Impossibile creare la cartella." +msgstr "Impossibile creare la sottocartella \"%s\"." #: platform/osx/export/codesign.cpp msgid "Failed to extract thin binary." -msgstr "" +msgstr "Estrazione del file binario fallito." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Invalid binary format." -msgstr "Percorso di base non valido." +msgstr "Formato eseguibile non valido." #: platform/osx/export/codesign.cpp msgid "Already signed!" -msgstr "" +msgstr "Già firmato!" #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Failed to process nested resources." -msgstr "Caricamento della risorsa fallito." +msgstr "Elaborazione risorse nidificate fallito." #: platform/osx/export/codesign.cpp msgid "Failed to create _CodeSignature subfolder." -msgstr "" +msgstr "Creazione sottocartella _CodeSignature fallita." #: platform/osx/export/codesign.cpp #, fuzzy @@ -19557,53 +19462,48 @@ msgid "Failed to get CodeResources hash." msgstr "Caricamento della risorsa fallito." #: platform/osx/export/codesign.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Invalid entitlements file." -msgstr "Estensione non valida." +msgstr "File di permessi non valido." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Invalid executable file." -msgstr "Estensione non valida." +msgstr "File eseguibile non valido." #: platform/osx/export/codesign.cpp msgid "Can't resize signature load command." -msgstr "" +msgstr "Impossibile ridimensionare il comando caricamento firma." #: platform/osx/export/codesign.cpp msgid "Failed to create fat binary." -msgstr "" +msgstr "Creazione del file binario fat fallito." #: platform/osx/export/codesign.cpp msgid "Unknown bundle type." -msgstr "" +msgstr "Tipo di bundle sconosciuto." #: platform/osx/export/codesign.cpp msgid "Unknown object type." -msgstr "" +msgstr "Tipo di oggetto sconosciuto." #: platform/osx/export/export.cpp -#, fuzzy msgid "App Category" -msgstr "Categoria:" +msgstr "Categoria Applicazione" #: platform/osx/export/export.cpp msgid "High Res" -msgstr "" +msgstr "Alta Risoluzione" #: platform/osx/export/export.cpp -#, fuzzy msgid "Location Usage Description" -msgstr "Descrizione" +msgstr "Descrizione d'uso Posizione" #: platform/osx/export/export.cpp msgid "Address Book Usage Description" -msgstr "" +msgstr "Descrizione d'uso Rubrica" #: platform/osx/export/export.cpp -#, fuzzy msgid "Calendar Usage Description" -msgstr "Descrizione" +msgstr "Descrizione d'uso Calendario" #: platform/osx/export/export.cpp #, fuzzy @@ -19611,37 +19511,33 @@ msgid "Photos Library Usage Description" msgstr "Descrizioni delle proprietà " #: platform/osx/export/export.cpp -#, fuzzy msgid "Desktop Folder Usage Description" -msgstr "Descrizioni del metodo" +msgstr "Descrizione d'uso Cartella Desktop" #: platform/osx/export/export.cpp -#, fuzzy msgid "Documents Folder Usage Description" -msgstr "Descrizioni del metodo" +msgstr "Descrizione d'uso Cartella Documenti" #: platform/osx/export/export.cpp msgid "Downloads Folder Usage Description" -msgstr "" +msgstr "Descrizione d'uso Cartella Downloads" #: platform/osx/export/export.cpp msgid "Network Volumes Usage Description" -msgstr "" +msgstr "Descrizione d'uso Volumi di Rete" #: platform/osx/export/export.cpp msgid "Removable Volumes Usage Description" -msgstr "" +msgstr "Descrizione d'uso Volumi Rimovibili" #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Codesign" -msgstr "Nodo" +msgstr "Firma del codice" #: platform/osx/export/export.cpp platform/uwp/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Identity" -msgstr "Indenta" +msgstr "Identità " #: platform/osx/export/export.cpp platform/windows/export/export.cpp #, fuzzy @@ -19653,59 +19549,52 @@ msgid "Hardened Runtime" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Replace Existing Signature" -msgstr "Sostituisci nei file" +msgstr "Sostituisci firma esistente" #: platform/osx/export/export.cpp -#, fuzzy msgid "Entitlements" -msgstr "Gizmos" +msgstr "Permessi" #: platform/osx/export/export.cpp -#, fuzzy msgid "Custom File" -msgstr "Taglia nodi" +msgstr "File Personalizzato" #: platform/osx/export/export.cpp msgid "Allow JIT Code Execution" -msgstr "" +msgstr "Consenti l'esecuzione di codice JIT" #: platform/osx/export/export.cpp msgid "Allow Unsigned Executable Memory" -msgstr "" +msgstr "Consenti memoria eseguibile non firmata" #: platform/osx/export/export.cpp msgid "Allow Dyld Environment Variables" -msgstr "" +msgstr "Consenti variabili d'ambiente Dyld" #: platform/osx/export/export.cpp -#, fuzzy msgid "Disable Library Validation" -msgstr "Pulsante disabilitato" +msgstr "Disabilita Convalida Libreria" #: platform/osx/export/export.cpp -#, fuzzy msgid "Audio Input" -msgstr "Aggiungi Input" +msgstr "Ingresso Audio" #: platform/osx/export/export.cpp msgid "Address Book" -msgstr "" +msgstr "Rubrica" #: platform/osx/export/export.cpp msgid "Calendars" -msgstr "" +msgstr "Calendari" #: platform/osx/export/export.cpp -#, fuzzy msgid "Photos Library" -msgstr "Esporta Libreria" +msgstr "Libreria Foto" #: platform/osx/export/export.cpp -#, fuzzy msgid "Apple Events" -msgstr "Aggiungi Evento" +msgstr "Eventi Apple" #: platform/osx/export/export.cpp #, fuzzy @@ -19714,60 +19603,51 @@ msgstr "Debug" #: platform/osx/export/export.cpp msgid "App Sandbox" -msgstr "" +msgstr "Applicazione Sandbox" #: platform/osx/export/export.cpp -#, fuzzy msgid "Network Server" -msgstr "Peer di Rete" +msgstr "Server di Rete" #: platform/osx/export/export.cpp -#, fuzzy msgid "Network Client" -msgstr "Peer di Rete" +msgstr "Client di Rete" #: platform/osx/export/export.cpp -#, fuzzy msgid "Device USB" -msgstr "Dispositivo" +msgstr "Dispositivo USB" #: platform/osx/export/export.cpp msgid "Device Bluetooth" -msgstr "" +msgstr "Dispositivo Bluetooth" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Downloads" -msgstr "Scarica" +msgstr "File scaricati" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Pictures" -msgstr "Funzionalità " +msgstr "File Immagini" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Music" -msgstr "Files" +msgstr "File Audio" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Movies" -msgstr "Filtra tiles" +msgstr "File Video" #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Custom Options" -msgstr "Opzioni Bus" +msgstr "Opzioni personalizzate" #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization" -msgstr "Localizzazione" +msgstr "Autenticazione" #: platform/osx/export/export.cpp msgid "Apple ID Name" -msgstr "" +msgstr "Nome Apple ID" #: platform/osx/export/export.cpp #, fuzzy @@ -19789,9 +19669,8 @@ msgid "Could not start xcrun executable." msgstr "Impossibile avviare l'eseguibile xcrun." #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization failed." -msgstr "Localizzazione" +msgstr "Autenticazione fallita." #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" @@ -19802,22 +19681,30 @@ msgid "" "The notarization process generally takes less than an hour. When the process " "is completed, you'll receive an email." msgstr "" +"Il processo di autenticazione impiega generalmente meno di un'ora. Riceverai " +"una email quando il processo sarà concluso." #: platform/osx/export/export.cpp msgid "" "You can check progress manually by opening a Terminal and running the " "following command:" msgstr "" +"Puoi controllare manualmente l'avanzamento aprendo il Terminale e lanciando " +"il seguente comando:" #: platform/osx/export/export.cpp msgid "" "Run the following command to staple the notarization ticket to the exported " "application (optional):" msgstr "" +"Lancia il seguente comando per agganciare il ticket di notarizzazione " +"all'applicazione esportata (opzionale):" #: platform/osx/export/export.cpp msgid "Timestamping is not compatible with ad-hoc signature, and was disabled!" msgstr "" +"La visualizzazione dell'orario non è compatibile con la firma ad-hoc, ed è " +"stata disabilitata!" #: platform/osx/export/export.cpp msgid "" @@ -19826,17 +19713,19 @@ msgstr "" #: platform/osx/export/export.cpp msgid "Built-in CodeSign failed with error \"%s\"." -msgstr "" +msgstr "Firma del codice incorporata fallita con errore \"%s\"." #: platform/osx/export/export.cpp msgid "Built-in CodeSign require regex module." -msgstr "" +msgstr "La firma del codice incorporata richiede il modulo regex." #: platform/osx/export/export.cpp msgid "" "Could not start codesign executable, make sure Xcode command line tools are " "installed." msgstr "" +"Non è stato possibile lanciare l'eseguibile di firma del codice, controllare " +"che gli strumenti da linea di comando di Xcode siano installati." #: platform/osx/export/export.cpp platform/windows/export/export.cpp #, fuzzy @@ -19851,11 +19740,12 @@ msgstr "Errore nel salvataggio del file: %s" #: platform/osx/export/export.cpp msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" msgstr "" +"I link simbolici relativi non sono supportati, \"%s\" esportato potrebbe " +"essere danneggiato!" #: platform/osx/export/export.cpp -#, fuzzy msgid "DMG Creation" -msgstr "Direzione" +msgstr "Creazione del DMG" #: platform/osx/export/export.cpp #, fuzzy @@ -19864,79 +19754,83 @@ msgstr "Impossibile avviare l'eseguibile hdiutil." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." -msgstr "" +msgstr "`hdutil create` fallito - Il file già esiste." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed." -msgstr "" +msgstr "`hdutil create` fallito." #: platform/osx/export/export.cpp -#, fuzzy msgid "Creating app bundle" -msgstr "Creando la miniatura" +msgstr "Creando il pacchetto dell'app" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not find template app to export: \"%s\"." -msgstr "Impossibile trovare il template dell'app per l'esportazione:" +msgstr "Impossibile trovare il template dell'app per l'esportazione:\"%s\"." #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid export format." -msgstr "Template di esportazione non valido:" +msgstr "Formato di esportazione invalido." #: platform/osx/export/export.cpp msgid "" "Relative symlinks are not supported on this OS, the exported project might " "be broken!" msgstr "" +"I link simbolici relativi non sono supportati in questo Sistema Operativo, " +"il progetto esportato potrebbe essere danneggiato!" #: platform/osx/export/export.cpp msgid "" "Requested template binary \"%s\" not found. It might be missing from your " "template archive." msgstr "" +"Il modello di eseguibile \"%s\" richiesto non è stato trovato. Potrebbe " +"essere mancante dal tuo archivio dei modelli." #: platform/osx/export/export.cpp msgid "Making PKG" -msgstr "" +msgstr "Creando il PKG" #: platform/osx/export/export.cpp msgid "" "Ad-hoc signed applications require the 'Disable Library Validation' " "entitlement to load dynamic libraries." msgstr "" +"Le applicazioni firmate ad-hoc richiedono il permesso \"Disabilita verifica " +"libreria\" per caricare le librerie dinamiche." #: platform/osx/export/export.cpp msgid "Code signing bundle" -msgstr "" +msgstr "Pacchetto di firma del codice" #: platform/osx/export/export.cpp msgid "Making DMG" -msgstr "" +msgstr "Creando il DMG" #: platform/osx/export/export.cpp msgid "Code signing DMG" -msgstr "" +msgstr "Firmando il codice DMG" #: platform/osx/export/export.cpp msgid "Making ZIP" -msgstr "" +msgstr "Creando lo ZIP" #: platform/osx/export/export.cpp msgid "" "Notarization requires the app to be archived first, select the DMG or ZIP " "export format instead." msgstr "" +"La notarizazzione richiede che l'app sia prima archiviata, seleziona invece " +"il formato di esportazione DMG o ZIP." #: platform/osx/export/export.cpp msgid "Sending archive for notarization" -msgstr "" +msgstr "Inviando l'archivio per l'autenticazione" #: platform/osx/export/export.cpp -#, fuzzy msgid "ZIP Creation" -msgstr "Proiezione" +msgstr "Creazione dello ZIP" #: platform/osx/export/export.cpp #, fuzzy @@ -19952,16 +19846,22 @@ msgid "" "Warning: Built-in \"codesign\" is selected in the Editor Settings. Code " "signing is limited to ad-hoc signature only." msgstr "" +"Warning: \"firma del codice\" integrato è selezionato nelle impostazioni " +"dell'editor. La firma del codice è limitata solo alle firme ad-hoc." #: platform/osx/export/export.cpp msgid "" "Warning: Xcode command line tools are not installed, using built-in " "\"codesign\". Code signing is limited to ad-hoc signature only." msgstr "" +"Warning: gli strumenti da linea di comando di Xcode non sono installati, " +"usando la \"firma del codice\" integrata. La firma del codice è limitata " +"solo alle firme ad-hoc." #: platform/osx/export/export.cpp msgid "Notarization: Notarization with an ad-hoc signature is not supported." msgstr "" +"Autenticazione: L'autenticazione con una firma ad-hoc non è supportata." #: platform/osx/export/export.cpp #, fuzzy @@ -19991,12 +19891,16 @@ msgid "" "Warning: Notarization is disabled. The exported project will be blocked by " "Gatekeeper if it's downloaded from an unknown source." msgstr "" +"Warning: l'autenticazione è disabilitata. Il progetto esportato sarà " +"bloccato dal Gatekeeper is è scaricato da una sorgente sconosciuta." #: platform/osx/export/export.cpp msgid "" "Code signing is disabled. The exported project will not run on Macs with " "enabled Gatekeeper and Apple Silicon powered Macs." msgstr "" +"La firma del codice è disabilitata. Il progetto esportato non verrà eseguito " +"su Mac con Gatekeeper abilitato e Mac alimentati da Apple Silicon." #: platform/osx/export/export.cpp msgid "" @@ -20008,23 +19912,32 @@ msgstr "" msgid "" "Timestamping is not compatible with ad-hoc signature, and will be disabled!" msgstr "" +"La stampa dell'ora non è compatibile con la firma ad-hoc, e sarà " +"disabilitata!" #: platform/osx/export/export.cpp msgid "" "Warning: Notarization is not supported from this OS. The exported project " "will be blocked by Gatekeeper if it's downloaded from an unknown source." msgstr "" +"Warning: la notarizzazione non è supportata da questo Sistema Operativo. Il " +"progetto esportato sarà bloccato da Gatekeeper se è scaricato da una " +"sorgente sconosciuta." #: platform/osx/export/export.cpp msgid "" "Privacy: Microphone access is enabled, but usage description is not " "specified." msgstr "" +"Privacy: L'accesso al microfono è abilitato, ma la descrizione dell'uso non " +"è specificata." #: platform/osx/export/export.cpp msgid "" "Privacy: Camera access is enabled, but usage description is not specified." msgstr "" +"Privacy: L'accesso alla Camera è abilitato, ma la descrizione d'uso non è " +"specificata." #: platform/osx/export/export.cpp msgid "" @@ -20062,6 +19975,7 @@ msgid "Architecture" msgstr "Architettura" #: platform/uwp/export/export.cpp +#, fuzzy msgid "Display Name" msgstr "Nome Display" @@ -20123,7 +20037,7 @@ msgstr "Cambia espressione" #: platform/uwp/export/export.cpp msgid "Landscape" -msgstr "" +msgstr "Panorama" #: platform/uwp/export/export.cpp #, fuzzy @@ -20200,6 +20114,7 @@ msgid "Invalid package unique name." msgstr "Nome univoco del pacchetto non valido." #: platform/uwp/export/export.cpp +#, fuzzy msgid "Invalid package publisher display name." msgstr "Nome visualizzato del publisher del pacchetto invalido." @@ -20262,9 +20177,8 @@ msgid "UWP" msgstr "UWP" #: platform/uwp/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Signtool" -msgstr "Signtool" +msgstr "Strumento di segno" #: platform/uwp/export/export.cpp msgid "Debug Certificate" @@ -20440,7 +20354,7 @@ msgstr "Osslsigncode" #: platform/windows/export/export.cpp msgid "Wine" -msgstr "Wine" +msgstr "Vino" #: platform/x11/export/export.cpp msgid "32-bit executables cannot have embedded data >= 4 GiB." @@ -20458,13 +20372,13 @@ msgid "" "order for AnimatedSprite to display frames." msgstr "" "Una risorsa SpriteFrames deve essere creata o impostata nella proprietà " -"\"Frames\" per permettere a AnimatedSprite di visualizzare i frame." +"\"Frames\" per permettere all'AnimatedSprite di visualizzare i frame." #: scene/2d/animated_sprite.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/particles.cpp #, fuzzy msgid "Speed Scale" -msgstr "Scala" +msgstr "Scala della velocità " #: scene/2d/animated_sprite.cpp scene/2d/audio_stream_player_2d.cpp #: scene/3d/audio_stream_player_3d.cpp scene/3d/sprite_3d.cpp @@ -20516,7 +20430,7 @@ msgstr "Genera punti" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy msgid "Gravity Distance Scale" -msgstr "Istanza" +msgstr "Scala della distanza della gravità " #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20559,7 +20473,7 @@ msgstr "Volume" #: servers/audio/effects/audio_effect_pitch_shift.cpp #, fuzzy msgid "Pitch Scale" -msgstr "Scala" +msgstr "Scala del tono" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp @@ -21389,7 +21303,6 @@ msgid "Antialiased" msgstr "Inizializza" #: scene/2d/multimesh_instance_2d.cpp scene/3d/multimesh_instance.cpp -#, fuzzy msgid "Multimesh" msgstr "Multimesh" @@ -21484,7 +21397,6 @@ msgstr "" "poligono." #: scene/2d/navigation_polygon.cpp -#, fuzzy msgid "Navpoly" msgstr "Navpoly" @@ -21530,7 +21442,7 @@ msgstr "Scatti relativi" #: scene/2d/parallax_background.cpp scene/gui/scroll_container.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Scroll" -msgstr "" +msgstr "Scorrere" #: scene/2d/parallax_background.cpp #, fuzzy @@ -21841,7 +21753,7 @@ msgstr "" #: scene/2d/polygon_2d.cpp msgid "Invert" -msgstr "" +msgstr "Invertire" #: scene/2d/polygon_2d.cpp #, fuzzy @@ -21921,12 +21833,10 @@ msgstr "" "Skeleton2D e impostane una." #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp -#, fuzzy msgid "Hframes" msgstr "Hframes" #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp -#, fuzzy msgid "Vframes" msgstr "Vframes" @@ -22328,9 +22238,8 @@ msgid "Projection" msgstr "Proiezione" #: scene/3d/camera.cpp -#, fuzzy msgid "FOV" -msgstr "FOV" +msgstr "Campo Visivo" #: scene/3d/camera.cpp #, fuzzy @@ -22530,7 +22439,6 @@ msgstr "" "Per rimuovere questo avviso, disattiva la proprietà Compress di GIProbe." #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Subdiv" msgstr "Subdiv" @@ -22597,9 +22505,8 @@ msgstr "Forza Modulazione Bianca" #: scene/3d/label_3d.cpp scene/resources/default_theme/default_theme.cpp #: scene/resources/dynamic_font.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Font" -msgstr "Font" +msgstr "Carattere" #: scene/3d/label_3d.cpp scene/resources/primitive_meshes.cpp #, fuzzy @@ -22683,7 +22590,6 @@ msgid "Depth Range" msgstr "Profondità " #: scene/3d/light.cpp -#, fuzzy msgid "Omni" msgstr "Omni" @@ -23758,6 +23664,16 @@ msgstr "Errore" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Ordina" + +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Use AABB Center" +msgstr "Usa Ambiente" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" @@ -24241,6 +24157,7 @@ msgid "Theme Overrides" msgstr "Sovrascrizioni" #: scene/gui/control.cpp +#, fuzzy msgid "" "The Hint Tooltip won't be displayed as the control's Mouse Filter is set to " "\"Ignore\". To solve this, set the Mouse Filter to \"Stop\" or \"Pass\"." @@ -24406,7 +24323,7 @@ msgstr "Mostra Ossa" #: scene/gui/graph_edit.cpp scene/gui/text_edit.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Minimap" -msgstr "" +msgstr "Minimappa" #: scene/gui/graph_edit.cpp msgid "Enable grid minimap." @@ -25269,9 +25186,8 @@ msgid "Use 32 BPC Depth" msgstr "" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Default Environment" -msgstr "Mostra Ambiente" +msgstr "Ambiente predefinito" #: scene/main/scene_tree.cpp msgid "" @@ -27506,9 +27422,8 @@ msgid "Invalid comparison function for that type." msgstr "Funzione di confronto non valida per quel tipo." #: scene/resources/world.cpp -#, fuzzy msgid "Fallback Environment" -msgstr "Mostra Ambiente" +msgstr "Ambiente di ripiego" #: scene/resources/world.cpp #, fuzzy @@ -27821,9 +27736,8 @@ msgid "Feed" msgstr "" #: servers/camera/camera_feed.cpp -#, fuzzy msgid "Is Active" -msgstr "Prospettica" +msgstr "È attiva" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Sleep Threshold Linear" diff --git a/editor/translations/ja.po b/editor/translations/ja.po index 2570cb6288..dc17329ba7 100644 --- a/editor/translations/ja.po +++ b/editor/translations/ja.po @@ -43,13 +43,17 @@ # fadhliazhari <m.fadhliazhari@gmail.com>, 2022. # Chia-Hsiang Cheng <cche0109@student.monash.edu>, 2022. # meko <hirono.yoneyama@outlook.com>, 2022. +# Fire Dingo <snowsable113@icloud.com>, 2022. +# Narazaki Shuji <shujinarazaki@protonmail.com>, 2022. +# ta ko <neji.cion@gmail.com>, 2022. +# T K <kidaaam@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-27 21:37+0000\n" -"Last-Translator: nitenook <admin@alterbaum.net>\n" +"PO-Revision-Date: 2022-12-13 13:21+0000\n" +"Last-Translator: T K <kidaaam@gmail.com>\n" "Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/" "godot/ja/>\n" "Language: ja\n" @@ -57,7 +61,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -480,7 +484,6 @@ msgid "Pressure" msgstr "圧力" #: core/os/input_event.cpp -#, fuzzy msgid "Pen Inverted" msgstr "ペンå転" @@ -906,9 +909,8 @@ msgid "Resource" msgstr "リソース" #: core/resource.cpp -#, fuzzy msgid "Local To Scene" -msgstr "シーンを閉ã˜ã‚‹" +msgstr "シーンã§å›ºæœ‰" #: core/resource.cpp editor/dependency_editor.cpp #: editor/editor_autoload_settings.cpp editor/plugins/path_editor_plugin.cpp @@ -1050,12 +1052,10 @@ msgid "Scale" msgstr "スケール" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Follow Surface" msgstr "サーフェスをフォãƒãƒ¼ã™ã‚‹" #: drivers/gles3/rasterizer_scene_gles3.cpp -#, fuzzy msgid "Weight Samples" msgstr "é‡é‡ã‚µãƒ³ãƒ—ル" @@ -1365,14 +1365,12 @@ msgid "Easing:" msgstr "イージング:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In-Handle:" -msgstr "ãƒãƒ³ãƒ‰ãƒ«ã‚’è¨å®šã™ã‚‹" +msgstr "インãƒãƒ³ãƒ‰ãƒ«:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out-Handle:" -msgstr "ãƒãƒ³ãƒ‰ãƒ«ã‚’è¨å®šã™ã‚‹" +msgstr "アウトãƒãƒ³ãƒ‰ãƒ«:" #: editor/animation_track_editor.cpp msgid "Stream:" @@ -1645,9 +1643,8 @@ msgid "" msgstr "ã“ã®ã‚ªãƒ—ションã¯å˜ä¸€ãƒˆãƒ©ãƒƒã‚¯ã§ã®ãƒ™ã‚¸ã‚§ç·¨é›†ã§ã¯æ©Ÿèƒ½ã—ã¾ã›ã‚“。" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Anim Add RESET Keys" -msgstr "アニメーションã‚ãƒ¼ã®æ‹¡ç¸®" +msgstr "リセットã‚ーã®è¿½åŠ " #: editor/animation_track_editor.cpp msgid "" @@ -3377,7 +3374,6 @@ msgid "ScanSources" msgstr "スã‚ャンソース" #: editor/editor_file_system.cpp -#, fuzzy msgid "" "There are multiple importers for different types pointing to file %s, import " "aborted" @@ -3600,14 +3596,12 @@ msgid "Checked" msgstr "ãƒã‚§ãƒƒã‚¯æ¸ˆã¿" #: editor/editor_inspector.cpp -#, fuzzy msgid "Draw Red" -msgstr "ドãƒãƒ¼ã‚³ãƒ¼ãƒ«:" +msgstr "èµ¤è‰²ã§æç”»" #: editor/editor_inspector.cpp -#, fuzzy msgid "Keying" -msgstr "実行" +msgstr "ã‚ーイング" #: editor/editor_inspector.cpp msgid "Pin value" @@ -4340,9 +4334,8 @@ msgid "Update Continuously" msgstr "ç¶™ç¶šçš„ã«æ›´æ–°" #: editor/editor_node.cpp -#, fuzzy msgid "Update Vital Only" -msgstr "マテリアルã®å¤‰æ›´:" +msgstr "é‡è¦ãªå¤‰æ›´ç‚¹ã®ã¿ã‚’æ›´æ–°" #: editor/editor_node.cpp msgid "Localize Settings" @@ -4377,12 +4370,10 @@ msgid "Auto Unfold Foreign Scenes" msgstr "外部シーンã®è‡ªå‹•展開" #: editor/editor_node.cpp -#, fuzzy msgid "Horizontal Vector2 Editing" msgstr "水平ベクトル2編集" #: editor/editor_node.cpp -#, fuzzy msgid "Horizontal Vector Types Editing" msgstr "水平ベクトルタイプ編集" @@ -5189,9 +5180,8 @@ msgstr "æ–°è¦ %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Base Type" -msgstr "基底型を変更" +msgstr "基底型" #: editor/editor_resource_picker.cpp msgid "Edited Resource" @@ -5297,7 +5287,6 @@ msgid "Dim Editor On Dialog Popup" msgstr "ダイアãƒã‚°ã®ãƒãƒƒãƒ—アップ時ã«ã‚¨ãƒ‡ã‚£ã‚¿ãƒ¼ã‚’è–„æš—ãã™ã‚‹" #: editor/editor_settings.cpp main/main.cpp -#, fuzzy msgid "Low Processor Mode Sleep (µsec)" msgstr "低プãƒã‚»ãƒƒã‚µ モード スリープ (マイクãƒç§’)" @@ -5307,16 +5296,14 @@ msgid "Unfocused Low Processor Mode Sleep (µsec)" msgstr "フォーカスã•れã¦ã„ãªã„低プãƒã‚»ãƒƒã‚µ モード スリープ (マイクãƒç§’)" #: editor/editor_settings.cpp -#, fuzzy msgid "Separate Distraction Mode" -msgstr "集ä¸ãƒ¢ãƒ¼ãƒ‰" +msgstr "集ä¸ãƒ¢ãƒ¼ãƒ‰ã‚’分離ã™ã‚‹" #: editor/editor_settings.cpp msgid "Automatically Open Screenshots" msgstr "自動的ã«ã‚¹ã‚¯ãƒªãƒ¼ãƒ³ã‚·ãƒ§ãƒƒãƒˆã‚’é–‹ã" #: editor/editor_settings.cpp -#, fuzzy msgid "Max Array Dictionary Items Per Page" msgstr "ページã‚ãŸã‚Šã®æœ€å¤§é…åˆ—è¾žæ›¸é …ç›®æ•°" @@ -5347,7 +5334,6 @@ msgid "Contrast" msgstr "コントラスト" #: editor/editor_settings.cpp -#, fuzzy msgid "Relationship Line Opacity" msgstr "関係線ã®ä¸é€æ˜Žåº¦" @@ -5397,9 +5383,8 @@ msgid "Compress Binary Resources" msgstr "ãƒã‚¤ãƒŠãƒªãƒªã‚½ãƒ¼ã‚¹ã®åœ§ç¸®" #: editor/editor_settings.cpp -#, fuzzy msgid "Safe Save On Backup Then Rename" -msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—時ã«å®‰å…¨ã«ä¿å˜ã—ã¦ã‹ã‚‰åå‰ã‚’変更ã™ã‚‹" +msgstr "ãƒãƒƒã‚¯ã‚¢ãƒƒãƒ—ã¨ã—ã¦åå‰ã‚’変更ã—ã¦ã‹ã‚‰å®‰å…¨ã«ä¿å˜ã™ã‚‹" #: editor/editor_settings.cpp msgid "File Dialog" @@ -5434,9 +5419,8 @@ msgid "Auto Refresh Interval" msgstr "自動リフレッシュã®é–“éš”" #: editor/editor_settings.cpp -#, fuzzy msgid "Subresource Hue Tint" -msgstr "サブリソース" +msgstr "サブリソースã®è‰²ç›¸ãƒ»è‰²åˆã„" #: editor/editor_settings.cpp msgid "Color Theme" @@ -5512,9 +5496,8 @@ msgid "Minimap Width" msgstr "ミニマップã®å¹…" #: editor/editor_settings.cpp -#, fuzzy msgid "Mouse Extra Buttons Navigate History" -msgstr "ãƒžã‚¦ã‚¹è¿½åŠ ãƒœã‚¿ãƒ³ãƒŠãƒ“ã‚²ãƒ¼ãƒˆå±¥æ´" +msgstr "マウスã®è¿½åŠ ãƒœã‚¿ãƒ³ã§å±¥æ´ã‚’表示" #: editor/editor_settings.cpp msgid "Drag And Drop Selection" @@ -5537,19 +5520,16 @@ msgid "Line Numbers Zero Padded" msgstr "行番å·ã‚’ゼãƒåŸ‹ã‚" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Bookmark Gutter" -msgstr "ブックマークガターを表示" +msgstr "ブックマークãƒãƒ¼ã‚’表示" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Breakpoint Gutter" -msgstr "ブレークãƒã‚¤ãƒ³ãƒˆã‚’スã‚ップã™ã‚‹" +msgstr "ブレークãƒã‚¤ãƒ³ãƒˆãƒãƒ¼ã‚’表示" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Info Gutter" -msgstr "æƒ…å ±ã‚¬ã‚¿ãƒ¼ã‚’è¡¨ç¤º" +msgstr "æƒ…å ±ãƒãƒ¼ã‚’表示" #: editor/editor_settings.cpp msgid "Code Folding" @@ -5564,23 +5544,20 @@ msgid "Show Line Length Guidelines" msgstr "行ã®é•·ã•ã®ã‚¬ã‚¤ãƒ‰ç·šã‚’表示" #: editor/editor_settings.cpp -#, fuzzy msgid "Line Length Guideline Soft Column" -msgstr "行長ガイドラインソフト列" +msgstr "行ã®é•·ã•ã®ã‚½ãƒ•トガイドライン" #: editor/editor_settings.cpp -#, fuzzy msgid "Line Length Guideline Hard Column" -msgstr "行長ガイドライン ãƒãƒ¼ãƒ‰åˆ—" +msgstr "行ã®é•·ã•ã®ãƒãƒ¼ãƒ‰ã‚¬ã‚¤ãƒ‰ãƒ©ã‚¤ãƒ³" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Script List" msgstr "スクリプト一覧" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Members Overview" -msgstr "メンãƒãƒ¼æ¦‚è¦ã‚’表示" +msgstr "クラスメンãƒãƒ¼ã®æ¦‚è¦ã‚’表示" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Files" @@ -5611,9 +5588,8 @@ msgid "Create Signal Callbacks" msgstr "シグナルã®ã‚³ãƒ¼ãƒ«ãƒãƒƒã‚¯ã‚’作æˆ" #: editor/editor_settings.cpp -#, fuzzy msgid "Sort Members Outline Alphabetically" -msgstr "メンãƒãƒ¼ã®ã‚¢ã‚¦ãƒˆãƒ©ã‚¤ãƒ³ã‚’ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆé †ã«ä¸¦ã¹æ›¿ãˆã‚‹" +msgstr "クラスメンãƒãƒ¼ã®æ¦‚è¦ã‚’ã‚¢ãƒ«ãƒ•ã‚¡ãƒ™ãƒƒãƒˆé †ã«ä¸¦ã¹ã‚‹" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Cursor" @@ -5643,7 +5619,7 @@ msgstr "å³ã‚¯ãƒªãƒƒã‚¯ã§ã‚ャレットを移動" #: modules/gdscript/gdscript_editor.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Completion" -msgstr "完了" +msgstr "自動補完" #: editor/editor_settings.cpp msgid "Idle Parse Delay" @@ -5670,9 +5646,8 @@ msgid "Complete File Paths" msgstr "ファイルパスã®è£œå®Œ" #: editor/editor_settings.cpp modules/gdscript/gdscript_editor.cpp -#, fuzzy msgid "Add Type Hints" -msgstr "ã‚¿ã‚¤ãƒ—ã‚’è¿½åŠ " +msgstr "åž‹ãƒ’ãƒ³ãƒˆã‚’è¿½åŠ " #: editor/editor_settings.cpp msgid "Use Single Quotes" @@ -5699,9 +5674,8 @@ msgid "Grid Map" msgstr "グリッドマップ" #: editor/editor_settings.cpp modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Pick Distance" -msgstr "è·é›¢ã‚’å–å¾—:" +msgstr "è·é›¢ã‚’é¸æŠž" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Preview Size" @@ -5749,9 +5723,8 @@ msgid "Shape" msgstr "シェイプ" #: editor/editor_settings.cpp -#, fuzzy msgid "Primary Grid Steps" -msgstr "グリッドã®ã‚¹ãƒ†ãƒƒãƒ—:" +msgstr "プライマリグリッドã®ã‚¹ãƒ†ãƒƒãƒ—æ•°" #: editor/editor_settings.cpp msgid "Grid Size" @@ -6899,14 +6872,12 @@ msgid "Collada" msgstr "Collada" #: editor/import/editor_import_collada.cpp -#, fuzzy msgid "Use Ambient" msgstr "アンビエントを使用" #: editor/import/resource_importer_bitmask.cpp -#, fuzzy msgid "Create From" -msgstr "フォルダーを作æˆ" +msgstr "作æˆå…ƒ" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp @@ -6927,7 +6898,7 @@ msgstr "区切り文å—" #: editor/import/resource_importer_layered_texture.cpp msgid "ColorCorrect" -msgstr "ColorCorrect" +msgstr "カラーコレクト" #: editor/import/resource_importer_layered_texture.cpp msgid "No BPTC If RGB" @@ -6960,7 +6931,6 @@ msgstr "ミップマップ" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Anisotropic" msgstr "異方性" @@ -6992,9 +6962,8 @@ msgid "Generate Tangents" msgstr "接線を生æˆ" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Scale Mesh" -msgstr "スケールモード" +msgstr "スケールメッシュ" #: editor/import/resource_importer_obj.cpp msgid "Offset Mesh" @@ -7002,14 +6971,12 @@ msgstr "メッシュã®ã‚ªãƒ•セット" #: editor/import/resource_importer_obj.cpp #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Octahedral Compression" -msgstr "圧縮" +msgstr "å…«é¢ä½“圧縮" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Optimize Mesh Flags" -msgstr "サイズ: " +msgstr "メッシュ最é©åŒ–フラグ" #: editor/import/resource_importer_scene.cpp msgid "Import as Single Scene" @@ -7069,9 +7036,8 @@ msgid "Root Scale" msgstr "ルートã®ã‚¹ã‚±ãƒ¼ãƒ«" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Custom Script" -msgstr "ノードを切りå–ã‚‹" +msgstr "カスタムスクリプト" #: editor/import/resource_importer_scene.cpp scene/resources/texture.cpp msgid "Storage" @@ -7086,28 +7052,24 @@ msgid "Materials" msgstr "マテリアル" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Keep On Reimport" -msgstr "å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆ" +msgstr "å†ã‚¤ãƒ³ãƒãƒ¼ãƒˆæ™‚ã«ä¿æŒ(Keep On Reimport)" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Meshes" msgstr "メッシュ" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Ensure Tangents" -msgstr "接線を計算" +msgstr "接線ã®ç¢ºä¿" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Light Baking" -msgstr "ライトマップ" +msgstr "ライトベーã‚ング(Light Baking)" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Lightmap Texel Size" -msgstr "ライトマップを焼ã込む" +msgstr "ライトマップã®ãƒ†ã‚¯ã‚»ãƒ«ã‚µã‚¤ã‚º" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Skins" @@ -7130,14 +7092,12 @@ msgid "Filter Script" msgstr "スクリプトを絞り込む" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Keep Custom Tracks" -msgstr "トランスフォーム" +msgstr "ã‚«ã‚¹ã‚¿ãƒ ãƒˆãƒ©ãƒƒã‚¯ã‚’ä¿æŒ" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Optimizer" -msgstr "最é©åŒ–" +msgstr "オプティマイザー(Optimizer)" #: editor/import/resource_importer_scene.cpp #: editor/plugins/item_list_editor_plugin.cpp main/main.cpp @@ -7155,19 +7115,16 @@ msgid "Enabled" msgstr "有効" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Linear Error" -msgstr "最大。線形エラー:" +msgstr "最大リニアエラー" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Angular Error" -msgstr "最大。角度エラー:" +msgstr "最大角度エラー" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Angle" -msgstr "値" +msgstr "最大角度" #: editor/import/resource_importer_scene.cpp msgid "Remove Unused Tracks" @@ -7197,9 +7154,8 @@ msgid "Generating Lightmaps" msgstr "ライトマップã®ç”Ÿæˆ" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Generating for Mesh:" -msgstr "メッシュã®ç”Ÿæˆ: " +msgstr "メッシュã®ç”Ÿæˆ:" #: editor/import/resource_importer_scene.cpp msgid "Running Custom Script..." @@ -7227,38 +7183,33 @@ msgid "Saving..." msgstr "ä¿å˜ä¸..." #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" -"%s: 3Dã§æ³•線マップã¨ã—ã¦ä½¿ç”¨ã•れã¦ã„るテクスãƒãƒ£ãŒæ¤œå‡ºã•れã¾ã—ãŸã€‚赤緑テクス" -"ãƒãƒ£åœ§ç¸®ã‚’有効ã«ã—ã¦ãƒ¡ãƒ¢ãƒªä½¿ç”¨é‡ã‚’削減ã—ã¾ã™ï¼ˆé’ãƒãƒ£ãƒ³ãƒãƒ«ã¯ã™ã§ã«ç ´æ£„ã•れã¾" -"ã—ãŸï¼‰ã€‚" +"%s: 3Dã§æ³•線マップã¨ã—ã¦ä½¿ç”¨ã•れã¦ã„るテクスãƒãƒ£ãŒæ¤œå‡ºã•れã¾ã—ãŸã€‚赤ã¨ç·‘ã®ãƒ†" +"クスãƒãƒ£åœ§ç¸®ã‚’有効ã«ã—ã¦ãƒ¡ãƒ¢ãƒªä½¿ç”¨é‡ã‚’削減ã—ã¾ã™ï¼ˆé’ãƒãƒ£ãƒ³ãƒãƒ«ã¯ç ´æ£„ã•れã¾" +"ã™ï¼‰ã€‚" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." msgstr "" -"%s: 3Dã§ä½¿ç”¨ã•れã¦ã„るテクスãƒãƒ£ãŒæ¤œå‡ºã•れã¾ã—ãŸã€‚フィルターã€ç¹°ã‚Šè¿”ã—ã€ãƒŸãƒƒ" -"プマップ生æˆã€VRAMテクスãƒãƒ£åœ§ç¸®ã‚’有効ã«ã—ã¾ã™ã€‚" +"%s: 3Dã§ä½¿ç”¨ã•れるテクスãƒãƒ£ãŒæ¤œå‡ºã•れã¾ã—ãŸã€‚フィルターã€ç¹°ã‚Šè¿”ã—ã€ãƒŸãƒƒãƒ—" +"マップ生æˆã€VRAMテクスãƒãƒ£åœ§ç¸®ã‚’有効ã«ã—ã¾ã™ã€‚" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "2D, Detect 3D" msgstr "2Dã€3D検出" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "2D Pixel" msgstr "2Dピクセル" #: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp -#, fuzzy msgid "Lossy Quality" -msgstr "æå¤±ã®ã‚ã‚‹å“質" +msgstr "éžå¯é€†å“質" #: editor/import/resource_importer_texture.cpp msgid "HDR Mode" @@ -7276,12 +7227,10 @@ msgid "Normal Map" msgstr "法線マップ" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Process" -msgstr "å‰å‡¦ç†" +msgstr "プãƒã‚»ã‚¹" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Fix Alpha Border" msgstr "アルファボーダーを修æ£" @@ -7296,21 +7245,18 @@ msgid "Hdr As Srgb" msgstr "Srgbã¨ã—ã¦Hdr" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Invert Color" -msgstr "é ‚ç‚¹" +msgstr "色ã®å転" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Normal Map Invert Y" -msgstr "ランダムãªç¸®å°º:" +msgstr "法線マップã®Yã‚’å転" #: editor/import/resource_importer_texture.cpp msgid "Size Limit" msgstr "サイズ制é™" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Detect 3D" msgstr "3Dを検出" @@ -7335,19 +7281,16 @@ msgid "Import Mode" msgstr "インãƒãƒ¼ãƒˆãƒ¢ãƒ¼ãƒ‰" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Crop To Region" -msgstr "ã‚¿ã‚¤ãƒ«é ˜åŸŸã‚’è¨å®š" +msgstr "é ˜åŸŸã«ã‚ã‚ã›ã¦ãƒˆãƒªãƒŸãƒ³ã‚°" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Trim Alpha Border From Region" -msgstr "ã‚¢ãƒ«ãƒ•ã‚¡å¢ƒç•Œç·šã‚’é ˜åŸŸã‹ã‚‰ãƒˆãƒªãƒŸãƒ³ã‚°" +msgstr "é ˜åŸŸã‹ã‚‰ã‚¢ãƒ«ãƒ•ァボーダーをトリミング" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp -#, fuzzy msgid "Force" -msgstr "強制プッシュ" +msgstr "強制" #: editor/import/resource_importer_wav.cpp msgid "8 Bit" @@ -7360,14 +7303,12 @@ msgid "Mono" msgstr "Mono" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Max Rate" -msgstr "ミックス ノード" +msgstr "最大レート" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Max Rate Hz" -msgstr "ミックス ノード" +msgstr "最大レート(Hz)" #: editor/import/resource_importer_wav.cpp msgid "Trim" @@ -12888,9 +12829,8 @@ msgid "This property can't be changed." msgstr "ã“ã®ãƒ—ãƒãƒ‘ティã¯å¤‰æ›´ã§ãã¾ã›ã‚“。" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Snap Options" -msgstr "スナッピングオプション" +msgstr "スナップオプション" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/animated_sprite.cpp #: scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp @@ -12898,9 +12838,10 @@ msgstr "スナッピングオプション" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "オフセット" @@ -12913,14 +12854,12 @@ msgstr "ステップ" #: editor/plugins/tile_set_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separation" -msgstr "分離:" +msgstr "分離" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Tile" -msgstr "é¸æŠž" +msgstr "タイルã®é¸æŠž" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/light_2d.cpp scene/2d/line_2d.cpp scene/2d/mesh_instance_2d.cpp @@ -12933,9 +12872,8 @@ msgid "Texture" msgstr "テクスãƒãƒ£" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tex Offset" -msgstr "ãƒã‚¤ãƒˆã®ã‚ªãƒ•セット" +msgstr "テクスãƒãƒ£ã®ã‚ªãƒ•セット" #: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp @@ -12945,18 +12883,16 @@ msgstr "マテリアル" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Modulate" -msgstr "ãƒ‡ãƒ¼ã‚¿ã®æŠ•å…¥" +msgstr "変調" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Tile Mode" msgstr "タイルモード" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Autotile Bitmask Mode" -msgstr "ビットマスクモード" +msgstr "オートタイル ビットマスクモード" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Subtile Size" @@ -12975,44 +12911,36 @@ msgid "Navigation Offset" msgstr "ナビゲーションã®ã‚ªãƒ•セット" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Shape Offset" -msgstr "オフセット:" +msgstr "シェイプオフセット" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Shape Transform" -msgstr "トランスフォーム" +msgstr "シェイプトランスフォーム" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision" -msgstr "コリジョンを使用" +msgstr "ã‚³ãƒªã‚¸ãƒ§ãƒ³ã‚’é¸æŠž" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision One Way" -msgstr "é¸æŠžç¯„å›²ã®ã¿" +msgstr "片方å‘ã®ã‚³ãƒªã‚¸ãƒ§ãƒ³ã‚’é¸æŠž" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision One Way Margin" -msgstr "BVHコリジョンマージン" +msgstr "片方å‘ã®ã‚³ãƒªã‚¸ãƒ§ãƒ³ã®ãƒžãƒ¼ã‚¸ãƒ³" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Navigation" -msgstr "ナビゲーションを表示" +msgstr "ãƒŠãƒ“ã‚²ãƒ¼ã‚·ãƒ§ãƒ³ã‚’é¸æŠž" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Occlusion" -msgstr "é¸æŠž" +msgstr "オクルージョンã®é¸æŠž" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tileset Script" -msgstr "スクリプトを絞り込む" +msgstr "タイルセットスクリプト" #: editor/plugins/tile_set_editor_plugin.cpp msgid "TileSet" @@ -14094,6 +14022,8 @@ msgstr "定義ã•れãŸã™ã¹ã¦ã®ãƒ—リセットã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’エク #: editor/project_export.cpp msgid "All presets must have an export path defined for Export All to work." msgstr "" +"å…¨ã¦ã®ãƒ—リセットã¯ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãŒå…¨ã¦æ©Ÿèƒ½ã™ã‚‹ãŸã‚ã«ã€ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãƒ‘スを定義ã™" +"ã‚‹å¿…è¦ãŒã‚りã¾ã™ã€‚" #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -14312,16 +14242,17 @@ msgid "Invalid project path (changed anything?)." msgstr "無効ãªãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆãƒ‘スã§ã™ (ãªã«ã‹å¤‰æ›´ãŒã‚りã¾ã—ãŸã‹ï¼Ÿ)。" #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "プãƒã‚¸ã‚§ã‚¯ãƒˆãƒ‘ス㮠project.godot ã‚’èªã¿è¾¼ã‚ã¾ã›ã‚“ã§ã—ãŸã€‚ (エラー %d)。見ã¤ã‹" "らãªã„ã‹ç ´æã—ã¦ã„ã‚‹å¯èƒ½æ€§ãŒã‚りã¾ã™ã€‚" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "プãƒã‚¸ã‚§ã‚¯ãƒˆãƒ‘ス㮠project.godot を編集ã§ãã¾ã›ã‚“ã§ã—ãŸã€‚" +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "次ã®å ´æ‰€ã®ãƒ—ãƒã‚¸ã‚§ã‚¯ãƒˆã‚’é–‹ã‘ã¾ã›ã‚“ '%s'。" #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -15353,19 +15284,16 @@ msgid "Make Local" msgstr "ãƒãƒ¼ã‚«ãƒ«ã«ã™ã‚‹" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Enable Scene Unique Name(s)" -msgstr "ノードå:" +msgstr "シーン固有åを有効ã«ã™ã‚‹" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Unique names already used by another node in the scene:" -msgstr "ä»–ã®é–¢æ•°/変数/シグナルã«ã‚ˆã‚Šã™ã§ã«ä½¿ã‚れã¦ã„ã‚‹åå‰:" +msgstr "固有åãŒã‚·ãƒ¼ãƒ³å†…ã®ä»–ã®ãƒŽãƒ¼ãƒ‰ã«æ—¢ã«ä½¿ã‚れã¦ã„ã¾ã™:" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Disable Scene Unique Name(s)" -msgstr "ノードå:" +msgstr "シーン固有åを無効ã«ã™ã‚‹" #: editor/scene_tree_dock.cpp msgid "New Scene Root" @@ -15441,7 +15369,7 @@ msgstr "サブリソース" #: editor/scene_tree_dock.cpp msgid "Access as Scene Unique Name" -msgstr "" +msgstr "シーン固有åã§ã‚¢ã‚¯ã‚»ã‚¹" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" @@ -15541,18 +15469,16 @@ msgid "Clear Inheritance? (No Undo!)" msgstr "継承をクリアã—ã¾ã™ã‹ï¼Ÿ (å…ƒã«æˆ»ã›ã¾ã›ã‚“ï¼)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Show Scene Tree Root Selection" -msgstr "é¸æŠžå¯¾è±¡ã‚’ä¸å¤®ã«" +msgstr "シーンツリーã®ãƒ«ãƒ¼ãƒˆé¸æŠžå¯¾è±¡ã‚’表示" #: editor/scene_tree_dock.cpp msgid "Derive Script Globals By Name" -msgstr "" +msgstr "åå‰ã«ã‚ˆã‚‹ã‚¹ã‚¯ãƒªãƒ—トグãƒãƒ¼ãƒãƒ«ã®å°Žå‡º" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Use Favorites Root Selection" -msgstr "é¸æŠžå¯¾è±¡ã‚’å…¨é¢ã«" +msgstr "ãŠæ°—ã«å…¥ã‚Šã®ãƒ«ãƒ¼ãƒˆé¸æŠžå¯¾è±¡ã‚’使用" #: editor/scene_tree_editor.cpp msgid "Toggle Visible" @@ -15567,9 +15493,8 @@ msgid "Button Group" msgstr "ボタングループ" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Disable Scene Unique Name" -msgstr "ノードå:" +msgstr "シーン固有åを無効ã«ã™ã‚‹" #: editor/scene_tree_editor.cpp msgid "(Connecting From)" @@ -15592,7 +15517,7 @@ msgid "" "Click to show signals dock." msgstr "" "ノードã«ã¯ %s 接続㨠%s グループãŒã‚りã¾ã™ã€‚\n" -"クリックã™ã‚‹ã¨ã€ä¿¡å·ãƒ‰ãƒƒã‚¯ãŒè¡¨ç¤ºã•れã¾ã™ã€‚" +"クリックã™ã‚‹ã¨ã€ã‚·ã‚°ãƒŠãƒ«ãƒ‰ãƒƒã‚¯ãŒè¡¨ç¤ºã•れã¾ã™ã€‚" #: editor/scene_tree_editor.cpp msgid "" @@ -16422,7 +16347,7 @@ msgstr "ボーンを表示ã™ã‚‹" #: main/main.cpp msgid "Image" -msgstr "" +msgstr "ç”»åƒ" #: main/main.cpp msgid "Fullsize" @@ -16446,7 +16371,7 @@ msgstr "Windowsã®ãƒã‚¤ãƒ†ã‚£ãƒ–アイコン" #: main/main.cpp msgid "Buffering" -msgstr "" +msgstr "ãƒãƒƒãƒ•ァリング" #: main/main.cpp msgid "Agile Event Flushing" @@ -16618,7 +16543,7 @@ msgstr "ガイドを表示" #: modules/csg/csg_shape.cpp msgid "Cone" -msgstr "" +msgstr "円éŒ" #: modules/csg/csg_shape.cpp #, fuzzy @@ -16922,14 +16847,12 @@ msgid "Byte Offset" msgstr "ãƒã‚¤ãƒˆã®ã‚ªãƒ•セット" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Component Type" -msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆ" +msgstr "コンãƒãƒ¼ãƒãƒ³ãƒˆã®åž‹" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Normalized" -msgstr "フォーマット" +msgstr "æ£è¦åŒ–" #: modules/gltf/gltf_accessor.cpp #, fuzzy @@ -16937,19 +16860,16 @@ msgid "Count" msgstr "ç·è¨ˆ:" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Min" -msgstr "MiB" +msgstr "最å°" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Max" -msgstr "ミックス" +msgstr "最大" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Sparse Count" -msgstr "インスタンス" +msgstr "スパースカウント" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Buffer View" @@ -17016,12 +16936,11 @@ msgstr "色" #: modules/gltf/gltf_light.cpp scene/3d/reflection_probe.cpp #: scene/resources/environment.cpp msgid "Intensity" -msgstr "" +msgstr "強度" #: modules/gltf/gltf_light.cpp scene/2d/light_2d.cpp scene/3d/light.cpp -#, fuzzy msgid "Range" -msgstr "変更" +msgstr "範囲" #: modules/gltf/gltf_light.cpp msgid "Inner Cone Angle" @@ -17032,14 +16951,12 @@ msgid "Outer Cone Angle" msgstr "" #: modules/gltf/gltf_mesh.cpp -#, fuzzy msgid "Blend Weights" -msgstr "ライトマップを焼ã込む" +msgstr "ブレンドウエイト" #: modules/gltf/gltf_mesh.cpp -#, fuzzy msgid "Instance Materials" -msgstr "マテリアルã®å¤‰æ›´:" +msgstr "マテリアルインスタンス" #: modules/gltf/gltf_node.cpp scene/3d/skeleton.cpp msgid "Parent" @@ -17074,7 +16991,7 @@ msgstr "" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_state.cpp msgid "Unique Names" -msgstr "" +msgstr "固有å" #: modules/gltf/gltf_skeleton.cpp #, fuzzy @@ -17177,7 +17094,7 @@ msgstr "テクスãƒãƒ£" #: modules/gltf/gltf_state.cpp platform/uwp/export/export.cpp msgid "Images" -msgstr "" +msgstr "ç”»åƒ" #: modules/gltf/gltf_state.cpp msgid "Cameras" @@ -17188,9 +17105,8 @@ msgid "Lights" msgstr "ライト" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Unique Animation Names" -msgstr "æ–°è¦ã‚¢ãƒ‹ãƒ¡ãƒ¼ã‚·ãƒ§ãƒ³å:" +msgstr "固有アニメーションå" #: modules/gltf/gltf_state.cpp msgid "Skeletons" @@ -17225,7 +17141,7 @@ msgstr "ライトマップを焼ã込む" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp msgid "Cell" -msgstr "" +msgstr "セル" #: modules/gridmap/grid_map.cpp #, fuzzy @@ -17582,13 +17498,12 @@ msgid "Seamless" msgstr "シームレス" #: modules/opensimplex/noise_texture.cpp -#, fuzzy msgid "As Normal Map" -msgstr "ランダムãªç¸®å°º:" +msgstr "法線マップã¨ã—ã¦" #: modules/opensimplex/noise_texture.cpp msgid "Bump Strength" -msgstr "" +msgstr "ãƒãƒ³ãƒ—強度" #: modules/opensimplex/noise_texture.cpp msgid "Noise" @@ -17607,9 +17522,8 @@ msgid "Period" msgstr "周期" #: modules/opensimplex/open_simplex_noise.cpp -#, fuzzy msgid "Persistence" -msgstr "é€è¦–投影" +msgstr "パーシステンス" #: modules/opensimplex/open_simplex_noise.cpp #, fuzzy @@ -17622,7 +17536,6 @@ msgid "Subject" msgstr "対象" #: modules/regex/regex.cpp -#, fuzzy msgid "Names" msgstr "åå‰" @@ -18048,14 +17961,12 @@ msgid "Return" msgstr "Return(戻り値)" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Return Enabled" -msgstr "実行å¯èƒ½" +msgstr "æˆ»ã‚Šå€¤ãŒæœ‰åй" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Return Type" -msgstr "Return(戻り値)" +msgstr "戻り値ã®åž‹" #: modules/visual_script/visual_script_flow_control.cpp #: scene/resources/visual_shader_nodes.cpp @@ -18067,9 +17978,8 @@ msgid "if (cond) is:" msgstr "" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "While" -msgstr "一方" +msgstr "〜ã®é–“(While)" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" @@ -18084,18 +17994,16 @@ msgid "for (elem) in (input):" msgstr "" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Input type not iterable:" -msgstr "入力タイプã¯å復å¯èƒ½ã§ã¯ã‚りã¾ã›ã‚“: " +msgstr "入力タイプã¯å復å¯èƒ½ã§ã¯ã‚りã¾ã›ã‚“:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid" msgstr "イテレーターãŒç„¡åйã«ãªã‚Šã¾ã—ãŸ" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Iterator became invalid:" -msgstr "イテレーターãŒç„¡åйã«ãªã‚Šã¾ã—ãŸ: " +msgstr "イテレーターãŒç„¡åйã«ãªã‚Šã¾ã—ãŸ:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" @@ -18192,11 +18100,11 @@ msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftLeft %s" -msgstr "" +msgstr "左シフト%s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" -msgstr "" +msgstr "å³ã‚·ãƒ•ト%s" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitAnd %s" @@ -18255,9 +18163,8 @@ msgstr "é…列ã®ã‚µã‚¤ã‚ºã‚’変更" #: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Operator" -msgstr "イテレータ" +msgstr "演算å" #: modules/visual_script/visual_script_nodes.cpp msgid "Invalid argument of type:" @@ -18336,9 +18243,8 @@ msgid "Get Self" msgstr "自己" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "CustomNode" -msgstr "ノードを切りå–ã‚‹" +msgstr "カスタムノード" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -18661,7 +18567,7 @@ msgstr "パッケージ" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp msgid "Unique Name" -msgstr "ユニークå" +msgstr "固有å" #: platform/android/export/export_plugin.cpp msgid "Signed" @@ -19020,7 +18926,6 @@ msgstr "" "æƒ…å ±ãŒå˜åœ¨ã—ã¾ã›ã‚“。 「プãƒã‚¸ã‚§ã‚¯ãƒˆã€ãƒ¡ãƒ‹ãƒ¥ãƒ¼ã‹ã‚‰å†ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã—ã¦ãã ã•ã„。" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Android build version mismatch: Template installed: %s, Godot version: %s. " "Please reinstall Android build template from 'Project' menu." @@ -20964,19 +20869,17 @@ msgstr "æ–¹å‘" #: scene/resources/particles_material.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Spread" -msgstr "" +msgstr "広ãŒã‚Š" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Initial Velocity" -msgstr "åˆæœŸåŒ–" +msgstr "åˆæœŸé€Ÿåº¦" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity Random" -msgstr "オービットビュー å³" +msgstr "速度ランダム化" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp @@ -20986,15 +20889,13 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity Curve" -msgstr "オービットビュー å³" +msgstr "速度曲線" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Orbit Velocity" -msgstr "オービットビュー å³" +msgstr "オービット速度" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21004,25 +20905,23 @@ msgstr "リニア" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Accel" -msgstr "アクセス" +msgstr "åŠ é€Ÿåº¦" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Accel Random" -msgstr "" +msgstr "åŠ é€Ÿåº¦ãƒ©ãƒ³ãƒ€ãƒ åŒ–" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Accel Curve" -msgstr "曲線を分割ã™ã‚‹" +msgstr "åŠ é€Ÿåº¦æ›²ç·š" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Radial Accel" -msgstr "" +msgstr "角化速度" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21051,7 +20950,7 @@ msgstr "曲線を分割ã™ã‚‹" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/light.cpp #: scene/resources/particles_material.cpp msgid "Angle" -msgstr "" +msgstr "角度" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21121,21 +21020,18 @@ msgstr "スケール" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed Curve" -msgstr "曲線を分割ã™ã‚‹" +msgstr "速度曲線" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Offset Random" -msgstr "オフセット:" +msgstr "オフセットランダム化" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Offset Curve" -msgstr "曲線を閉ã˜ã‚‹" +msgstr "オフセット曲線" #: scene/2d/joints_2d.cpp msgid "Node A and Node B must be PhysicsBody2Ds" @@ -21333,7 +21229,7 @@ msgstr "" #: scene/2d/line_2d.cpp msgid "Round Precision" -msgstr "" +msgstr "丸ã‚精度" #: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp #: scene/resources/dynamic_font.cpp @@ -21349,7 +21245,7 @@ msgstr "" #: scene/3d/navigation.cpp scene/animation/root_motion_view.cpp #: scene/resources/world_2d.cpp servers/physics_2d/physics_2d_server_sw.cpp msgid "Cell Size" -msgstr "" +msgstr "セルサイズ" #: scene/2d/navigation_2d.cpp scene/3d/navigation.cpp #, fuzzy @@ -22023,7 +21919,7 @@ msgstr "ARVRCameraã¯ARVROriginãƒŽãƒ¼ãƒ‰ã‚’è¦ªã«æŒã¤å¿…è¦ãŒã‚りã¾ã™ã€‚" #: scene/3d/arvr_nodes.cpp msgid "Controller ID" -msgstr "" +msgstr "コントãƒãƒ¼ãƒ©ãƒ¼ID" #: scene/3d/arvr_nodes.cpp servers/arvr/arvr_positional_tracker.cpp msgid "Rumble" @@ -22081,7 +21977,7 @@ msgstr "" #: scene/3d/audio_stream_player_3d.cpp msgid "Max dB" -msgstr "" +msgstr "最大dB" #: scene/3d/audio_stream_player_3d.cpp msgid "Out Of Range Mode" @@ -22807,15 +22703,15 @@ msgstr "リニア" #: scene/3d/physics_body.cpp msgid "Angular X" -msgstr "" +msgstr "角度X" #: scene/3d/physics_body.cpp msgid "Angular Y" -msgstr "" +msgstr "角度Y" #: scene/3d/physics_body.cpp msgid "Angular Z" -msgstr "" +msgstr "角度Z" #: scene/3d/physics_body.cpp #, fuzzy @@ -23026,7 +22922,7 @@ msgstr "Node A 㨠Node B ã¯ç•°ãªã‚‹ PhysicsBody ã§ãªã‘れã°ãªã‚Šã¾ã›ã‚ #: scene/3d/physics_joint.cpp msgid "Solver" -msgstr "" +msgstr "ソルãƒãƒ¼" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23553,11 +23449,11 @@ msgstr "" #: scene/3d/soft_body.cpp msgid "Pressure Coefficient" -msgstr "" +msgstr "圧力係数" #: scene/3d/soft_body.cpp msgid "Damping Coefficient" -msgstr "" +msgstr "減衰係数" #: scene/3d/soft_body.cpp msgid "Drag Coefficient" @@ -23604,7 +23500,7 @@ msgstr "" #: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp msgid "Opacity" -msgstr "" +msgstr "ä¸é€æ˜Žåº¦" #: scene/3d/sprite_3d.cpp scene/resources/material.cpp #, fuzzy @@ -23685,6 +23581,16 @@ msgstr "エラー" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "ソート" + +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Use AABB Center" +msgstr "アンビエントを使用" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" @@ -24265,7 +24171,7 @@ msgstr "テーマ プãƒãƒ‘ティ" #: scene/gui/dialogs.cpp msgid "Window Title" -msgstr "" +msgstr "ウィンドウタイトル" #: scene/gui/dialogs.cpp #, fuzzy @@ -24355,7 +24261,7 @@ msgstr "コミット" #: scene/gui/graph_node.cpp msgid "Overlay" -msgstr "" +msgstr "オーãƒãƒ¼ãƒ¬ã‚¤" #: scene/gui/grid_container.cpp scene/gui/item_list.cpp scene/gui/tree.cpp #, fuzzy @@ -24438,7 +24344,7 @@ msgstr "" #: scene/gui/line_edit.cpp scene/resources/navigation_mesh.cpp msgid "Max Length" -msgstr "" +msgstr "最大長" #: scene/gui/line_edit.cpp msgid "Secret" @@ -24825,7 +24731,7 @@ msgstr "" #: scene/gui/text_edit.cpp msgid "Readonly" -msgstr "" +msgstr "èªã¿å–り専用" #: scene/gui/text_edit.cpp #, fuzzy @@ -25344,14 +25250,12 @@ msgid "Clear Mode" msgstr "定è¦ãƒ¢ãƒ¼ãƒ‰" #: scene/main/viewport.cpp -#, fuzzy msgid "Enable 2D" -msgstr "有効" +msgstr "2D有効化" #: scene/main/viewport.cpp -#, fuzzy msgid "Enable 3D" -msgstr "有効" +msgstr "3D有効化" #: scene/main/viewport.cpp #, fuzzy @@ -25359,9 +25263,8 @@ msgid "Object Picking" msgstr "オニオンスã‚ンを有効ã«ã™ã‚‹" #: scene/main/viewport.cpp -#, fuzzy msgid "Disable Input" -msgstr "アイテムを無効ã«ã™ã‚‹" +msgstr "入力無効化" #: scene/main/viewport.cpp servers/visual_server.cpp msgid "Shadow Atlas" @@ -26310,11 +26213,11 @@ msgstr "データ付" #: scene/resources/environment.cpp msgid "Background" -msgstr "" +msgstr "背景" #: scene/resources/environment.cpp scene/resources/sky.cpp msgid "Sky" -msgstr "" +msgstr "空" #: scene/resources/environment.cpp #, fuzzy @@ -26322,19 +26225,16 @@ msgid "Sky Custom FOV" msgstr "ノードを切りå–ã‚‹" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Orientation" -msgstr "オンラインドã‚ュメント" +msgstr "ç©ºã®æ–¹å‘" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Rotation" -msgstr "回転ã®ã‚¹ãƒ†ãƒƒãƒ—:" +msgstr "空ã®å›žè»¢" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Rotation Degrees" -msgstr "%s 度回転。" +msgstr "空ã®å›žè»¢è§’度" #: scene/resources/environment.cpp msgid "Canvas Max Layer" @@ -26497,7 +26397,7 @@ msgstr "UVãƒãƒ£ãƒ³ãƒãƒ« デãƒãƒƒã‚°" #: scene/resources/environment.cpp msgid "Blur" -msgstr "" +msgstr "ブラー" #: scene/resources/environment.cpp msgid "Edge Sharpness" @@ -26564,7 +26464,7 @@ msgstr "" #: scene/resources/environment.cpp msgid "Bloom" -msgstr "" +msgstr "ブルーム" #: scene/resources/environment.cpp msgid "HDR Threshold" @@ -26789,7 +26689,7 @@ msgstr "" #: scene/resources/material.cpp msgid "NormalMap" -msgstr "" +msgstr "法線マップ" #: scene/resources/material.cpp msgid "Rim" @@ -28128,17 +28028,15 @@ msgstr "" #: servers/visual_server.cpp msgid "Disable Half Float" -msgstr "" +msgstr "åŠç²¾åº¦å°æ•°ã‚’無効化" #: servers/visual_server.cpp -#, fuzzy msgid "Enable High Float" -msgstr "å„ªå…ˆé †ä½ã‚’有効化" +msgstr "é«˜ç²¾åº¦å°æ•°ã‚’有効化" #: servers/visual_server.cpp -#, fuzzy msgid "Precision" -msgstr "ãƒãƒ¼ã‚¸ãƒ§ãƒ³" +msgstr "精度" #: servers/visual_server.cpp msgid "UV Contract" diff --git a/editor/translations/ka.po b/editor/translations/ka.po index f085051bf7..629afaa429 100644 --- a/editor/translations/ka.po +++ b/editor/translations/ka.po @@ -12951,9 +12951,10 @@ msgstr "მáƒáƒœáƒ˜áƒ¨áƒœáƒ£áƒšáƒ˜ მხáƒáƒšáƒáƒ“" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14349,12 +14350,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -23337,6 +23337,15 @@ msgstr "სáƒáƒ კე" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "გáƒáƒ“áƒáƒ¡áƒ•ლები" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/km.po b/editor/translations/km.po index 3d39686d68..ade147ec7e 100644 --- a/editor/translations/km.po +++ b/editor/translations/km.po @@ -12389,9 +12389,10 @@ msgstr "Anim ផ្លាស់ប្ážáž¼ážš Transform" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13726,12 +13727,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22256,6 +22256,14 @@ msgstr "កញ្ចក់" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +msgid "Sorting" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/ko.po b/editor/translations/ko.po index e1940d698c..f43830b1e9 100644 --- a/editor/translations/ko.po +++ b/editor/translations/ko.po @@ -39,13 +39,15 @@ # 박민규 <80dots@gmail.com>, 2022. # ì´ì§€ë¯¼ <jiminaleejung@gmail.com>, 2022. # nulltable <un5450@naver.com>, 2022. +# Godoto <aicompose@gmail.com>, 2022. +# gaenyang <gaenyang@outlook.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-23 04:16+0000\n" -"Last-Translator: nulltable <un5450@naver.com>\n" +"PO-Revision-Date: 2022-10-24 12:41+0000\n" +"Last-Translator: Godoto <aicompose@gmail.com>\n" "Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/" "godot/ko/>\n" "Language: ko\n" @@ -53,7 +55,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.14.2-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -270,7 +272,7 @@ msgstr "ì²í¬ í¬ê¸° ì½ê¸°" #: core/io/marshalls.cpp msgid "Object ID" -msgstr "오브ì 트 ID" +msgstr "오브ì 트 ì•„ì´ë””" #: core/io/multiplayer_api.cpp core/io/packet_peer.cpp msgid "Allow Object Decoding" @@ -394,9 +396,8 @@ msgid "Mouse Mode" msgstr "마우스 모드" #: core/os/input.cpp -#, fuzzy msgid "Use Accumulated Input" -msgstr "ìž…ë ¥ ì‚ì œ" +msgstr "누ì ìž…ë ¥ 사용" #: core/os/input_event.cpp editor/project_settings_editor.cpp #: servers/audio_server.cpp @@ -479,7 +480,7 @@ msgstr "ì••ë ¥" #: core/os/input_event.cpp msgid "Pen Inverted" -msgstr "" +msgstr "펜 ë°˜ì „" #: core/os/input_event.cpp msgid "Relative" @@ -682,11 +683,11 @@ msgstr "스í¬ë¦½íЏ 템플릿 검색 경로" #: core/project_settings.cpp msgid "Version Control Autoload On Startup" -msgstr "ì‹œìž‘í• ë•Œ ìžë™ìœ¼ë¡œ Version Control 로드" +msgstr "시작 시 ë²„ì „ 관리 ìžë™ì‹¤í–‰" #: core/project_settings.cpp msgid "Version Control Plugin Name" -msgstr "ë²„ì „ 컨트롤 í”ŒëŸ¬ê·¸ì¸ ì´ë¦„" +msgstr "ë²„ì „ 관리 í”ŒëŸ¬ê·¸ì¸ ì´ë¦„" #: core/project_settings.cpp scene/2d/collision_object_2d.cpp #: scene/3d/collision_object.cpp scene/gui/control.cpp @@ -1606,7 +1607,7 @@ msgstr "변형" #: editor/animation_track_editor.cpp editor/editor_help.cpp msgid "Methods" -msgstr "메서드" +msgstr "방법" #: editor/animation_track_editor.cpp msgid "Bezier" @@ -2071,7 +2072,7 @@ msgstr "\"%s\" 시그ë„ì˜ ëª¨ë“ ì—°ê²°ì„ ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" #: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp msgid "Signals" -msgstr "시그ë„" +msgstr "ì‹ í˜¸" #: editor/connections_dialog.cpp msgid "Filter signals" @@ -2200,7 +2201,7 @@ msgstr "열기" #: editor/dependency_editor.cpp msgid "Owners of: %s (Total: %d)" -msgstr "" +msgstr "ì†Œìœ ìž: %s(ì´: %d)" #: editor/dependency_editor.cpp msgid "" @@ -2756,16 +2757,15 @@ msgstr "ì„ íƒ" #: editor/editor_export.cpp msgid "Project export for platform:" -msgstr "플랫í¼ìœ¼ë¡œ 프로ì 트 내보내기:" +msgstr "플랫í¼ìš© 프로ì 트 내보내기:" #: editor/editor_export.cpp msgid "Completed with warnings." msgstr "완료하였지만 ê²½ê³ ê°€ 있습니다." #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "패키지를 성공ì 으로 설치했습니다!" +msgstr "성공ì 으로 완료ë˜ì—ˆìŠµë‹ˆë‹¤." #: editor/editor_export.cpp msgid "Failed." @@ -2921,9 +2921,8 @@ msgid "Custom release template not found." msgstr "커스텀 릴리스 í…œí”Œë¦¿ì„ ì°¾ì„ ìˆ˜ 없습니다." #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" -msgstr "템플릿 관리" +msgstr "템플릿 준비" #: editor/editor_export.cpp platform/osx/export/export.cpp msgid "The given export path doesn't exist." @@ -2939,9 +2938,8 @@ msgstr "내보내기 í…œí”Œë¦¿ì„ ë³µì‚¬í•˜ì§€ 못했습니다." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp -#, fuzzy msgid "PCK Embedding" -msgstr "패딩" +msgstr "PCK ìž„ë² ë”©" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." @@ -3435,7 +3433,7 @@ msgstr "스타ì¼" #: editor/editor_help.cpp msgid "Enumerations" -msgstr "열거형" +msgstr "목ë¡" #: editor/editor_help.cpp msgid "Property Descriptions" @@ -5472,7 +5470,7 @@ msgstr "ì„ íƒëœ í•ëª©ì„ Drag and drop" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" -msgstr "" +msgstr "ì„ íƒí•œ 노드ì—서 스í¬ë¦½íЏ 편집기 ìœ ì§€" #: editor/editor_settings.cpp msgid "Appearance" @@ -5774,7 +5772,7 @@ msgstr "줌 변경" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Warped Mouse Panning" -msgstr "" +msgstr "뒤틀린 마우스 패ë‹" #: editor/editor_settings.cpp msgid "Navigation Feel" @@ -5782,56 +5780,47 @@ msgstr "내비게ì´ì…˜ ê°ë„" #: editor/editor_settings.cpp msgid "Orbit Sensitivity" -msgstr "" +msgstr "ê¶¤ë„ ê°ë„" #: editor/editor_settings.cpp msgid "Orbit Inertia" -msgstr "" +msgstr "ê¶¤ë„ ê´€ì„±" #: editor/editor_settings.cpp -#, fuzzy msgid "Translation Inertia" -msgstr "번ì—" +msgstr "ë²ˆì— ê´€ì„±" #: editor/editor_settings.cpp -#, fuzzy msgid "Zoom Inertia" -msgstr "줌 ì¸" +msgstr "줌 관성" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook" -msgstr "ìžìœ 시ì 위로" +msgstr "ìžìœ 시ì " #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Navigation Scheme" -msgstr "내비게ì´ì…˜ 메시 만들기" +msgstr "ìžìœ 시ì 내비게ì´ì…˜ 계íš" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Sensitivity" -msgstr "ìžìœ 시ì 왼쪽으로" +msgstr "ìžìœ 시ì ê°ë„" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Inertia" -msgstr "ìžìœ 시ì 왼쪽으로" +msgstr "ìžìœ 시ì 관성" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Base Speed" -msgstr "ìžìœ 시ì ì†ë„ ìˆ˜ì •ìž" +msgstr "ìžìœ 시ì 기본 ì†ë ¥" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Activation Modifier" -msgstr "ìžìœ 시ì ëŠë¦° ìˆ˜ì •ìž" +msgstr "ìžìœ 시ì 활성화 ìˆ˜ì •ìž" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Speed Zoom Link" -msgstr "ìžìœ 시ì ì†ë„ ìˆ˜ì •ìž" +msgstr "ìžìœ 시ì ì†ë„ 확대 ë§í¬" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp msgid "Grid Color" @@ -5867,98 +5856,89 @@ msgstr "본 IK 색ìƒ" #: editor/editor_settings.cpp msgid "Bone Outline Color" -msgstr "" +msgstr "뼈 ìœ¤ê³½ì„ ìƒ‰ìƒ" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Outline Size" -msgstr "ìœ¤ê³½ì„ í¬ê¸°:" +msgstr "뼈 ìœ¤ê³½ì„ í¬ê¸°" #: editor/editor_settings.cpp msgid "Viewport Border Color" -msgstr "" +msgstr "표시 ì˜ì— í…Œë‘리 색ìƒ" #: editor/editor_settings.cpp msgid "Constrain Editor View" -msgstr "" +msgstr "ì œì•½ 편집기 보기" #: editor/editor_settings.cpp msgid "Simple Panning" -msgstr "" +msgstr "간단한 패ë‹" #: editor/editor_settings.cpp msgid "Scroll To Pan" -msgstr "" +msgstr "팬으로 스í¬ë¡¤" #: editor/editor_settings.cpp -#, fuzzy msgid "Pan Speed" -msgstr "ì†ë„:" +msgstr "팬 ì†ë„" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Poly Editor" -msgstr "í´ë¦¬ê³¤ 2D UV ì—디터" +msgstr "í´ë¦¬ ì—디터" #: editor/editor_settings.cpp msgid "Point Grab Radius" -msgstr "" +msgstr "í¬ì¸íЏ 잡기 반경" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Show Previous Outline" -msgstr "ì´ì „ í‰ë©´" +msgstr "ì´ì „ 아웃ë¼ì¸ 보기" #: editor/editor_settings.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Autorename Animation Tracks" -msgstr "ì• ë‹ˆë©”ì´ì…˜ ì´ë¦„ 바꾸기" +msgstr "ì• ë‹ˆë©”ì´ì…˜ 트랙 ìžë™ ì´ë¦„ 바꾸기" #: editor/editor_settings.cpp msgid "Default Create Bezier Tracks" -msgstr "" +msgstr "기본 ë² ì§€ì–´ 트랙 만들기" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Create Reset Tracks" -msgstr "ìž¬ì„¤ì • 트랙 만들기" +msgstr "기본 ìž¬ì„¤ì • 트랙 만들기" #: editor/editor_settings.cpp msgid "Onion Layers Past Color" -msgstr "" +msgstr "양파 ë ˆì´ì–´ 과거 색ìƒ" #: editor/editor_settings.cpp msgid "Onion Layers Future Color" -msgstr "" +msgstr "양파 ë ˆì´ì–´ 미래 색ìƒ" #: editor/editor_settings.cpp -#, fuzzy msgid "Visual Editors" -msgstr "그룹 ì—디터" +msgstr "비주얼 편집기" #: editor/editor_settings.cpp msgid "Minimap Opacity" -msgstr "" +msgstr "미니맵 불투명ë„" #: editor/editor_settings.cpp msgid "Window Placement" -msgstr "" +msgstr "ì°½ 배치" #: editor/editor_settings.cpp scene/2d/back_buffer_copy.cpp scene/2d/sprite.cpp #: scene/2d/visibility_notifier_2d.cpp scene/3d/sprite_3d.cpp #: scene/gui/control.cpp -#, fuzzy msgid "Rect" -msgstr "사ê°í˜• ì „ì²´" +msgstr "ì§ì‚¬ê°í˜•" #: editor/editor_settings.cpp -#, fuzzy msgid "Rect Custom Position" -msgstr "ê³¡ì„ ì˜ ì•„ì›ƒ 위치 ì„¤ì •" +msgstr "ì§ì‚¬ê°í˜• ì‚¬ìš©ìž ì •ì˜ ìœ„ì¹˜" #: editor/editor_settings.cpp platform/android/export/export_plugin.cpp msgid "Screen" -msgstr "" +msgstr "화면" #: editor/editor_settings.cpp msgid "Auto Save" @@ -5974,20 +5954,17 @@ msgstr "í°íЏ í¬ê¸°" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Remote Host" -msgstr "ì›ê²© " +msgstr "ì›ê²© 호스트" #: editor/editor_settings.cpp #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Remote Port" -msgstr "ì ì œê±°" +msgstr "ì›ê²© í¬íЏ" #: editor/editor_settings.cpp -#, fuzzy msgid "Editor SSL Certificates" -msgstr "ì—디터 ì„¤ì •" +msgstr "íŽ¸ì§‘ìž SSL ì¸ì¦ì„œ" #: editor/editor_settings.cpp msgid "HTTP Proxy" @@ -5995,13 +5972,13 @@ msgstr "HTTP 프ë¡ì‹œ" #: editor/editor_settings.cpp msgid "Host" -msgstr "" +msgstr "호스트" #: editor/editor_settings.cpp editor/fileserver/editor_file_server.cpp #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Port" -msgstr "" +msgstr "í¬íЏ" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp @@ -6019,28 +5996,27 @@ msgstr "ìƒì§• 색" #: editor/editor_settings.cpp msgid "Keyword Color" -msgstr "" +msgstr "키워드 색ìƒ" #: editor/editor_settings.cpp msgid "Control Flow Keyword Color" -msgstr "" +msgstr "플로우 키워드 ìƒ‰ìƒ ì œì–´" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Type Color" -msgstr "기본 타입 바꾸기" +msgstr "기본 ìœ í˜• 색ìƒ" #: editor/editor_settings.cpp msgid "Engine Type Color" -msgstr "" +msgstr "엔진 ìœ í˜• 색ìƒ" #: editor/editor_settings.cpp msgid "User Type Color" -msgstr "" +msgstr "ì‚¬ìš©ìž ìœ í˜• 색ìƒ" #: editor/editor_settings.cpp msgid "Comment Color" -msgstr "" +msgstr "댓글 색ìƒ" #: editor/editor_settings.cpp msgid "String Color" @@ -6057,35 +6033,32 @@ msgid "Completion Background Color" msgstr "완성 ë°°ê²½ 색" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Completion Selected Color" -msgstr "ì„ íƒëœ í•목 ê°€ì ¸ì˜¤ê¸°" +msgstr "ì„ íƒ ìƒ‰ìƒ ì™„ë£Œ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Existing Color" -msgstr "" +msgstr "기존 ìƒ‰ìƒ ì™„ì„±" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Scroll Color" -msgstr "" +msgstr "스í¬ë¡¤ ìƒ‰ìƒ ì™„ë£Œ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Completion Font Color" -msgstr "" +msgstr "글꼴 ìƒ‰ìƒ ì™„ë£Œ" #: editor/editor_settings.cpp -#, fuzzy msgid "Text Color" -msgstr "ë‹¤ìŒ ì¸µ" +msgstr "글ìžìƒ‰" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Line Number Color" msgstr "í–‰ ë²ˆí˜¸ì˜ ìƒ‰" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Safe Line Number Color" -msgstr "í–‰ 번호:" +msgstr "ì•ˆì „ ë¼ì¸ 번호 색ìƒ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" @@ -6096,93 +6069,82 @@ msgid "Caret Background Color" msgstr "íƒˆìž ê¸°í˜¸ ë°°ê²½ 색" #: editor/editor_settings.cpp -#, fuzzy msgid "Text Selected Color" -msgstr "ì„ íƒ í•목 ì‚ì œ" +msgstr "ì„ íƒí•œ í…스트 색ìƒ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Selection Color" -msgstr "ì„ íƒ ì˜ì—ë§Œ" +msgstr "ì„ íƒ ìƒ‰ìƒ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Brace Mismatch Color" -msgstr "" +msgstr "중괄호 불ì¼ì¹˜ 색ìƒ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Current Line Color" -msgstr "현재 씬" +msgstr "현재 줄 색ìƒ" #: editor/editor_settings.cpp msgid "Line Length Guideline Color" -msgstr "" +msgstr "ë¼ì¸ ê¸¸ì´ ê°€ì´ë“œë¼ì¸ 색ìƒ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Word Highlighted Color" -msgstr "구문 ê°•ì¡°" +msgstr "구문 ê°•ì¡° 색ìƒ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Number Color" -msgstr "" +msgstr "ìˆ«ìž ìƒ‰ìƒ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Function Color" -msgstr "함수(Function)" +msgstr "함수 색ìƒ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Member Variable Color" -msgstr "변수명 바꾸기" +msgstr "멤버 변수 색ìƒ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Mark Color" -msgstr "ìƒ‰ìƒ ì„ íƒ" +msgstr "ë§ˆí¬ ìƒ‰ìƒ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Bookmark Color" -msgstr "ë¶ë§ˆí¬" +msgstr "ë¶ë§ˆí¬ 색ìƒ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Breakpoint Color" -msgstr "중단ì " +msgstr "중단ì 색ìƒ" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Executing Line Color" -msgstr "" +msgstr "ë¼ì¸ ìƒ‰ìƒ ì‹¤í–‰" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Code Folding Color" -msgstr "" +msgstr "코드 í´ë”© 색ìƒ" #: editor/editor_settings.cpp -#, fuzzy msgid "Search Result Color" -msgstr "검색 ê²°ê³¼" +msgstr "검색 ê²°ê³¼ 색ìƒ" #: editor/editor_settings.cpp -#, fuzzy msgid "Search Result Border Color" -msgstr "검색 ê²°ê³¼" +msgstr "검색 ê²°ê³¼ í…Œë‘리 색ìƒ" #: editor/editor_spin_slider.cpp msgid "Hold %s to round to integers. Hold Shift for more precise changes." -msgstr "%s를 눌러 ì •ìˆ˜ë¡œ 반올림합니다. Shift를 눌러 좀 ë” ì •ë°€í•˜ê²Œ 조작합니다." +msgstr "" +"ì •ìˆ˜ë¡œ ë°˜ì˜¬ë¦¼í•˜ë ¤ë©´ %s 키를 누르세요. ë” ì •ë°€í•œ ë³€ê²½ì„ í•˜ë ¤ë©´ Shift 키를 누르" +"세요." #: editor/editor_spin_slider.cpp scene/gui/button.cpp -#, fuzzy msgid "Flat" -msgstr "플랫 0" +msgstr "í‰ë©´" #: editor/editor_spin_slider.cpp -#, fuzzy msgid "Hide Slider" -msgstr "ì½œë¦¬ì „ 모드" +msgstr "슬ë¼ì´ë” 숨기기" #: editor/editor_sub_scene.cpp msgid "Select Node(s) to Import" @@ -6190,11 +6152,11 @@ msgstr "ê°€ì ¸ì˜¬ 노드 ì„ íƒ" #: editor/editor_sub_scene.cpp editor/project_manager.cpp msgid "Browse" -msgstr "íƒìƒ‰" +msgstr "검색" #: editor/editor_sub_scene.cpp msgid "Scene Path:" -msgstr "씬 경로:" +msgstr "장면 경로:" #: editor/editor_sub_scene.cpp msgid "Import From Node:" @@ -6202,13 +6164,12 @@ msgstr "노드ì—서 ê°€ì ¸ì˜¤ê¸°:" #. TRANSLATORS: %s refers to the name of a version control system (e.g. "Git"). #: editor/editor_vcs_interface.cpp -#, fuzzy msgid "%s Error" -msgstr "오류" +msgstr "%s 오류" #: editor/export_template_manager.cpp msgid "Open the folder containing these templates." -msgstr "ì´ í…œí”Œë¦¿ì„ í¬í•¨í•˜ëŠ” í´ë”를 엽니다." +msgstr "ì´ í…œí”Œë¦¿ì´ í¬í•¨ëœ í´ë”를 엽니다." #: editor/export_template_manager.cpp msgid "Uninstall these templates." @@ -6220,11 +6181,11 @@ msgstr "사용 가능한 미러가 없습니다." #: editor/export_template_manager.cpp msgid "Retrieving the mirror list..." -msgstr "미러 목ë¡ì„ 검색하는 중..." +msgstr "미러 목ë¡ì„ ê°€ì ¸ì˜¤ëŠ” 중..." #: editor/export_template_manager.cpp msgid "Starting the download..." -msgstr "다운로드를 시작하는 중..." +msgstr "다운로드 시작 중..." #: editor/export_template_manager.cpp msgid "Error requesting URL:" @@ -6232,11 +6193,11 @@ msgstr "URL ìš”ì² ì¤‘ 오류:" #: editor/export_template_manager.cpp msgid "Connecting to the mirror..." -msgstr "ë¯¸ëŸ¬ì— ì—°ê²° 중..." +msgstr "미러 ì—°ê²° 중..." #: editor/export_template_manager.cpp msgid "Can't resolve the requested address." -msgstr "ìš”ì²ëœ 주소를 í•´ê²°í• ìˆ˜ 없습니다." +msgstr "ìš”ì²í•œ 주소를 확ì¸í• 수 없습니다." #: editor/export_template_manager.cpp msgid "Can't connect to the mirror." @@ -6472,13 +6433,13 @@ msgstr "" #: editor/fileserver/editor_file_server.cpp msgid "File Server" -msgstr "" +msgstr "íŒŒì¼ ì„œë²„" #: editor/fileserver/editor_file_server.cpp #: editor/plugins/version_control_editor_plugin.cpp #: platform/uwp/export/export.cpp platform/windows/export/export.cpp msgid "Password" -msgstr "" +msgstr "비밀번호" #: editor/filesystem_dock.cpp msgid "Favorites" @@ -6539,6 +6500,9 @@ msgid "" "After renaming to an unknown extension, the file won't be shown in the " "editor anymore." msgstr "" +"ì´ íŒŒì¼ í™•ìž¥ìžëŠ” 편집기ì—서 ì¸ì‹ë˜ì§€ 않습니다.\n" +"ì´ë¦„ì„ ë³€ê²½í•˜ë ¤ë©´ ìš´ì˜ ì²´ì œì˜ íŒŒì¼ íƒìƒ‰ê¸°ë¥¼ 사용하ì‹ì‹œì˜¤.\n" +"알 수 없는 확장ìžë¡œ ì´ë¦„ì„ ë°”ê¾¸ë©´ 파ì¼ì´ ë” ì´ìƒ íŽ¸ì§‘ê¸°ì— í‘œì‹œë˜ì§€ 않습니다." #: editor/filesystem_dock.cpp msgid "" @@ -6760,14 +6724,12 @@ msgid "Replace..." msgstr "바꾸기..." #: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Replace in Files" -msgstr "ëª¨ë‘ ë°”ê¾¸ê¸°" +msgstr "파ì¼ì—서 바꾸기" #: editor/find_in_files.cpp -#, fuzzy msgid "Replace All (NO UNDO)" -msgstr "ëª¨ë‘ ë°”ê¾¸ê¸°" +msgstr "ëª¨ë‘ ë°”ê¾¸ê¸°(실행 취소 ì—†ìŒ)" #: editor/find_in_files.cpp msgid "Searching..." @@ -6840,43 +6802,40 @@ msgstr "그룹 관리" #: editor/import/editor_import_collada.cpp msgid "Collada" -msgstr "" +msgstr "COLLADA" #: editor/import/editor_import_collada.cpp msgid "Use Ambient" -msgstr "" +msgstr "주변광 사용" #: editor/import/resource_importer_bitmask.cpp -#, fuzzy msgid "Create From" -msgstr "í´ë” 만들기" +msgstr "다ìŒì—서 만들기" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp msgid "Threshold" -msgstr "" +msgstr "ìŠ¤ë ˆìˆ„ë“œ" #: editor/import/resource_importer_csv_translation.cpp #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_scene.cpp #: editor/import/resource_importer_texture.cpp #: editor/import/resource_importer_wav.cpp scene/3d/gi_probe.cpp -#, fuzzy msgid "Compress" -msgstr "구성 요소" +msgstr "ì»´í”„ë ˆìŠ¤" #: editor/import/resource_importer_csv_translation.cpp msgid "Delimiter" -msgstr "" +msgstr "디리미터" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "ColorCorrect" -msgstr "ìƒ‰ìƒ í•¨ìˆ˜." +msgstr "ì»¬ëŸ¬ì½”ë ‰íŠ¸" #: editor/import/resource_importer_layered_texture.cpp msgid "No BPTC If RGB" -msgstr "" +msgstr "RGBì¸ ê²½ìš° BPTC ì—†ìŒ" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/cpu_particles_2d.cpp @@ -6884,13 +6843,13 @@ msgstr "" #: scene/resources/material.cpp scene/resources/particles_material.cpp #: scene/resources/texture.cpp scene/resources/visual_shader.cpp msgid "Flags" -msgstr "" +msgstr "플래그" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/animation/tween.cpp #: scene/resources/texture.cpp msgid "Repeat" -msgstr "" +msgstr "반복" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/light_2d.cpp @@ -6900,14 +6859,13 @@ msgstr "í•„í„°" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Mipmaps" -msgstr "시그ë„" +msgstr "밉맵" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "Anisotropic" -msgstr "" +msgstr "ì´ë°©ì„±" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp @@ -6915,9 +6873,8 @@ msgid "sRGB" msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "Slices" -msgstr "ìžë™ ìžë¥´ê¸°" +msgstr "슬ë¼ì´ìФ" #: editor/import/resource_importer_layered_texture.cpp #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp @@ -6934,14 +6891,12 @@ msgid "Vertical" msgstr "수ì§" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Generate Tangents" -msgstr "ìƒì„±í•œ ì 개수" +msgstr "ì ‘ì„ ìƒì„±" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Scale Mesh" -msgstr "ìŠ¤ì¼€ì¼ ëª¨ë“œ" +msgstr "ìŠ¤ì¼€ì¼ ë©”ì‰¬" #: editor/import/resource_importer_obj.cpp msgid "Offset Mesh" @@ -6949,9 +6904,8 @@ msgstr "오프셋 메시" #: editor/import/resource_importer_obj.cpp #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Octahedral Compression" -msgstr "í‘œí˜„ì‹ ì„¤ì •" +msgstr "팔면체 ì••ì¶•" #: editor/import/resource_importer_obj.cpp msgid "Optimize Mesh Flags" @@ -6999,100 +6953,84 @@ msgstr "여러 ê°œì˜ ì”¬ê³¼ 머티리얼로 ê°€ì ¸ì˜¤ê¸°" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Nodes" msgstr "노드" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Type" -msgstr "멤버 타입" +msgstr "루트 ìœ í˜•" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Name" -msgstr "ì›ê²© ì´ë¦„" +msgstr "루트 ì´ë¦„" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Scale" -msgstr "스케ì¼" +msgstr "루트 스케ì¼" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Custom Script" -msgstr "노드 잘ë¼ë‚´ê¸°" +msgstr "ì‚¬ìš©ìž ì •ì˜ ìŠ¤í¬ë¦½íЏ" #: editor/import/resource_importer_scene.cpp scene/resources/texture.cpp -#, fuzzy msgid "Storage" -msgstr "ì €ìž¥í•˜ë ¤ëŠ” 파ì¼:" +msgstr "보관소" #: editor/import/resource_importer_scene.cpp msgid "Use Legacy Names" -msgstr "" +msgstr "기존 ì´ë¦„ 사용" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Materials" msgstr "머티리얼" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Keep On Reimport" -msgstr "다시 ê°€ì ¸ì˜¤ê¸°" +msgstr "ê³„ì† ë‹¤ì‹œ ê°€ì ¸ì˜¤ê¸°" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp -#, fuzzy msgid "Meshes" -msgstr "메시" +msgstr "메쉬" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Ensure Tangents" -msgstr "ê³¡ì„ íƒ„ì 트 ìˆ˜ì •" +msgstr "ì ‘ì„ í™•ì¸" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Light Baking" -msgstr "ë¼ì´íŠ¸ë§µ 굽기" +msgstr "ë¼ì´íЏ ë² ì´í‚¹" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Lightmap Texel Size" -msgstr "ë¼ì´íŠ¸ë§µ 굽기" +msgstr "ë¼ì´íŠ¸ë§µ í…ì…€ í¬ê¸°" #: editor/import/resource_importer_scene.cpp modules/gltf/gltf_state.cpp msgid "Skins" -msgstr "" +msgstr "스킨" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Use Named Skins" -msgstr "ìŠ¤ì¼€ì¼ ìŠ¤ëƒ… 사용" +msgstr "네임드 스킨 사용" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "External Files" -msgstr "íŒŒì¼ ì—´ê¸°" +msgstr "외부 파ì¼" #: editor/import/resource_importer_scene.cpp msgid "Store In Subdir" -msgstr "" +msgstr "하위 ë””ë ‰í† ë¦¬ì— ì €ìž¥" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Filter Script" -msgstr "스í¬ë¦½íЏ í•„í„°" +msgstr "í•„í„° 스í¬ë¦½íЏ" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Keep Custom Tracks" -msgstr "변형" +msgstr "맞춤 트랙 ìœ ì§€" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Optimizer" -msgstr "최ì í™”" +msgstr "최ì í™” ë„구" #: editor/import/resource_importer_scene.cpp #: editor/plugins/item_list_editor_plugin.cpp main/main.cpp @@ -7106,9 +7044,8 @@ msgstr "최ì í™”" #: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp #: scene/gui/rich_text_label.cpp scene/resources/curve.cpp #: scene/resources/environment.cpp scene/resources/material.cpp -#, fuzzy msgid "Enabled" -msgstr "활성화" +msgstr "활성화ë¨" #: editor/import/resource_importer_scene.cpp msgid "Max Linear Error" @@ -7119,19 +7056,16 @@ msgid "Max Angular Error" msgstr "최대 ê°ë„ 오류" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Angle" -msgstr "ê°’" +msgstr "최대 ê°ë„" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Remove Unused Tracks" -msgstr "ì• ë‹ˆë©”ì´ì…˜ 트랙 ì œê±°" +msgstr "미사용 트랙 ì œê±°" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Clips" -msgstr "ì• ë‹ˆë©”ì´ì…˜ í´ë¦½" +msgstr "í´ë¦½" #: editor/import/resource_importer_scene.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/particles_2d.cpp scene/3d/area.cpp scene/3d/cpu_particles.cpp @@ -7185,64 +7119,63 @@ msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" +"%s: í…스처가 3Dì—서 노멀 맵으로 사용ë˜ëŠ” 것으로 ê°ì§€ë˜ì—ˆìŠµë‹ˆë‹¤. 메모리 사용량" +"ì„ ì¤„ì´ê¸° 위해 빨강-ì´ˆë¡ í…스처 ì••ì¶•ì„ í™œì„±í™”í•©ë‹ˆë‹¤(파란색 채ë„ì€ ë²„ë ¤ì§)." #: editor/import/resource_importer_texture.cpp msgid "" "%s: Texture detected as used in 3D. Enabling filter, repeat, mipmap " "generation and VRAM texture compression." msgstr "" +"%s: í…스처가 3Dì—서 ì‚¬ìš©ëœ ê²ƒìœ¼ë¡œ ê°ì§€ë˜ì—ˆìŠµë‹ˆë‹¤. í•„í„°, 반복, 밉맵 ìƒì„± ë° " +"VRAM í…스처 ì••ì¶•ì„ í™œì„±í™”í•©ë‹ˆë‹¤." #: editor/import/resource_importer_texture.cpp msgid "2D, Detect 3D" -msgstr "" +msgstr "2D, 3D ê°ì§€" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "2D Pixel" -msgstr "ì „ë©´ 픽셀" +msgstr "2D 픽셀" #: editor/import/resource_importer_texture.cpp scene/resources/texture.cpp msgid "Lossy Quality" -msgstr "" +msgstr "ì†ì‹¤ 품질" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "HDR Mode" -msgstr "모드 ì„ íƒ" +msgstr "HDR 모드" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" -msgstr "" +msgstr "BPTC LDR" #: editor/import/resource_importer_texture.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/mesh_instance_2d.cpp scene/2d/multimesh_instance_2d.cpp #: scene/2d/particles_2d.cpp scene/2d/sprite.cpp scene/resources/style_box.cpp msgid "Normal Map" -msgstr "" +msgstr "ì¼ë°˜ ë§µ" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Process" -msgstr "후처리" +msgstr "프로세스" #: editor/import/resource_importer_texture.cpp msgid "Fix Alpha Border" -msgstr "" +msgstr "알파 í…Œë‘리 ìˆ˜ì •" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Premult Alpha" -msgstr "í´ë¦¬ê³¤ 편집" +msgstr "프리멀트 알파" #: editor/import/resource_importer_texture.cpp msgid "Hdr As Srgb" -msgstr "" +msgstr "Srgb로 HDR" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Invert Color" -msgstr "ê¼ì§“ì " +msgstr "ìƒ‰ìƒ ë°˜ì „" #: editor/import/resource_importer_texture.cpp msgid "Normal Map Invert Y" @@ -7254,18 +7187,19 @@ msgstr "í¬ê¸° ì œí•œ" #: editor/import/resource_importer_texture.cpp msgid "Detect 3D" -msgstr "" +msgstr "3D ê°ì§€" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "SVG" -msgstr "HSV" +msgstr "SVG" #: editor/import/resource_importer_texture.cpp msgid "" "Warning, no suitable PC VRAM compression enabled in Project Settings. This " "texture will not display correctly on PC." msgstr "" +"ê²½ê³ , 프로ì 트 ì„¤ì •ì—서 í™œì„±í™”ëœ ì ì ˆí•œ PC VRAM ì••ì¶•ì´ ì—†ìŠµë‹ˆë‹¤. ì´ í…스처는 " +"PCì—서 올바르게 표시ë˜ì§€ 않습니다." #: editor/import/resource_importer_texture_atlas.cpp msgid "Atlas File" @@ -7276,65 +7210,57 @@ msgid "Import Mode" msgstr "ê°€ì ¸ì˜¤ê¸° 모드" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Crop To Region" -msgstr "íƒ€ì¼ ì˜ì— ì„¤ì •" +msgstr "ì˜ì—으로 ìžë¥´ê¸°" #: editor/import/resource_importer_texture_atlas.cpp msgid "Trim Alpha Border From Region" -msgstr "" +msgstr "ì˜ì—ì—서 알파 í…Œë‘리 ìžë¥´ê¸°" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp -#, fuzzy msgid "Force" -msgstr "ì›ë³¸ 메시:" +msgstr "힘" #: editor/import/resource_importer_wav.cpp msgid "8 Bit" -msgstr "" +msgstr "8비트" #: editor/import/resource_importer_wav.cpp main/main.cpp #: modules/mono/editor/csharp_project.cpp modules/mono/godotsharp_dirs.cpp #: modules/mono/mono_gd/gd_mono.cpp msgid "Mono" -msgstr "" +msgstr "모노" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Max Rate" -msgstr "믹스 노드" +msgstr "최대 비율" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Max Rate Hz" -msgstr "믹스 노드" +msgstr "최대 ì†ë„ Hz" #: editor/import/resource_importer_wav.cpp msgid "Trim" -msgstr "" +msgstr "ì†ì§ˆ" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Normalize" -msgstr "형ì‹" +msgstr "ì •ê·œí™”" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop Mode" -msgstr "ì´ë™ 모드" +msgstr "루프 모드" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop Begin" -msgstr "ì´ë™ 모드" +msgstr "루프 시작" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp -#, fuzzy msgid "Loop End" -msgstr "ì´ë™ 모드" +msgstr "루프 종료" #: editor/import_defaults_editor.cpp msgid "Select Importer" @@ -7346,7 +7272,7 @@ msgstr "ìž„í¬í„°:" #: editor/import_defaults_editor.cpp msgid "Reset to Defaults" -msgstr "ë””í´íŠ¸ë¡œ ìž¬ì„¤ì •" +msgstr "기본값으로 ìž¬ì„¤ì •" #: editor/import_dock.cpp msgid "Keep File (No Import)" @@ -7358,11 +7284,11 @@ msgstr "íŒŒì¼ %dê°œ" #: editor/import_dock.cpp msgid "Set as Default for '%s'" -msgstr "'%s'ì„(를) ë””í´íŠ¸ë¡œ ì„¤ì •" +msgstr "기본값으로 '%s' ì„¤ì •" #: editor/import_dock.cpp msgid "Clear Default for '%s'" -msgstr "'%s'ì„(를) ë””í´íЏì—서 지우기" +msgstr "'%s'ì˜ ê¸°ë³¸ê°’ 지우기" #: editor/import_dock.cpp msgid "Reimport" @@ -7382,55 +7308,54 @@ msgstr "" #: editor/import_dock.cpp msgid "Import As:" -msgstr "ë‹¤ìŒ í˜•ì‹ìœ¼ë¡œ ê°€ì ¸ì˜¤ê¸°:" +msgstr "다ìŒìœ¼ë¡œ ê°€ì ¸ì˜¤ê¸°:" #: editor/import_dock.cpp msgid "Save Scenes, Re-Import, and Restart" -msgstr "씬 ì €ìž¥, 다시 ê°€ì ¸ì˜¤ê¸° ë° ë‹¤ì‹œ 시작" +msgstr "장면 ì €ìž¥, 다시 ê°€ì ¸ì˜¤ê¸° ë° ìž¬ì‹œìž‘" #: editor/import_dock.cpp msgid "Changing the type of an imported file requires editor restart." -msgstr "ê°€ì ¸ì˜¨ 파ì¼ì˜ íƒ€ìž…ì„ ë°”ê¾¸ë ¤ë©´ ì—디터를 다시 시작해야 합니다." +msgstr "ê°€ì ¸ì˜¨ 파ì¼ì˜ ìœ í˜•ì„ ë³€ê²½í•˜ë ¤ë©´ 편집기를 다시 시작해야 합니다." #: editor/import_dock.cpp msgid "" "WARNING: Assets exist that use this resource, they may stop loading properly." msgstr "" -"ê²½ê³ : ì´ ë¦¬ì†ŒìŠ¤ë¥¼ 사용하는 ì• ì…‹ì´ ìžˆìŠµë‹ˆë‹¤. ì •ìƒì 으로 불러오지 ëª»í• ìˆ˜ë„ ìžˆ" -"습니다." +"ê²½ê³ : ì´ ë¦¬ì†ŒìŠ¤ë¥¼ 사용하는 ì• ì…‹ì´ ìžˆìŠµë‹ˆë‹¤. ì •ìƒì 으로 불러오지 ëª»í• ìˆ˜ 있습" +"니다." #: editor/import_dock.cpp msgid "" "Select a resource file in the filesystem or in the inspector to adjust " "import settings." msgstr "" +"íŒŒì¼ ì‹œìŠ¤í…œ ë˜ëŠ” 검사기ì—서 리소스 파ì¼ì„ ì„ íƒí•˜ì—¬ ê°€ì ¸ì˜¤ê¸° ì„¤ì •ì„ ì¡°ì •í•˜ì‹ì‹œ" +"오." #: editor/inspector_dock.cpp msgid "Failed to load resource." -msgstr "리소스 ë¶ˆëŸ¬ì˜¤ê¸°ì— ì‹¤íŒ¨í–ˆìŠµë‹ˆë‹¤." +msgstr "리소스를 불러오지 못했습니다." #: editor/inspector_dock.cpp -#, fuzzy msgid "Property Name Style" -msgstr "프로ì 트 ì´ë¦„:" +msgstr "ì†ì„± ì´ë¦„ 스타ì¼" #: editor/inspector_dock.cpp scene/gui/color_picker.cpp msgid "Raw" -msgstr "Raw" +msgstr "RAW" #: editor/inspector_dock.cpp -#, fuzzy msgid "Capitalized" msgstr "대문ìžë¡œ 시작" #: editor/inspector_dock.cpp -#, fuzzy msgid "Localized" -msgstr "로케ì¼" +msgstr "현지화" #: editor/inspector_dock.cpp msgid "Localization not available for current language." -msgstr "" +msgstr "현재 언어로는 현지화가 불가능합니다." #: editor/inspector_dock.cpp msgid "Copy Properties" @@ -7973,9 +7898,8 @@ msgid "New" msgstr "새로 만들기" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Paste As Reference" -msgstr "%s í´ëž˜ìФ 참조" +msgstr "참조로 붙여넣기" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Transitions..." @@ -8303,7 +8227,7 @@ msgstr "í•„í„°..." #: editor/plugins/asset_library_editor_plugin.cpp scene/main/http_request.cpp msgid "Use Threads" -msgstr "" +msgstr "ìŠ¤ë ˆë“œ 사용" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Contents:" @@ -8430,9 +8354,8 @@ msgid "Download Error" msgstr "다운로드 오류" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgid "Available URLs" -msgstr "사용 가능한 프로필:" +msgstr "사용 가능한 URL" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -8467,28 +8390,24 @@ msgid "Loading..." msgstr "불러오는 중..." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "First" -msgstr "처ìŒìœ¼ë¡œ" +msgstr "처ìŒ" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Previous" msgstr "ì´ì „" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Next" msgstr "다ìŒ" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Last" -msgstr "ë으로" +msgstr "마지막" #: editor/plugins/asset_library_editor_plugin.cpp msgid "All" @@ -8536,7 +8455,7 @@ msgstr "테스트" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed to get repository configuration." -msgstr "" +msgstr "ì €ìž¥ì†Œ êµ¬ì„±ì„ ê°€ì ¸ì˜¤ì§€ 못했습니다." #: editor/plugins/asset_library_editor_plugin.cpp msgid "Assets ZIP File" @@ -8592,7 +8511,7 @@ msgstr "ë¼ì´íŠ¸ë§µ 굽기" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "LightMap Bake" -msgstr "" +msgstr "ë¼ì´íŠ¸ë§µ ë² ì´í‚¹" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Select lightmap bake file:" @@ -8902,9 +8821,8 @@ msgid "Alt+Drag: Move selected node." msgstr "Alt+드래그: ì„ íƒëœ 노드를 ì´ë™í•©ë‹ˆë‹¤." #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Alt+Drag: Scale selected node." -msgstr "Alt+드래그: ì„ íƒëœ 노드를 ì´ë™í•©ë‹ˆë‹¤." +msgstr "Alt+드래그: ì„ íƒí•œ ë…¸ë“œì˜ í¬ê¸°ë¥¼ ì¡°ì ˆí•©ë‹ˆë‹¤." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "V: Set selected node's pivot position." @@ -8937,7 +8855,7 @@ msgstr "ìŠ¤ì¼€ì¼ ëª¨ë“œ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Shift: Scale proportionally." -msgstr "" +msgstr "Shift: 비례ì 으로 ì¡°ì •í•©ë‹ˆë‹¤." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -9036,9 +8954,8 @@ msgstr "ì„ íƒëœ 오브ì 트를 ê·¸ ìžë¦¬ì— ìž ê¸‰ë‹ˆë‹¤ (움ì§ì¼ 수 ì—†ì #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Lock Selected Node(s)" -msgstr "ì„ íƒ í•목 ìž ê·¸ê¸°" +msgstr "ì„ íƒí•œ 노드 ìž ê¸ˆ" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -9047,9 +8964,8 @@ msgstr "ì„ íƒëœ 오브ì 트를 ìž ê¸ˆì—서 풉니다 (움ì§ì¼ 수 ìžˆìŠµë‹ #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Unlock Selected Node(s)" -msgstr "ì„ íƒ í•목 ìž ê¸ˆ 풀기" +msgstr "ì„ íƒí•œ 노드 ìž ê¸ˆ í•´ì œ" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -9058,9 +8974,8 @@ msgstr "오브ì íŠ¸ì˜ ìžì‹ì„ ì„ íƒí•˜ì§€ 않ë„ë¡ í•©ë‹ˆë‹¤." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Group Selected Node(s)" -msgstr "ì„ íƒ í•목 묶기" +msgstr "ì„ íƒí•œ 노드 그룹화" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp @@ -9069,9 +8984,8 @@ msgstr "오브ì íŠ¸ì˜ ìžì‹ì„ ì„ íƒí• 수 있ë„ë¡ ë³µì›í•©ë‹ˆë‹¤." #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Ungroup Selected Node(s)" -msgstr "ì„ íƒ í•목 ë¬¶ìŒ í’€ê¸°" +msgstr "ì„ íƒí•œ 노드 그룹 í•´ì œ" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Skeleton Options" @@ -9096,23 +9010,20 @@ msgid "View" msgstr "보기" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show" -msgstr "ê²©ìž ë³´ì´ê¸°" +msgstr "표시" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show When Snapping" -msgstr "스마트 스냅" +msgstr "ìŠ¤ëƒ…í• ë•Œ 표시" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Hide" -msgstr "" +msgstr "숨김" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle Grid" -msgstr "모드 í† ê¸€" +msgstr "í† ê¸€ 그리드" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -9463,16 +9374,15 @@ msgstr "기울기 편집ë¨" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap GradientTexture2D Fill Points" -msgstr "" +msgstr "ê·¸ë¼ë””언트í…스처2D 채우기 í¬ì¸íЏ êµì²´" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp msgid "Swap Gradient Fill Points" -msgstr "" +msgstr "ê·¸ë¼ë””언트 채우기 í¬ì¸íЏ êµì²´" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp -#, fuzzy msgid "Toggle Grid Snap" -msgstr "모드 í† ê¸€" +msgstr "í† ê¸€ 그리드 스냅" #: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp #: scene/3d/label_3d.cpp scene/gui/button.cpp scene/gui/dialogs.cpp @@ -9491,13 +9401,12 @@ msgstr "ì•„ì´ì½˜" #: editor/plugins/item_list_editor_plugin.cpp msgid "ID" -msgstr "" +msgstr "ID" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separator" -msgstr "간격:" +msgstr "분리 기호" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -9730,9 +9639,8 @@ msgstr "" "%s" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "MeshLibrary" -msgstr "메시 ë¼ì´ë¸ŒëŸ¬ë¦¬" +msgstr "메쉬 ë¼ì´ë¸ŒëŸ¬ë¦¬" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Add Item" @@ -9755,14 +9663,12 @@ msgid "Update from Scene" msgstr "씬ì—서 ì—…ë°ì´íЏ" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Apply without Transforms" -msgstr "MeshInstance 변형 ì ìš©" +msgstr "변환 ì—†ì´ ì ìš©" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Apply with Transforms" -msgstr "MeshInstance 변형 ì ìš©" +msgstr "변환과 함께 ì ìš©" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and no MultiMesh set in node)." @@ -10286,7 +10192,7 @@ msgstr "ë³¸ì„ í´ë¦¬ê³¤ì— ë™ê¸°í™”" #: editor/plugins/ray_cast_2d_editor_plugin.cpp msgid "Set cast_to" -msgstr "" +msgstr "cast_to ì„¤ì •" #: editor/plugins/resource_preloader_editor_plugin.cpp msgid "ERROR: Couldn't load resource!" @@ -10617,57 +10523,51 @@ msgstr "검색 ê²°ê³¼" #: editor/plugins/script_editor_plugin.cpp msgid "Open Dominant Script On Scene Change" -msgstr "" +msgstr "장면 변경 시 주요 스í¬ë¦½íЏ 열기" #: editor/plugins/script_editor_plugin.cpp msgid "External" -msgstr "" +msgstr "외부" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Use External Editor" -msgstr "외부 ì—디터로 디버깅" +msgstr "외부 편집기 사용" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Exec Path" -msgstr "경로 내보내기" +msgstr "실행 경로" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Script Temperature Enabled" -msgstr "템플릿 íŒŒì¼ ì„ íƒ" +msgstr "스í¬ë¦½íЏ ì˜¨ë„ í™œì„±í™”ë¨" #: editor/plugins/script_editor_plugin.cpp msgid "Highlight Current Script" -msgstr "" +msgstr "현재 스í¬ë¦½íЏ ê°•ì¡° 표시" #: editor/plugins/script_editor_plugin.cpp msgid "Script Temperature History Size" -msgstr "" +msgstr "스í¬ë¦½íЏ ì˜¨ë„ ê¸°ë¡ í¬ê¸°" #: editor/plugins/script_editor_plugin.cpp msgid "Current Script Background Color" msgstr "현재 스í¬ë¦½íЏ ë°°ê²½ 색" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Group Help Pages" -msgstr "ì„ íƒ í•목 묶기" +msgstr "그룹 ë„ì›€ë§ íŽ˜ì´ì§€" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort Scripts By" -msgstr "스í¬ë¦½íЏ 만들기" +msgstr "스í¬ë¦½íЏ ì •ë ¬ 기준" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "List Script Names As" -msgstr "스í¬ë¦½íЏ ì´ë¦„:" +msgstr "스í¬ë¦½íЏ ì´ë¦„ 나열" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" -msgstr "" +msgstr "실행 플래그" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Scripts" @@ -10823,9 +10723,8 @@ msgid "Find in Files..." msgstr "파ì¼ì—서 찾기..." #: editor/plugins/script_text_editor.cpp -#, fuzzy msgid "Replace in Files..." -msgstr "바꾸기..." +msgstr "파ì¼ì—서 바꾸기..." #: editor/plugins/script_text_editor.cpp msgid "Contextual Help" @@ -11029,15 +10928,13 @@ msgstr "ì´ë™" #. TRANSLATORS: Refers to changing the scale of a node in the 3D editor. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling:" -msgstr "í¬ê¸° ì¡°ì ˆ 중: " +msgstr "스케ì¼ë§:" #. TRANSLATORS: Refers to changing the position of a node in the 3D editor. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating:" -msgstr "ì´ë™ 중: " +msgstr "ë²ˆì— ì¤‘:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -11185,13 +11082,14 @@ msgstr "시네마틱 미리보기" #: editor/plugins/spatial_editor_plugin.cpp msgid "(Not in GLES2)" -msgstr "" +msgstr "(GLES2ì—는 ì—†ìŒ)" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "" "Debug draw modes are only available when using the GLES3 renderer, not GLES2." -msgstr "GLES2 ë Œë”러ì—서 ì‚¬ìš©í• ìˆ˜ 없습니다." +msgstr "" +"디버그 그리기 모드는 GLES2ê°€ 아닌 GLES3 ë Œë”러를 ì‚¬ìš©í• ë•Œë§Œ ì‚¬ìš©í• ìˆ˜ 있습니" +"다." #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" @@ -11354,16 +11252,15 @@ msgstr "ìžìœ 시ì í† ê¸€" #: editor/plugins/spatial_editor_plugin.cpp msgid "Decrease Field of View" -msgstr "" +msgstr "시야 ê°ì†Œ" #: editor/plugins/spatial_editor_plugin.cpp msgid "Increase Field of View" -msgstr "" +msgstr "시야 확대" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Reset Field of View to Default" -msgstr "ë””í´íŠ¸ë¡œ ìž¬ì„¤ì •" +msgstr "시야를 기본값으로 ìž¬ì„¤ì •" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Object to Floor" @@ -11484,16 +11381,15 @@ msgstr "후" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Size" -msgstr "" +msgstr "조작기 기즈모 í¬ê¸°" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Opacity" -msgstr "" +msgstr "조작기 기즈모 불투명ë„" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Show Viewport Rotation Gizmo" -msgstr "ë·° íšŒì „ ìž ê¸ˆ" +msgstr "ë·°í¬íЏ íšŒì „ 기즈모 표시" #: editor/plugins/spatial_editor_plugin.cpp msgid "Unnamed Gizmo" @@ -11544,9 +11440,8 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "ìž˜ëª»ëœ ì§€ì˜¤ë©”íŠ¸ë¦¬. 메시로 ëŒ€ì²´í• ìˆ˜ 없습니다." #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Convert to MeshInstance2D" -msgstr "Mesh2D로 변환" +msgstr "메쉬ì¸ìŠ¤í„´ìŠ¤2D로 변환" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." @@ -11577,19 +11472,16 @@ msgid "Sprite" msgstr "스프ë¼ì´íЏ" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Simplification:" -msgstr "단순화: " +msgstr "단순화:" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels):" -msgstr "수축 (픽셀): " +msgstr "축소(픽셀):" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Grow (Pixels):" -msgstr "성장 (픽셀): " +msgstr "확대(픽셀):" #: editor/plugins/sprite_editor_plugin.cpp msgid "Update Preview" @@ -11652,9 +11544,8 @@ msgid "New Animation" msgstr "새 ì• ë‹ˆë©”ì´ì…˜" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "메서드 í•„í„°" +msgstr "ì• ë‹ˆë©”ì´ì…˜ í•„í„°ë§" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -11953,9 +11844,8 @@ msgstr "" "ë¬´ì‹œí•˜ê³ ë‹«ìœ¼ì‹œê² ìŠµë‹ˆê¹Œ?" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Type" -msgstr "íƒ€ì¼ ì œê±°" +msgstr "ìœ í˜• ì œê±°" #: editor/plugins/theme_editor_plugin.cpp msgid "" @@ -11998,14 +11888,12 @@ msgstr "" "ì§ì ‘ ë˜ëŠ” 다른 테마ì—서 ê°€ì ¸ì™€ì„œ í…Œë§ˆì— ë” ë§Žì€ í•ëª©ì„ ì¶”ê°€í•˜ì„¸ìš”." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Theme Type" -msgstr "í•목 타입 추가" +msgstr "테마 ìœ í˜• 추가" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Theme Type" -msgstr "í•목 ì œê±°" +msgstr "테마 ìœ í˜• ì œê±°" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Color Item" @@ -12120,9 +12008,8 @@ msgid "Select Another Theme Resource:" msgstr "다른 테마 리소스 ì„ íƒ:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme Resource" -msgstr "리소스 ì´ë¦„ 바꾸기" +msgstr "테마 리소스" #: editor/plugins/theme_editor_plugin.cpp msgid "Another Theme" @@ -12134,22 +12021,19 @@ msgstr "타입 추가" #: editor/plugins/theme_editor_plugin.cpp msgid "Filter the list of types or create a new custom type:" -msgstr "" +msgstr "ìœ í˜• 목ë¡ì„ í•„í„°ë§í•˜ê±°ë‚˜ 새 ì‚¬ìš©ìž ì •ì˜ ìœ í˜•ì„ ë§Œë“œì„¸ìš”:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Available Node-based types:" -msgstr "사용 가능한 프로필:" +msgstr "사용 가능한 노드 기반 ìœ í˜•:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Type name is empty!" -msgstr "íŒŒì¼ ì´ë¦„ì´ ë¹„ì—ˆìŠµë‹ˆë‹¤." +msgstr "ìœ í˜• ì´ë¦„ì´ ë¹„ì–´ 있습니다!" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Are you sure you want to create an empty type?" -msgstr "ë‘ ê°œ ì´ìƒì˜ 프로ì 트를 ì—¬ì‹œê² ìŠµë‹ˆê¹Œ?" +msgstr "빈 ìœ í˜•ì„ ë§Œë“œì‹œê² ìŠµë‹ˆê¹Œ?" #: editor/plugins/theme_editor_plugin.cpp msgid "Confirm Item Rename" @@ -12180,14 +12064,12 @@ msgid "Add Item Type" msgstr "í•목 타입 추가" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Set Variation Base Type" -msgstr "변수 타입 ì„¤ì •" +msgstr "변형 기본 ìœ í˜• ì„¤ì •" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Set Base Type" -msgstr "기본 타입 바꾸기" +msgstr "기본 ìœ í˜• ì„¤ì •" #: editor/plugins/theme_editor_plugin.cpp msgid "Show Default" @@ -12207,13 +12089,13 @@ msgstr "ëª¨ë“ ë””í´íЏ 타입 í•ëª©ì„ ì˜¤ë²„ë¼ì´ë“œí•©ë‹ˆë‹¤." #: editor/plugins/theme_editor_plugin.cpp msgid "Select the variation base type from a list of available types." -msgstr "" +msgstr "사용 가능한 ìœ í˜• 목ë¡ì—서 변형 기본 ìœ í˜•ì„ ì„ íƒí•©ë‹ˆë‹¤." #: editor/plugins/theme_editor_plugin.cpp msgid "" "A type associated with a built-in class cannot be marked as a variation of " "another type." -msgstr "" +msgstr "내장 í´ëž˜ìŠ¤ì™€ ì—°ê²°ëœ ìœ í˜•ì€ ë‹¤ë¥¸ ìœ í˜•ì˜ ë³€í˜•ìœ¼ë¡œ í‘œì‹œí• ìˆ˜ 없습니다." #: editor/plugins/theme_editor_plugin.cpp msgid "Theme:" @@ -12450,55 +12332,46 @@ msgid "Clear Transform" msgstr "변형 지우기" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Tile Map" -msgstr "타ì¼ë§µ ì¹ í•˜ê¸°" +msgstr "íƒ€ì¼ ë§µ" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Palette Min Width" -msgstr "" +msgstr "íŒ”ë ˆíŠ¸ 최소 너비" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Palette Item H Separation" -msgstr "ì´ë¦„ 있는 구분ìž" +msgstr "íŒ”ë ˆíŠ¸ í•목 H 분리" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Show Tile Names" -msgstr "ëª¨ë“ ë¡œì¼€ì¼ ë³´ì´ê¸°" +msgstr "íƒ€ì¼ ì´ë¦„ 표시" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Show Tile Ids" -msgstr "ìž ë³´ì´ê¸°" +msgstr "íƒ€ì¼ ì•„ì´ë”” 표시" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Sort Tiles By Name" -msgstr "íŒŒì¼ ì •ë ¬" +msgstr "ì´ë¦„별로 íƒ€ì¼ ì •ë ¬" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Bucket Fill Preview" -msgstr "버킷 채우기" +msgstr "버킷 채우기 미리보기" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Editor Side" -msgstr "ì—디터" +msgstr "편집기 사ì´ë“œ" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Display Grid" -msgstr "오버드로 표시" +msgstr "그리드 표시" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Axis Color" -msgstr "ìƒ‰ìƒ ì„ íƒ" +msgstr "ì¶• 색ìƒ" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Add Texture(s) to TileSet." @@ -12560,7 +12433,7 @@ msgstr "ì½œë¦¬ì „" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Occlusion" -msgstr "오í´ë£¨ì „" +msgstr "ì°¨í" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/touch_screen_button.cpp msgid "Bitmask" @@ -12835,7 +12708,6 @@ msgid "This property can't be changed." msgstr "ì´ ì†ì„±ì€ 바꿀 수 없습니다." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Snap Options" msgstr "스냅 ì„¤ì •" @@ -12845,9 +12717,10 @@ msgstr "스냅 ì„¤ì •" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "오프셋" @@ -12860,14 +12733,12 @@ msgstr "단계" #: editor/plugins/tile_set_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separation" -msgstr "간격:" +msgstr "분리" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Tile" -msgstr "ì„ íƒ" +msgstr "ì„ íƒí•œ 타ì¼" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/light_2d.cpp scene/2d/line_2d.cpp scene/2d/mesh_instance_2d.cpp @@ -12876,14 +12747,12 @@ msgstr "ì„ íƒ" #: scene/gui/nine_patch_rect.cpp scene/gui/texture_rect.cpp #: scene/resources/material.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Texture" -msgstr "í…스트" +msgstr "í…스ì³" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tex Offset" -msgstr "ê²©ìž ì˜¤í”„ì…‹:" +msgstr "í…스 오프셋" #: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp @@ -12893,112 +12762,95 @@ msgstr "머티리얼" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Modulate" -msgstr "만들기" +msgstr "변조" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tile Mode" -msgstr "모드 í† ê¸€" +msgstr "íƒ€ì¼ ëª¨ë“œ" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Autotile Bitmask Mode" -msgstr "비트 ë§ˆìŠ¤í¬ ëª¨ë“œ" +msgstr "ì˜¤í† íƒ€ì¼ ë¹„íŠ¸ë§ˆìŠ¤í¬ ëª¨ë“œ" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Subtile Size" -msgstr "ìœ¤ê³½ì„ í¬ê¸°:" +msgstr "ì„œë¸Œíƒ€ì¼ í¬ê¸°" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Subtile Spacing" -msgstr "ì• ë‹ˆë©”ì´ì…˜ 반복" +msgstr "ì„œë¸Œíƒ€ì¼ ê°„ê²©" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occluder Offset" -msgstr "Occluder í´ë¦¬ê³¤ 만들기" +msgstr "오í´ë£¨ë” 오프셋" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation Offset" -msgstr "내비게ì´ì…˜ 모드" +msgstr "내비게ì´ì…˜ 오프셋" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Shape Offset" -msgstr "오프셋:" +msgstr "모양 오프셋" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Shape Transform" -msgstr "변형" +msgstr "모양 변형" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision" -msgstr "ì½œë¦¬ì „" +msgstr "ì„ íƒëœ ì¶©ëŒ" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision One Way" -msgstr "ì„ íƒ ì˜ì—ë§Œ" +msgstr "ì„ íƒëœ 단방향 ì¶©ëŒ" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision One Way Margin" -msgstr "ì½œë¦¬ì „ 모드" +msgstr "ì„ íƒëœ 단방향 ì¶©ëŒ ì—¬ë°±" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Navigation" -msgstr "내비게ì´ì…˜ ë³´ì´ê¸°" +msgstr "ì„ íƒí•œ 내비게ì´ì…˜" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Occlusion" -msgstr "ì„ íƒ" +msgstr "ì„ íƒëœ ì°¨í" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tileset Script" -msgstr "스í¬ë¦½íЏ í•„í„°" +msgstr "타ì¼ì…‹ 스í¬ë¦½íЏ" #: editor/plugins/tile_set_editor_plugin.cpp msgid "TileSet" msgstr "타ì¼ì…‹" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No VCS plugins are available." -msgstr "ì´ìš©í• 수 있는 ë²„ì „ 관리 시스템(VCS)ì´ ì—†ìŠµë‹ˆë‹¤." +msgstr "VCS 플러그ì¸ì„ ì‚¬ìš©í• ìˆ˜ 없습니다." #: editor/plugins/version_control_editor_plugin.cpp msgid "" "Remote settings are empty. VCS features that use the network may not work." msgstr "" +"ì›ê²© ì„¤ì •ì´ ë¹„ì–´ 있습니다. 네트워í¬ë¥¼ 사용하는 VCS ê¸°ëŠ¥ì´ ìž‘ë™í•˜ì§€ ì•Šì„ ìˆ˜ 있" +"습니다." #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "No commit message was provided." -msgstr "ì´ë¦„ì„ ì œê³µí•˜ì§€ 않았습니다." +msgstr "커밋 메시지가 ì œê³µë˜ì§€ 않았습니다." #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit" msgstr "커밋" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Staged Changes" -msgstr "ì…°ì´ë” 바꾸기:" +msgstr "단계ì 변경" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Unstaged Changes" -msgstr "ì…°ì´ë” 바꾸기:" +msgstr "비단계ì 변경" #: editor/plugins/version_control_editor_plugin.cpp msgid "Commit:" @@ -13006,26 +12858,23 @@ msgstr "커밋:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Date:" -msgstr "" +msgstr "ë‚ ì§œ:" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Subtitle:" -msgstr "하위 트리" +msgstr "ë¶€ì œ:" #: editor/plugins/version_control_editor_plugin.cpp msgid "Do you want to remove the %s branch?" -msgstr "" +msgstr "%s 분기를 ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Do you want to remove the %s remote?" -msgstr "ë‘ ê°œ ì´ìƒì˜ 프로ì 트를 ì—¬ì‹œê² ìŠµë‹ˆê¹Œ?" +msgstr "%s 리모트를 ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ?" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Apply" -msgstr "ìž¬ì„¤ì • ì ìš©" +msgstr "ì ìš©" #: editor/plugins/version_control_editor_plugin.cpp msgid "Version Control System" @@ -14037,11 +13886,13 @@ msgstr "실행가능" #: editor/project_export.cpp msgid "Export the project for all the presets defined." -msgstr "" +msgstr "ì •ì˜ëœ ëª¨ë“ ì‚¬ì „ ì„¤ì •ì˜ í”„ë¡œì 트를 내보냅니다." #: editor/project_export.cpp msgid "All presets must have an export path defined for Export All to work." msgstr "" +"ëª¨ë“ ì‚¬ì „ ì„¤ì •ì—는 ëª¨ë‘ ë‚´ë³´ë‚´ê¸°ê°€ ìž‘ë™í•˜ë„ë¡ ì •ì˜ëœ 내보내기 경로가 있어야 " +"합니다." #: editor/project_export.cpp msgid "Delete preset '%s'?" @@ -14152,11 +14003,12 @@ msgid "" "Note: Encryption key needs to be stored in the binary,\n" "you need to build the export templates from source." msgstr "" +"ì°¸ê³ : 암호화 키는 ë°”ì´ë„ˆë¦¬ì— ì €ìž¥ë˜ì–´ì•¼ 하며,\n" +"소스ì—서 내보내기 í…œí”Œë¦¿ì„ ë¹Œë“œí•´ì•¼ 합니다." #: editor/project_export.cpp -#, fuzzy msgid "More Info..." -msgstr "여기로 ì´ë™..." +msgstr "추가 ì •ë³´..." #: editor/project_export.cpp msgid "Export PCK/Zip..." @@ -14183,18 +14035,16 @@ msgid "ZIP File" msgstr "ZIP 파ì¼" #: editor/project_export.cpp -#, fuzzy msgid "Godot Project Pack" -msgstr "Godot 게임 팩" +msgstr "Godot 프로ì 트 팩" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" msgstr "ì´ í”Œëž«í¼ì— 대한 내보내기 í…œí”Œë¦¿ì´ ëˆ„ë½ë¨:" #: editor/project_export.cpp -#, fuzzy msgid "Project Export" -msgstr "프로ì 트 창립ìž" +msgstr "프로ì 트 내보내기" #: editor/project_export.cpp msgid "Manage Export Templates" @@ -14260,16 +14110,17 @@ msgid "Invalid project path (changed anything?)." msgstr "ìž˜ëª»ëœ í”„ë¡œì 트 경로 (무언가를 변경하셨습니까?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "프로ì 트 경로ì—서 project.godotì„ ë¶ˆëŸ¬ì˜¬ 수 없습니다 (오류 %d). 누ë½ë˜ê±°ë‚˜ ì†" "ìƒëœ 모양입니다." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "프로ì 트 경로ì—서 project.godot 파ì¼ì„ íŽ¸ì§‘í• ìˆ˜ 없습니다." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "'%s'ì—서 프로ì 트를 ì—´ 수 없습니다." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -14501,7 +14352,6 @@ msgstr "" #. TRANSLATORS: This refers to the application where users manage their Godot projects. #: editor/project_manager.cpp -#, fuzzy msgctxt "Application" msgid "Project Manager" msgstr "프로ì 트 ë§¤ë‹ˆì €" @@ -15255,6 +15105,9 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"ì´ë¯¸ ì¸ìŠ¤í„´ìŠ¤í™”ëœ ìž¥ë©´ì˜ í•˜ìœ„ í•ëª©ì¸ ë¶„ê¸°ë¥¼ ì €ìž¥í• ìˆ˜ 없습니다.\n" +"ì´ ë¶„ê¸°ë¥¼ ìžì²´ ìž¥ë©´ì— ì €ìž¥í•˜ë ¤ë©´ ì›ë³¸ ìž¥ë©´ì„ ì—´ê³ ì´ ë¶„ê¸°ë¥¼ 마우스 오른쪽 버" +"튼으로 í´ë¦í•œ ë‹¤ìŒ \"분기를 장면으로 ì €ìž¥\"ì„ ì„ íƒí•˜ì„¸ìš”." #: editor/scene_tree_dock.cpp msgid "" @@ -15262,6 +15115,9 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"ìƒì†ëœ ìž¥ë©´ì˜ ì¼ë¶€ì¸ 분기를 ì €ìž¥í• ìˆ˜ 없습니다.\n" +"ì´ ë¶„ê¸°ë¥¼ ìžì²´ ìž¥ë©´ì— ì €ìž¥í•˜ë ¤ë©´ ì›ë³¸ ìž¥ë©´ì„ ì—´ê³ ì´ ë¶„ê¸°ë¥¼ 마우스 오른쪽 버" +"튼으로 í´ë¦í•œ ë‹¤ìŒ \"분기를 장면으로 ì €ìž¥\"ì„ ì„ íƒí•˜ì„¸ìš”." #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." @@ -15291,9 +15147,8 @@ msgid "Enable Scene Unique Name(s)" msgstr "씬 ê³ ìœ ì´ë¦„ 활성화" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Unique names already used by another node in the scene:" -msgstr "ì´ë¯¸ 다른 함수/변수/시그ë„로 ì‚¬ìš©ëœ ì´ë¦„:" +msgstr "ìž¥ë©´ì˜ ë‹¤ë¥¸ 노드ì—서 ì´ë¯¸ 사용 ì¤‘ì¸ ê³ ìœ ì´ë¦„:" #: editor/scene_tree_dock.cpp msgid "Disable Scene Unique Name(s)" @@ -15372,7 +15227,7 @@ msgstr "하위 리소스" #: editor/scene_tree_dock.cpp msgid "Access as Scene Unique Name" -msgstr "" +msgstr "장면 ê³ ìœ ì´ë¦„으로 액세스" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" @@ -15469,18 +15324,16 @@ msgid "Clear Inheritance? (No Undo!)" msgstr "ìƒì†ì„ 지울까요? (ë˜ëŒë¦´ 수 없습니다!)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Show Scene Tree Root Selection" -msgstr "ì„ íƒ í•목 중앙으로" +msgstr "장면 트리 루트 ì„ íƒ í‘œì‹œ" #: editor/scene_tree_dock.cpp msgid "Derive Script Globals By Name" -msgstr "" +msgstr "ì´ë¦„으로 스í¬ë¦½íЏ ì „ì— íŒŒìƒ" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Use Favorites Root Selection" -msgstr "í”„ë ˆìž„ ì„ íƒ" +msgstr "ì¦ê²¨ì°¾ê¸° 루트 ì„ íƒ ì‚¬ìš©" #: editor/scene_tree_editor.cpp msgid "Toggle Visible" @@ -15512,6 +15365,9 @@ msgid "" "with the '%s' prefix in a node path.\n" "Click to disable this." msgstr "" +"ì´ ë…¸ë“œëŠ” 노드 경로ì—서 '%s' ì ‘ë‘사를 ì•žì— ë¶™ì—¬ ìž¥ë©´ì˜ ì–´ëŠ ê³³ì—서나 액세스" +"í• ìˆ˜ 있습니다.\n" +"ë¹„í™œì„±í™”í•˜ë ¤ë©´ í´ë¦í•˜ì„¸ìš”." #: editor/scene_tree_editor.cpp msgid "" @@ -15575,7 +15431,7 @@ msgstr "ìž˜ëª»ëœ ë…¸ë“œ ì´ë¦„입니다. ë‹¤ìŒ ë¬¸ìžëŠ” 허용하지 ì•ŠìŠµë‹ #: editor/scene_tree_editor.cpp msgid "Another node already uses this unique name in the scene." -msgstr "" +msgstr "다른 노드가 ì´ë¯¸ 장면ì—서 ì´ ê³ ìœ í•œ ì´ë¦„ì„ ì‚¬ìš©í•˜ê³ ìžˆìŠµë‹ˆë‹¤." #: editor/scene_tree_editor.cpp msgid "Rename Node" @@ -15802,21 +15658,20 @@ msgid "Stack Frames" msgstr "ìŠ¤íƒ í”„ë ˆìž„" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Filter stack variables" -msgstr "íƒ€ì¼ í•„í„°" +msgstr "ìŠ¤íƒ ë³€ìˆ˜ í•„í„°ë§" #: editor/script_editor_debugger.cpp msgid "Auto Switch To Remote Scene Tree" -msgstr "" +msgstr "ì›ê²© 장면 트리로 ìžë™ ì „í™˜" #: editor/script_editor_debugger.cpp msgid "Remote Scene Tree Refresh Interval" -msgstr "" +msgstr "ì›ê²© 장면 트리 새로 ê³ ì¹¨ 간격" #: editor/script_editor_debugger.cpp msgid "Remote Inspect Refresh Interval" -msgstr "" +msgstr "ì›ê²© 검사 새로 ê³ ì¹¨ 간격" #: editor/script_editor_debugger.cpp msgid "Network Profiler" @@ -15914,7 +15769,7 @@ msgstr "ë¼ì´íЏ 반경 바꾸기" #: editor/spatial_editor_gizmos.cpp msgid "Stream Player 3D" -msgstr "" +msgstr "스트림 í”Œë ˆì´ì–´ 3D" #: editor/spatial_editor_gizmos.cpp msgid "Change AudioStreamPlayer3D Emission Angle" @@ -15924,7 +15779,7 @@ msgstr "AudioStreamPlayer3D ë°©ì¶œ ê°ë„ 바꾸기" #: platform/osx/export/export.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Camera" -msgstr "" +msgstr "ì¹´ë©”ë¼" #: editor/spatial_editor_gizmos.cpp msgid "Change Camera FOV" @@ -15936,7 +15791,7 @@ msgstr "ì¹´ë©”ë¼ í¬ê¸° 바꾸기" #: editor/spatial_editor_gizmos.cpp msgid "Visibility Notifier" -msgstr "" +msgstr "가시성 알리미" #: editor/spatial_editor_gizmos.cpp msgid "Change Notifier AABB" @@ -15947,18 +15802,16 @@ msgid "Change Particles AABB" msgstr "íŒŒí‹°í´ AABB 바꾸기" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Reflection Probe" -msgstr "ì†ì„± ì„ íƒ" +msgstr "반사 프로브" #: editor/spatial_editor_gizmos.cpp msgid "Change Probe Extents" msgstr "프로브 범위 바꾸기" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "GI Probe" -msgstr "GI 프로브 굽기" +msgstr "GI 프로브" #: editor/spatial_editor_gizmos.cpp msgid "Baked Indirect Light" @@ -15993,57 +15846,52 @@ msgid "Change Ray Shape Length" msgstr "ê´‘ì„ ëª¨ì–‘ ê¸¸ì´ ë°”ê¾¸ê¸°" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Edge" -msgstr "내비게ì´ì…˜ 모드" +msgstr "내비게ì´ì…˜ 엣지" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Edge Disabled" -msgstr "내비게ì´ì…˜ 모드" +msgstr "내비게ì´ì…˜ 엣지 비활성화" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Solid" -msgstr "내비게ì´ì…˜ 모드" +msgstr "내비게ì´ì…˜ 솔리드" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Navigation Solid Disabled" -msgstr "내비게ì´ì…˜ 모드" +msgstr "내비게ì´ì…˜ 솔리드 비활성화ë¨" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body A" -msgstr "" +msgstr "ì¡°ì¸íЏ 바디 A" #: editor/spatial_editor_gizmos.cpp msgid "Joint Body B" -msgstr "" +msgstr "ì¡°ì¸íЏ 바디 B" #: editor/spatial_editor_gizmos.cpp msgid "Room Edge" -msgstr "" +msgstr "ë°© 가장ìžë¦¬" #: editor/spatial_editor_gizmos.cpp msgid "Room Overlap" -msgstr "" +msgstr "룸 겹침" #: editor/spatial_editor_gizmos.cpp msgid "Set Room Point Position" -msgstr "룸 ì 위치 ì„¤ì •" +msgstr "룸 í¬ì¸íЏ 위치 ì„¤ì •" #: editor/spatial_editor_gizmos.cpp scene/3d/portal.cpp -#, fuzzy msgid "Portal Margin" -msgstr "여백 ì„¤ì •" +msgstr "í¬í„¸ 여백" #: editor/spatial_editor_gizmos.cpp msgid "Portal Edge" -msgstr "" +msgstr "í¬í„¸ 엣지" #: editor/spatial_editor_gizmos.cpp msgid "Portal Arrow" -msgstr "" +msgstr "í¬í„¸ ì• ë¡œìš°" #: editor/spatial_editor_gizmos.cpp msgid "Set Portal Point Position" @@ -16051,18 +15899,16 @@ msgstr "í¬í„¸ ì 위치 ì„¤ì •" #: editor/spatial_editor_gizmos.cpp msgid "Portal Front" -msgstr "" +msgstr "í¬í„¸ ì „ë©´" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Portal Back" -msgstr "뒤로" +msgstr "í¬í„¸ 뒤로" #: editor/spatial_editor_gizmos.cpp scene/2d/light_occluder_2d.cpp #: scene/2d/tile_map.cpp -#, fuzzy msgid "Occluder" -msgstr "ì–´í´ë£¨ì „ 모드" +msgstr "오í´ë£¨ë”" #: editor/spatial_editor_gizmos.cpp msgid "Set Occluder Sphere Radius" @@ -16073,109 +15919,98 @@ msgid "Set Occluder Sphere Position" msgstr "ì–´í´ë£¨ë” 구체 위치 ì„¤ì •" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Polygon Point Position" -msgstr "í¬í„¸ ì 위치 ì„¤ì •" +msgstr "오í´ë£¨ë” í´ë¦¬ê³¤ í¬ì¸íЏ 위치 ì„¤ì •" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Hole Point Position" -msgstr "ê³¡ì„ ì 위치 ì„¤ì •" +msgstr "오í´ë£¨ë” 홀 í¬ì¸íЏ 위치 ì„¤ì •" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Polygon Front" -msgstr "Occluder í´ë¦¬ê³¤ 만들기" +msgstr "오í´ë£¨ë” í´ë¦¬ê³¤ í”„ë¡ íŠ¸" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Polygon Back" -msgstr "Occluder í´ë¦¬ê³¤ 만들기" +msgstr "오í´ë£¨ë” í´ë¦¬ê³¤ ë°±" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Hole" -msgstr "Occluder í´ë¦¬ê³¤ 만들기" +msgstr "오í´ë£¨ë” 홀" #: main/main.cpp msgid "Godot Physics" -msgstr "" +msgstr "Godot 물리" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp msgid "Use BVH" -msgstr "" +msgstr "BVH 사용" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp -#, fuzzy msgid "BVH Collision Margin" -msgstr "ì½œë¦¬ì „ 모드" +msgstr "BVH ì¶©ëŒ ì—¬ë°±" #: main/main.cpp -#, fuzzy msgid "Crash Handler" -msgstr "핸들 ì„¤ì •" +msgstr "ì¶©ëŒ ì²˜ë¦¬ê¸°" #: main/main.cpp -#, fuzzy msgid "Multithreaded Server" -msgstr "다중 노드 ì„¤ì •" +msgstr "ë©€í‹°ìŠ¤ë ˆë“œ 서버" #: main/main.cpp msgid "RID Pool Prealloc" -msgstr "" +msgstr "RID í’€ ì‚¬ì „ í• ë‹¹" #: main/main.cpp -#, fuzzy msgid "Debugger stdout" -msgstr "디버거" +msgstr "디버거 표준 ì¶œë ¥" #: main/main.cpp msgid "Max Chars Per Second" -msgstr "" +msgstr "초당 최대 문ìž" #: main/main.cpp msgid "Max Messages Per Frame" -msgstr "" +msgstr "í”„ë ˆìž„ë‹¹ 최대 메시지" #: main/main.cpp msgid "Max Errors Per Second" -msgstr "" +msgstr "초당 최대 오류" #: main/main.cpp msgid "Max Warnings Per Second" -msgstr "" +msgstr "초당 최대 ê²½ê³ " #: main/main.cpp msgid "Flush stdout On Print" -msgstr "" +msgstr "ì¸ì‡„ 시 stdout 플러시" #: main/main.cpp servers/visual_server.cpp msgid "Logging" -msgstr "" +msgstr "로깅" #: main/main.cpp msgid "File Logging" -msgstr "" +msgstr "íŒŒì¼ ë¡œê¹…" #: main/main.cpp -#, fuzzy msgid "Enable File Logging" -msgstr "í•„í„° 활성화" +msgstr "íŒŒì¼ ë¡œê¹… 활성화" #: main/main.cpp -#, fuzzy msgid "Log Path" -msgstr "경로 복사" +msgstr "로그 경로" #: main/main.cpp msgid "Max Log Files" -msgstr "" +msgstr "최대 로그 파ì¼" #: main/main.cpp msgid "Driver" -msgstr "" +msgstr "드ë¼ì´ë²„" #: main/main.cpp msgid "Driver Name" @@ -16183,85 +16018,77 @@ msgstr "드ë¼ì´ë²„ ì´ë¦„" #: main/main.cpp msgid "Fallback To GLES2" -msgstr "" +msgstr "GLES2로 대체" #: main/main.cpp msgid "Use Nvidia Rect Flicker Workaround" -msgstr "" +msgstr "Nvidia Rect 깜박임 í•´ê²° 방법 사용" #: main/main.cpp msgid "DPI" -msgstr "" +msgstr "DPI" #: main/main.cpp msgid "Allow hiDPI" -msgstr "" +msgstr "hiDPI 허용" #: main/main.cpp -#, fuzzy msgid "V-Sync" -msgstr "ë™ê¸°í™”" +msgstr "수ì§ë™ê¸°í™”" #: main/main.cpp -#, fuzzy msgid "Use V-Sync" -msgstr "스냅 사용" +msgstr "V-Sync 사용" #: main/main.cpp msgid "Per Pixel Transparency" -msgstr "" +msgstr "픽셀당 투명ë„" #: main/main.cpp msgid "Allowed" -msgstr "" +msgstr "허용ë¨" #: main/main.cpp msgid "Intended Usage" -msgstr "" +msgstr "사용 목ì " #: main/main.cpp -#, fuzzy msgid "Framebuffer Allocation" -msgstr "í”„ë ˆìž„ ì„ íƒ" +msgstr "í”„ë ˆìž„ ë²„í¼ í• ë‹¹" #: main/main.cpp platform/uwp/os_uwp.cpp -#, fuzzy msgid "Energy Saving" -msgstr "ì €ìž¥ 중 오류" +msgstr "ì—너지 ì ˆì•½" #: main/main.cpp msgid "Threads" -msgstr "" +msgstr "ìŠ¤ë ˆë“œ" #: main/main.cpp servers/physics_2d/physics_2d_server_wrap_mt.h -#, fuzzy msgid "Thread Model" -msgstr "모드 í† ê¸€" +msgstr "ìŠ¤ë ˆë“œ 모ë¸" #: main/main.cpp msgid "Thread Safe BVH" -msgstr "" +msgstr "ìŠ¤ë ˆë“œ 세ì´í”„ BVH" #: main/main.cpp msgid "Handheld" -msgstr "" +msgstr "휴대용" #: main/main.cpp platform/javascript/export/export.cpp #: platform/uwp/export/export.cpp -#, fuzzy msgid "Orientation" -msgstr "온ë¼ì¸ 문서" +msgstr "오리엔테ì´ì…˜" #: main/main.cpp scene/gui/scroll_container.cpp scene/gui/text_edit.cpp #: scene/main/scene_tree.cpp scene/register_scene_types.cpp -#, fuzzy msgid "Common" -msgstr "커뮤니티" +msgstr "ì¼ë°˜" #: main/main.cpp -#, fuzzy msgid "Physics FPS" -msgstr "물리 í”„ë ˆìž„ %" +msgstr "물리 FPS" #: main/main.cpp msgid "Force FPS" @@ -16269,177 +16096,163 @@ msgstr "FPS ê°•ì œ" #: main/main.cpp msgid "Enable Pause Aware Picking" -msgstr "" +msgstr "ì¼ì‹œ 중지 ì¸ì‹ ì„ íƒ í™œì„±í™”" #: main/main.cpp scene/gui/item_list.cpp scene/gui/popup_menu.cpp #: scene/gui/scroll_container.cpp scene/gui/text_edit.cpp scene/gui/tree.cpp #: scene/main/viewport.cpp scene/register_scene_types.cpp msgid "GUI" -msgstr "" +msgstr "GUI" #: main/main.cpp msgid "Drop Mouse On GUI Input Disabled" -msgstr "" +msgstr "GUI ìž…ë ¥ 시 마우스 놓기 비활성화ë¨" #: main/main.cpp msgid "stdout" -msgstr "" +msgstr "표준 ì¶œë ¥" #: main/main.cpp msgid "Print FPS" -msgstr "" +msgstr "FPS ì¸ì‡„" #: main/main.cpp msgid "Verbose stdout" -msgstr "" +msgstr "ìžì„¸í•œ 표준 ì¶œë ¥" #: main/main.cpp scene/main/scene_tree.cpp scene/resources/multimesh.cpp -#, fuzzy msgid "Physics Interpolation" -msgstr "ë³´ê°„ 모드" +msgstr "물리 ë³´ê°„" #: main/main.cpp -#, fuzzy msgid "Enable Warnings" -msgstr "í•„í„° 활성화" +msgstr "ê²½ê³ í™œì„±í™”" #: main/main.cpp -#, fuzzy msgid "Frame Delay Msec" -msgstr "í”„ë ˆìž„ ì„ íƒ" +msgstr "í”„ë ˆìž„ 지연 Msec" #: main/main.cpp msgid "Low Processor Mode" -msgstr "" +msgstr "ë‚®ì€ í”„ë¡œì„¸ì„œ 모드" #: main/main.cpp msgid "Delta Sync After Draw" -msgstr "" +msgstr "그리기 후 ë¸íƒ€ ë™ê¸°í™”" #: main/main.cpp msgid "iOS" -msgstr "" +msgstr "iOS" #: main/main.cpp msgid "Hide Home Indicator" -msgstr "" +msgstr "홈 표시기 숨기기" #: main/main.cpp -#, fuzzy msgid "Input Devices" -msgstr "ëª¨ë“ ê¸°ê¸°" +msgstr "ìž…ë ¥ 장치" #: main/main.cpp -#, fuzzy msgid "Pointing" -msgstr "ì " +msgstr "í¬ì¸íŒ…" #: main/main.cpp msgid "Touch Delay" -msgstr "" +msgstr "터치 지연" #: main/main.cpp servers/visual_server.cpp msgid "GLES3" -msgstr "" +msgstr "GLES3" #: main/main.cpp servers/visual_server.cpp -#, fuzzy msgid "Shaders" msgstr "ì…°ì´ë”" #: main/main.cpp msgid "Debug Shader Fallbacks" -msgstr "" +msgstr "ì…°ì´ë” í´ë°± 디버그" #: main/main.cpp scene/3d/baked_lightmap.cpp scene/3d/camera.cpp #: scene/3d/world_environment.cpp scene/main/scene_tree.cpp #: scene/resources/world.cpp -#, fuzzy msgid "Environment" -msgstr "환경 보기" +msgstr "환경" #: main/main.cpp msgid "Default Clear Color" -msgstr "" +msgstr "기본 í´ë¦¬ì–´ 컬러" #: main/main.cpp msgid "Boot Splash" -msgstr "" +msgstr "부트 스플래쉬" #: main/main.cpp -#, fuzzy msgid "Show Image" -msgstr "본 ë³´ì´ê¸°" +msgstr "ì´ë¯¸ì§€ 표시" #: main/main.cpp msgid "Image" -msgstr "" +msgstr "ì˜ìƒ" #: main/main.cpp msgid "Fullsize" -msgstr "" +msgstr "ì „ì²´ í¬ê¸°" #: main/main.cpp scene/resources/dynamic_font.cpp msgid "Use Filter" msgstr "í•„í„° 사용" #: main/main.cpp scene/resources/style_box.cpp -#, fuzzy msgid "BG Color" -msgstr "색ìƒ" +msgstr "배경색" #: main/main.cpp -#, fuzzy msgid "macOS Native Icon" -msgstr "íƒ€ì¼ ì•„ì´ì½˜ ì„¤ì •" +msgstr "ë§¥OS 네ì´í‹°ë¸Œ ì•„ì´ì½˜" #: main/main.cpp msgid "Windows Native Icon" -msgstr "" +msgstr "윈ë„ìš° 네ì´í‹°ë¸Œ ì•„ì´ì½˜" #: main/main.cpp msgid "Buffering" -msgstr "" +msgstr "버í¼ë§" #: main/main.cpp msgid "Agile Event Flushing" -msgstr "" +msgstr "ì• ìžì¼ ì´ë²¤íЏ 플러싱" #: main/main.cpp msgid "Emulate Touch From Mouse" -msgstr "" +msgstr "마우스 터치 ì—ë®¬ë ˆì´íЏ" #: main/main.cpp msgid "Emulate Mouse From Touch" -msgstr "" +msgstr "터치로 마우스 ì—ë®¬ë ˆì´íЏ" #: main/main.cpp -#, fuzzy msgid "Mouse Cursor" -msgstr "마우스 버튼" +msgstr "마우스 커서" #: main/main.cpp -#, fuzzy msgid "Custom Image" -msgstr "노드 잘ë¼ë‚´ê¸°" +msgstr "ì‚¬ìš©ìž ì •ì˜ ì´ë¯¸ì§€" #: main/main.cpp msgid "Custom Image Hotspot" -msgstr "" +msgstr "ì‚¬ìš©ìž ì •ì˜ ì´ë¯¸ì§€ 핫스팟" #: main/main.cpp msgid "Tooltip Position Offset" msgstr "íˆ´íŒ ìœ„ì¹˜ 오프셋" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Debugger Agent" -msgstr "디버거" +msgstr "디버거 ì—ì´ì „트" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp -#, fuzzy msgid "Wait For Debugger" -msgstr "디버거" +msgstr "디버거 대기" #: main/main.cpp modules/mono/mono_gd/gd_mono.cpp msgid "Wait Timeout" @@ -16447,60 +16260,56 @@ msgstr "대기 타임아웃" #: main/main.cpp msgid "Runtime" -msgstr "" +msgstr "런타임" #: main/main.cpp msgid "Unhandled Exception Policy" -msgstr "" +msgstr "처리ë˜ì§€ ì•Šì€ ì˜ˆì™¸ ì •ì±…" #: main/main.cpp -#, fuzzy msgid "Main Loop Type" -msgstr "노드 타입 찾기" +msgstr "ë©”ì¸ ë£¨í”„ ìœ í˜•" #: main/main.cpp scene/gui/texture_progress.cpp #: scene/gui/viewport_container.cpp msgid "Stretch" -msgstr "" +msgstr "ìŠ¤íŠ¸ë ˆì¹˜" #: main/main.cpp -#, fuzzy msgid "Aspect" -msgstr "ì¸ìŠ¤íŽ™í„°" +msgstr "ì–‘ìƒ" #: main/main.cpp msgid "Shrink" -msgstr "" +msgstr "수축" #: main/main.cpp scene/main/scene_tree.cpp msgid "Auto Accept Quit" -msgstr "" +msgstr "ìžë™ ìˆ˜ë½ ì¢…ë£Œ" #: main/main.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Quit On Go Back" -msgstr "뒤로" +msgstr "ëŒì•„가면서 종료" #: main/main.cpp scene/main/viewport.cpp -#, fuzzy msgid "Snap Controls To Pixels" -msgstr "노드 ì˜†ë©´ì— ìŠ¤ëƒ…" +msgstr "í”½ì…€ì— ì»¨íŠ¸ë¡¤ 스냅" #: main/main.cpp msgid "Dynamic Fonts" -msgstr "" +msgstr "ë™ì 글꼴" #: main/main.cpp msgid "Use Oversampling" -msgstr "" +msgstr "ì˜¤ë²„ìƒ˜í”Œë§ ì‚¬ìš©" #: modules/bullet/register_types.cpp modules/bullet/space_bullet.cpp msgid "Active Soft World" -msgstr "" +msgstr "액티브 소프트 월드" #: modules/csg/csg_gizmos.cpp msgid "CSG" -msgstr "" +msgstr "CSG" #: modules/csg/csg_gizmos.cpp msgid "Change Cylinder Radius" @@ -16519,35 +16328,30 @@ msgid "Change Torus Outer Radius" msgstr "ë„ë„› 외부 반지름 바꾸기" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Operation" -msgstr "ì„¤ì •" +msgstr "오í¼ë ˆì´ì…˜" #: modules/csg/csg_shape.cpp msgid "Calculate Tangents" -msgstr "" +msgstr "ì ‘ì„ ê³„ì‚°" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Use Collision" -msgstr "ì½œë¦¬ì „" +msgstr "ì¶©ëŒ ì‚¬ìš©" #: modules/csg/csg_shape.cpp servers/physics_2d_server.cpp -#, fuzzy msgid "Collision Layer" -msgstr "ì½œë¦¬ì „ 모드" +msgstr "ì¶©ëŒ ë ˆì´ì–´" #: modules/csg/csg_shape.cpp scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp #: scene/3d/ray_cast.cpp scene/3d/spring_arm.cpp #: scene/resources/navigation_mesh.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Mask" -msgstr "ì½œë¦¬ì „ 모드" +msgstr "ì¶©ëŒ ë§ˆìŠ¤í¬" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Invert Faces" -msgstr "ëŒ€ì†Œë¬¸ìž ë³€í™˜" +msgstr "ë©´ ë°˜ì „" #: modules/csg/csg_shape.cpp scene/2d/navigation_agent_2d.cpp #: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_agent.cpp @@ -16561,170 +16365,147 @@ msgid "Radius" msgstr "반지름" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Radial Segments" -msgstr "ë©”ì¸ ì”¬ ì¸ìˆ˜:" +msgstr "방사형 세그먼트" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Rings" -msgstr "ê²½ê³ " +msgstr "ë§" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Smooth Faces" -msgstr "부드러운 단계" +msgstr "부드러운 얼굴" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Sides" -msgstr "ê°€ì´ë“œ ë³´ì´ê¸°" +msgstr "사ì´ë“œ" #: modules/csg/csg_shape.cpp msgid "Cone" -msgstr "" +msgstr "ì›ë¿”" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Inner Radius" -msgstr "ë„ë„› ë‚´ë¶€ 반지름 바꾸기" +msgstr "ë‚´ë¶€ 반경" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Outer Radius" -msgstr "ë„ë„› 외부 반지름 바꾸기" +msgstr "외부 반경" #: modules/csg/csg_shape.cpp msgid "Ring Sides" -msgstr "" +msgstr "ë§ ì‚¬ì´ë“œ" #: modules/csg/csg_shape.cpp scene/2d/collision_polygon_2d.cpp #: scene/2d/light_occluder_2d.cpp scene/2d/polygon_2d.cpp #: scene/3d/collision_polygon.cpp -#, fuzzy msgid "Polygon" msgstr "í´ë¦¬ê³¤" #: modules/csg/csg_shape.cpp msgid "Spin Degrees" -msgstr "" +msgstr "íšŒì „ ì •ë„" #: modules/csg/csg_shape.cpp msgid "Spin Sides" -msgstr "" +msgstr "스핀 사ì´ë“œ" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Node" -msgstr "노드 붙여넣기" +msgstr "경로 노드" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Interval Type" -msgstr "ë‚´ë¶€ ê¼ì§“ì 만들기" +msgstr "경로 간격 ìœ í˜•" #: modules/csg/csg_shape.cpp msgid "Path Interval" -msgstr "" +msgstr "경로 간격" #: modules/csg/csg_shape.cpp msgid "Path Simplify Angle" -msgstr "" +msgstr "경로 단순화 ê°ë„" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Rotation" -msgstr "무작위 íšŒì „:" +msgstr "경로 íšŒì „" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Local" -msgstr "로컬로 만들기" +msgstr "경로 로컬" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Continuous U" -msgstr "ì—°ì†ì " +msgstr "경로 ì—°ì† U" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path U Distance" -msgstr "거리 ì„ íƒ:" +msgstr "경로 U 거리" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Joined" -msgstr "무작위 íšŒì „:" +msgstr "ê²°í•©ëœ ê²½ë¡œ" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Compression Mode" -msgstr "ì½œë¦¬ì „ 모드" +msgstr "ì••ì¶• 모드" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Transfer Channel" -msgstr "변형 바꾸기" +msgstr "ì „ì†¡ 채ë„" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Channel Count" -msgstr "ì¸ìŠ¤í„´ìŠ¤í•˜ê¸°" +msgstr "ì±„ë„ ì¹´ìš´íŠ¸" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Always Ordered" -msgstr "í•ìƒ ê²©ìž ë³´ì´ê¸°" +msgstr "í•ìƒ ì£¼ë¬¸" #: modules/enet/networked_multiplayer_enet.cpp msgid "Server Relay" -msgstr "" +msgstr "서버 ë¦´ë ˆì´" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Verify" -msgstr "" +msgstr "DTLS 확ì¸" #: modules/enet/networked_multiplayer_enet.cpp msgid "DTLS Hostname" -msgstr "" +msgstr "DTLS 호스트 ì´ë¦„" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Use DTLS" -msgstr "스냅 사용" +msgstr "DTLS 사용" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "FBX" -msgstr "" +msgstr "FBX" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "Use FBX" -msgstr "" +msgstr "FBX 사용" #: modules/gdnative/gdnative.cpp msgid "Config File" msgstr "ì„¤ì • 파ì¼" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Load Once" -msgstr "리소스 불러오기" +msgstr "한 번 로드" #: modules/gdnative/gdnative.cpp #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Singleton" -msgstr "ìŠ¤ì¼ˆë ˆí†¤" +msgstr "싱글톤" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Symbol Prefix" -msgstr "ì ‘ë‘사:" +msgstr "기호 ì ‘ë‘ì–´" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Reloadable" -msgstr "ìƒˆë¡œê³ ì¹¨" +msgstr "다시 로드 가능" #: modules/gdnative/gdnative.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp @@ -16789,9 +16570,8 @@ msgid "Script Class" msgstr "스í¬ë¦½íЏ í´ëž˜ìФ" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Icon Path" -msgstr "경로 í¬ì»¤ìФ" +msgstr "ì•„ì´ì½˜ 경로" #: modules/gdnative/register_types.cpp msgid "GDNative" @@ -16799,34 +16579,32 @@ msgstr "GDNative" #: modules/gdscript/editor/gdscript_highlighter.cpp #: modules/gdscript/gdscript.cpp -#, fuzzy msgid "GDScript" -msgstr "스í¬ë¦½íЏ" +msgstr "GD스í¬ë¦½íЏ" #: modules/gdscript/editor/gdscript_highlighter.cpp msgid "Function Definition Color" -msgstr "" +msgstr "함수 ì •ì˜ ìƒ‰ìƒ" #: modules/gdscript/editor/gdscript_highlighter.cpp -#, fuzzy msgid "Node Path Color" -msgstr "노드 경로 복사" +msgstr "노드 경로 색ìƒ" #: modules/gdscript/gdscript.cpp modules/visual_script/visual_script.cpp msgid "Max Call Stack" -msgstr "" +msgstr "최대 호출 스íƒ" #: modules/gdscript/gdscript.cpp msgid "Treat Warnings As Errors" -msgstr "" +msgstr "ê²½ê³ ë¥¼ 오류로 처리" #: modules/gdscript/gdscript.cpp msgid "Exclude Addons" -msgstr "" +msgstr "ì• ë“œì˜¨ ì œì™¸" #: modules/gdscript/gdscript.cpp msgid "Autocomplete Setters And Getters" -msgstr "" +msgstr "ìžë™ 완성 ì„¤ì •ìž ë° ê²Œí„°" #: modules/gdscript/gdscript_functions.cpp msgid "Step argument is zero!" @@ -16869,17 +16647,16 @@ msgid "Language Server" msgstr "언어 서버" #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Enable Smart Resolve" -msgstr "í•´ê²°í• ìˆ˜ ì—†ìŒ" +msgstr "스마트 í•´ê²° 활성화" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Show Native Symbols In Editor" -msgstr "" +msgstr "편집기ì—서 기본 기호 표시" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Use Thread" -msgstr "" +msgstr "ìŠ¤ë ˆë“œ 사용" #: modules/gltf/editor_scene_exporter_gltf_plugin.cpp msgid "Export Mesh GLTF2" @@ -16890,96 +16667,84 @@ msgid "Export GLTF..." msgstr "GLTF 내보내기..." #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Buffer View" -msgstr "후면 ë·°" +msgstr "ë²„í¼ ë³´ê¸°" #: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp msgid "Byte Offset" msgstr "ë°”ì´íЏ 오프셋" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Component Type" -msgstr "구성 요소" +msgstr "구성 요소 ìœ í˜•" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Normalized" -msgstr "형ì‹" +msgstr "ì •ê·œí™”" #: modules/gltf/gltf_accessor.cpp msgid "Count" msgstr "ì–‘" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Min" -msgstr "MiB" +msgstr "최소" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Max" -msgstr "믹스" +msgstr "최대" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Sparse Count" -msgstr "ì¸ìŠ¤í„´ìŠ¤í•˜ê¸°" +msgstr "í¬ì†Œ 카운트" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Buffer View" -msgstr "" +msgstr "í¬ì†Œ ì¸ë±ìФ ë²„í¼ ë³´ê¸°" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Byte Offset" -msgstr "" +msgstr "í¬ì†Œ ì¸ë±ìФ ë°”ì´íЏ 오프셋" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Sparse Indices Component Type" -msgstr "지오메트리 ë¶„ì„ ì¤‘..." +msgstr "í¬ì†Œ ì¸ë±ìФ 구성 요소 ìœ í˜•" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Buffer View" -msgstr "" +msgstr "í¬ì†Œ ê°’ ë²„í¼ ë³´ê¸°" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Byte Offset" -msgstr "" +msgstr "í¬ì†Œ ê°’ ë°”ì´íЏ 오프셋" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Buffer" -msgstr "후면 ë·°" +msgstr "버í¼" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Byte Length" -msgstr "ë””í´íЏ 테마" +msgstr "ë°”ì´íЏ 길ì´" #: modules/gltf/gltf_buffer_view.cpp msgid "Byte Stride" -msgstr "" +msgstr "ë°”ì´íЏ 스트ë¼ì´ë“œ" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Indices" -msgstr "ëª¨ë“ ê¸°ê¸°" +msgstr "ì¸ë±ìФ" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "FOV Size" -msgstr "í¬ê¸°:" +msgstr "FOV í¬ê¸°" #: modules/gltf/gltf_camera.cpp msgid "Zfar" -msgstr "" +msgstr "Z 멀리" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "Znear" -msgstr "ì§ì„ 형" +msgstr "Z 근처" #: modules/gltf/gltf_light.cpp scene/2d/canvas_modulate.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp scene/2d/polygon_2d.cpp @@ -16989,273 +16754,239 @@ msgstr "ì§ì„ 형" #: scene/resources/environment.cpp scene/resources/material.cpp #: scene/resources/particles_material.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Color" msgstr "색ìƒ" #: modules/gltf/gltf_light.cpp scene/3d/reflection_probe.cpp #: scene/resources/environment.cpp msgid "Intensity" -msgstr "" +msgstr "강함" #: modules/gltf/gltf_light.cpp scene/2d/light_2d.cpp scene/3d/light.cpp -#, fuzzy msgid "Range" -msgstr "바꾸기" +msgstr "범위" #: modules/gltf/gltf_light.cpp msgid "Inner Cone Angle" -msgstr "" +msgstr "ë‚´ë¶€ ì›ë¿” ê°ë„" #: modules/gltf/gltf_light.cpp msgid "Outer Cone Angle" -msgstr "" +msgstr "외부 ì›ë¿” ê°ë„" #: modules/gltf/gltf_mesh.cpp -#, fuzzy msgid "Blend Weights" -msgstr "ë¼ì´íŠ¸ë§µ 굽기" +msgstr "혼합 가중치" #: modules/gltf/gltf_mesh.cpp -#, fuzzy msgid "Instance Materials" -msgstr "머티리얼 바꾸기:" +msgstr "ì¸ìŠ¤í„´ìŠ¤ 재료" #: modules/gltf/gltf_node.cpp scene/3d/skeleton.cpp -#, fuzzy msgid "Parent" -msgstr "부모 다시 ì§€ì •" +msgstr "부모" #: modules/gltf/gltf_node.cpp -#, fuzzy msgid "Xform" -msgstr "플랫í¼" +msgstr "변형" #: modules/gltf/gltf_node.cpp scene/3d/mesh_instance.cpp msgid "Skin" -msgstr "" +msgstr "스킨" #: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp -#, fuzzy msgid "Translation" msgstr "번ì—" #: modules/gltf/gltf_node.cpp -#, fuzzy msgid "Children" -msgstr "íŽ¸ì§‘í• ìˆ˜ 있는 ìžì‹" +msgstr "어린ì´" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Joints" -msgstr "ì " +msgstr "ê´€ì ˆ" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp msgid "Roots" -msgstr "" +msgstr "루트" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_state.cpp msgid "Unique Names" -msgstr "" +msgstr "ê³ ìœ í•œ ì´ë¦„" #: modules/gltf/gltf_skeleton.cpp -#, fuzzy msgid "Godot Bone Node" -msgstr "시간 íƒìƒ‰ 노드" +msgstr "Godot 본 노드" #: modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Skin Root" -msgstr "새 씬 루트" +msgstr "스킨 루트" #: modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Joints Original" -msgstr "ì›ì í¬ì»¤ìФ" +msgstr "ê´€ì ˆ ì›ë³¸" #: modules/gltf/gltf_skin.cpp msgid "Inverse Binds" -msgstr "" +msgstr "ì—ê²°í•©" #: modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Non Joints" -msgstr "ê´€ì ˆ ì´ë™" +msgstr "비 ê´€ì ˆ" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Bone I" -msgstr "" +msgstr "ê´€ì ˆ Iì—서 뼈 I" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Name" -msgstr "" +msgstr "ê´€ì ˆ I ì´ë¦„" #: modules/gltf/gltf_skin.cpp msgid "Godot Skin" -msgstr "" +msgstr "Godot 스킨" #: modules/gltf/gltf_spec_gloss.cpp msgid "Diffuse Img" -msgstr "" +msgstr "확산 ì´ë¯¸ì§€" #: modules/gltf/gltf_spec_gloss.cpp msgid "Diffuse Factor" -msgstr "" +msgstr "확산 계수" #: modules/gltf/gltf_spec_gloss.cpp msgid "Gloss Factor" -msgstr "" +msgstr "ê´‘íƒ ê³„ìˆ˜" #: modules/gltf/gltf_spec_gloss.cpp -#, fuzzy msgid "Specular Factor" -msgstr "ìŠ¤ì¹¼ë¼ ì—°ì‚°ìž." +msgstr "반사 ì¸ìž" #: modules/gltf/gltf_spec_gloss.cpp msgid "Spec Gloss Img" -msgstr "" +msgstr "반사광 ì´ë¯¸ì§€" #: modules/gltf/gltf_state.cpp msgid "Json" -msgstr "" +msgstr "Json" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Major Version" -msgstr "ë²„ì „" +msgstr "ë©”ì´ì € ë²„ì „" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Minor Version" -msgstr "ë²„ì „" +msgstr "마ì´ë„ˆ ë²„ì „" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "GLB Data" -msgstr "ë°ì´í„°ì™€ 함께" +msgstr "GLB ë°ì´í„°" #: modules/gltf/gltf_state.cpp msgid "Use Named Skin Binds" -msgstr "" +msgstr "네임드 스킨 ë°”ì¸ë”© 사용" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Buffer Views" -msgstr "후면 ë·°" +msgstr "ë²„í¼ ë³´ê¸°" #: modules/gltf/gltf_state.cpp msgid "Accessors" -msgstr "" +msgstr "ì ‘ê·¼ìž" #: modules/gltf/gltf_state.cpp msgid "Scene Name" msgstr "씬 ì´ë¦„" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Root Nodes" -msgstr "루트 노드 ì´ë¦„" +msgstr "루트 노드" #: modules/gltf/gltf_state.cpp scene/2d/particles_2d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_progress.cpp -#, fuzzy msgid "Textures" -msgstr "기능" +msgstr "í…스처" #: modules/gltf/gltf_state.cpp platform/uwp/export/export.cpp msgid "Images" -msgstr "" +msgstr "ì´ë¯¸ì§€" #: modules/gltf/gltf_state.cpp msgid "Cameras" -msgstr "" +msgstr "ì¹´ë©”ë¼" #: modules/gltf/gltf_state.cpp servers/visual_server.cpp -#, fuzzy msgid "Lights" -msgstr "ë¼ì´íЏ" +msgstr "ë¹›" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Unique Animation Names" -msgstr "새 ì• ë‹ˆë©”ì´ì…˜ ì´ë¦„:" +msgstr "ê³ ìœ í•œ ì• ë‹ˆë©”ì´ì…˜ ì´ë¦„" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Skeletons" msgstr "ìŠ¤ì¼ˆë ˆí†¤" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Skeleton To Node" -msgstr "노드를 ì„ íƒí•˜ì„¸ìš”" +msgstr "ìŠ¤ì¼ˆë ˆí†¤ì—서 노드로" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Animations" -msgstr "ì• ë‹ˆë©”ì´ì…˜:" +msgstr "ì• ë‹ˆë©”ì´ì…˜" #: modules/gltf/gltf_texture.cpp -#, fuzzy msgid "Src Image" -msgstr "본 ë³´ì´ê¸°" +msgstr "SRC ì´ë¯¸ì§€" #: modules/gridmap/grid_map.cpp msgid "Mesh Library" msgstr "메시 ë¼ì´ë¸ŒëŸ¬ë¦¬" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Physics Material" -msgstr "물리 í”„ë ˆìž„ %" +msgstr "물리 재료" #: modules/gridmap/grid_map.cpp scene/3d/visual_instance.cpp -#, fuzzy msgid "Use In Baked Light" -msgstr "ë¼ì´íŠ¸ë§µ 굽기" +msgstr "ë² ì´í‚¹ ë¼ì´íЏì—서 사용" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp msgid "Cell" -msgstr "" +msgstr "ì…€" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Octant Size" -msgstr "ì •ë©´ ë·°" +msgstr "옥탄트 í¬ê¸°" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Center X" -msgstr "중앙" +msgstr "중앙 X" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Center Y" -msgstr "중앙" +msgstr "중앙 Y" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Center Z" -msgstr "중앙" +msgstr "중앙 Z" #: modules/gridmap/grid_map.cpp scene/2d/collision_object_2d.cpp #: scene/2d/tile_map.cpp scene/3d/collision_object.cpp scene/3d/soft_body.cpp #: scene/resources/material.cpp msgid "Mask" -msgstr "" +msgstr "마스í¬" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp -#, fuzzy msgid "Bake Navigation" -msgstr "네비게ì´ì…˜" +msgstr "ë² ì´í¬ 내비게ì´ì…˜" #: modules/gridmap/grid_map.cpp scene/2d/navigation_2d.cpp #: scene/2d/navigation_agent_2d.cpp scene/2d/navigation_polygon.cpp #: scene/2d/tile_map.cpp scene/3d/navigation.cpp scene/3d/navigation_agent.cpp #: scene/3d/navigation_mesh_instance.cpp -#, fuzzy msgid "Navigation Layers" -msgstr "내비게ì´ì…˜ ê°ë„" +msgstr "내비게ì´ì…˜ ë ˆì´ì–´" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Plane" @@ -17414,63 +17145,59 @@ msgid "Plotting lightmaps" msgstr "ë¼ì´íŠ¸ë§µ 그리는 중" #: modules/lightmapper_cpu/register_types.cpp -#, fuzzy msgid "CPU Lightmapper" -msgstr "ë¼ì´íŠ¸ë§µ 굽기" +msgstr "CPU ë¼ì´íŠ¸ë§¤í¼" #: modules/lightmapper_cpu/register_types.cpp msgid "Low Quality Ray Count" -msgstr "" +msgstr "ë‚®ì€ í’ˆì§ˆì˜ ê´‘ì„ ìˆ˜" #: modules/lightmapper_cpu/register_types.cpp msgid "Medium Quality Ray Count" -msgstr "" +msgstr "중간 품질 ê´‘ì„ ìˆ˜" #: modules/lightmapper_cpu/register_types.cpp msgid "High Quality Ray Count" -msgstr "" +msgstr "ê³ í’ˆì§ˆ ê´‘ì„ ìˆ˜" #: modules/lightmapper_cpu/register_types.cpp msgid "Ultra Quality Ray Count" -msgstr "" +msgstr "ì´ˆê³ í’ˆì§ˆ ê´‘ì„ ìˆ˜" #: modules/minimp3/audio_stream_mp3.cpp #: modules/minimp3/resource_importer_mp3.cpp #: modules/stb_vorbis/audio_stream_ogg_vorbis.cpp #: modules/stb_vorbis/resource_importer_ogg_vorbis.cpp -#, fuzzy msgid "Loop Offset" -msgstr "오프셋:" +msgstr "루프 오프셋" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Eye Height" -msgstr "" +msgstr "눈 높ì´" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "IOD" -msgstr "" +msgstr "IOD" #: modules/mobile_vr/mobile_vr_interface.cpp -#, fuzzy msgid "Display Width" -msgstr "와ì´ì–´í”„ë ˆìž„ 표시" +msgstr "ë””ìŠ¤í”Œë ˆì´ ë„ˆë¹„" #: modules/mobile_vr/mobile_vr_interface.cpp -#, fuzzy msgid "Display To Lens" -msgstr "ì…°ì´ë” ì—†ìŒ í‘œì‹œ" +msgstr "ë Œì¦ˆì— í‘œì‹œ" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Oversample" -msgstr "" +msgstr "오버샘플" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K1" -msgstr "" +msgstr "K1" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "K2" -msgstr "" +msgstr "K2" #: modules/mono/csharp_script.cpp msgid "Class name can't be a reserved keyword" @@ -17481,24 +17208,20 @@ msgid "Build Solution" msgstr "솔루션 빌드" #: modules/mono/editor/csharp_project.cpp -#, fuzzy msgid "Auto Update Project" -msgstr "ì´ë¦„ 없는 프로ì 트" +msgstr "ìžë™ ì—…ë°ì´íЏ 프로ì 트" #: modules/mono/godotsharp_dirs.cpp -#, fuzzy msgid "Assembly Name" -msgstr "ëª¨ë‘ í‘œì‹œ" +msgstr "어셈블리 ì´ë¦„" #: modules/mono/godotsharp_dirs.cpp -#, fuzzy msgid "Solution Directory" -msgstr "ë””ë ‰í† ë¦¬ë¥¼ ì„ íƒí•˜ì„¸ìš”" +msgstr "솔루션 ë””ë ‰í† ë¦¬" #: modules/mono/godotsharp_dirs.cpp -#, fuzzy msgid "C# Project Directory" -msgstr "ë””ë ‰í† ë¦¬ë¥¼ ì„ íƒí•˜ì„¸ìš”" +msgstr "C# 프로ì 트 ë””ë ‰í† ë¦¬" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -17572,20 +17295,19 @@ msgstr "완료!" #: modules/opensimplex/noise_texture.cpp msgid "Seamless" -msgstr "" +msgstr "ì›í™œí•œ" #: modules/opensimplex/noise_texture.cpp -#, fuzzy msgid "As Normal Map" -msgstr "무작위 스케ì¼:" +msgstr "노멀 맵으로" #: modules/opensimplex/noise_texture.cpp msgid "Bump Strength" -msgstr "" +msgstr "범프 ê°•ë„" #: modules/opensimplex/noise_texture.cpp msgid "Noise" -msgstr "" +msgstr "소ìŒ" #: modules/opensimplex/noise_texture.cpp msgid "Noise Offset" @@ -17593,27 +17315,25 @@ msgstr "ë…¸ì´ì¦ˆ 오프셋" #: modules/opensimplex/open_simplex_noise.cpp msgid "Octaves" -msgstr "" +msgstr "옥타브" #: modules/opensimplex/open_simplex_noise.cpp msgid "Period" -msgstr "" +msgstr "기간" #: modules/opensimplex/open_simplex_noise.cpp -#, fuzzy msgid "Persistence" -msgstr "ì›ê·¼" +msgstr "ì§€ì†ì„±" #: modules/opensimplex/open_simplex_noise.cpp msgid "Lacunarity" -msgstr "" +msgstr "세심함" #: modules/regex/regex.cpp msgid "Subject" -msgstr "" +msgstr "서브ì 트" #: modules/regex/regex.cpp -#, fuzzy msgid "Names" msgstr "ì´ë¦„" @@ -17623,43 +17343,39 @@ msgstr "문ìžì—´" #: modules/upnp/upnp.cpp msgid "Discover Multicast If" -msgstr "" +msgstr "멀티ìºìŠ¤íŠ¸ë¥¼ 발견하면" #: modules/upnp/upnp.cpp msgid "Discover Local Port" -msgstr "" +msgstr "로컬 í¬íЏ 검색" #: modules/upnp/upnp.cpp msgid "Discover IPv6" -msgstr "" +msgstr "IPv6 발견" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "Description URL" -msgstr "설명" +msgstr "설명 URL" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "Service Type" -msgstr "변수 타입 ì„¤ì •" +msgstr "서비스 ìœ í˜•" #: modules/upnp/upnp_device.cpp msgid "IGD Control URL" -msgstr "" +msgstr "IGD ì œì–´ URL" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "IGD Service Type" -msgstr "변수 타입 ì„¤ì •" +msgstr "IGD 서비스 ìœ í˜•" #: modules/upnp/upnp_device.cpp msgid "IGD Our Addr" -msgstr "" +msgstr "IGD ìš°ë¦¬ì˜ ì£¼ì†Œ" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "IGD Status" -msgstr "ìƒíƒœ" +msgstr "IGD ìƒíƒœ" #: modules/visual_script/visual_script.cpp msgid "" @@ -17694,14 +17410,12 @@ msgstr "" "시퀀스 비트를 발견했지만 ìŠ¤íƒ ì•ˆì˜ ë…¸ë“œì—는 없습니다. 버그를 ì‹ ê³ í•˜ì„¸ìš”!" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Stack overflow with stack depth:" -msgstr "ìŠ¤íƒ ê¹Šì´ë¡œ 오버플로우한 스íƒ: " +msgstr "ìŠ¤íƒ ê¹Šì´ê°€ 있는 ìŠ¤íƒ ì˜¤ë²„í”Œë¡œ:" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Visual Script" -msgstr "비주얼스í¬ë¦½íЏ 검색" +msgstr "비주얼 스í¬ë¦½íЏ" #: modules/visual_script/visual_script_editor.cpp msgid "Change Signal Arguments" @@ -18022,122 +17736,108 @@ msgstr "멤버 편집" #: modules/visual_script/visual_script_expression.cpp #: scene/resources/visual_shader.cpp -#, fuzzy msgid "Expression" -msgstr "í‘œí˜„ì‹ ì„¤ì •" +msgstr "표현" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return" -msgstr "" +msgstr "반환" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Return Enabled" -msgstr "실행가능" +msgstr "반환 활성화ë¨" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Return Type" -msgstr "멤버 타입" +msgstr "반환 ìœ í˜•" #: modules/visual_script/visual_script_flow_control.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Condition" -msgstr "ì• ë‹ˆë©”ì´ì…˜" +msgstr "ì¡°ê±´" #: modules/visual_script/visual_script_flow_control.cpp msgid "if (cond) is:" -msgstr "" +msgstr "(ì¡°ê±´)ì´ ë‹¤ìŒê³¼ 같으면:" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "While" +msgstr "ë™ì•ˆ" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" -msgstr "" +msgstr "ë™ì•ˆ(ì¡°ê±´):" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator" -msgstr "" +msgstr "반복ìž" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" -msgstr "" +msgstr "(ìž…ë ¥)ì—서 (요소):" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Input type not iterable:" -msgstr "ë°˜ë³µí• ìˆ˜ 없는 ìž…ë ¥ 타입: " +msgstr "ë°˜ë³µí• ìˆ˜ 없는 ìž…ë ¥ ìœ í˜•:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid" -msgstr "Iteratorê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤" +msgstr "반복ìžê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Iterator became invalid:" -msgstr "Iteratorê°€ 잘못ë¨: " +msgstr "반복ìžê°€ 잘못ë˜ì—ˆìŠµë‹ˆë‹¤:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" -msgstr "" +msgstr "순서" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "in order:" -msgstr "í´ë” ì´ë¦„ 바꾸기:" +msgstr "규칙대로:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Steps" msgstr "단계" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Switch" -msgstr "Pitch:" +msgstr "스위치" #: modules/visual_script/visual_script_flow_control.cpp msgid "'input' is:" -msgstr "" +msgstr "'ìž…ë ¥'ì€:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Type Cast" -msgstr "타입:" +msgstr "ìœ í˜• ìºìŠ¤íŠ¸" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" -msgstr "" +msgstr "%sì¸ê°€ìš”?" #: modules/visual_script/visual_script_flow_control.cpp #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Base Script" -msgstr "새 스í¬ë¦½íЏ" +msgstr "기본 스í¬ë¦½íЏ" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" -msgstr "" +msgstr "%sì—" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "On Self" -msgstr "ìžì²´" +msgstr "온 셀프" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Call Mode" -msgstr "ìŠ¤ì¼€ì¼ ëª¨ë“œ" +msgstr "호출 모드" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Type" -msgstr "기본 타입 바꾸기" +msgstr "기본형" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -20129,7 +19829,7 @@ msgstr "ê°œì •" #: platform/uwp/export/export.cpp msgid "Landscape" -msgstr "" +msgstr "í’ê²½" #: platform/uwp/export/export.cpp #, fuzzy @@ -20426,7 +20126,7 @@ msgstr "" #: platform/windows/export/export.cpp msgid "Wine" -msgstr "" +msgstr "와ì¸" #: platform/x11/export/export.cpp msgid "32-bit executables cannot have embedded data >= 4 GiB." @@ -20982,7 +20682,7 @@ msgstr "ì„ íšŒ ë·° 오른쪽으로" #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Angular Velocity" -msgstr "" +msgstr "ê°ì†ë„" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21427,7 +21127,7 @@ msgstr "ë„ë„› 외부 반지름 바꾸기" msgid "" "The NavigationObstacle2D only serves to provide collision avoidance to a " "Node2D object." -msgstr "" +msgstr "NavigationObstacle2D는 Node2D ê°œì²´ì— ëŒ€í•œ ì¶©ëŒ ë°©ì§€ 기능만 ì œê³µí•©ë‹ˆë‹¤." #: scene/2d/navigation_polygon.cpp msgid "" @@ -23668,6 +23368,16 @@ msgstr "오류" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "ì •ë ¬" + +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Use AABB Center" +msgstr "주변광 사용" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" @@ -26547,7 +26257,7 @@ msgstr "" #: scene/resources/environment.cpp msgid "Bloom" -msgstr "" +msgstr "블룸" #: scene/resources/environment.cpp msgid "HDR Threshold" @@ -27176,9 +26886,8 @@ msgid "Bind" msgstr "ë°”ì¸ë”©" #: scene/resources/skin.cpp -#, fuzzy msgid "Bone" -msgstr "본" +msgstr "뼈" #: scene/resources/sky.cpp #, fuzzy diff --git a/editor/translations/lt.po b/editor/translations/lt.po index e89e801a9b..5f0c068dbb 100644 --- a/editor/translations/lt.po +++ b/editor/translations/lt.po @@ -12948,9 +12948,10 @@ msgstr "Žingsnis(iai):" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14343,12 +14344,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -23371,6 +23371,15 @@ msgstr "Ä®vyko klaida kraunant Å¡riftÄ…." msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Importuojama:" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/lv.po b/editor/translations/lv.po index 7234ac270a..51836c627b 100644 --- a/editor/translations/lv.po +++ b/editor/translations/lv.po @@ -12808,9 +12808,10 @@ msgstr "Opcijas" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14176,12 +14177,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -23214,6 +23214,15 @@ msgstr "%s Kļūda" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Å Ä·irot" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/mk.po b/editor/translations/mk.po index d0be6e7036..6d725ac82b 100644 --- a/editor/translations/mk.po +++ b/editor/translations/mk.po @@ -9,7 +9,7 @@ msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" -"PO-Revision-Date: 2022-07-23 03:57+0000\n" +"PO-Revision-Date: 2022-10-24 12:41+0000\n" "Last-Translator: Kristijan Fremen Velkovski <me@krisfremen.com>\n" "Language-Team: Macedonian <https://hosted.weblate.org/projects/godot-engine/" "godot/mk/>\n" @@ -17,11 +17,11 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8-bit\n" "Plural-Forms: nplurals=2; plural=n==1 || n%10==1 ? 0 : 1;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.14.2-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" -msgstr "" +msgstr "Драјвер за Таблет" #: core/bind/core_bind.cpp msgid "Clipboard" @@ -49,7 +49,7 @@ msgstr "Делта Измазнување" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode" -msgstr "" +msgstr "Режим за ниÑка употреба на процеÑор" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" @@ -186,19 +186,19 @@ msgstr "Ред за наредби" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" -msgstr "" +msgstr "Големина на редот за Мултитрединг" #: core/func_ref.cpp modules/visual_script/visual_script_builtin_funcs.cpp #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: scene/resources/visual_shader_nodes.cpp msgid "Function" -msgstr "" +msgstr "Функција" #: core/image.cpp core/packed_data_container.cpp scene/2d/polygon_2d.cpp #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp msgid "Data" -msgstr "" +msgstr "Дата" #: core/io/file_access_network.cpp core/register_core_types.cpp #: editor/editor_file_dialog.cpp editor/editor_settings.cpp main/main.cpp @@ -206,16 +206,15 @@ msgstr "" #: modules/webrtc/webrtc_data_channel.h modules/websocket/websocket_macros.h #: scene/gui/file_dialog.cpp msgid "Network" -msgstr "" +msgstr "Мрежа" #: core/io/file_access_network.cpp -#, fuzzy msgid "Remote FS" -msgstr "Избриши невалидни клучеви" +msgstr "Далечен ФС" #: core/io/file_access_network.cpp msgid "Page Size" -msgstr "" +msgstr "Големина на Страница" #: core/io/file_access_network.cpp msgid "Page Read Ahead" @@ -3357,7 +3356,7 @@ msgstr "" #: editor/editor_help.cpp msgid "Enumerations" -msgstr "" +msgstr "Енумерации" #: editor/editor_help.cpp msgid "Property Descriptions" @@ -12418,9 +12417,10 @@ msgstr "СвојÑтва на анимацијата." #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13759,12 +13759,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22313,6 +22312,14 @@ msgstr "Огледало" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +msgid "Sorting" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/ml.po b/editor/translations/ml.po index 35845df066..171cc17fdb 100644 --- a/editor/translations/ml.po +++ b/editor/translations/ml.po @@ -12440,9 +12440,10 @@ msgstr "à´ªàµà´°à´µàµƒà´¤àµà´¤à´¿à´•ൾ:" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13783,12 +13784,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22389,6 +22389,14 @@ msgstr "à´•à´£àµà´£à´¾à´Ÿà´¿" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +msgid "Sorting" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/mr.po b/editor/translations/mr.po index 6baf1dc52e..24300da41a 100644 --- a/editor/translations/mr.po +++ b/editor/translations/mr.po @@ -12432,9 +12432,10 @@ msgstr "अâ€à¥…निमेशन टà¥à¤°à¥€" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13776,12 +13777,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22411,6 +22411,14 @@ msgstr "तà¥à¤°à¥à¤Ÿà¥€!" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +msgid "Sorting" +msgstr "" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/ms.po b/editor/translations/ms.po index adb377d13a..3b34efe6f2 100644 --- a/editor/translations/ms.po +++ b/editor/translations/ms.po @@ -12936,9 +12936,10 @@ msgstr "Pilihan Snap" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Grid Offset:" @@ -14318,12 +14319,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -23441,6 +23441,15 @@ msgstr "%s Ralat" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Mengimport:" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/nb.po b/editor/translations/nb.po index b39bc2a602..9d831aee5d 100644 --- a/editor/translations/nb.po +++ b/editor/translations/nb.po @@ -18,7 +18,7 @@ # Patrick Sletvold <patricksletvold@hotmail.com>, 2021. # Kristoffer <kskau93@gmail.com>, 2021. # Lili Zoey <sayaks1@gmail.com>, 2021. -# slasken06 <ask.skivdal@gmail.com>, 2021. +# slasken06 <ask.skivdal@gmail.com>, 2021, 2022. # Daniel Skogly <daniel@klungo.no>, 2021. # Imre Kristoffer Eilertsen <imreeil42@gmail.com>, 2022. # Edvard Ekrem Sæther <edvardekrem@gmail.com>, 2022. @@ -28,8 +28,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-03-20 03:01+0000\n" -"Last-Translator: Changry <c@changry.no>\n" +"PO-Revision-Date: 2022-12-08 10:28+0000\n" +"Last-Translator: slasken06 <ask.skivdal@gmail.com>\n" "Language-Team: Norwegian BokmÃ¥l <https://hosted.weblate.org/projects/godot-" "engine/godot/nb_NO/>\n" "Language: nb\n" @@ -37,7 +37,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -118,9 +118,8 @@ msgstr "Minimert" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp -#, fuzzy msgid "Resizable" -msgstr "Kan Endre Størrelse" +msgstr "Skalerbar" #: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp #: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp @@ -230,7 +229,6 @@ msgid "Network" msgstr "Nettverk" #: core/io/file_access_network.cpp -#, fuzzy msgid "Remote FS" msgstr "Fjernstyrt FS" @@ -243,7 +241,6 @@ msgid "Page Read Ahead" msgstr "" #: core/io/http_client.cpp -#, fuzzy msgid "Blocking Mode Enabled" msgstr "Blokkeringsmodus Aktivert" @@ -252,7 +249,6 @@ msgid "Connection" msgstr "Tilkobling" #: core/io/http_client.cpp -#, fuzzy msgid "Read Chunk Size" msgstr "Les Chunk Størrelse" @@ -286,7 +282,7 @@ msgstr "Overføringsmodus" #: core/io/packet_peer.cpp msgid "Encode Buffer Max Size" -msgstr "" +msgstr "Enkodingsbuffer Maks Størrelse" #: core/io/packet_peer.cpp msgid "Input Buffer Max Size" @@ -13499,9 +13495,10 @@ msgstr "Snapping innstillinger" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Avstand:" @@ -14927,16 +14924,17 @@ msgid "Invalid project path (changed anything?)." msgstr "" #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Kunne ikke laste project.godot i prosjektstien (feil %d). Den kan mangle " "eller være korrupt." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "Kunne ikke endre project.godot i projsektstien." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Kan ikke Ã¥pne prosjekt" #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -24341,6 +24339,15 @@ msgstr "Feil!" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Sortering" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/nl.po b/editor/translations/nl.po index 2b09ed5abc..5e80c53732 100644 --- a/editor/translations/nl.po +++ b/editor/translations/nl.po @@ -13261,9 +13261,10 @@ msgstr "Kleefinstellingen" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Afstand:" @@ -14731,16 +14732,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Ongeldig projectpad (iets veranderd?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Kan project.godot in project pad niet laden (error %d). Mogelijk is het " "bestand niet aanwezig of corrupt." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "Kan project.godot niet bewerken in projectpad." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Kan project niet openen op '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -24277,6 +24279,15 @@ msgstr "Fout" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Sorteren" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/pl.po b/editor/translations/pl.po index 7b7e680cff..47b7bfe98a 100644 --- a/editor/translations/pl.po +++ b/editor/translations/pl.po @@ -64,13 +64,18 @@ # Dawid Skubij <davidsd@tlen.pl>, 2022. # kingofsponges <q.patex.q@gmail.com>, 2022. # Patryk Morawski <gormit7@gmail.com>, 2022. +# Adrians <adrianspl@o2.pl>, 2022. +# Wodorek <Krol.w94@gmail.com>, 2022. +# Filip GliszczyÅ„ski <filipgliszczynski@gmail.com>, 2022. +# Piotr Åšlusarz <piotrekslusarz@outlook.com>, 2022. +# Jan Kurzak <Iqaz0oki@outlook.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-08-17 18:20+0000\n" -"Last-Translator: Patryk Morawski <gormit7@gmail.com>\n" +"PO-Revision-Date: 2022-12-12 09:46+0000\n" +"Last-Translator: Tomek <kobewi4e@gmail.com>\n" "Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/" "godot/pl/>\n" "Language: pl\n" @@ -79,7 +84,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : n%10>=2 && n%10<=4 && (n%100<10 " "|| n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -902,9 +907,8 @@ msgid "Connect Timeout Seconds" msgstr "Sekundowy limit czasu połączenia" #: core/register_core_types.cpp -#, fuzzy msgid "Packet Peer Stream" -msgstr "StrumieÅ„ czÅ‚onków pakietów" +msgstr "StrumieÅ„ pakietów równorzÄ™dnych" #: core/register_core_types.cpp msgid "Max Buffer (Power of 2)" @@ -1159,9 +1163,8 @@ msgstr "Animacja WywoÅ‚anie funkcji" #: editor/animation_track_editor.cpp scene/2d/animated_sprite.cpp #: scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Frame" -msgstr "Klatka %" +msgstr "Klatka" #: editor/animation_track_editor.cpp editor/editor_profiler.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp @@ -1172,16 +1175,14 @@ msgstr "Czas" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Location" msgstr "Lokalizacja" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp -#, fuzzy msgid "Rotation" -msgstr "Krok obrotu:" +msgstr "Obrót" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp @@ -1189,9 +1190,8 @@ msgid "Value" msgstr "Wartość" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Arg Count" -msgstr "IloÅ›c:" +msgstr "Liczba argumentów" #: editor/animation_track_editor.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp @@ -1206,14 +1206,12 @@ msgid "Type" msgstr "Typ" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In Handle" -msgstr "Ustaw uchwyt" +msgstr "Uchwyt wejÅ›ciowy" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out Handle" -msgstr "Ustaw uchwyt" +msgstr "Uchwyt wyjÅ›ciowy" #: editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1223,14 +1221,12 @@ msgid "Stream" msgstr "StrumieÅ„" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "Offset siatki:" +msgstr "Rozpocznij przesuniÄ™cie" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" -msgstr "PrzesuniÄ™cie:" +msgstr "Koniec przesuniÄ™cia" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1243,9 +1239,8 @@ msgid "Animation" msgstr "Animacja" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing" -msgstr "Åagodne wejÅ›cie-wyjÅ›cie" +msgstr "WygÅ‚adzanie" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" @@ -1354,19 +1349,16 @@ msgid "Remove this track." msgstr "UsuÅ„ tÄ™ Å›cieżkÄ™." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "Czas (s): " +msgstr "Czas (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "Pozycja" +msgstr "Pozycja:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Rotation:" -msgstr "Krok obrotu:" +msgstr "Obrót:" #: editor/animation_track_editor.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -1383,44 +1375,36 @@ msgid "Type:" msgstr "Typ:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "(Invalid, expected type: %s)" -msgstr "Szablon eksportu nieprawidÅ‚owy:" +msgstr "(NieprawidÅ‚owy, oczekiwano typ: %s)" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing:" -msgstr "Åagodne wejÅ›cie-wyjÅ›cie" +msgstr "Åagodne wejÅ›cie-wyjÅ›cie:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In-Handle:" -msgstr "Ustaw uchwyt" +msgstr "Uchwyt wew.:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out-Handle:" -msgstr "Ustaw uchwyt" +msgstr "Uchwyt zew.:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "CzÅ‚onek transmisji" +msgstr "StrumieÅ„:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start (s):" -msgstr "Restart(y):" +msgstr "Start (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End (s):" -msgstr "Zanikanie w (s):" +msgstr "Koniec (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Animation Clip:" -msgstr "Animacje:" +msgstr "Animacja:" #: editor/animation_track_editor.cpp msgid "Toggle Track Enabled" @@ -1634,9 +1618,8 @@ msgid "Add Method Track Key" msgstr "Dodaj klucz Å›cieżki metody" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" -msgstr "Metoda nie znaleziona w obiekcie: " +msgstr "Metoda nie znaleziona w obiekcie:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -2601,9 +2584,8 @@ msgid "There is no '%s' file." msgstr "Nie ma pliku \"%s\"." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Layout:" -msgstr "UkÅ‚ad" +msgstr "UkÅ‚ad:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2809,19 +2791,16 @@ msgid "Project export for platform:" msgstr "Eksportowanie projektu dla platformy:" #: editor/editor_export.cpp -#, fuzzy msgid "Completed with warnings." -msgstr "Skopiuj Å›cieżkÄ™ wÄ™zÅ‚a" +msgstr "UkoÅ„czone z ostrzeżeniami." #: editor/editor_export.cpp -#, fuzzy msgid "Completed successfully." -msgstr "Pakiet zainstalowano poprawnie!" +msgstr "ZakoÅ„czono pomyÅ›lnie." #: editor/editor_export.cpp -#, fuzzy msgid "Failed." -msgstr "Nie powiodÅ‚o siÄ™:" +msgstr "Nie powiodÅ‚o siÄ™." #: editor/editor_export.cpp msgid "Storing File:" @@ -2844,19 +2823,16 @@ msgid "Cannot create file \"%s\"." msgstr "Nie można utworzyć pliku \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to export project files." -msgstr "Nie udaÅ‚o siÄ™ eksportować plików projektu" +msgstr "Eksportowanie plików projektu nie powiodÅ‚o siÄ™." #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." msgstr "Nie można otworzyć pliku do zapisu:" #: editor/editor_export.cpp -#, fuzzy msgid "Save ZIP" -msgstr "Zapisz jako" +msgstr "Zapisz plik ZIP" #: editor/editor_export.cpp msgid "" @@ -2929,9 +2905,8 @@ msgid "Release" msgstr "Wydanie" #: editor/editor_export.cpp -#, fuzzy msgid "Binary Format" -msgstr "Operator koloru." +msgstr "Format binarny" #: editor/editor_export.cpp msgid "64 Bits" @@ -2942,9 +2917,8 @@ msgid "Embed PCK" msgstr "Osadź PCK" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Texture Format" -msgstr "Obszar tekstury" +msgstr "Format tekstury" #: editor/editor_export.cpp msgid "BPTC" @@ -2955,19 +2929,16 @@ msgid "S3TC" msgstr "S3TC" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "ETC" -msgstr "TCP" +msgstr "ETC" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "ETC2" msgstr "ETC2" #: editor/editor_export.cpp -#, fuzzy msgid "No BPTC Fallbacks" -msgstr "Fallback" +msgstr "Brak fallbacków BPTC" #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -2982,30 +2953,25 @@ msgid "Custom release template not found." msgstr "Nie znaleziono wÅ‚asnego szablonu wydania." #: editor/editor_export.cpp -#, fuzzy msgid "Prepare Template" -msgstr "ZarzÄ…dzaj szablonami" +msgstr "Przygotuj szablon" #: editor/editor_export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "The given export path doesn't exist." -msgstr "Podana Å›cieżka eksportu nie istnieje:" +msgstr "Podana Å›cieżka eksportu nie istnieje." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "Nie znaleziono pliku szablonu:" +msgstr "Nie znaleziono pliku szablonu: \"%s\"." #: editor/editor_export.cpp -#, fuzzy msgid "Failed to copy export template." -msgstr "Szablon eksportu nieprawidÅ‚owy:" +msgstr "Kopiowanie szablonu eksportu nie powiodÅ‚o siÄ™." #: editor/editor_export.cpp platform/windows/export/export.cpp #: platform/x11/export/export.cpp -#, fuzzy msgid "PCK Embedding" -msgstr "Wyrównanie" +msgstr "Osadzanie plików PCK" #: editor/editor_export.cpp msgid "On 32-bit exports the embedded PCK cannot be bigger than 4 GiB." @@ -3218,9 +3184,8 @@ msgid "Manage Editor Feature Profiles" msgstr "ZarzÄ…dzaj profilami funkcjonalnoÅ›ci edytora" #: editor/editor_feature_profile.cpp -#, fuzzy msgid "Default Feature Profile" -msgstr "Profil funkcjonalnoÅ›ci Godota" +msgstr "Profil domyÅ›lnych funkcji" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp msgid "Select Current Folder" @@ -3292,14 +3257,12 @@ msgid "Save a File" msgstr "Zapisz plik" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Access" -msgstr "Sukces!" +msgstr "DostÄ™p" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp -#, fuzzy msgid "Display Mode" -msgstr "Tryb odtwarzania:" +msgstr "Tryb wyÅ›wietlania" #: editor/editor_file_dialog.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -3312,30 +3275,25 @@ msgstr "Tryb odtwarzania:" #: scene/resources/environment.cpp scene/resources/material.cpp #: scene/resources/visual_shader.cpp #: servers/audio/effects/audio_effect_distortion.cpp -#, fuzzy msgid "Mode" -msgstr "Tryb przesuwania" +msgstr "Tryb" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Dir" -msgstr "Bieżący:" +msgstr "Bieżący katalog" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current File" -msgstr "Bieżący profil:" +msgstr "Bieżący Plik" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Path" -msgstr "Bieżący:" +msgstr "Bieżąca Å›cieżka" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #: scene/gui/file_dialog.cpp -#, fuzzy msgid "Show Hidden Files" -msgstr "Przełącz ukryte pliki" +msgstr "Pokaż ukryte pliki" #: editor/editor_file_dialog.cpp msgid "Disable Overwrite Warning" @@ -3439,7 +3397,6 @@ msgid "(Re)Importing Assets" msgstr "(Ponowne) importowanie zasobów" #: editor/editor_file_system.cpp -#, fuzzy msgid "Reimport Missing Imported Files" msgstr "Zaimportuj ponownie brakujÄ…ce importowane pliki" @@ -3632,36 +3589,30 @@ msgid "Property:" msgstr "WÅ‚aÅ›ciwość:" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp -#, fuzzy msgid "Label" -msgstr "Wartość" +msgstr "Etykieta" #: editor/editor_inspector.cpp editor/editor_spin_slider.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Read Only" -msgstr "Tylko metody" +msgstr "Tylko do odczytu" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp -#, fuzzy msgid "Checkable" -msgstr "Element wyboru" +msgstr "Zaznaczalne" #: editor/editor_inspector.cpp editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Checked" -msgstr "Zaznaczony element wyboru" +msgstr "Sprawdzone" #: editor/editor_inspector.cpp -#, fuzzy msgid "Draw Red" -msgstr "WywoÅ‚ania rysowania:" +msgstr "Rysuj czerwony" #: editor/editor_inspector.cpp -#, fuzzy msgid "Keying" -msgstr "Uruchom" +msgstr "Kluczowanie" #: editor/editor_inspector.cpp msgid "Pin value" @@ -4024,14 +3975,12 @@ msgid "Quick Open Script..." msgstr "Szybkie otwieranie skryptu..." #: editor/editor_node.cpp -#, fuzzy msgid "Save & Reload" msgstr "Zapisz i zrestartuj" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to '%s' before reloading?" -msgstr "Zapisać zmiany w \"%s\" przed zamkniÄ™ciem?" +msgstr "Zapisać zmiany w '%s' przed zrestartowaniem?" #: editor/editor_node.cpp msgid "Save & Close" @@ -4150,9 +4099,8 @@ msgid "Open Project Manager?" msgstr "Otworzyć menadżera projektów?" #: editor/editor_node.cpp -#, fuzzy msgid "Save changes to the following scene(s) before reloading?" -msgstr "Czy zapisać zmiany w aktualnej scenie/scenach przed wyjÅ›ciem?" +msgstr "Czy zapisać zmiany w aktualnej scenie/scenach przed zrestartowaniem?" #: editor/editor_node.cpp msgid "Save & Quit" @@ -4343,24 +4291,20 @@ msgstr "" #: editor/editor_node.cpp editor/editor_settings.cpp editor/scene_tree_dock.cpp #: servers/arvr/arvr_interface.cpp -#, fuzzy msgid "Interface" -msgstr "Interfejs użytkownika" +msgstr "Interfejs" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Scene Tabs" -msgstr "Przełącz zakÅ‚adkÄ™ sceny" +msgstr "ZakÅ‚adki scen" #: editor/editor_node.cpp -#, fuzzy msgid "Always Show Close Button" -msgstr "Zawsze pokazuj siatkÄ™" +msgstr "Zawsze pokazuj przycisk wyjÅ›cia" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Resize If Many Tabs" -msgstr "ZmieÅ„ rozmiar jeÅ›li wyÅ›wietlonych jest wiele zakÅ‚adek" +msgstr "Rozszerz rozmiar jeżeli jest wiele zakÅ‚adek" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Minimum Width" @@ -4371,9 +4315,8 @@ msgid "Output" msgstr "Konsola" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Always Clear Output On Play" -msgstr "Wyczyść wyjÅ›cie" +msgstr "Zawsze wyczyszczaj wyjÅ›cie gdy włączono grÄ™" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Open Output On Play" @@ -4388,41 +4331,34 @@ msgid "Save On Focus Loss" msgstr "Zapisz przy utracie skupienia" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Save Each Scene On Quit" -msgstr "Zapisz gałąź jako scenÄ™" +msgstr "Zapisz każdÄ… scenÄ™ przed wyjÅ›ciem" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Quit Confirmation" -msgstr "WyÅ›wietlaj informacje" +msgstr "Potwierdzenie wyjÅ›cia" #: editor/editor_node.cpp -#, fuzzy msgid "Show Update Spinner" -msgstr "Ukryj wiatraczek aktualizacji" +msgstr "Pokaż suwak aktualizacji" #: editor/editor_node.cpp msgid "Update Continuously" msgstr "Aktualizuj ciÄ…gle" #: editor/editor_node.cpp -#, fuzzy msgid "Update Vital Only" -msgstr "Zaktualizuj istotne zmiany" +msgstr "Aktualizuj tylko istotne" #: editor/editor_node.cpp -#, fuzzy msgid "Localize Settings" -msgstr "Lokalizacja" +msgstr "Lokalizuj ustawienia" #: editor/editor_node.cpp -#, fuzzy msgid "Restore Scenes On Load" -msgstr "Pozyskaj wÄ™zeÅ‚ sceny" +msgstr "Przywracaj sceny po zaÅ‚adowaniu" #: editor/editor_node.cpp editor/editor_settings.cpp -#, fuzzy msgid "Show Thumbnail On Hover" msgstr "Pokaż miniaturÄ™ po najechaniu kursorem" @@ -4431,18 +4367,16 @@ msgid "Inspector" msgstr "Inspektor" #: editor/editor_node.cpp -#, fuzzy msgid "Default Property Name Style" -msgstr "Åšcieżka do projektu:" +msgstr "DomyÅ›lny styl nazw wÅ‚aÅ›ciwoÅ›ci" #: editor/editor_node.cpp msgid "Default Float Step" msgstr "DomyÅ›lny krok zmiennoprzecinkowy" #: editor/editor_node.cpp scene/gui/tree.cpp -#, fuzzy msgid "Disable Folding" -msgstr "Wyłączony przycisk" +msgstr "Wyłącz zwijanie" #: editor/editor_node.cpp msgid "Auto Unfold Foreign Scenes" @@ -4457,19 +4391,16 @@ msgid "Horizontal Vector Types Editing" msgstr "Edycja poziomych typów wektorów" #: editor/editor_node.cpp -#, fuzzy msgid "Open Resources In Current Inspector" -msgstr "Otwórz w inspektorze" +msgstr "Otwórz zasoby w aktualnym inspektorze" #: editor/editor_node.cpp -#, fuzzy msgid "Resources To Open In New Inspector" -msgstr "Otwórz w inspektorze" +msgstr "Zasoby do otwarcia w nowym inspektorze" #: editor/editor_node.cpp -#, fuzzy msgid "Default Color Picker Mode" -msgstr "DomyÅ›lny tryb pipety" +msgstr "DomyÅ›lny tryb pobieracza kolorów" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Version Control" @@ -4477,7 +4408,7 @@ msgstr "Kontrola wersji" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "Username" -msgstr "Użytkownik" +msgstr "Nazwa użytkownika" #: editor/editor_node.cpp editor/plugins/version_control_editor_plugin.cpp msgid "SSH Public Key Path" @@ -5121,14 +5052,12 @@ msgid "Debugger" msgstr "Debugger" #: editor/editor_profiler.cpp -#, fuzzy msgid "Profiler Frame History Size" msgstr "Rozmiar historii klatek profilera" #: editor/editor_profiler.cpp -#, fuzzy msgid "Profiler Frame Max Functions" -msgstr "ZmieÅ„ nazwÄ™ funkcji" +msgstr "Maksymalna ilość funkcji klatki profilera" #: editor/editor_properties.cpp msgid "Edit Text:" @@ -5197,9 +5126,8 @@ msgid "Size:" msgstr "Rozmiar:" #: editor/editor_properties_array_dict.cpp -#, fuzzy msgid "Page:" -msgstr "Strona: " +msgstr "Strona:" #: editor/editor_properties_array_dict.cpp #: editor/plugins/theme_editor_plugin.cpp @@ -5261,20 +5189,17 @@ msgstr "Nowy %s" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Base Type" -msgstr "ZmieÅ„ typ podstawowy" +msgstr "Typ bazowy" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Edited Resource" -msgstr "Dodaj Zasób" +msgstr "Edytowany zasób" #: editor/editor_resource_picker.cpp scene/gui/line_edit.cpp #: scene/gui/slider.cpp scene/gui/spin_box.cpp -#, fuzzy msgid "Editable" -msgstr "Edytowalny element" +msgstr "Edytowalny" #: editor/editor_resource_picker.cpp editor/property_editor.cpp msgid "New Script" @@ -5285,9 +5210,8 @@ msgid "Extend Script" msgstr "Rozszerz skrypt" #: editor/editor_resource_picker.cpp -#, fuzzy msgid "Script Owner" -msgstr "Nazwa skryptu:" +msgstr "WÅ‚aÅ›ciciel skryptu" #: editor/editor_run_native.cpp msgid "" @@ -5300,9 +5224,8 @@ msgstr "" "jako uruchamialny." #: editor/editor_run_native.cpp -#, fuzzy msgid "Project Run" -msgstr "Projekt" +msgstr "Uruchom projekt" #: editor/editor_run_script.cpp msgid "Write your logic in the _run() method." @@ -5329,14 +5252,12 @@ msgid "Did you forget the '_run' method?" msgstr "Zapomniano metody \"_run\"?" #: editor/editor_settings.cpp -#, fuzzy msgid "Editor Language" -msgstr "UkÅ‚ad edytora" +msgstr "JÄ™zyk edytora" #: editor/editor_settings.cpp -#, fuzzy msgid "Display Scale" -msgstr "Pokaż wszystko" +msgstr "Rozmiar wyÅ›wietlania" #: editor/editor_settings.cpp msgid "Custom Display Scale" @@ -5359,21 +5280,18 @@ msgid "Font Hinting" msgstr "Czcionka podpowiedzi" #: editor/editor_settings.cpp -#, fuzzy msgid "Main Font" -msgstr "Scena główna" +msgstr "Główna czcionka" #: editor/editor_settings.cpp msgid "Main Font Bold" msgstr "Główna czcionka pogrubiona" #: editor/editor_settings.cpp -#, fuzzy msgid "Code Font" -msgstr "Dodaj punkt wÄ™zÅ‚a" +msgstr "Czcionka kodu" #: editor/editor_settings.cpp -#, fuzzy msgid "Dim Editor On Dialog Popup" msgstr "PrzygaÅ› edytor przy wyskakujÄ…cym oknie" @@ -5386,9 +5304,8 @@ msgid "Unfocused Low Processor Mode Sleep (µsec)" msgstr "Nieskoncentrowany tryb uÅ›pienia w trybie niskiego procesora (µsec)" #: editor/editor_settings.cpp -#, fuzzy msgid "Separate Distraction Mode" -msgstr "Tryb bez rozproszeÅ„" +msgstr "Oddzielny tryb bez rozproszeÅ„" #: editor/editor_settings.cpp msgid "Automatically Open Screenshots" @@ -5413,14 +5330,12 @@ msgid "Icon And Font Color" msgstr "Kolor ikony i czcionki" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Color" -msgstr "Kolory" +msgstr "Kolor podstawowy" #: editor/editor_settings.cpp -#, fuzzy msgid "Accent Color" -msgstr "Wybierz Kolor" +msgstr "Kolor akcentu" #: editor/editor_settings.cpp scene/resources/environment.cpp msgid "Contrast" @@ -5431,109 +5346,92 @@ msgid "Relationship Line Opacity" msgstr "Przezroczystość linii relacji" #: editor/editor_settings.cpp -#, fuzzy msgid "Highlight Tabs" -msgstr "Zapisywanie map Å›wiatÅ‚a" +msgstr "PodÅ›wietl zakÅ‚adki" #: editor/editor_settings.cpp -#, fuzzy msgid "Border Size" -msgstr "Brzegowe piksele" +msgstr "Rozmiar obwódki" #: editor/editor_settings.cpp msgid "Use Graph Node Headers" msgstr "Użyj wykresu nagłówków wÄ™złów" #: editor/editor_settings.cpp -#, fuzzy msgid "Additional Spacing" -msgstr "ZapÄ™tlenie animacji" +msgstr "Dodatkowe odstÄ™py" #: editor/editor_settings.cpp -#, fuzzy msgid "Custom Theme" -msgstr "Motyw edytora" +msgstr "WÅ‚asny motyw" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Script Button" -msgstr "Kółko w prawo" +msgstr "Pokaż przycisk skryptu" #: editor/editor_settings.cpp -#, fuzzy msgid "Directories" -msgstr "Kierunki" +msgstr "Katalogi" #: editor/editor_settings.cpp -#, fuzzy msgid "Autoscan Project Path" -msgstr "Åšcieżka do projektu:" +msgstr "Automatycznie skanuj Å›cieżkÄ™ projektu" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Project Path" -msgstr "Åšcieżka do projektu:" +msgstr "DomyÅ›lna Å›cieżka projektu" #: editor/editor_settings.cpp -#, fuzzy msgid "On Save" -msgstr "Zapisz" +msgstr "Przy zapisie" #: editor/editor_settings.cpp -#, fuzzy msgid "Compress Binary Resources" -msgstr "Kopiuj zasób" +msgstr "Skompresuj binarne zasoby" #: editor/editor_settings.cpp msgid "Safe Save On Backup Then Rename" msgstr "Bezpieczne zapisywanie kopii zapasowej, a nastÄ™pnie zmiana nazwy" #: editor/editor_settings.cpp -#, fuzzy msgid "File Dialog" -msgstr "Okno dialogowe XForm" +msgstr "Dialog plików" #: editor/editor_settings.cpp -#, fuzzy msgid "Thumbnail Size" -msgstr "Miniatura..." +msgstr "Rozmiar miniaturki" #: editor/editor_settings.cpp msgid "Docks" msgstr "Doki" #: editor/editor_settings.cpp -#, fuzzy msgid "Scene Tree" -msgstr "Pozyskaj drzewo sceny" +msgstr "Drzewo sceny" #: editor/editor_settings.cpp msgid "Start Create Dialog Fully Expanded" msgstr "Rozpocznij tworzenie w peÅ‚ni rozwiniÄ™tego okna dialogowego" #: editor/editor_settings.cpp -#, fuzzy msgid "Always Show Folders" -msgstr "Zawsze pokazuj siatkÄ™" +msgstr "Zawsze pokazuj foldery" #: editor/editor_settings.cpp -#, fuzzy msgid "Property Editor" -msgstr "Edytor grup" +msgstr "Edytor wÅ‚aÅ›ciwoÅ›ci" #: editor/editor_settings.cpp msgid "Auto Refresh Interval" msgstr "Czas miÄ™dzy automatycznym odÅ›wieżaniem" #: editor/editor_settings.cpp -#, fuzzy msgid "Subresource Hue Tint" -msgstr "Zasoby" +msgstr "OdcieÅ„ barwy zasobów podrzÄ™dnych" #: editor/editor_settings.cpp -#, fuzzy msgid "Color Theme" -msgstr "Motyw edytora" +msgstr "Motyw koloru" #: editor/editor_settings.cpp scene/3d/label_3d.cpp #: scene/resources/default_theme/default_theme.cpp @@ -5542,14 +5440,12 @@ msgstr "OdstÄ™py miÄ™dzy liniami" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp #: modules/gdscript/editor/gdscript_highlighter.cpp -#, fuzzy msgid "Highlighting" -msgstr "OÅ›wietlenie bezpoÅ›rednie" +msgstr "PodÅ›wietlanie" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Syntax Highlighting" -msgstr "PodÅ›wietlacz skÅ‚adni" +msgstr "PodÅ›wietlanie skÅ‚adni" #: editor/editor_settings.cpp scene/gui/text_edit.cpp msgid "Highlight All Occurrences" @@ -5564,28 +5460,24 @@ msgid "Highlight Type Safe Lines" msgstr "Wyróżnij typy bezpiecznych linii" #: editor/editor_settings.cpp -#, fuzzy msgid "Indent" -msgstr "WciÄ™cie w lewo" +msgstr "WciÄ™cie" #: editor/editor_settings.cpp editor/plugins/script_text_editor.cpp msgid "Auto Indent" msgstr "Automatyczne wciÄ™cie" #: editor/editor_settings.cpp -#, fuzzy msgid "Convert Indent On Save" -msgstr "ZamieÅ„ wciÄ™cia na spacje" +msgstr "ZamieÅ„ wciÄ™cia przy zapisie" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Tabs" -msgstr "WywoÅ‚ania rysowania:" +msgstr "Rysuj taby" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Draw Spaces" -msgstr "WywoÅ‚ania rysowania:" +msgstr "Rysuj spacje" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/tile_map.cpp @@ -5603,9 +5495,8 @@ msgid "V Scroll Speed" msgstr "Pionowa szybkość przewijania" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Minimap" -msgstr "Pokaż pozycjÄ™ poczÄ…tkowÄ…" +msgstr "Pokaż minimapÄ™" #: editor/editor_settings.cpp msgid "Minimap Width" @@ -5616,9 +5507,8 @@ msgid "Mouse Extra Buttons Navigate History" msgstr "Historia nawigacji dodatkowych przycisków myszy" #: editor/editor_settings.cpp -#, fuzzy msgid "Drag And Drop Selection" -msgstr "Wybór GridMap" +msgstr "PrzeciÄ…gnij i upuść zaznaczenie" #: editor/editor_settings.cpp msgid "Stay In Script Editor On Node Selected" @@ -5629,9 +5519,8 @@ msgid "Appearance" msgstr "WyglÄ…d" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Show Line Numbers" -msgstr "Numer linii:" +msgstr "Pokaż numery linii" #: editor/editor_settings.cpp #, fuzzy @@ -5669,7 +5558,7 @@ msgstr "Wytyczne dotyczÄ…ce dÅ‚ugoÅ›ci linii miÄ™kkiej kolumny" #: editor/editor_settings.cpp msgid "Line Length Guideline Hard Column" -msgstr "" +msgstr "Wytyczne dotyczÄ…ce dÅ‚ugoÅ›ci linii twardej kolumny" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp #, fuzzy @@ -5678,33 +5567,31 @@ msgstr "Edytor skryptów" #: editor/editor_settings.cpp msgid "Show Members Overview" -msgstr "" +msgstr "Pokaż podglÄ…d czÅ‚onków" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Files" -msgstr "Plik" +msgstr "Pliki" #: editor/editor_settings.cpp -#, fuzzy msgid "Trim Trailing Whitespace On Save" -msgstr "Przytnij koÅ„cowe biaÅ‚e znaki" +msgstr "Przytnij koÅ„cowe biaÅ‚e znaki przy zapisie" #: editor/editor_settings.cpp msgid "Autosave Interval Secs" -msgstr "" +msgstr "czas autozapisu sek" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp msgid "Restore Scripts On Load" -msgstr "" +msgstr "Przywróć skrypty przy zaÅ‚adowaniu" #: editor/editor_settings.cpp msgid "Auto Reload And Parse Scripts On Save" -msgstr "" +msgstr "Automatycznie przeÅ‚aduj i zanalizuj skrypty przy zapisie" #: editor/editor_settings.cpp msgid "Auto Reload Scripts On External Change" -msgstr "" +msgstr "Automatycznie przeÅ‚aduj skrypty przy zmianie zewnÄ™trznej" #: editor/editor_settings.cpp #, fuzzy @@ -5713,7 +5600,7 @@ msgstr "Opóźnienia wymuszania shaderów" #: editor/editor_settings.cpp msgid "Sort Members Outline Alphabetically" -msgstr "" +msgstr "Posortuj szkic czÅ‚onków alfabetycznie" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Cursor" @@ -5721,19 +5608,19 @@ msgstr "Kursor" #: editor/editor_settings.cpp msgid "Scroll Past End Of File" -msgstr "" +msgstr "Przewijaj za koniec pliku" #: editor/editor_settings.cpp msgid "Block Caret" -msgstr "" +msgstr "Zablokuj Karete" #: editor/editor_settings.cpp msgid "Caret Blink" -msgstr "" +msgstr "MigniÄ™cie karety" #: editor/editor_settings.cpp msgid "Caret Blink Speed" -msgstr "" +msgstr "PrÄ™dkość migania karety" #: editor/editor_settings.cpp #, fuzzy @@ -5748,15 +5635,15 @@ msgstr "UkoÅ„czenie" #: editor/editor_settings.cpp msgid "Idle Parse Delay" -msgstr "" +msgstr "Opóźnienie interpretacji" #: editor/editor_settings.cpp msgid "Auto Brace Complete" -msgstr "" +msgstr "Automatyczne zamykanie nawiasów" #: editor/editor_settings.cpp msgid "Code Complete Delay" -msgstr "" +msgstr "Opóźnienie zakoÅ„czenia kodu" #: editor/editor_settings.cpp msgid "Put Callhint Tooltip Below Current Line" @@ -13095,9 +12982,10 @@ msgstr "Opcje przyciÄ…gania" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "PrzesuniÄ™cie:" @@ -14534,16 +14422,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Niepoprawna Å›cieżka projektu (zmienić cokolwiek?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Nie udaÅ‚o siÄ™ wczytać project.godot w Å›cieżce projektu (błąd %d). Może go " "brakować lub być uszkodzony." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "Nie można byÅ‚o edytować engine.cfg w Å›cieżce projektu." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Nie można otworzyć projektu w \"%s\"." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -17074,7 +16963,7 @@ msgstr "Dodaj pole architektury" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "GDNativeLibrary" -msgstr "GDNativeLibrary" +msgstr "Natywna biblioteka GD" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Enabled GDNative Singleton" @@ -18383,7 +18272,7 @@ msgstr "Iterator" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" -msgstr "for (element) in (wejÅ›cie):" +msgstr "dla (elementu) w (input)" #: modules/visual_script/visual_script_flow_control.cpp #, fuzzy @@ -18555,9 +18444,8 @@ msgstr "Utwórz TablicÄ™" #: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Operator" -msgstr "Iterator" +msgstr "Operator" #: modules/visual_script/visual_script_nodes.cpp #, fuzzy @@ -18634,7 +18522,7 @@ msgstr "Pozyskaj samego siebie" #: modules/visual_script/visual_script_nodes.cpp msgid "CustomNode" -msgstr "NiestandardowyWÄ™zeÅ‚" +msgstr "Niestandardowy wÄ™zeÅ‚" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -24139,6 +24027,15 @@ msgstr "Błąd" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Sortuj" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" @@ -24954,7 +24851,7 @@ msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "Karetka" +msgstr "Kareta" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" diff --git a/editor/translations/pr.po b/editor/translations/pr.po index e8e4e5c79d..45bbc8daf0 100644 --- a/editor/translations/pr.po +++ b/editor/translations/pr.po @@ -12947,9 +12947,10 @@ msgstr "Yar, Blow th' Selected Down!" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14341,12 +14342,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -23398,6 +23398,15 @@ msgstr "Error loading yer Calligraphy Pen." msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Discharge ye' Signal" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/pt.po b/editor/translations/pt.po index 3052fff9bb..85814ded34 100644 --- a/editor/translations/pt.po +++ b/editor/translations/pt.po @@ -13,7 +13,7 @@ # Rueben Stevens <supercell03@gmail.com>, 2017. # SARDON <fabio3_Santos@hotmail.com>, 2017. # Vinicius Gonçalves <viniciusgoncalves21@gmail.com>, 2017. -# ssantos <ssantos@web.de>, 2018, 2019, 2020, 2021. +# ssantos <ssantos@web.de>, 2018, 2019, 2020, 2021, 2022. # Gonçalo Dinis Guerreiro João <goncalojoao205@gmail.com>, 2019. # Manuela Silva <mmsrs@sky.com>, 2020. # Murilo Gama <murilovsky2030@gmail.com>, 2020, 2022. @@ -29,13 +29,15 @@ # Rafael Testa <rafael1testa@gmail.com>, 2022. # Baiterson <baiter160@gmail.com>, 2022. # Tuily <brizolla.tuily@gmail.com>, 2022. +# Thuany <thutymsoares@gmail.com>, 2022. +# Isaque Mendes <isaquemendes405@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-19 05:22+0000\n" -"Last-Translator: Tuily <brizolla.tuily@gmail.com>\n" +"PO-Revision-Date: 2022-11-19 08:35+0000\n" +"Last-Translator: ssantos <ssantos@web.de>\n" "Language-Team: Portuguese <https://hosted.weblate.org/projects/godot-engine/" "godot/pt/>\n" "Language: pt\n" @@ -43,7 +45,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -2901,9 +2903,8 @@ msgid "ETC2" msgstr "ETC2" #: editor/editor_export.cpp -#, fuzzy msgid "No BPTC Fallbacks" -msgstr "Forçar Shader de Reserva" +msgstr "Sem Fallbacks para imagens BPTC" #: editor/editor_export.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp @@ -5593,9 +5594,8 @@ msgid "Caret Blink Speed" msgstr "Velocidade do Piscamento do Cursor" #: editor/editor_settings.cpp -#, fuzzy msgid "Right Click Moves Caret" -msgstr "Clique direito para adicionar ponto" +msgstr "Clique direito move cursor de texto" #: editor/editor_settings.cpp modules/gdscript/gdscript.cpp #: modules/gdscript/gdscript_editor.cpp @@ -5624,23 +5624,20 @@ msgid "Callhint Tooltip Offset" msgstr "Deslocamento da Sugestão de Chamada" #: editor/editor_settings.cpp -#, fuzzy msgid "Complete File Paths" -msgstr "Copiar Caminho do Nó" +msgstr "Caminhos Completos dos Arquivos" #: editor/editor_settings.cpp modules/gdscript/gdscript_editor.cpp -#, fuzzy msgid "Add Type Hints" -msgstr "Adicionar Tipo" +msgstr "Adicionar Dicas de Tipo" #: editor/editor_settings.cpp msgid "Use Single Quotes" msgstr "Use Citação Única" #: editor/editor_settings.cpp -#, fuzzy msgid "Show Help Index" -msgstr "Mostrar Ajudantes" +msgstr "Mostrar Ãndice de Dicas" #: editor/editor_settings.cpp msgid "Help Font Size" @@ -5675,32 +5672,27 @@ msgid "Secondary Grid Color" msgstr "Cor da Grade Secundária" #: editor/editor_settings.cpp -#, fuzzy msgid "Selection Box Color" -msgstr "Apenas seleção" +msgstr "Seleção de Cor da Caixa" #: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp -#, fuzzy msgid "3D Gizmos" -msgstr "Bugigangas" +msgstr "Bugigangas 3D" #: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp -#, fuzzy msgid "Gizmo Colors" -msgstr "Cores de Emissão" +msgstr "Cores das Bugigangas" #: editor/editor_settings.cpp -#, fuzzy msgid "Instanced" -msgstr "Instância" +msgstr "Instânciado" #: editor/editor_settings.cpp modules/gltf/gltf_node.cpp #: scene/3d/physics_body.cpp -#, fuzzy msgid "Joint" -msgstr "Ponto" +msgstr "Conjunto" #: editor/editor_settings.cpp scene/2d/collision_shape_2d.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/touch_screen_button.cpp @@ -5732,58 +5724,48 @@ msgid "Grid Division Level Bias" msgstr "Viés de NÃvel de Divisão de Grade" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid XZ Plane" -msgstr "Pintura do GridMap" +msgstr "Grade do Plano XZ" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid XY Plane" -msgstr "Pintura do GridMap" +msgstr "Grade do Plano XY" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid YZ Plane" -msgstr "Pintura do GridMap" +msgstr "Grade do Plano YZ" #: editor/editor_settings.cpp -#, fuzzy msgid "Default FOV" -msgstr "Predefinição" +msgstr "Campo de Visão (FOV) Padrão" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Z Near" -msgstr "Tema Predefinido" +msgstr "Z Padrão Próximo" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Z Far" -msgstr "Predefinição" +msgstr "Z Padrão Longe" #: editor/editor_settings.cpp msgid "Lightmap Baking Number Of CPU Threads" msgstr "Número de threads da CPU para Baking do Mapa de luz" #: editor/editor_settings.cpp -#, fuzzy msgid "Navigation Scheme" -msgstr "Modo Navegação" +msgstr "Esquema de Navegação" #: editor/editor_settings.cpp -#, fuzzy msgid "Invert Y Axis" -msgstr "Editar Eixo Y" +msgstr "Inverter Eixo Y" #: editor/editor_settings.cpp -#, fuzzy msgid "Invert X Axis" -msgstr "Editar Eixo X" +msgstr "Inverter Eixo X" #: editor/editor_settings.cpp -#, fuzzy msgid "Zoom Style" -msgstr "Diminuir Zoom" +msgstr "Estilo de Zoom" #: editor/editor_settings.cpp msgid "Emulate Numpad" @@ -5794,28 +5776,24 @@ msgid "Emulate 3 Button Mouse" msgstr "Emular Mouse de 3 Botões" #: editor/editor_settings.cpp -#, fuzzy msgid "Orbit Modifier" -msgstr "Ordenar por Primeiro Modificado" +msgstr "Modificador de Órbita" #: editor/editor_settings.cpp -#, fuzzy msgid "Pan Modifier" -msgstr "Modo deslocamento" +msgstr "Modificador de Panorâmica" #: editor/editor_settings.cpp -#, fuzzy msgid "Zoom Modifier" -msgstr "Modificado" +msgstr "Modificador de Zoom" #: editor/editor_settings.cpp editor/plugins/spatial_editor_plugin.cpp msgid "Warped Mouse Panning" msgstr "Panorama do Mouse Distorcido" #: editor/editor_settings.cpp -#, fuzzy msgid "Navigation Feel" -msgstr "Modo Navegação" +msgstr "Sensação de Navegação" #: editor/editor_settings.cpp msgid "Orbit Sensitivity" @@ -5826,82 +5804,68 @@ msgid "Orbit Inertia" msgstr "Inércia da Órbita" #: editor/editor_settings.cpp -#, fuzzy msgid "Translation Inertia" -msgstr "Traduções" +msgstr "Inércia de Translação" #: editor/editor_settings.cpp -#, fuzzy msgid "Zoom Inertia" -msgstr "Aumentar Zoom" +msgstr "Inércia de Zoom" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook" -msgstr "Freelook Cima" +msgstr "Visão Livre" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Navigation Scheme" -msgstr "Criar Malha de Navegação" +msgstr "Esquema de Navegação de Visão Livre" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Sensitivity" -msgstr "Freelook Esquerda" +msgstr "Sensibilidade de visualização livre" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Inertia" -msgstr "Freelook Esquerda" +msgstr "Inércia de Visualização livre" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Base Speed" -msgstr "Freelook Modificador de Velocidade" +msgstr "Velocidade Base de Visão Livre" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Activation Modifier" -msgstr "Freelook Modificador de Lentidão" +msgstr "Modificador de Ativação de Visão Livre" #: editor/editor_settings.cpp -#, fuzzy msgid "Freelook Speed Zoom Link" -msgstr "Freelook Modificador de Velocidade" +msgstr "Velocidade de Ligação do Visão Livre" #: editor/editor_settings.cpp editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Grid Color" -msgstr "Escolher cor" +msgstr "Cor da Grade" #: editor/editor_settings.cpp -#, fuzzy msgid "Guides Color" -msgstr "Escolher cor" +msgstr "Cor Guia" #: editor/editor_settings.cpp -#, fuzzy msgid "Smart Snapping Line Color" -msgstr "Ajuste Inteligente" +msgstr "Cor da Linha de Encaixe Inteligente" #: editor/editor_settings.cpp msgid "Bone Width" msgstr "Largura do Osso" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Color 1" -msgstr "Renomear Item Cor" +msgstr "Cor de Osso 1" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Color 2" -msgstr "Renomear Item Cor" +msgstr "Cor de Osso 2" #: editor/editor_settings.cpp msgid "Bone Selected Color" -msgstr "Cor dos Ossos Selecionados" +msgstr "Cor Selecionada do Osso" #: editor/editor_settings.cpp msgid "Bone IK Color" @@ -5936,32 +5900,28 @@ msgid "Pan Speed" msgstr "Velocidade de Rotação" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Poly Editor" -msgstr "Editor UV de PolÃgono 2D" +msgstr "Editor de PolÃgonos" #: editor/editor_settings.cpp msgid "Point Grab Radius" msgstr "Raio do Ponto de Captura" #: editor/editor_settings.cpp editor/plugins/polygon_2d_editor_plugin.cpp -#, fuzzy msgid "Show Previous Outline" -msgstr "Plano Anterior" +msgstr "Exibir Prévia Anterior" #: editor/editor_settings.cpp editor/scene_tree_dock.cpp -#, fuzzy msgid "Autorename Animation Tracks" -msgstr "Renomear Animação" +msgstr "Renomear Automaticamente Faixa de Animação" #: editor/editor_settings.cpp msgid "Default Create Bezier Tracks" msgstr "Criar Faixas de Bézier Padrão" #: editor/editor_settings.cpp -#, fuzzy msgid "Default Create Reset Tracks" -msgstr "Criar Pista(s) RESET" +msgstr "Criar Faixa RESET Por Padrão" #: editor/editor_settings.cpp msgid "Onion Layers Past Color" @@ -6877,9 +6837,8 @@ msgid "Use Ambient" msgstr "Usar Ambiente" #: editor/import/resource_importer_bitmask.cpp -#, fuzzy msgid "Create From" -msgstr "Criar Pasta" +msgstr "Criar à Partir de" #: editor/import/resource_importer_bitmask.cpp #: servers/audio/effects/audio_effect_compressor.cpp @@ -6891,18 +6850,16 @@ msgstr "Limite" #: editor/import/resource_importer_scene.cpp #: editor/import/resource_importer_texture.cpp #: editor/import/resource_importer_wav.cpp scene/3d/gi_probe.cpp -#, fuzzy msgid "Compress" -msgstr "Componentes" +msgstr "Comprimir" #: editor/import/resource_importer_csv_translation.cpp msgid "Delimiter" msgstr "Delimitador" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "ColorCorrect" -msgstr "Função Cor." +msgstr "Corrigir as Cores" #: editor/import/resource_importer_layered_texture.cpp msgid "No BPTC If RGB" @@ -6945,9 +6902,8 @@ msgid "sRGB" msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp -#, fuzzy msgid "Slices" -msgstr "Corte automático" +msgstr "Fatias" #: editor/import/resource_importer_layered_texture.cpp #: scene/gui/aspect_ratio_container.cpp scene/gui/control.cpp @@ -6964,9 +6920,8 @@ msgid "Vertical" msgstr "Vertical" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Generate Tangents" -msgstr "Gerar Pontos" +msgstr "Gerar Tangentes" #: editor/import/resource_importer_obj.cpp msgid "Scale Mesh" @@ -7095,19 +7050,16 @@ msgid "Store In Subdir" msgstr "Armazenar no Subdiretório" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Filter Script" -msgstr "Scripts de filtro" +msgstr "Filtrar Script" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Keep Custom Tracks" -msgstr "Transformar" +msgstr "Manter Faixas Personalizadas" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Optimizer" -msgstr "Otimizar" +msgstr "Otimizador" #: editor/import/resource_importer_scene.cpp #: editor/plugins/item_list_editor_plugin.cpp main/main.cpp @@ -7121,9 +7073,8 @@ msgstr "Otimizar" #: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp #: scene/gui/rich_text_label.cpp scene/resources/curve.cpp #: scene/resources/environment.cpp scene/resources/material.cpp -#, fuzzy msgid "Enabled" -msgstr "Ativar" +msgstr "Ativado" #: editor/import/resource_importer_scene.cpp msgid "Max Linear Error" @@ -7134,19 +7085,16 @@ msgid "Max Angular Error" msgstr "Máximo de Erros Angulares" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Angle" -msgstr "Valor" +msgstr "Ângulo Máximo" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Remove Unused Tracks" -msgstr "Remover Pista de Animação" +msgstr "Remover Faixas não Utilizadas" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Clips" -msgstr "Clips Anim" +msgstr "Clipes" #: editor/import/resource_importer_scene.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/particles_2d.cpp scene/3d/area.cpp scene/3d/cpu_particles.cpp @@ -7428,14 +7376,12 @@ msgid "Raw" msgstr "Raw" #: editor/inspector_dock.cpp -#, fuzzy msgid "Capitalized" -msgstr "Capitalizar" +msgstr "Capitalizado" #: editor/inspector_dock.cpp -#, fuzzy msgid "Localized" -msgstr "Localização" +msgstr "Localizado" #: editor/inspector_dock.cpp msgid "Localization not available for current language." @@ -7984,9 +7930,8 @@ msgid "New" msgstr "Novo" #: editor/plugins/animation_player_editor_plugin.cpp -#, fuzzy msgid "Paste As Reference" -msgstr "Referência de classe %s" +msgstr "Colar como Referência" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Edit Transitions..." @@ -8176,9 +8121,8 @@ msgid "Set the end animation. This is useful for sub-transitions." msgstr "Definir a animação final. Útil para sub-transições." #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition:" -msgstr "Transição: " +msgstr "Transição:" #: editor/plugins/animation_state_machine_editor.cpp msgid "Play Mode:" @@ -8478,25 +8422,21 @@ msgid "Loading..." msgstr "A Carregar..." #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "First" msgstr "Primeiro" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Previous" msgstr "Anterior" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Next" msgstr "Próximo" #: editor/plugins/asset_library_editor_plugin.cpp -#, fuzzy msgctxt "Pagination" msgid "Last" msgstr "Último" @@ -9110,23 +9050,20 @@ msgid "View" msgstr "Vista" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show" -msgstr "Mostrar grelha" +msgstr "Exibir" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Show When Snapping" -msgstr "Ajuste Inteligente" +msgstr "Exibir ao Encaixar" #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Hide" msgstr "Esconder" #: editor/plugins/canvas_item_editor_plugin.cpp -#, fuzzy msgid "Toggle Grid" -msgstr "Alternar Modo" +msgstr "Alternar Grade" #: editor/plugins/canvas_item_editor_plugin.cpp #: editor/plugins/polygon_2d_editor_plugin.cpp @@ -9485,9 +9422,8 @@ msgid "Swap Gradient Fill Points" msgstr "Trocar Pontos de Preenchimento de Gradiente" #: editor/plugins/gradient_texture_2d_editor_plugin.cpp -#, fuzzy msgid "Toggle Grid Snap" -msgstr "Alternar Modo" +msgstr "Alternar Encaixe da Grade" #: editor/plugins/item_list_editor_plugin.cpp editor/project_export.cpp #: scene/3d/label_3d.cpp scene/gui/button.cpp scene/gui/dialogs.cpp @@ -9510,9 +9446,8 @@ msgstr "ID" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separator" -msgstr "Separação:" +msgstr "Separador" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -9747,9 +9682,8 @@ msgstr "" "%s" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "MeshLibrary" -msgstr "Bib. de Malhas" +msgstr "Biblioteca de Malhas" #: editor/plugins/mesh_library_editor_plugin.cpp msgid "Add Item" @@ -9772,14 +9706,12 @@ msgid "Update from Scene" msgstr "Atualizar a partir da Cena" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Apply without Transforms" -msgstr "Aplicar Transformações do MeshInstance" +msgstr "Aplicar sem Transformações" #: editor/plugins/mesh_library_editor_plugin.cpp -#, fuzzy msgid "Apply with Transforms" -msgstr "Aplicar Transformações do MeshInstance" +msgstr "Aplicar com Transformações" #: editor/plugins/multimesh_editor_plugin.cpp msgid "No mesh source specified (and no MultiMesh set in node)." @@ -9945,9 +9877,8 @@ msgid "Volume" msgstr "Volume" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source:" -msgstr "Fonte de emissão: " +msgstr "Fonte de emissão:" #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." @@ -10641,19 +10572,16 @@ msgid "External" msgstr "Externo" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Use External Editor" -msgstr "Depurar com Editor Externo" +msgstr "Utilizar Editor Externo" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Exec Path" -msgstr "Exportar Caminho" +msgstr "Caminho de Execução" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Script Temperature Enabled" -msgstr "Selecionar Ficheiro de Modelo" +msgstr "Temperatura de Script Ativado" #: editor/plugins/script_editor_plugin.cpp msgid "Highlight Current Script" @@ -10668,19 +10596,16 @@ msgid "Current Script Background Color" msgstr "Cor de Fundo Script Atual" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Group Help Pages" -msgstr "Agrupar Seleção" +msgstr "Agrupar Páginas de Ajuda" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Sort Scripts By" -msgstr "Criar Script" +msgstr "Ordenar Scripts Por" #: editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "List Script Names As" -msgstr "Nome do Script:" +msgstr "Listar Nomes de Script Como" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" @@ -11042,15 +10967,13 @@ msgstr "Translação" #. TRANSLATORS: Refers to changing the scale of a node in the 3D editor. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Scaling:" -msgstr "A escalar: " +msgstr "Escala:" #. TRANSLATORS: Refers to changing the position of a node in the 3D editor. #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Translating:" -msgstr "A transladar: " +msgstr "Traduzir:" #: editor/plugins/spatial_editor_plugin.cpp msgid "Rotating %s degrees." @@ -11201,10 +11124,11 @@ msgid "(Not in GLES2)" msgstr "(Não em GLES2)" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "" "Debug draw modes are only available when using the GLES3 renderer, not GLES2." -msgstr "Não disponÃvel para o renderizador GLES2." +msgstr "" +"Modos de Debug draw só estão disponÃveis para uso com o renderizador GLES3. " +"GLES2 não suporta esta funcionalidade." #: editor/plugins/spatial_editor_plugin.cpp msgid "Freelook Left" @@ -11506,9 +11430,8 @@ msgid "Manipulator Gizmo Opacity" msgstr "Opacidade do Gizmo do Manipulador" #: editor/plugins/spatial_editor_plugin.cpp -#, fuzzy msgid "Show Viewport Rotation Gizmo" -msgstr "Bloquear Rotação da Vista" +msgstr "Exibir Gizmo de Rotação do Viewport" #: editor/plugins/spatial_editor_plugin.cpp msgid "Unnamed Gizmo" @@ -11559,9 +11482,8 @@ msgid "Invalid geometry, can't replace by mesh." msgstr "Geometria inválida, não substituÃvel por malha." #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Convert to MeshInstance2D" -msgstr "Converter para Mesh2D" +msgstr "Converter para MeshInstance2D" #: editor/plugins/sprite_editor_plugin.cpp msgid "Invalid geometry, can't create polygon." @@ -11592,19 +11514,16 @@ msgid "Sprite" msgstr "Sprite" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Simplification:" -msgstr "Simplificação: " +msgstr "Simplificação:" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Shrink (Pixels):" -msgstr "Encolher (Pixeis): " +msgstr "Encolher (Pixels):" #: editor/plugins/sprite_editor_plugin.cpp -#, fuzzy msgid "Grow (Pixels):" -msgstr "Aumentar (Pixeis): " +msgstr "Crescer (Pixels):" #: editor/plugins/sprite_editor_plugin.cpp msgid "Update Preview" @@ -11667,9 +11586,8 @@ msgid "New Animation" msgstr "Nova Animação" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "Métodos de filtro" +msgstr "Filtrar animações" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -11969,9 +11887,8 @@ msgstr "" "Fechar na mesma?" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Type" -msgstr "Remover Tile" +msgstr "Remover Tipo" #: editor/plugins/theme_editor_plugin.cpp msgid "" @@ -12015,14 +11932,12 @@ msgstr "" "Adicione-lhe mais itens manualmente ou importando-os de outro tema." #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Add Theme Type" -msgstr "Adicionar Tipo de Item" +msgstr "Adicionar Tipo de Tema" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Remove Theme Type" -msgstr "Remover Remoto" +msgstr "Remover Tipo de Tema" #: editor/plugins/theme_editor_plugin.cpp msgid "Add Color Item" @@ -12137,9 +12052,8 @@ msgid "Select Another Theme Resource:" msgstr "Selecionar Outro Recurso Tema:" #: editor/plugins/theme_editor_plugin.cpp -#, fuzzy msgid "Theme Resource" -msgstr "Renomear recurso" +msgstr "Recurso de Tema" #: editor/plugins/theme_editor_plugin.cpp msgid "Another Theme" @@ -12476,45 +12390,37 @@ msgid "Palette Min Width" msgstr "Largura MÃnima da Paleta" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Palette Item H Separation" -msgstr "Separador Nomeado" +msgstr "Separação Horizontal dos Itens de Paleta" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Show Tile Names" -msgstr "Mostrar Todos os Idiomas" +msgstr "Mostrar Nomes dos Tiles" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Show Tile Ids" -msgstr "Mostrar réguas" +msgstr "Mostrar Ids dos Tiles" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Sort Tiles By Name" -msgstr "Ordenar ficheiros" +msgstr "Ordenar Tiles por Nome" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Bucket Fill Preview" -msgstr "Balde de Enchimento" +msgstr "Pré-visualização do Preenchimento de Balde" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Editor Side" -msgstr "Editor" +msgstr "Lado do Editor" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Display Grid" -msgstr "Vista Overdraw" +msgstr "Mostrar Grid" #: editor/plugins/tile_map_editor_plugin.cpp -#, fuzzy msgid "Axis Color" -msgstr "Escolher cor" +msgstr "Cor do Eixo" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Add Texture(s) to TileSet." @@ -12851,9 +12757,8 @@ msgid "This property can't be changed." msgstr "Esta propriedade não pode ser alterada." #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Snap Options" -msgstr "Opções de Ajuste" +msgstr "Opções de Encaixe" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/animated_sprite.cpp #: scene/2d/camera_2d.cpp scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp @@ -12861,12 +12766,12 @@ msgstr "Opções de Ajuste" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp -#, fuzzy +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" -msgstr "Compensação:" +msgstr "Deslocamento" #: editor/plugins/tile_set_editor_plugin.cpp editor/rename_dialog.cpp #: scene/gui/range.cpp scene/resources/animation.cpp @@ -12877,14 +12782,12 @@ msgstr "Passo" #: editor/plugins/tile_set_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separation" -msgstr "Separação:" +msgstr "Separação" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Tile" -msgstr "Selecionar" +msgstr "Selecionar Tile" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/light_2d.cpp scene/2d/line_2d.cpp scene/2d/mesh_instance_2d.cpp @@ -12893,97 +12796,79 @@ msgstr "Selecionar" #: scene/gui/nine_patch_rect.cpp scene/gui/texture_rect.cpp #: scene/resources/material.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Texture" -msgstr "Texto" +msgstr "Textura" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tex Offset" -msgstr "Compensação da grelha:" +msgstr "Deslocamento da Textura" #: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp #: scene/3d/mesh_instance.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Material" -msgstr "Mudanças de Material:" +msgstr "Material" #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/canvas_item.cpp #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Modulate" -msgstr "Povoar" +msgstr "Modular" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tile Mode" -msgstr "Alternar Modo" +msgstr "Modo de Tiles" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Autotile Bitmask Mode" -msgstr "Modo Bitmask" +msgstr "Modo Bitmask do Autotile" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Subtile Size" -msgstr "Tamanho do contorno:" +msgstr "Tamanho do Subtile" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Subtile Spacing" -msgstr "Loop da Animação" +msgstr "Espaçamento dos Subtiles" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occluder Offset" -msgstr "Criar PolÃgono Oclusor" +msgstr "Deslocamento de Oclusor" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation Offset" -msgstr "Modo Navegação" +msgstr "Deslocamento da Navegação" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Shape Offset" -msgstr "Compensação:" +msgstr "Deslocamento da Forma" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Shape Transform" -msgstr "Transformar" +msgstr "Transformação da Forma" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision" -msgstr "Colisão" +msgstr "Colisão Selecionada" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision One Way" -msgstr "Apenas seleção" +msgstr "Colisão em sentido único selecionada" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision One Way Margin" -msgstr "Modo Colisão" +msgstr "Margem de colisão em sentido único selecionada" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Navigation" -msgstr "Navegação VisÃvel" +msgstr "Navegação Selecionada" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Occlusion" -msgstr "Selecionar" +msgstr "Oclusão Selecionada" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tileset Script" -msgstr "Scripts de filtro" +msgstr "Scripts do Tileset" #: editor/plugins/tile_set_editor_plugin.cpp msgid "TileSet" @@ -14188,51 +14073,44 @@ msgstr "" "você precisa construir os modelos de exportação da fonte." #: editor/project_export.cpp -#, fuzzy msgid "More Info..." -msgstr "Mover para..." +msgstr "Mais Informações..." #: editor/project_export.cpp -#, fuzzy msgid "Export PCK/Zip..." -msgstr "Exportar PCK/Zip" +msgstr "Exportar PCK/Zip..." #: editor/project_export.cpp -#, fuzzy msgid "Export Project..." -msgstr "Exportar Projeto" +msgstr "Exportar Projeto…" #: editor/project_export.cpp msgid "Export All" msgstr "Exportar Tudo" #: editor/project_export.cpp -#, fuzzy msgid "Choose an export mode:" -msgstr "Por favor escolha uma pasta vazia." +msgstr "Escolha um modo de exportação:" #: editor/project_export.cpp -#, fuzzy msgid "Export All..." -msgstr "Exportar Tudo" +msgstr "Exportar tudo…" #: editor/project_export.cpp editor/project_manager.cpp msgid "ZIP File" msgstr "Ficheiro ZIP" #: editor/project_export.cpp -#, fuzzy msgid "Godot Project Pack" -msgstr "Pacote de Jogo Godot" +msgstr "Pacote do Projeto Godot" #: editor/project_export.cpp msgid "Export templates for this platform are missing:" msgstr "Não existem Modelos de exportação para esta plataforma:" #: editor/project_export.cpp -#, fuzzy msgid "Project Export" -msgstr "Fundadores do Projeto" +msgstr "Exportar Projeto" #: editor/project_export.cpp msgid "Manage Export Templates" @@ -14298,16 +14176,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Caminho de projeto inválido (alguma alteração?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Não consegui carregar o project.godot no caminho do projeto (erro %d). " "Poderá estar em falta ou corrompido." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "Incapaz de editar project.godot no caminho do projeto." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Incapaz de abrir projeto em '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -14546,7 +14425,6 @@ msgstr "" #. TRANSLATORS: This refers to the application where users manage their Godot projects. #: editor/project_manager.cpp -#, fuzzy msgctxt "Application" msgid "Project Manager" msgstr "Gestor de Projetos" @@ -15343,19 +15221,16 @@ msgid "Make Local" msgstr "Tornar Local" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Enable Scene Unique Name(s)" -msgstr "Nome do Nó:" +msgstr "Ativar Nome(s) Único(s) de Cena" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Unique names already used by another node in the scene:" -msgstr "Outro nó já usa esse nome exclusivo na cena." +msgstr "Nomes únicos já estão sendo usados por outro nó na cena:" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Disable Scene Unique Name(s)" -msgstr "Nome do Nó:" +msgstr "Desativar Nome(s) Único(s) de Cena" #: editor/scene_tree_dock.cpp msgid "New Scene Root" @@ -15530,18 +15405,16 @@ msgid "Clear Inheritance? (No Undo!)" msgstr "Limpar herança? (Definitivo!)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Show Scene Tree Root Selection" -msgstr "Centrar Seleção" +msgstr "Mostrar seleção da hierarquia de cenas" #: editor/scene_tree_dock.cpp msgid "Derive Script Globals By Name" msgstr "Derivar Globais de Script Por Nome" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Use Favorites Root Selection" -msgstr "Seleção de Frame" +msgstr "Seleção de favoritos da raÃz" #: editor/scene_tree_editor.cpp msgid "Toggle Visible" @@ -15556,9 +15429,8 @@ msgid "Button Group" msgstr "Grupo Botão" #: editor/scene_tree_editor.cpp -#, fuzzy msgid "Disable Scene Unique Name" -msgstr "Nome do Nó:" +msgstr "Desativar Nome Único de Cena" #: editor/scene_tree_editor.cpp msgid "(Connecting From)" @@ -15791,9 +15663,8 @@ msgid "Attach Node Script" msgstr "Anexar Script de Nó" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Remote %s:" -msgstr "Remoto " +msgstr "%s remoto:" #: editor/script_editor_debugger.cpp msgid "Bytes:" @@ -15868,9 +15739,8 @@ msgid "Stack Frames" msgstr "Empilhar Frames" #: editor/script_editor_debugger.cpp -#, fuzzy msgid "Filter stack variables" -msgstr "Filtrar Tiles" +msgstr "Filtrar variáveis stack" #: editor/script_editor_debugger.cpp msgid "Auto Switch To Remote Scene Tree" @@ -16547,26 +16417,22 @@ msgid "Calculate Tangents" msgstr "Calcular Tangentes" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Use Collision" -msgstr "Colisão" +msgstr "Usar Colisão" #: modules/csg/csg_shape.cpp servers/physics_2d_server.cpp -#, fuzzy msgid "Collision Layer" -msgstr "Modo Colisão" +msgstr "Camada de Colisão" #: modules/csg/csg_shape.cpp scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp #: scene/3d/ray_cast.cpp scene/3d/spring_arm.cpp #: scene/resources/navigation_mesh.cpp servers/physics_server.cpp -#, fuzzy msgid "Collision Mask" -msgstr "Modo Colisão" +msgstr "Máscara de Colisão" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Invert Faces" -msgstr "Converter maiúsculas/minúsculas" +msgstr "Inverter Faces" #: modules/csg/csg_shape.cpp scene/2d/navigation_agent_2d.cpp #: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_agent.cpp @@ -16576,43 +16442,36 @@ msgstr "Converter maiúsculas/minúsculas" #: scene/resources/cylinder_shape.cpp scene/resources/environment.cpp #: scene/resources/navigation_mesh.cpp scene/resources/primitive_meshes.cpp #: scene/resources/sphere_shape.cpp -#, fuzzy msgid "Radius" -msgstr "Raio:" +msgstr "Raio" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Radial Segments" -msgstr "Argumentos da Cena Principal:" +msgstr "Segmentos Radiais" #: modules/csg/csg_shape.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Rings" -msgstr "Avisos" +msgstr "Anéis" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Smooth Faces" -msgstr "Smoothstep" +msgstr "Suavizar Faces" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Sides" -msgstr "Mostrar Guias" +msgstr "Lados" #: modules/csg/csg_shape.cpp msgid "Cone" msgstr "Cone" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Inner Radius" -msgstr "Mudar Raio Interno do Toro" +msgstr "Raio Interno" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Outer Radius" -msgstr "Mudar Raio Externo do Toro" +msgstr "Raio Externo" #: modules/csg/csg_shape.cpp msgid "Ring Sides" @@ -16621,9 +16480,8 @@ msgstr "Lados do Anel" #: modules/csg/csg_shape.cpp scene/2d/collision_polygon_2d.cpp #: scene/2d/light_occluder_2d.cpp scene/2d/polygon_2d.cpp #: scene/3d/collision_polygon.cpp -#, fuzzy msgid "Polygon" -msgstr "PolÃgonos" +msgstr "PolÃgono" #: modules/csg/csg_shape.cpp msgid "Spin Degrees" @@ -16634,14 +16492,12 @@ msgid "Spin Sides" msgstr "Girar Lados" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Node" -msgstr "Colar Nós" +msgstr "Caminho do Nó" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Interval Type" -msgstr "Criar vértice interno" +msgstr "Tipo de Intervalo de Caminho" #: modules/csg/csg_shape.cpp msgid "Path Interval" @@ -16652,14 +16508,12 @@ msgid "Path Simplify Angle" msgstr "Simplifique o Ângulo do Caminho" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Rotation" -msgstr "Rotação aleatória:" +msgstr "Rotação do Caminho" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Local" -msgstr "Tornar Local" +msgstr "Caminho Local" #: modules/csg/csg_shape.cpp #, fuzzy @@ -16667,34 +16521,28 @@ msgid "Path Continuous U" msgstr "ContÃnuo" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path U Distance" -msgstr "Distância de escolha:" +msgstr "Distância do Caminho U" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Joined" -msgstr "Rotação aleatória:" +msgstr "Caminho Unido" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Compression Mode" -msgstr "Modo Colisão" +msgstr "Modo de Compressão" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Transfer Channel" -msgstr "Mudar Transformação" +msgstr "Transferir Canal" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Channel Count" -msgstr "Instância" +msgstr "Quantidade de Canais" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Always Ordered" -msgstr "Mostrar Grelha Sempre" +msgstr "Sempre Ordenado" #: modules/enet/networked_multiplayer_enet.cpp msgid "Server Relay" @@ -16709,9 +16557,8 @@ msgid "DTLS Hostname" msgstr "Nome do Host DTLS" #: modules/enet/networked_multiplayer_enet.cpp -#, fuzzy msgid "Use DTLS" -msgstr "Usar Ajuste" +msgstr "Usar DTLS" #: modules/fbx/editor_scene_importer_fbx.cpp msgid "FBX" @@ -16722,14 +16569,12 @@ msgid "Use FBX" msgstr "Usar FBX" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Config File" -msgstr "Armazenar o Ficheiro:" +msgstr "Ficheiro de Configuração" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Load Once" -msgstr "Carregar recurso" +msgstr "Carregar Apenas uma Vez" #: modules/gdnative/gdnative.cpp #: modules/visual_script/visual_script_func_nodes.cpp @@ -16738,14 +16583,12 @@ msgid "Singleton" msgstr "Esqueleto" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Symbol Prefix" -msgstr "Prefixo:" +msgstr "Prefixo do SÃmbolo" #: modules/gdnative/gdnative.cpp -#, fuzzy msgid "Reloadable" -msgstr "Recarregar" +msgstr "Recarregável" #: modules/gdnative/gdnative.cpp #: modules/gdnative/gdnative_library_singleton_editor.cpp @@ -16798,24 +16641,20 @@ msgid "Disabled GDNative Singleton" msgstr "Instância única GDNative desativada" #: modules/gdnative/gdnative_library_singleton_editor.cpp -#, fuzzy msgid "Libraries:" -msgstr "Bibliotecas: " +msgstr "Bibliotecas:" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Class Name" -msgstr "Nome de Classe:" +msgstr "Nome da Classe" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Script Class" -msgstr "Nome do Script:" +msgstr "Classe do Script" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Icon Path" -msgstr "Caminho de Foco" +msgstr "Caminho para Ãcone" #: modules/gdnative/register_types.cpp msgid "GDNative" @@ -16823,18 +16662,16 @@ msgstr "GDNative" #: modules/gdscript/editor/gdscript_highlighter.cpp #: modules/gdscript/gdscript.cpp -#, fuzzy msgid "GDScript" -msgstr "Script" +msgstr "GDScript" #: modules/gdscript/editor/gdscript_highlighter.cpp msgid "Function Definition Color" msgstr "Função de Definição de Cor" #: modules/gdscript/editor/gdscript_highlighter.cpp -#, fuzzy msgid "Node Path Color" -msgstr "Copiar Caminho do Nó" +msgstr "Cor do Caminho do Nó" #: modules/gdscript/gdscript.cpp modules/visual_script/visual_script.cpp msgid "Max Call Stack" @@ -16891,9 +16728,8 @@ msgid "Object can't provide a length." msgstr "Objeto não fornece um comprimento." #: modules/gdscript/language_server/gdscript_language_server.cpp -#, fuzzy msgid "Language Server" -msgstr "Linguagem:" +msgstr "Servidor de Idioma" #: modules/gdscript/language_server/gdscript_language_server.cpp msgid "Enable Smart Resolve" @@ -16916,44 +16752,36 @@ msgid "Export GLTF..." msgstr "Exportar GLTF..." #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Buffer View" -msgstr "Vista de Trás" +msgstr "Visão de Buffer" #: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Byte Offset" -msgstr "Compensação da grelha:" +msgstr "Deslocamento do Byte" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Component Type" -msgstr "Componentes" +msgstr "Tipo do Componente" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Normalized" -msgstr "Formato" +msgstr "Normalizado" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Count" -msgstr "Valor:" +msgstr "Quantidade" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Min" -msgstr "MiB" +msgstr "Min" #: modules/gltf/gltf_accessor.cpp scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Max" -msgstr "Combinar" +msgstr "Max" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Sparse Count" -msgstr "Instância" +msgstr "Contagem Escassa" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Buffer View" @@ -16964,9 +16792,8 @@ msgid "Sparse Indices Byte Offset" msgstr "Deslocamento de Bytes de Ãndices Esparsos" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Sparse Indices Component Type" -msgstr "A analisar geometria..." +msgstr "Tipo de Componente de Ãndices Esparsos" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Values Buffer View" @@ -16977,37 +16804,32 @@ msgid "Sparse Values Byte Offset" msgstr "Deslocamento de Bytes de Valores Esparsos" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Buffer" -msgstr "Vista de Trás" +msgstr "Buffer" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Byte Length" -msgstr "Tema Predefinido" +msgstr "Largura do byte" #: modules/gltf/gltf_buffer_view.cpp msgid "Byte Stride" msgstr "Passo de Byte" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Indices" -msgstr "Todos os Aparelhos" +msgstr "Ãndices" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "FOV Size" -msgstr "Tamanho:" +msgstr "Tamanho do FOV" #: modules/gltf/gltf_camera.cpp msgid "Zfar" msgstr "Zfar" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "Znear" -msgstr "Linear" +msgstr "Z perto" #: modules/gltf/gltf_light.cpp scene/2d/canvas_modulate.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp scene/2d/polygon_2d.cpp @@ -17017,9 +16839,8 @@ msgstr "Linear" #: scene/resources/environment.cpp scene/resources/material.cpp #: scene/resources/particles_material.cpp scene/resources/sky.cpp #: scene/resources/style_box.cpp -#, fuzzy msgid "Color" -msgstr "Cores" +msgstr "Cor" #: modules/gltf/gltf_light.cpp scene/3d/reflection_probe.cpp #: scene/resources/environment.cpp @@ -17027,9 +16848,8 @@ msgid "Intensity" msgstr "Intensidade" #: modules/gltf/gltf_light.cpp scene/2d/light_2d.cpp scene/3d/light.cpp -#, fuzzy msgid "Range" -msgstr "Mudar" +msgstr "Intervalo" #: modules/gltf/gltf_light.cpp msgid "Inner Cone Angle" @@ -17040,19 +16860,16 @@ msgid "Outer Cone Angle" msgstr "Ângulo do Cone Externo" #: modules/gltf/gltf_mesh.cpp -#, fuzzy msgid "Blend Weights" -msgstr "Consolidar Lightmaps" +msgstr "Peso da mesclagem" #: modules/gltf/gltf_mesh.cpp -#, fuzzy msgid "Instance Materials" -msgstr "Mudanças de Material:" +msgstr "Materiais da Instância" #: modules/gltf/gltf_node.cpp scene/3d/skeleton.cpp -#, fuzzy msgid "Parent" -msgstr "Reassociar" +msgstr "Pai" #: modules/gltf/gltf_node.cpp #, fuzzy @@ -17064,19 +16881,16 @@ msgid "Skin" msgstr "Skin" #: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp -#, fuzzy msgid "Translation" -msgstr "Traduções" +msgstr "Tradução" #: modules/gltf/gltf_node.cpp -#, fuzzy msgid "Children" -msgstr "Filhos editáveis" +msgstr "Filhos" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Joints" -msgstr "Ponto" +msgstr "Pontos" #: modules/gltf/gltf_skeleton.cpp modules/gltf/gltf_skin.cpp msgid "Roots" @@ -17087,28 +16901,24 @@ msgid "Unique Names" msgstr "Nomes Únicos" #: modules/gltf/gltf_skeleton.cpp -#, fuzzy msgid "Godot Bone Node" -msgstr "Obter Nó da Cena" +msgstr "Nó de Osso Godot" #: modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Skin Root" -msgstr "Nova Raiz da Cena" +msgstr "Raiz da Skin" #: modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Joints Original" -msgstr "Focar na Origem" +msgstr "Pontos Originais" #: modules/gltf/gltf_skin.cpp msgid "Inverse Binds" msgstr "Inverter Ligações" #: modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Non Joints" -msgstr "Mover Junta" +msgstr "Não-Juntas" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Bone I" @@ -17147,48 +16957,41 @@ msgid "Json" msgstr "Json" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Major Version" -msgstr "Versão" +msgstr "Versão Importante" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Minor Version" -msgstr "Versão" +msgstr "Versão Minoritária" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "GLB Data" -msgstr "Com Dados" +msgstr "Dados do GLB" #: modules/gltf/gltf_state.cpp msgid "Use Named Skin Binds" msgstr "Usar Ligações de Skin Nomeadas" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Buffer Views" -msgstr "Vista de Trás" +msgstr "Visão Buffer" #: modules/gltf/gltf_state.cpp msgid "Accessors" msgstr "Assessores" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Scene Name" -msgstr "Caminho da Cena:" +msgstr "Nome da Cena" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Root Nodes" -msgstr "Nome do nó raiz" +msgstr "Nós RaÃzes" #: modules/gltf/gltf_state.cpp scene/2d/particles_2d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_progress.cpp -#, fuzzy msgid "Textures" -msgstr "Funcionalidades" +msgstr "Texturas" #: modules/gltf/gltf_state.cpp platform/uwp/export/export.cpp msgid "Images" @@ -17199,72 +17002,60 @@ msgid "Cameras" msgstr "Câmeras" #: modules/gltf/gltf_state.cpp servers/visual_server.cpp -#, fuzzy msgid "Lights" -msgstr "Luz" +msgstr "Luzes" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Unique Animation Names" -msgstr "Novo Nome da Animação:" +msgstr "Nomes de Animação Únicos" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Skeletons" -msgstr "Esqueleto" +msgstr "Esqueletos" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Skeleton To Node" -msgstr "Selecione um Nó" +msgstr "Esqueleto Para Nó" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Animations" -msgstr "Animações:" +msgstr "Animações" #: modules/gltf/gltf_texture.cpp -#, fuzzy msgid "Src Image" -msgstr "Mostrar ossos" +msgstr "Imagem fonte" #: modules/gridmap/grid_map.cpp msgid "Mesh Library" msgstr "Bib. de Malhas" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Physics Material" -msgstr "Frame de FÃsica %" +msgstr "Material de FÃsica" #: modules/gridmap/grid_map.cpp scene/3d/visual_instance.cpp -#, fuzzy msgid "Use In Baked Light" -msgstr "Consolidar Lightmaps" +msgstr "Usar no mapa de luz" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp msgid "Cell" msgstr "Célula" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Octant Size" -msgstr "Vista de Frente" +msgstr "Tamanho Octante" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Center X" -msgstr "Centro" +msgstr "Centro X" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Center Y" -msgstr "Centro" +msgstr "Centro Y" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Center Z" -msgstr "Centro" +msgstr "Centro Z" #: modules/gridmap/grid_map.cpp scene/2d/collision_object_2d.cpp #: scene/2d/tile_map.cpp scene/3d/collision_object.cpp scene/3d/soft_body.cpp @@ -17273,17 +17064,15 @@ msgid "Mask" msgstr "Máscara" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp -#, fuzzy msgid "Bake Navigation" -msgstr "Navegação" +msgstr "Navegação Pré-Processada" #: modules/gridmap/grid_map.cpp scene/2d/navigation_2d.cpp #: scene/2d/navigation_agent_2d.cpp scene/2d/navigation_polygon.cpp #: scene/2d/tile_map.cpp scene/3d/navigation.cpp scene/3d/navigation_agent.cpp #: scene/3d/navigation_mesh_instance.cpp -#, fuzzy msgid "Navigation Layers" -msgstr "Modo Navegação" +msgstr "Camadas da Navegação" #: modules/gridmap/grid_map_editor_plugin.cpp msgid "Next Plane" @@ -17442,9 +17231,8 @@ msgid "Plotting lightmaps" msgstr "A Traçar lightmaps" #: modules/lightmapper_cpu/register_types.cpp -#, fuzzy msgid "CPU Lightmapper" -msgstr "Consolidar Lightmaps" +msgstr "Mapeamento de Luz da CPU" #: modules/lightmapper_cpu/register_types.cpp msgid "Low Quality Ray Count" @@ -17466,9 +17254,8 @@ msgstr "Contagem de Raios de Ultra Qualidade" #: modules/minimp3/resource_importer_mp3.cpp #: modules/stb_vorbis/audio_stream_ogg_vorbis.cpp #: modules/stb_vorbis/resource_importer_ogg_vorbis.cpp -#, fuzzy msgid "Loop Offset" -msgstr "Compensação:" +msgstr "Deslocamento do Loop" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Eye Height" @@ -17479,14 +17266,12 @@ msgid "IOD" msgstr "IOD" #: modules/mobile_vr/mobile_vr_interface.cpp -#, fuzzy msgid "Display Width" -msgstr "Vista Wireframe" +msgstr "Largura de Ecrã" #: modules/mobile_vr/mobile_vr_interface.cpp -#, fuzzy msgid "Display To Lens" -msgstr "Vista sem sombras" +msgstr "Exibir à s Lentes" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Oversample" @@ -17509,24 +17294,20 @@ msgid "Build Solution" msgstr "Construir Solução" #: modules/mono/editor/csharp_project.cpp -#, fuzzy msgid "Auto Update Project" -msgstr "Projeto sem nome" +msgstr "Atualizar Projeto Automaticamente" #: modules/mono/godotsharp_dirs.cpp -#, fuzzy msgid "Assembly Name" -msgstr "Mostrar Tudo" +msgstr "Nome de Montagem" #: modules/mono/godotsharp_dirs.cpp -#, fuzzy msgid "Solution Directory" -msgstr "Escolha uma Diretoria" +msgstr "Diretório da Solução" #: modules/mono/godotsharp_dirs.cpp -#, fuzzy msgid "C# Project Directory" -msgstr "Escolha uma Diretoria" +msgstr "Diretório do Projeto C#" #: modules/mono/mono_gd/gd_mono_utils.cpp msgid "End of inner exception stack trace" @@ -17604,9 +17385,8 @@ msgid "Seamless" msgstr "Sem Emenda" #: modules/opensimplex/noise_texture.cpp -#, fuzzy msgid "As Normal Map" -msgstr "Escala aleatória:" +msgstr "Como Mapa Normal" #: modules/opensimplex/noise_texture.cpp msgid "Bump Strength" @@ -17617,9 +17397,8 @@ msgid "Noise" msgstr "Ruido" #: modules/opensimplex/noise_texture.cpp -#, fuzzy msgid "Noise Offset" -msgstr "Compensação da grelha:" +msgstr "Deslocamento do RuÃdo" #: modules/opensimplex/open_simplex_noise.cpp msgid "Octaves" @@ -17630,9 +17409,8 @@ msgid "Period" msgstr "Periodo" #: modules/opensimplex/open_simplex_noise.cpp -#, fuzzy msgid "Persistence" -msgstr "Perspetiva" +msgstr "Persistência" #: modules/opensimplex/open_simplex_noise.cpp msgid "Lacunarity" @@ -17643,14 +17421,12 @@ msgid "Subject" msgstr "Sujeito" #: modules/regex/regex.cpp -#, fuzzy msgid "Names" -msgstr "Nome" +msgstr "Nomes" #: modules/regex/regex.cpp -#, fuzzy msgid "Strings" -msgstr "Configuração:" +msgstr "Strings" #: modules/upnp/upnp.cpp msgid "Discover Multicast If" @@ -17665,32 +17441,28 @@ msgid "Discover IPv6" msgstr "Descobrir IPv6" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "Description URL" -msgstr "Descrição" +msgstr "URL Descritiva" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "Service Type" -msgstr "Definir tipo de variável" +msgstr "Tipo de Serviço" #: modules/upnp/upnp_device.cpp msgid "IGD Control URL" msgstr "URL de controle IGD" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "IGD Service Type" -msgstr "Definir tipo de variável" +msgstr "Tipo de Serviço IGD" #: modules/upnp/upnp_device.cpp msgid "IGD Our Addr" msgstr "IGD Nosso Endereço" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "IGD Status" -msgstr "Status" +msgstr "Estado do IGD" #: modules/visual_script/visual_script.cpp msgid "" @@ -17717,9 +17489,8 @@ msgstr "" "trabalho de nós! Corrija o seu nó por favor." #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Node returned an invalid sequence output:" -msgstr "O nó retornou uma sequência de saÃda incorreta: " +msgstr "O nó retornou uma saÃda de sequência inválida:" #: modules/visual_script/visual_script.cpp msgid "Found sequence bit but not the node in the stack, report bug!" @@ -17727,14 +17498,12 @@ msgstr "" "Foi encontrada o bit da sequência mas não o nó na pilha, denuncie o bug!" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Stack overflow with stack depth:" -msgstr "Pilha cheia com a profundidade da pilha: " +msgstr "Sobrecarga da pilha com profundidade:" #: modules/visual_script/visual_script.cpp -#, fuzzy msgid "Visual Script" -msgstr "Procurar VisualScript" +msgstr "Script Visual" #: modules/visual_script/visual_script_editor.cpp msgid "Change Signal Arguments" @@ -18062,14 +17831,12 @@ msgid "Return" msgstr "Voltar" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Return Enabled" -msgstr "Executável" +msgstr "Retorno Ativado" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Return Type" -msgstr "Voltar" +msgstr "Tipo de Retorno" #: modules/visual_script/visual_script_flow_control.cpp #: scene/resources/visual_shader_nodes.cpp @@ -18097,18 +17864,16 @@ msgid "for (elem) in (input):" msgstr "para (elem) em (input):" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Input type not iterable:" -msgstr "Tipo de Input não iterável: " +msgstr "Tipo de entrada não iterável:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Iterator became invalid" msgstr "O iterador tornou-se inválido" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Iterator became invalid:" -msgstr "O iterador tornou-se inválido: " +msgstr "Iterador tornou-se inválido:" #: modules/visual_script/visual_script_flow_control.cpp msgid "Sequence" @@ -18119,9 +17884,8 @@ msgid "in order:" msgstr "em ordem:" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Steps" -msgstr "Passo" +msgstr "Passos" #: modules/visual_script/visual_script_flow_control.cpp msgid "Switch" @@ -18141,9 +17905,8 @@ msgstr "É %s?" #: modules/visual_script/visual_script_flow_control.cpp #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Base Script" -msgstr "Novo Script" +msgstr "Script Base" #: modules/visual_script/visual_script_func_nodes.cpp msgid "On %s" @@ -18155,37 +17918,31 @@ msgstr "Nele Próprio" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Call Mode" -msgstr "Modo Escalar" +msgstr "Modo de Chamada" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Basic Type" -msgstr "Mudar tipo base" +msgstr "Tipo Base" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Node Path" -msgstr "Copiar Caminho do Nó" +msgstr "Caminho do Nó" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Use Default Args" -msgstr "Restaurar Predefinições" +msgstr "Usar Argumentos Padrão" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Validate" -msgstr "Caracteres válidos:" +msgstr "Validar" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "RPC Call Mode" -msgstr "Modo Escalar" +msgstr "Modo de Chamada RPC" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Subtract %s" @@ -18224,14 +17981,12 @@ msgid "BitXor %s" msgstr "BitXor %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Set Mode" -msgstr "Modo Seleção" +msgstr "Modo de Definição" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Assign Op" -msgstr "Atribuir" +msgstr "Atribuir Op" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp @@ -18248,9 +18003,8 @@ msgid "Base object is not a Node!" msgstr "Objeto de base não é um Nó!" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Path does not lead to Node!" -msgstr "Caminho não conduz Nó!" +msgstr "Caminho não leva ao Nó!" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Invalid index property name '%s' in node %s." @@ -18266,38 +18020,32 @@ msgstr "Compor Array" #: modules/visual_script/visual_script_nodes.cpp scene/resources/material.cpp #: scene/resources/visual_shader_nodes.cpp -#, fuzzy msgid "Operator" -msgstr "Iterador" +msgstr "Operador" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Invalid argument of type:" -msgstr ": Argumento inválido de tipo: " +msgstr "Argumento inválido do tipo:" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Invalid arguments:" -msgstr ": Argumentos inválidos: " +msgstr "Argumentos inválidos:" #: modules/visual_script/visual_script_nodes.cpp msgid "a if cond, else b" msgstr "a se cond, senão b" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "Var Name" -msgstr "Nome" +msgstr "Nome da Variável" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "VariableGet not found in script:" -msgstr "VariableGet não encontrado no script: " +msgstr "VariableGet não encontrado no script:" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "VariableSet not found in script:" -msgstr "VariableSet não encontrado no script: " +msgstr "VariableSet não encontrado no script:" #: modules/visual_script/visual_script_nodes.cpp msgid "Preload" @@ -18413,9 +18161,8 @@ msgid "%s sec(s)" msgstr "%s sec(s)" #: modules/visual_script/visual_script_yield_nodes.cpp scene/main/timer.cpp -#, fuzzy msgid "Wait Time" -msgstr "Pintar Tile" +msgstr "Tempo de Espera" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "WaitSignal" @@ -18430,9 +18177,8 @@ msgid "WaitInstanceSignal" msgstr "WaitInstanceSignal" #: modules/webrtc/webrtc_data_channel.cpp -#, fuzzy msgid "Write Mode" -msgstr "Modo Prioridade" +msgstr "Modo de Escrita" #: modules/webrtc/webrtc_data_channel.h msgid "WebRTC" @@ -18451,69 +18197,60 @@ msgid "Trusted SSL Certificate" msgstr "Certificado SSL Confiável" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "WebSocket Client" -msgstr "Analisador de Rede" +msgstr "Cliente WebSocket" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "Max In Buffer (KB)" -msgstr "Tamanho Máximo (KB)" +msgstr "Buffer de Entrada Máximo (KB)" #: modules/websocket/websocket_macros.h msgid "Max In Packets" msgstr "Máximo de Pacotes de Entrada" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "Max Out Buffer (KB)" -msgstr "Tamanho Máximo (KB)" +msgstr "Buffer de SaÃda Máximo (KB)" #: modules/websocket/websocket_macros.h msgid "Max Out Packets" msgstr "Máximo de Pacotes de Saida" #: modules/websocket/websocket_macros.h -#, fuzzy msgid "WebSocket Server" -msgstr "Analisador de Rede" +msgstr "Servidor WebSocket" #: modules/websocket/websocket_server.cpp msgid "Bind IP" msgstr "Associar IP" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "Private Key" -msgstr "Caminho da Chave Privada SSH" +msgstr "Chave Privada" #: modules/websocket/websocket_server.cpp platform/javascript/export/export.cpp msgid "SSL Certificate" msgstr "Certificado SSL" #: modules/websocket/websocket_server.cpp -#, fuzzy msgid "CA Chain" -msgstr "Apagar corrente IK" +msgstr "Cadeia CA" #: modules/websocket/websocket_server.cpp msgid "Handshake Timeout" msgstr "Timeout de Handshake" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Session Mode" -msgstr "Modo Região" +msgstr "Modo Sessão" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Required Features" -msgstr "Funcionalidades Principais:" +msgstr "Funcionalidades Necessárias" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Optional Features" -msgstr "Funcionalidades Principais:" +msgstr "Funcionalidades Opcionais" #: modules/webxr/webxr_interface.cpp msgid "Requested Reference Space Types" @@ -18524,28 +18261,24 @@ msgid "Reference Space Type" msgstr "Tipo de Espaço de Referência" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Visibility State" -msgstr "Alternar visibilidade" +msgstr "Estado de Visibilidade" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Bounds Geometry" -msgstr "Repetir" +msgstr "Limita a Geometria" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "XR Standard Mapping" -msgstr "Ajuste Inteligente" +msgstr "Mapeamento XR Padrão" #: platform/android/export/export.cpp msgid "Android SDK Path" msgstr "Caminho do SDK Android" #: platform/android/export/export.cpp -#, fuzzy msgid "Debug Keystore" -msgstr "Depurador" +msgstr "Depurar Keystore" #: platform/android/export/export.cpp msgid "Debug Keystore User" @@ -18606,33 +18339,28 @@ msgid "The package must have at least one '.' separator." msgstr "O pacote deve ter pelo menos um separador '.'." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Custom Build" -msgstr "Usar Compilação Personalizada" +msgstr "Build Personalizada" #: platform/android/export/export_plugin.cpp msgid "Use Custom Build" msgstr "Usar Compilação Personalizada" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Export Format" -msgstr "Exportar Caminho" +msgstr "Exportar Formato" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Min SDK" -msgstr "Tamanho do contorno:" +msgstr "SDK MÃnimo" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Target SDK" -msgstr "Alvo" +msgstr "SDK Alvo" #: platform/android/export/export_plugin.cpp platform/iphone/export/export.cpp -#, fuzzy msgid "Architectures" -msgstr "Adicionar uma entrada arquitetura" +msgstr "Arquiteturas" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18640,86 +18368,72 @@ msgid "Keystore" msgstr "Depurador" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Debug User" -msgstr "Depurador" +msgstr "Depurar Utilizador" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Debug Password" -msgstr "Senha" +msgstr "Depurar Palavra-passe" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Release User" -msgstr "Libertar" +msgstr "Liberar Utilizador" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Release Password" -msgstr "Senha" +msgstr "Liberar Palavra-passe" #: platform/android/export/export_plugin.cpp msgid "One Click Deploy" msgstr "Implantação com Um Clique" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Clear Previous Install" -msgstr "Inspecionar instância anterior" +msgstr "Limpar Instalação Anterior" #: platform/android/export/export_plugin.cpp msgid "Code" msgstr "Código" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Package" -msgstr "Empacotamento" +msgstr "Pacote" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Unique Name" -msgstr "Nome do Nó:" +msgstr "Nome Único" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Signed" -msgstr "Sinal" +msgstr "Assinado" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Classify As Game" -msgstr "Nome de Classe:" +msgstr "Classificar como Jogo" #: platform/android/export/export_plugin.cpp msgid "Retain Data On Uninstall" msgstr "Reter Dados na Desinstalação" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Exclude From Recents" -msgstr "Apagar Nós" +msgstr "Excluir de Recentes" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Graphics" -msgstr "Compensação da grelha:" +msgstr "Gráficos" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "OpenGL Debug" -msgstr "Abrir" +msgstr "Depurar OpenGL" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "XR Features" -msgstr "Funcionalidades" +msgstr "Funcionalidades XR" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "XR Mode" -msgstr "Modo deslocamento" +msgstr "Modo XR" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18735,72 +18449,60 @@ msgid "Passthrough" msgstr "Atravessar" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Immersive Mode" -msgstr "Modo Prioridade" +msgstr "Modo Imersivo" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Small" -msgstr "Suporte" +msgstr "Suporte Pequeno" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Normal" -msgstr "Suporte" +msgstr "Suporte Normal" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Large" -msgstr "Suporte" +msgstr "Suporte Grande" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Xlarge" -msgstr "Suporte" +msgstr "Suporte Extra-grande" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "User Data Backup" -msgstr "Interface do Utilizador" +msgstr "Backup de Dados do Utilizador" #: platform/android/export/export_plugin.cpp msgid "Allow" msgstr "Permitir" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Command Line" -msgstr "Comunidade" +msgstr "Linha de Comando" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Extra Args" -msgstr "Argumentos de chamada extra:" +msgstr "Argumentos Extra" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "APK Expansion" -msgstr "Expressão" +msgstr "Expansão APK" #: platform/android/export/export_plugin.cpp msgid "Salt" msgstr "Sal" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Public Key" -msgstr "Caminho da Chave Pública SSH" +msgstr "Chave Pública" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Permissions" -msgstr "Máscara de Emissão" +msgstr "Permissões" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Custom Permissions" -msgstr "Executar Cena Personalizada" +msgstr "Permissões Personalizadas" #: platform/android/export/export_plugin.cpp msgid "Select device from the list" @@ -18927,69 +18629,74 @@ msgid "\"Use Custom Build\" must be enabled to use the plugins." msgstr "\"Use Custom Build\" têm de estar ativa para usar os plugins." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "\"Hand Tracking\" is only valid when \"XR Mode\" is \"Oculus Mobile VrApi\" " "or \"OpenXR\"." msgstr "" -"\"Rastreamento de Mão\" só é válido quando \"Modo Xr\" é \"Oculus Mobile " -"VrApi\" ou \"OpenXR\"." +"\"Hand Tracking\" só é válido quando o \"XR Mode\" é \"Oculus Mobile VrApi\" " +"ou \"OpenXR\"." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." -msgstr "\"Passthrough\" só é válido quando \"Modo Xr\" é \"OpenXR\"." +msgstr "\"Passthrough\" só é válido quando o \"XR Mode\" é \"OpenXR\"." #: platform/android/export/export_plugin.cpp msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." msgstr "\"Exportar AAB\" só é válido quando \"Use Custom Build\" está ativa." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled." msgstr "" -"Mudança de \"Min Sdk\" só é válida quando \"Use Custom Build\" está ativa." +"\"Min SDK\" só pode ser substituÃdo quando \"Usar Compilação Customizada\" " +"está ativado." #: platform/android/export/export_plugin.cpp msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"\"Min SDK\" deve ser um número inteiro válido, mas obteve \"%s\" que é " +"inválido." #: platform/android/export/export_plugin.cpp msgid "" "\"Min SDK\" cannot be lower than %d, which is the version needed by the " "Godot library." msgstr "" +"\"Min SDK\" não pode ser inferior a %d, que é a versão necessária para a " +"biblioteca Godot." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled." msgstr "" -"Mudança de \"Target Sdk\" só é válida quando \"Use Custom Build\" está ativa." +"\"Target SDK\" só pode ser substituÃdo quando \"Usar Compilação " +"Customizada\" está ativado." #: platform/android/export/export_plugin.cpp msgid "" "\"Target SDK\" should be a valid integer, but got \"%s\" which is invalid." msgstr "" +"\"Target SDK\" deve ser um número inteiro válido, mas obteve \"%s\", que é " +"inválido." #: platform/android/export/export_plugin.cpp msgid "" "\"Target SDK\" %d is higher than the default version %d. This may work, but " "wasn't tested and may be unstable." msgstr "" +"\"Target SDK\" %d é superior à versão padrão %d. Isso pode funcionar, mas " +"não foi testado e pode ser instável." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "\"Target SDK\" version must be greater or equal to \"Min SDK\" version." msgstr "" -"Versão de \"Target Sdk\" tem de ser maior ou igual à versão de \"Min Sdk\"." +"Versão do \"Target SDK\" precisa ser igual ou maior que a versão do \"Min " +"SDK\"." #: platform/android/export/export_plugin.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Code Signing" -msgstr "Sinal" +msgstr "Assinatura de Código" #: platform/android/export/export_plugin.cpp msgid "" @@ -19066,12 +18773,11 @@ msgstr "" "menu 'Projeto'." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "Unable to overwrite res://android/build/res/*.xml files with project name." msgstr "" -"Incapaz de sobrescrever ficheiros res://android/build/res/*.xml com o nome " -"do projeto" +"Incapaz de sobrescrever os ficheiros res://android/build/res/*.xml com o " +"nome do projeto." #: platform/android/export/export_plugin.cpp msgid "Could not export project files to gradle project." @@ -19107,9 +18813,8 @@ msgstr "" "projeto gradle por resultados." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Package not found: \"%s\"." -msgstr "Pacote não encontrado: '%s'" +msgstr "Pacote não encontrado: \"%s\"." #: platform/android/export/export_plugin.cpp msgid "Creating APK..." @@ -19134,9 +18839,8 @@ msgid "Adding files..." msgstr "A adicionar ficheiros..." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Could not export project files." -msgstr "Incapaz de exportar ficheiros do projeto" +msgstr "Não foi possÃvel exportar os ficheiros do projeto." #: platform/android/export/export_plugin.cpp msgid "Aligning APK..." @@ -19232,9 +18936,8 @@ msgid "Code Sign Identity Release" msgstr "Liberação de Identidade de Sinal de Código" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Export Method Release" -msgstr "Modo exportação:" +msgstr "Modo de Exportação Lançamento" #: platform/iphone/export/export.cpp msgid "Targeted Device Family" @@ -19245,44 +18948,37 @@ msgid "Info" msgstr "Informações" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Identifier" -msgstr "Identificador Inválido:" +msgstr "Identificador" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Signature" -msgstr "Sinal" +msgstr "Assinatura" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Short Version" -msgstr "Versão" +msgstr "Versão Curta" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Copyright" -msgstr "Topo Direita" +msgstr "Direitos Autorais" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Capabilities" -msgstr "Colar Propriedades" +msgstr "Capacidades" #: platform/iphone/export/export.cpp msgid "Access Wi-Fi" msgstr "Acesso Wi-Fi" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Push Notifications" -msgstr "Rotação aleatória:" +msgstr "Notificações Push" #: platform/iphone/export/export.cpp -#, fuzzy msgid "User Data" -msgstr "Interface do Utilizador" +msgstr "Dados do Utilizador" #: platform/iphone/export/export.cpp msgid "Accessible From Files App" @@ -19293,19 +18989,16 @@ msgid "Accessible From iTunes Sharing" msgstr "AcessÃvel a partir do Compartilhamento do iTunes" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Privacy" -msgstr "Caminho da Chave Privada SSH" +msgstr "Privacidade" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Camera Usage Description" -msgstr "Descrição" +msgstr "Descrição do Uso da Câmara" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Microphone Usage Description" -msgstr "Descrições da Propriedade" +msgstr "Descrição do Uso do Microfone" #: platform/iphone/export/export.cpp #, fuzzy @@ -19353,9 +19046,8 @@ msgid "Use Launch Screen Storyboard" msgstr "Use o Storyboard da Tela de Inicialização" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Image Scale Mode" -msgstr "Modo Escalar" +msgstr "Modo de Escalonamento de Imagem" #: platform/iphone/export/export.cpp #, fuzzy @@ -19368,30 +19060,25 @@ msgid "Custom Image @3x" msgstr "CustomNode" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Use Custom BG Color" -msgstr "CustomNode" +msgstr "Usar Cor Personalizada de Fundo" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Custom BG Color" -msgstr "CustomNode" +msgstr "Cor Personalizada de Fundo" #: platform/iphone/export/export.cpp -#, fuzzy msgid "Export Icons" -msgstr "Expandir Tudo" +msgstr "Exportar Ãcones" #: platform/iphone/export/export.cpp platform/javascript/export/export.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Prepare Templates" -msgstr "Gerir Modelos" +msgstr "Preparar Templates" #: platform/iphone/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Export template not found." -msgstr "Modelo de lançamento personalizado não encontrado." +msgstr "Template exportado não encontrado." #: platform/iphone/export/export.cpp msgid "App Store Team ID not specified - cannot configure the project." @@ -19415,48 +19102,40 @@ msgid "Run exported HTML in the system's default browser." msgstr "Executar HTML exportado no navegador predefinido do sistema." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not open template for export: \"%s\"." -msgstr "Incapaz de abrir modelo para exportação:" +msgstr "Não foi possÃvel abrir o modelo para exportação: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Invalid export template: \"%s\"." -msgstr "Modelo de exportação inválido:" +msgstr "Template de exportação inválido: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not write file: \"%s\"." -msgstr "Incapaz de escrever ficheiro:" +msgstr "Não foi possÃvel escrever o ficheiro: \"%s\"." #: platform/javascript/export/export.cpp platform/osx/export/export.cpp -#, fuzzy msgid "Icon Creation" -msgstr "Definir Margem" +msgstr "Criação de Ãcone" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read file: \"%s\"." -msgstr "Incapaz de ler ficheiro:" +msgstr "Não foi possÃvel ler o ficheiro: \"%s\"." #: platform/javascript/export/export.cpp msgid "PWA" msgstr "PWA" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Variant" -msgstr "Separação:" +msgstr "Variante" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Export Type" -msgstr "Exportar" +msgstr "Tipo de Exportação" #: platform/javascript/export/export.cpp -#, fuzzy msgid "VRAM Texture Compression" -msgstr "Expressão" +msgstr "Compressão de Texturas na VRAM" #: platform/javascript/export/export.cpp msgid "For Desktop" @@ -19471,9 +19150,8 @@ msgid "HTML" msgstr "HTML" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Export Icon" -msgstr "Expandir Tudo" +msgstr "Exportar Ãcone" #: platform/javascript/export/export.cpp #, fuzzy @@ -19493,9 +19171,8 @@ msgid "Focus Canvas On Start" msgstr "Focar Tela ao Iniciar" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Experimental Virtual Keyboard" -msgstr "Filtrar sinais" +msgstr "Teclado Virtual Experimental" #: platform/javascript/export/export.cpp msgid "Progressive Web App" @@ -19518,19 +19195,16 @@ msgid "Icon 512 X 512" msgstr "Ãcone 512 X 512" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not read HTML shell: \"%s\"." -msgstr "Incapaz de ler shell HTML:" +msgstr "Não foi possÃvel ler o shell HTML: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Could not create HTTP server directory: %s." -msgstr "Incapaz de criar diretoria do servidor HTTP:" +msgstr "Não foi possÃvel criar o diretório do servidor HTTP: \"%s\"." #: platform/javascript/export/export.cpp -#, fuzzy msgid "Error starting HTTP server: %d." -msgstr "Erro ao iniciar servidor HTTP:" +msgstr "Erro ao iniciar o servidor HTTP: %d." #: platform/javascript/export/export.cpp msgid "Web" @@ -19545,9 +19219,8 @@ msgid "HTTP Port" msgstr "Porta HTTP" #: platform/javascript/export/export.cpp -#, fuzzy msgid "Use SSL" -msgstr "Usar Ajuste" +msgstr "Usar SSL" #: platform/javascript/export/export.cpp msgid "SSL Key" @@ -19576,27 +19249,24 @@ msgid "Invalid Info.plist, can't load." msgstr "Geometria inválida, incapaz de criar polÃgono." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Failed to create \"%s\" subfolder." -msgstr "Não consegui criar pasta." +msgstr "Falha ao criar sub-pasta \"%s\"." #: platform/osx/export/codesign.cpp msgid "Failed to extract thin binary." msgstr "Falha ao extrair o binário fino." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Invalid binary format." -msgstr "Caminho base inválido." +msgstr "Formato de binário inválido." #: platform/osx/export/codesign.cpp msgid "Already signed!" msgstr "Já assinado!" #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Failed to process nested resources." -msgstr "Falha ao carregar recurso." +msgstr "Falha ao processar recursos aninhados." #: platform/osx/export/codesign.cpp msgid "Failed to create _CodeSignature subfolder." @@ -19613,9 +19283,8 @@ msgid "Invalid entitlements file." msgstr "Extensão inválida." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Invalid executable file." -msgstr "Extensão inválida." +msgstr "Ficheiro executável inválido." #: platform/osx/export/codesign.cpp msgid "Can't resize signature load command." @@ -19634,42 +19303,36 @@ msgid "Unknown object type." msgstr "Tipo de objeto desconhecido." #: platform/osx/export/export.cpp -#, fuzzy msgid "App Category" -msgstr "Categoria:" +msgstr "Categoria da App" #: platform/osx/export/export.cpp msgid "High Res" msgstr "Alta resolução" #: platform/osx/export/export.cpp -#, fuzzy msgid "Location Usage Description" -msgstr "Descrição" +msgstr "Descrição do Uso da Localização" #: platform/osx/export/export.cpp msgid "Address Book Usage Description" msgstr "Descrição de Uso do Catálogo de Endereços" #: platform/osx/export/export.cpp -#, fuzzy msgid "Calendar Usage Description" -msgstr "Descrição" +msgstr "Descrição do Uso do Calendário" #: platform/osx/export/export.cpp -#, fuzzy msgid "Photos Library Usage Description" -msgstr "Descrições da Propriedade" +msgstr "Descrição do Uso da Biblioteca de Fotos" #: platform/osx/export/export.cpp -#, fuzzy msgid "Desktop Folder Usage Description" -msgstr "Descrições do Método" +msgstr "Descrição do Uso da Pasta da Ãrea de Trabalho" #: platform/osx/export/export.cpp -#, fuzzy msgid "Documents Folder Usage Description" -msgstr "Descrições do Método" +msgstr "Descrição do Uso da Pasta de Documentos" #: platform/osx/export/export.cpp msgid "Downloads Folder Usage Description" @@ -19690,23 +19353,20 @@ msgstr "Nó" #: platform/osx/export/export.cpp platform/uwp/export/export.cpp #: platform/windows/export/export.cpp -#, fuzzy msgid "Identity" -msgstr "Indentar à esquerda" +msgstr "Identidade" #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Timestamp" -msgstr "Tempo" +msgstr "Registo do Tempo" #: platform/osx/export/export.cpp msgid "Hardened Runtime" msgstr "Tempo de Execução Reforçado" #: platform/osx/export/export.cpp -#, fuzzy msgid "Replace Existing Signature" -msgstr "Substituir em Ficheiros" +msgstr "Substituir Assinatura Existente" #: platform/osx/export/export.cpp #, fuzzy @@ -19714,13 +19374,12 @@ msgid "Entitlements" msgstr "Bugigangas" #: platform/osx/export/export.cpp -#, fuzzy msgid "Custom File" -msgstr "CustomNode" +msgstr "Ficheiro Personalizado" #: platform/osx/export/export.cpp msgid "Allow JIT Code Execution" -msgstr "" +msgstr "Permitir Execução de Código JIT" #: platform/osx/export/export.cpp msgid "Allow Unsigned Executable Memory" @@ -19731,65 +19390,56 @@ msgid "Allow Dyld Environment Variables" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Disable Library Validation" -msgstr "Desativar Botão" +msgstr "Desativar Validação da Biblioteca" #: platform/osx/export/export.cpp -#, fuzzy msgid "Audio Input" -msgstr "Adicionar entrada" +msgstr "Entrada de Ãudio" #: platform/osx/export/export.cpp msgid "Address Book" -msgstr "" +msgstr "Contatos" #: platform/osx/export/export.cpp msgid "Calendars" -msgstr "" +msgstr "Calendários" #: platform/osx/export/export.cpp -#, fuzzy msgid "Photos Library" -msgstr "Exportar Biblioteca" +msgstr "Biblioteca de Fotos" #: platform/osx/export/export.cpp -#, fuzzy msgid "Apple Events" -msgstr "Adicionar evento" +msgstr "Eventos Apple" #: platform/osx/export/export.cpp -#, fuzzy msgid "Debugging" -msgstr "Depurar" +msgstr "Depuração" #: platform/osx/export/export.cpp msgid "App Sandbox" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "Network Server" -msgstr "Analisador de Rede" +msgstr "Servidor de Rede" #: platform/osx/export/export.cpp -#, fuzzy msgid "Network Client" -msgstr "Analisador de Rede" +msgstr "Cliente de Rede" #: platform/osx/export/export.cpp -#, fuzzy msgid "Device USB" -msgstr "Aparelho" +msgstr "Aparelho USB" #: platform/osx/export/export.cpp msgid "Device Bluetooth" -msgstr "" +msgstr "Bluetooth do Aparelho" #: platform/osx/export/export.cpp -#, fuzzy msgid "Files Downloads" -msgstr "Descarrega" +msgstr "Descarregas de Ficheiros" #: platform/osx/export/export.cpp #, fuzzy @@ -19807,9 +19457,8 @@ msgid "Files Movies" msgstr "Filtrar Tiles" #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "Custom Options" -msgstr "Opções de Barramento" +msgstr "Opções Personalizadas" #: platform/osx/export/export.cpp #, fuzzy @@ -19818,7 +19467,7 @@ msgstr "Localização" #: platform/osx/export/export.cpp msgid "Apple ID Name" -msgstr "" +msgstr "Nome Apple ID" #: platform/osx/export/export.cpp #, fuzzy @@ -19827,21 +19476,19 @@ msgstr "Senha" #: platform/osx/export/export.cpp msgid "Apple Team ID" -msgstr "" +msgstr "ID Apple Team" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not open icon file \"%s\"." -msgstr "Incapaz de exportar ficheiros do projeto" +msgstr "Não foi possÃvel abrir o ficheiro de Ãcone \"%s\"." #: platform/osx/export/export.cpp msgid "Could not start xcrun executable." msgstr "Não foi possÃvel iniciar o executável xcrun." #: platform/osx/export/export.cpp -#, fuzzy msgid "Notarization failed." -msgstr "Localização" +msgstr "Falha na notarização." #: platform/osx/export/export.cpp msgid "Notarization request UUID: \"%s\"" @@ -19858,6 +19505,8 @@ msgid "" "You can check progress manually by opening a Terminal and running the " "following command:" msgstr "" +"Pode verificar o progresso manualmente abrindo um Terminal e a executar o " +"seguinte comando:" #: platform/osx/export/export.cpp msgid "" @@ -19887,25 +19536,24 @@ msgid "" "Could not start codesign executable, make sure Xcode command line tools are " "installed." msgstr "" +"Não foi possÃvel iniciar o executável codesign, tenha certeza que as " +"utilidades de linha de comando do Xcode estão instaladas." #: platform/osx/export/export.cpp platform/windows/export/export.cpp -#, fuzzy msgid "No identity found." -msgstr "Ãcones não encontrados." +msgstr "Nenhuma identidade encontrada." #: platform/osx/export/export.cpp -#, fuzzy msgid "Cannot sign file %s." -msgstr "Erro ao guardar ficheiro: %s" +msgstr "Erro ao assinar o ficheiro %s." #: platform/osx/export/export.cpp msgid "Relative symlinks are not supported, exported \"%s\" might be broken!" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "DMG Creation" -msgstr "Direções" +msgstr "Criação de DMG" #: platform/osx/export/export.cpp msgid "Could not start hdiutil executable." @@ -19913,11 +19561,11 @@ msgstr "Não foi possÃvel iniciar o executável hdiutil." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed - file exists." -msgstr "" +msgstr "`hdiutil create` falhou - o ficheiro existe." #: platform/osx/export/export.cpp msgid "`hdiutil create` failed." -msgstr "" +msgstr "`hdiutil create` falhou." #: platform/osx/export/export.cpp #, fuzzy @@ -19925,14 +19573,13 @@ msgid "Creating app bundle" msgstr "A criar miniatura" #: platform/osx/export/export.cpp -#, fuzzy msgid "Could not find template app to export: \"%s\"." -msgstr "Incapaz de encontrar modelo app para exportar:" +msgstr "" +"Não foi possÃvel encontrar a aplicação de modelo para exportar: \"%s\"." #: platform/osx/export/export.cpp -#, fuzzy msgid "Invalid export format." -msgstr "Modelo de exportação inválido:" +msgstr "Formato de exportação inválido." #: platform/osx/export/export.cpp msgid "" @@ -19948,7 +19595,7 @@ msgstr "" #: platform/osx/export/export.cpp msgid "Making PKG" -msgstr "" +msgstr "Criando PKG" #: platform/osx/export/export.cpp msgid "" @@ -19962,7 +19609,7 @@ msgstr "" #: platform/osx/export/export.cpp msgid "Making DMG" -msgstr "" +msgstr "Criando DMG" #: platform/osx/export/export.cpp msgid "Code signing DMG" @@ -19970,7 +19617,7 @@ msgstr "" #: platform/osx/export/export.cpp msgid "Making ZIP" -msgstr "" +msgstr "Criando ZIP" #: platform/osx/export/export.cpp msgid "" @@ -19983,9 +19630,8 @@ msgid "Sending archive for notarization" msgstr "" #: platform/osx/export/export.cpp -#, fuzzy msgid "ZIP Creation" -msgstr "Projeto" +msgstr "Criação de ZIP" #: platform/osx/export/export.cpp msgid "Could not open file to read from path \"%s\"." @@ -20039,6 +19685,8 @@ msgid "" "Warning: Notarization is disabled. The exported project will be blocked by " "Gatekeeper if it's downloaded from an unknown source." msgstr "" +"Aviso: Notarização está desativada. O projeto exportado será bloqueado pelo " +"Gatekeeper se for descarregado de uma fonte desconhecida." #: platform/osx/export/export.cpp msgid "" @@ -20068,70 +19716,78 @@ msgid "" "Privacy: Microphone access is enabled, but usage description is not " "specified." msgstr "" +"Privacidade: O acesso ao microfone está ativado, mas a descrição de uso não " +"é especificada." #: platform/osx/export/export.cpp msgid "" "Privacy: Camera access is enabled, but usage description is not specified." msgstr "" +"Privacidade: O acesso à câmara está ativado, mas a descrição de uso não é " +"especificada." #: platform/osx/export/export.cpp msgid "" "Privacy: Location information access is enabled, but usage description is " "not specified." msgstr "" +"Privacidade: O acesso à localização está ativado, mas a descrição de uso não " +"é especificada." #: platform/osx/export/export.cpp msgid "" "Privacy: Address book access is enabled, but usage description is not " "specified." msgstr "" +"Privacidade: O acesso ao livro de endereços está ativado, mas a descrição de " +"uso não é especificada." #: platform/osx/export/export.cpp msgid "" "Privacy: Calendar access is enabled, but usage description is not specified." msgstr "" +"Privacidade: O acesso ao calendário está ativado, mas a descrição de uso não " +"é especificada." #: platform/osx/export/export.cpp msgid "" "Privacy: Photo library access is enabled, but usage description is not " "specified." msgstr "" +"Privacidade: O acesso à biblioteca de fotos está ativado, mas a descrição de " +"uso não é especificada." #: platform/osx/export/export.cpp msgid "macOS" -msgstr "" +msgstr "macOS" #: platform/osx/export/export.cpp msgid "Force Builtin Codesign" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Architecture" -msgstr "Adicionar uma entrada arquitetura" +msgstr "Arquitetura" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Display Name" -msgstr "Mostrar Tudo" +msgstr "Nome de Exibição" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Short Name" -msgstr "Nome do Script:" +msgstr "Nome Curto" #: platform/uwp/export/export.cpp msgid "Publisher" -msgstr "" +msgstr "Publicadora" #: platform/uwp/export/export.cpp msgid "Publisher Display Name" msgstr "Nome de Exibição do Editor" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Product GUID" -msgstr "GUID do produto inválido." +msgstr "GUID do produto" #: platform/uwp/export/export.cpp #, fuzzy @@ -20144,14 +19800,12 @@ msgid "Signing" msgstr "Sinal" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Certificate" -msgstr "Vértices:" +msgstr "Certificado" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Algorithm" -msgstr "Depurador" +msgstr "Algoritmo" #: platform/uwp/export/export.cpp msgid "Major" @@ -20167,26 +19821,24 @@ msgid "Build" msgstr "Modo Régua" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Revision" -msgstr "Expressão" +msgstr "Revisão" #: platform/uwp/export/export.cpp msgid "Landscape" -msgstr "" +msgstr "Paisagem" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Portrait" -msgstr "Inverter Portais" +msgstr "Retrato" #: platform/uwp/export/export.cpp msgid "Landscape Flipped" -msgstr "" +msgstr "Paisagem Invertido" #: platform/uwp/export/export.cpp msgid "Portrait Flipped" -msgstr "" +msgstr "Retrato Invertido" #: platform/uwp/export/export.cpp #, fuzzy @@ -20195,33 +19847,31 @@ msgstr "Modo Escalar" #: platform/uwp/export/export.cpp msgid "Square 44 X 44 Logo" -msgstr "" +msgstr "Logo Quadrada 44 X 44" #: platform/uwp/export/export.cpp msgid "Square 71 X 71 Logo" -msgstr "" +msgstr "Logo Quadrada 71 X 71" #: platform/uwp/export/export.cpp msgid "Square 150 X 150 Logo" -msgstr "" +msgstr "Logo Quadrada 150 X 150" #: platform/uwp/export/export.cpp msgid "Square 310 X 310 Logo" -msgstr "" +msgstr "Logo Quadrada 310 X 310" #: platform/uwp/export/export.cpp msgid "Wide 310 X 150 Logo" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Splash Screen" -msgstr "Chamadas de Desenho:" +msgstr "Escrã de Abertura" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Tiles" -msgstr "Ficheiro" +msgstr "Tiles" #: platform/uwp/export/export.cpp msgid "Show Name On Square 150 X 150" @@ -20240,6 +19890,8 @@ msgid "" "Godot's Mono version does not support the UWP platform. Use the standard " "build (no C# support) if you wish to target UWP." msgstr "" +"A versão Mono do Godot não suporta a plataforma UWP. Use a build padrão (sem " +"suporte a C#) se deseja exportar para UWP." #: platform/uwp/export/export.cpp msgid "Invalid package short name." @@ -20301,7 +19953,7 @@ msgstr "Dimensões inválidas da imagem do ecrã inicial (deve ser 620x300)." #: platform/uwp/export/export.cpp msgid "UWP" -msgstr "" +msgstr "UWP" #: platform/uwp/export/export.cpp platform/windows/export/export.cpp #, fuzzy @@ -20313,18 +19965,16 @@ msgid "Debug Certificate" msgstr "" #: platform/uwp/export/export.cpp -#, fuzzy msgid "Debug Algorithm" -msgstr "Depurador" +msgstr "Algoritmo de Depuração" #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to rename temporary file \"%s\"." -msgstr "Incapaz de remover ficheiro temporário:" +msgstr "Falha ao renomear o ficheiro temporário \"%s\"." #: platform/windows/export/export.cpp msgid "Identity Type" -msgstr "" +msgstr "Tipo de Identidade" #: platform/windows/export/export.cpp msgid "Timestamp Server URL" @@ -20336,42 +19986,36 @@ msgid "Digest Algorithm" msgstr "Depurador" #: platform/windows/export/export.cpp -#, fuzzy msgid "Modify Resources" -msgstr "Copiar Recurso" +msgstr "Modificar Recursos" #: platform/windows/export/export.cpp -#, fuzzy msgid "File Version" -msgstr "Versão" +msgstr "Versão do Ficheiro" #: platform/windows/export/export.cpp msgid "Product Version" msgstr "Versão do Produto" #: platform/windows/export/export.cpp -#, fuzzy msgid "Company Name" -msgstr "Nome do Nó:" +msgstr "Nome da Empresa" #: platform/windows/export/export.cpp -#, fuzzy msgid "Product Name" -msgstr "Nome do Projeto:" +msgstr "Nome do Produto" #: platform/windows/export/export.cpp -#, fuzzy msgid "File Description" -msgstr "Descrição" +msgstr "Descrição do Ficheiro" #: platform/windows/export/export.cpp msgid "Trademarks" -msgstr "" +msgstr "Marca Registada (Trademarks)" #: platform/windows/export/export.cpp -#, fuzzy msgid "Resources Modification" -msgstr "Rotação aleatória:" +msgstr "Modificações dos Recursos" #: platform/windows/export/export.cpp #, fuzzy @@ -20406,9 +20050,8 @@ msgid "Could not find osslsigncode executable at \"%s\"." msgstr "Incapaz de encontrar keystore e exportar." #: platform/windows/export/export.cpp -#, fuzzy msgid "Invalid identity type." -msgstr "Identificador Inválido:" +msgstr "Tipo de identidade inválido." #: platform/windows/export/export.cpp #, fuzzy @@ -20428,9 +20071,8 @@ msgid "Signtool failed to sign executable: %s." msgstr "Extensão inválida." #: platform/windows/export/export.cpp -#, fuzzy msgid "Failed to remove temporary file \"%s\"." -msgstr "Incapaz de remover ficheiro temporário:" +msgstr "Falha ao remover o ficheiro temporário \"%s\"." #: platform/windows/export/export.cpp msgid "" @@ -20452,7 +20094,7 @@ msgstr "Versão de produto inválida:" #: platform/windows/export/export.cpp msgid "Windows executables cannot be >= 4 GiB." -msgstr "" +msgstr "Executáveis Windows não podem ser >= 4GiB." #: platform/windows/export/export.cpp platform/x11/export/export.cpp #, fuzzy @@ -20465,12 +20107,11 @@ msgstr "" #: platform/windows/export/export.cpp platform/x11/export/export.cpp msgid "Executable \"pck\" section not found." -msgstr "" +msgstr "Secção executável \"pck\" não encontrada." #: platform/windows/export/export.cpp -#, fuzzy msgid "Windows" -msgstr "Nova Janela" +msgstr "Windows" #: platform/windows/export/export.cpp msgid "Rcedit" @@ -20482,7 +20123,7 @@ msgstr "" #: platform/windows/export/export.cpp msgid "Wine" -msgstr "" +msgstr "Vinho" #: platform/x11/export/export.cpp msgid "32-bit executables cannot have embedded data >= 4 GiB." @@ -20490,9 +20131,8 @@ msgstr "" #: scene/2d/animated_sprite.cpp scene/3d/sprite_3d.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Frames" -msgstr "Frame %" +msgstr "Quadros" #: scene/2d/animated_sprite.cpp msgid "" @@ -20504,21 +20144,18 @@ msgstr "" #: scene/2d/animated_sprite.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Speed Scale" -msgstr "Escala" +msgstr "Escalonamento da Velocidade" #: scene/2d/animated_sprite.cpp scene/2d/audio_stream_player_2d.cpp #: scene/3d/audio_stream_player_3d.cpp scene/3d/sprite_3d.cpp #: scene/audio/audio_stream_player.cpp -#, fuzzy msgid "Playing" -msgstr "Executar" +msgstr "A executar" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp -#, fuzzy msgid "Centered" -msgstr "Centro" +msgstr "Centralizado" #: scene/2d/animated_sprite.cpp scene/2d/sprite.cpp scene/3d/sprite_3d.cpp #: scene/gui/texture_button.cpp scene/gui/texture_rect.cpp @@ -20531,14 +20168,12 @@ msgid "Flip V" msgstr "" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Monitoring" -msgstr "Monitor" +msgstr "Monitorando" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Monitorable" -msgstr "Monitor" +msgstr "Monitorável" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20551,9 +20186,8 @@ msgid "Space Override" msgstr "Sobrepõe" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Gravity Point" -msgstr "Gerar Pontos" +msgstr "Ponto de Gravidade" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20568,7 +20202,7 @@ msgstr "Pré-visualização Predefinida" #: scene/2d/area_2d.cpp scene/2d/cpu_particles_2d.cpp scene/3d/area.cpp #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp msgid "Gravity" -msgstr "" +msgstr "Gravidade" #: scene/2d/area_2d.cpp scene/3d/area.cpp #, fuzzy @@ -20580,46 +20214,40 @@ msgid "Angular Damp" msgstr "" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Audio Bus" -msgstr "Adicionar barramento de áudio" +msgstr "Canal de Ãudio" #: scene/2d/area_2d.cpp scene/3d/area.cpp -#, fuzzy msgid "Override" -msgstr "Sobrepõe" +msgstr "Sobrescrever" #: scene/2d/audio_stream_player_2d.cpp scene/audio/audio_stream_player.cpp #: scene/gui/video_player.cpp servers/audio/effects/audio_effect_amplify.cpp -#, fuzzy msgid "Volume dB" -msgstr "Volume" +msgstr "Volume dB (decibéis)" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp #: servers/audio/effects/audio_effect_pitch_shift.cpp -#, fuzzy msgid "Pitch Scale" -msgstr "Escala" +msgstr "Escalonamento de Pitch" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp -#, fuzzy msgid "Autoplay" -msgstr "Alternar reprodução automática" +msgstr "Reproduzir automaticamente" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp msgid "Stream Paused" -msgstr "" +msgstr "Fluxo Pausado" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/3d/light.cpp scene/3d/reflection_probe.cpp #: scene/3d/visibility_notifier.cpp scene/3d/visual_instance.cpp #: scene/resources/material.cpp -#, fuzzy msgid "Max Distance" -msgstr "Distância de escolha:" +msgstr "Distância Máxima" #: scene/2d/audio_stream_player_2d.cpp scene/3d/light.cpp #, fuzzy @@ -20628,39 +20256,33 @@ msgstr "Animação" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp #: scene/audio/audio_stream_player.cpp scene/gui/video_player.cpp -#, fuzzy msgid "Bus" -msgstr "Adicionar Barramento" +msgstr "Canal" #: scene/2d/audio_stream_player_2d.cpp scene/3d/audio_stream_player_3d.cpp msgid "Area Mask" msgstr "" #: scene/2d/back_buffer_copy.cpp -#, fuzzy msgid "Copy Mode" -msgstr "Copiar Nós" +msgstr "Mode de Cópia" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Anchor Mode" -msgstr "Modo Ãcone" +msgstr "Modo de Âncora" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Rotating" -msgstr "Passo da rotação:" +msgstr "Rotacionando" #: scene/2d/camera_2d.cpp scene/2d/listener_2d.cpp scene/3d/camera.cpp #: scene/3d/listener.cpp scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Current" -msgstr "Atual:" +msgstr "Atual" #: scene/2d/camera_2d.cpp scene/gui/graph_edit.cpp -#, fuzzy msgid "Zoom" -msgstr "Aumentar Zoom" +msgstr "Zoom" #: scene/2d/camera_2d.cpp scene/main/canvas_layer.cpp #, fuzzy @@ -20676,31 +20298,27 @@ msgstr "Modo Mover" #: scene/2d/camera_2d.cpp msgid "Limit" -msgstr "" +msgstr "Limite" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp -#, fuzzy msgid "Left" -msgstr "Topo Esquerda" +msgstr "Esquerda" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/style_box.cpp scene/resources/texture.cpp -#, fuzzy msgid "Right" -msgstr "Luz" +msgstr "Direita" #: scene/2d/camera_2d.cpp scene/gui/control.cpp scene/gui/nine_patch_rect.cpp #: scene/resources/dynamic_font.cpp scene/resources/style_box.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Bottom" -msgstr "Fundo Esquerda" +msgstr "Embaixo" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Smoothed" -msgstr "Smoothstep" +msgstr "Suavizado" #: scene/2d/camera_2d.cpp #, fuzzy @@ -20718,9 +20336,8 @@ msgid "Drag Margin V Enabled" msgstr "Definir Margem" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Smoothing" -msgstr "Smoothstep" +msgstr "Suavizamento" #: scene/2d/camera_2d.cpp msgid "H" @@ -20737,14 +20354,12 @@ msgid "Drag Margin" msgstr "Definir Margem" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Draw Screen" -msgstr "Chamadas de Desenho:" +msgstr "Ecrã de Desenho" #: scene/2d/camera_2d.cpp -#, fuzzy msgid "Draw Limits" -msgstr "Chamadas de Desenho:" +msgstr "Limites de Desenho" #: scene/2d/camera_2d.cpp #, fuzzy @@ -20763,9 +20378,8 @@ msgid "Light Mode" msgstr "Direita Wide" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Particles Animation" -msgstr "PartÃculas" +msgstr "Animação de PartÃculas" #: scene/2d/canvas_item.cpp msgid "Particles Anim H Frames" @@ -20781,39 +20395,34 @@ msgid "Particles Anim Loop" msgstr "PartÃculas" #: scene/2d/canvas_item.cpp scene/3d/spatial.cpp -#, fuzzy msgid "Visibility" -msgstr "Alternar visibilidade" +msgstr "Visibilidade" #: scene/2d/canvas_item.cpp scene/3d/spatial.cpp scene/gui/progress_bar.cpp #: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp -#, fuzzy msgid "Visible" -msgstr "Alternar visibilidade" +msgstr "VisÃvel" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Self Modulate" -msgstr "Povoar" +msgstr "Auto Modular" #: scene/2d/canvas_item.cpp msgid "Show Behind Parent" -msgstr "" +msgstr "Mostrar Atrás do Pai" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Show On Top" -msgstr "Mostrar Origem" +msgstr "Mostrar Em Cima" #: scene/2d/canvas_item.cpp scene/2d/light_occluder_2d.cpp #: scene/2d/tile_map.cpp -#, fuzzy msgid "Light Mask" -msgstr "Luz" +msgstr "Máscara de Luz" #: scene/2d/canvas_item.cpp msgid "Use Parent Material" -msgstr "" +msgstr "Usar Material do Pai" #: scene/2d/canvas_modulate.cpp msgid "" @@ -20835,9 +20444,8 @@ msgstr "" "para definir a sua forma." #: scene/2d/collision_object_2d.cpp -#, fuzzy msgid "Pickable" -msgstr "Escolher Tile" +msgstr "Pegável" #: scene/2d/collision_polygon_2d.cpp msgid "" @@ -20879,9 +20487,8 @@ msgstr "Modo Régua" #: scene/3d/collision_polygon.cpp scene/3d/collision_shape.cpp #: scene/animation/animation_node_state_machine.cpp scene/gui/base_button.cpp #: scene/gui/texture_button.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Disabled" -msgstr "Item Desativado" +msgstr "Desativado" #: scene/2d/collision_polygon_2d.cpp scene/2d/collision_shape_2d.cpp #, fuzzy @@ -20929,9 +20536,8 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Emitting" -msgstr "Configuração:" +msgstr "Emitindo" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -20946,20 +20552,18 @@ msgstr "Nó OneShot" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Preprocess" -msgstr "Pós-processamento" +msgstr "Pré processamento" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Explosiveness" -msgstr "" +msgstr "Explosividade" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Randomness" -msgstr "ReinÃcio aleatório (s):" +msgstr "Aleatoriedade" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -20968,9 +20572,8 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Fixed FPS" -msgstr "Ver FPS" +msgstr "FPS Fixado" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp @@ -20980,24 +20583,22 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Drawing" -msgstr "" +msgstr "Desenhando" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp -#, fuzzy msgid "Local Coords" -msgstr "Projetos Locais" +msgstr "Coordenadas Locais" #: scene/2d/cpu_particles_2d.cpp scene/2d/particles_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/particles.cpp msgid "Draw Order" -msgstr "" +msgstr "Ordem de Desenho" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Emission Shape" -msgstr "Máscara de Emissão" +msgstr "Forma de Emissão" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21010,9 +20611,8 @@ msgid "Rect Extents" msgstr "Bugigangas" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp -#, fuzzy msgid "Normals" -msgstr "Formato" +msgstr "Normais" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21022,51 +20622,45 @@ msgstr "Atribuir" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Direction" -msgstr "Direções" +msgstr "Direção" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Spread" -msgstr "" +msgstr "Espalhar" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Initial Velocity" -msgstr "Inicializar" +msgstr "Velocidade Inicial" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity Random" -msgstr "Vista Órbita Direita" +msgstr "Velocidade Aleatória" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp msgid "Angular Velocity" -msgstr "" +msgstr "Velocidade Angular" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Velocity Curve" -msgstr "Vista Órbita Direita" +msgstr "Curva de Velocidade" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Orbit Velocity" -msgstr "Vista Órbita Direita" +msgstr "Velocidade Orbital" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Linear Accel" -msgstr "Linear" +msgstr "Aceleração Linear" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21076,23 +20670,22 @@ msgstr "Acel" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Accel Random" -msgstr "" +msgstr "Aceleração Aleatória" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Accel Curve" -msgstr "Dividir Curva" +msgstr "Curva de Aceleração" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Radial Accel" -msgstr "" +msgstr "Aceleração Radial" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Tangential Accel" -msgstr "" +msgstr "Aceleração Tangencial" #: scene/2d/cpu_particles_2d.cpp scene/2d/joints_2d.cpp #: scene/3d/cpu_particles.cpp scene/3d/physics_body.cpp @@ -21116,23 +20709,21 @@ msgstr "Dividir Curva" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp scene/3d/light.cpp #: scene/resources/particles_material.cpp msgid "Angle" -msgstr "" +msgstr "Ângulo" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp msgid "Angle Random" -msgstr "" +msgstr "Ângulo Aleatório" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Angle Curve" -msgstr "Fechar curva" +msgstr "Curva do Ângulo" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp -#, fuzzy msgid "Scale Amount" -msgstr "Valor:" +msgstr "Quantidade da Escala" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp msgid "Scale Amount Random" @@ -21156,45 +20747,38 @@ msgstr "" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Hue Variation" -msgstr "Separação:" +msgstr "Variação da Tonalidade" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Variation" -msgstr "Separação:" +msgstr "Variação" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Variation Random" -msgstr "Separação:" +msgstr "Variação Aleatória" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Variation Curve" -msgstr "Separação:" +msgstr "Curva de Variação" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed Random" -msgstr "Escala" +msgstr "Velocidade Aleatória" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Speed Curve" -msgstr "Dividir Curva" +msgstr "Curva de Velocidade" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp -#, fuzzy msgid "Offset Random" -msgstr "Compensação:" +msgstr "Deslocamento Aleatório" #: scene/2d/cpu_particles_2d.cpp scene/3d/cpu_particles.cpp #: scene/resources/particles_material.cpp @@ -21223,14 +20807,12 @@ msgid "Node A and Node B must be different PhysicsBody2Ds" msgstr "Nó A e Nó B têm de ser PhysicsBody2Ds diferentes" #: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp -#, fuzzy msgid "Node A" -msgstr "Nó" +msgstr "Nó A" #: scene/2d/joints_2d.cpp scene/3d/physics_joint.cpp -#, fuzzy msgid "Node B" -msgstr "Nó" +msgstr "Nó B" #: scene/2d/joints_2d.cpp scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp #: scene/3d/light.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp @@ -21239,9 +20821,8 @@ msgid "Bias" msgstr "" #: scene/2d/joints_2d.cpp -#, fuzzy msgid "Disable Collision" -msgstr "Desativar Botão" +msgstr "Desativar Colisão" #: scene/2d/joints_2d.cpp scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "Softness" @@ -21250,7 +20831,7 @@ msgstr "" #: scene/2d/joints_2d.cpp scene/resources/animation.cpp #: scene/resources/ray_shape.cpp scene/resources/segment_shape_2d.cpp msgid "Length" -msgstr "" +msgstr "Comprimento" #: scene/2d/joints_2d.cpp #, fuzzy @@ -21274,20 +20855,18 @@ msgstr "" "\"Textura\"." #: scene/2d/light_2d.cpp scene/3d/light.cpp scene/gui/reference_rect.cpp -#, fuzzy msgid "Editor Only" -msgstr "Editor" +msgstr "Somente Editor" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Texture Scale" -msgstr "TextureRegion" +msgstr "Escalonamento da Textura" #: scene/2d/light_2d.cpp scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp #: scene/3d/light.cpp scene/resources/environment.cpp #: scene/resources/material.cpp scene/resources/sky.cpp msgid "Energy" -msgstr "" +msgstr "Energia" #: scene/2d/light_2d.cpp msgid "Z Min" @@ -21312,9 +20891,8 @@ msgid "Item Cull Mask" msgstr "" #: scene/2d/light_2d.cpp scene/3d/light.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Shadow" -msgstr "Shader" +msgstr "Sombra" #: scene/2d/light_2d.cpp #, fuzzy @@ -21322,9 +20900,8 @@ msgid "Buffer Size" msgstr "Vista de Trás" #: scene/2d/light_2d.cpp -#, fuzzy msgid "Gradient Length" -msgstr "Gradiente Editado" +msgstr "Comprimento do Gradiente" #: scene/2d/light_2d.cpp #, fuzzy @@ -21332,9 +20909,8 @@ msgid "Filter Smooth" msgstr "Métodos de filtro" #: scene/2d/light_occluder_2d.cpp -#, fuzzy msgid "Closed" -msgstr "Fechar" +msgstr "Fechado" #: scene/2d/light_occluder_2d.cpp scene/resources/material.cpp #, fuzzy @@ -21353,28 +20929,24 @@ msgid "The occluder polygon for this occluder is empty. Please draw a polygon." msgstr "O polÃgono oclusor deste oclusor está vazio. Desenhe um polÃgono." #: scene/2d/line_2d.cpp -#, fuzzy msgid "Width Curve" -msgstr "Dividir Curva" +msgstr "Largura da Curva" #: scene/2d/line_2d.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Default Color" -msgstr "Predefinição" +msgstr "Cor Padrão" #: scene/2d/line_2d.cpp scene/resources/texture.cpp msgid "Fill" -msgstr "" +msgstr "Preencher" #: scene/2d/line_2d.cpp scene/resources/texture.cpp -#, fuzzy msgid "Gradient" -msgstr "Gradiente Editado" +msgstr "Gradiente" #: scene/2d/line_2d.cpp -#, fuzzy msgid "Texture Mode" -msgstr "TextureRegion" +msgstr "Modo de Textura" #: scene/2d/line_2d.cpp msgid "Capping" @@ -21391,14 +20963,12 @@ msgid "Begin Cap Mode" msgstr "Modo Região" #: scene/2d/line_2d.cpp -#, fuzzy msgid "End Cap Mode" -msgstr "Modo Ajuste:" +msgstr "Modo de Limite Final" #: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp scene/resources/style_box.cpp -#, fuzzy msgid "Border" -msgstr "em ordem:" +msgstr "Borda" #: scene/2d/line_2d.cpp msgid "Sharp Limit" @@ -21406,7 +20976,7 @@ msgstr "" #: scene/2d/line_2d.cpp msgid "Round Precision" -msgstr "" +msgstr "Precisão do Arredondamento" #: scene/2d/line_2d.cpp scene/2d/polygon_2d.cpp #: scene/resources/dynamic_font.cpp @@ -21426,9 +20996,8 @@ msgid "Cell Size" msgstr "" #: scene/2d/navigation_2d.cpp scene/3d/navigation.cpp -#, fuzzy msgid "Edge Connection Margin" -msgstr "Editar Conexão:" +msgstr "Margem de Ligação da Borda" #: scene/2d/navigation_2d.cpp msgid "" @@ -21452,9 +21021,8 @@ msgid "Target Desired Distance" msgstr "" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Path Max Distance" -msgstr "Distância de escolha:" +msgstr "Distância Máxima do Caminho" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp #, fuzzy @@ -21480,9 +21048,8 @@ msgid "Time Horizon" msgstr "Inverter na Horizontal" #: scene/2d/navigation_agent_2d.cpp scene/3d/navigation_agent.cpp -#, fuzzy msgid "Max Speed" -msgstr "Velocidade:" +msgstr "Velocidade Máxima" #: scene/2d/navigation_agent_2d.cpp #, fuzzy @@ -21491,9 +21058,8 @@ msgid "" msgstr "O NavigationAgent2D pode ser apenas usado dentro de um nó Node2D." #: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_obstacle.cpp -#, fuzzy msgid "Estimate Radius" -msgstr "Mudar Raio Externo do Toro" +msgstr "Raio Estimado" #: scene/2d/navigation_obstacle_2d.cpp msgid "" @@ -21531,18 +21097,16 @@ msgid "Rotation Degrees" msgstr "Graus de Rotação" #: scene/2d/node_2d.cpp scene/3d/spatial.cpp -#, fuzzy msgid "Global Rotation" -msgstr "Constante Global" +msgstr "Rotação Global" #: scene/2d/node_2d.cpp msgid "Global Rotation Degrees" msgstr "Graus de Rotação Global" #: scene/2d/node_2d.cpp -#, fuzzy msgid "Global Scale" -msgstr "Escala aleatória:" +msgstr "Escala Global" #: scene/2d/node_2d.cpp scene/3d/spatial.cpp #, fuzzy @@ -21557,12 +21121,11 @@ msgstr "Ajuste Relativo" #: scene/2d/parallax_background.cpp scene/gui/scroll_container.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Scroll" -msgstr "" +msgstr "Rolagem" #: scene/2d/parallax_background.cpp -#, fuzzy msgid "Base Offset" -msgstr "Compensação:" +msgstr "Deslocamento Base" #: scene/2d/parallax_background.cpp #, fuzzy @@ -21571,16 +21134,15 @@ msgstr "Usar Ajuste de Escala" #: scene/2d/parallax_background.cpp msgid "Limit Begin" -msgstr "" +msgstr "InÃcio do Limite" #: scene/2d/parallax_background.cpp -#, fuzzy msgid "Limit End" -msgstr "No Fim" +msgstr "Fim do limite" #: scene/2d/parallax_background.cpp msgid "Ignore Camera Zoom" -msgstr "" +msgstr "Ignorar Zoom da Câmara" #: scene/2d/parallax_layer.cpp msgid "" @@ -21653,9 +21215,8 @@ msgstr "" #: scene/2d/path_2d.cpp scene/3d/path.cpp scene/resources/sky.cpp #: scene/resources/texture.cpp -#, fuzzy msgid "Curve" -msgstr "Dividir Curva" +msgstr "Curva" #: scene/2d/path_2d.cpp msgid "PathFollow2D only works when set as a child of a Path2D node." @@ -21663,48 +21224,41 @@ msgstr "" "PathFollow2D apenas funciona quando definido como filho de um nó Path2D." #: scene/2d/path_2d.cpp scene/3d/path.cpp -#, fuzzy msgid "Unit Offset" -msgstr "Compensação da grelha:" +msgstr "Deslocamento da Unidade" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp -#, fuzzy msgid "H Offset" -msgstr "Compensação:" +msgstr "Deslocamento H" #: scene/2d/path_2d.cpp scene/3d/camera.cpp scene/3d/path.cpp -#, fuzzy msgid "V Offset" -msgstr "Compensação:" +msgstr "Deslocamento V" #: scene/2d/path_2d.cpp scene/3d/path.cpp msgid "Cubic Interp" -msgstr "" +msgstr "Interpolação Cúbica" #: scene/2d/path_2d.cpp msgid "Lookahead" msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/visual_instance.cpp -#, fuzzy msgid "Layers" -msgstr "Camada" +msgstr "Camadas" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Constant Linear Velocity" -msgstr "Inicializar" +msgstr "Velocidade Linear Constante" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Constant Angular Velocity" -msgstr "Inicializar" +msgstr "Velocidade Angular Constante" #: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp #: scene/resources/physics_material.cpp -#, fuzzy msgid "Friction" -msgstr "Função" +msgstr "Fricção" #: scene/2d/physics_body_2d.cpp scene/2d/tile_map.cpp scene/3d/physics_body.cpp #: scene/resources/physics_material.cpp @@ -21717,9 +21271,8 @@ msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: scene/resources/world.cpp scene/resources/world_2d.cpp -#, fuzzy msgid "Default Gravity" -msgstr "Pré-visualização Predefinida" +msgstr "Gravidade Padrão" #: scene/2d/physics_body_2d.cpp msgid "" @@ -21733,26 +21286,23 @@ msgstr "" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Mass" -msgstr "" +msgstr "Massa" #: scene/2d/physics_body_2d.cpp -#, fuzzy msgid "Inertia" -msgstr "Vertical:" +msgstr "Inércia" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Weight" -msgstr "Luz" +msgstr "Peso" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Gravity Scale" -msgstr "" +msgstr "Escala da Gravidade" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Custom Integrator" -msgstr "CustomNode" +msgstr "Integrador Customizado" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -21775,25 +21325,24 @@ msgid "Sleeping" msgstr "Ajuste Inteligente" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Can Sleep" -msgstr "Velocidade:" +msgstr "Pode Dormir" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Damp" -msgstr "" +msgstr "Úmido" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Angular" -msgstr "" +msgstr "Angular" #: scene/2d/physics_body_2d.cpp msgid "Applied Forces" -msgstr "" +msgstr "Forças Aplicadas" #: scene/2d/physics_body_2d.cpp msgid "Torque" -msgstr "" +msgstr "Torque" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #, fuzzy @@ -21805,73 +21354,64 @@ msgid "Sync To Physics" msgstr "Sincronizar com FÃsica" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Moving Platform" -msgstr "A mover saÃda" +msgstr "Plataforma Móvel" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Apply Velocity On Leave" -msgstr "" +msgstr "Aplicar Velocidade ao Sair" #: scene/2d/physics_body_2d.cpp scene/2d/touch_screen_button.cpp #: scene/3d/physics_body.cpp scene/gui/texture_button.cpp #: scene/resources/default_theme/default_theme.cpp #: scene/resources/line_shape_2d.cpp scene/resources/material.cpp -#, fuzzy msgid "Normal" -msgstr "Formato" +msgstr "Normal" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Remainder" -msgstr "Renderizador:" +msgstr "Restante" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Local Shape" -msgstr "Localização" +msgstr "Forma Local" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider" -msgstr "Modo Colisão" +msgstr "Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Collider ID" -msgstr "" +msgstr "ID do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider RID" -msgstr "RID inválido" +msgstr "RID do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider Shape" -msgstr "Modo Colisão" +msgstr "Forma do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Collider Shape Index" -msgstr "Modo Colisão" +msgstr "Ãndice da Forma do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Collider Velocity" -msgstr "Vista Órbita Direita" +msgstr "Velocidade do Colisor" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Collider Metadata" -msgstr "" +msgstr "Metadados do Colisor" #: scene/2d/polygon_2d.cpp msgid "Invert" -msgstr "" +msgstr "Inverter" #: scene/2d/polygon_2d.cpp #, fuzzy @@ -21890,7 +21430,7 @@ msgstr "Bugigangas" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp msgid "Exclude Parent" -msgstr "" +msgstr "Excluir Pai" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp #, fuzzy @@ -21899,15 +21439,15 @@ msgstr "Criar Nó Shader" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp msgid "Collide With" -msgstr "" +msgstr "Colidir com" #: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp msgid "Areas" -msgstr "" +msgstr "Ãreas" #: scene/2d/ray_cast_2d.cpp scene/3d/camera.cpp scene/3d/ray_cast.cpp msgid "Bodies" -msgstr "" +msgstr "Corpos" #: scene/2d/remote_transform_2d.cpp msgid "Path property must point to a valid Node2D node to work." @@ -21916,14 +21456,12 @@ msgstr "" "válido." #: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp -#, fuzzy msgid "Remote Path" -msgstr "Remover Ponto" +msgstr "Remover Caminho" #: scene/2d/remote_transform_2d.cpp scene/3d/remote_transform.cpp -#, fuzzy msgid "Use Global Coordinates" -msgstr "Próxima Coordenada" +msgstr "Usar Coordenadas Globais" #: scene/2d/skeleton_2d.cpp scene/3d/skeleton.cpp #, fuzzy @@ -21931,9 +21469,8 @@ msgid "Rest" msgstr "Reiniciar" #: scene/2d/skeleton_2d.cpp -#, fuzzy msgid "Default Length" -msgstr "Tema Predefinido" +msgstr "Comprimento Padrão" #: scene/2d/skeleton_2d.cpp msgid "This Bone2D chain should end at a Skeleton2D node." @@ -21977,14 +21514,12 @@ msgstr "" "RigidBody2D, KinematicBody2D, etc. para lhes dar uma forma." #: scene/2d/tile_map.cpp -#, fuzzy msgid "Tile Set" -msgstr "TileSet" +msgstr "Tile Set" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Quadrant Size" -msgstr "Mudar tamanho da Câmara" +msgstr "Tamanho do Quadrante" #: scene/2d/tile_map.cpp #, fuzzy @@ -21997,9 +21532,8 @@ msgid "Half Offset" msgstr "Inicializar" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Tile Origin" -msgstr "Ver origem" +msgstr "Origem do Tile" #: scene/2d/tile_map.cpp #, fuzzy @@ -22007,51 +21541,44 @@ msgid "Y Sort" msgstr "Ordenar" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Show Collision" -msgstr "Colisão" +msgstr "Mostrar Colisão" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Compatibility Mode" -msgstr "Modo Prioridade" +msgstr "Modo de Compatibilidade" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Centered Textures" -msgstr "Funcionalidades Principais:" +msgstr "Texturas Centradas" #: scene/2d/tile_map.cpp msgid "Cell Clip UV" msgstr "" #: scene/2d/tile_map.cpp -#, fuzzy msgid "Use Parent" -msgstr "Modo Colisão" +msgstr "Usar Pai" #: scene/2d/tile_map.cpp msgid "Use Kinematic" msgstr "" #: scene/2d/touch_screen_button.cpp -#, fuzzy msgid "Shape Centered" -msgstr "Ajustar ao Centro do Nó" +msgstr "Forma Centralizada" #: scene/2d/touch_screen_button.cpp -#, fuzzy msgid "Shape Visible" -msgstr "Alternar Visibilidade" +msgstr "Forma VisÃvel" #: scene/2d/touch_screen_button.cpp msgid "Passby Press" msgstr "" #: scene/2d/touch_screen_button.cpp -#, fuzzy msgid "Visibility Mode" -msgstr "Modo Prioridade" +msgstr "Modo de Visibilidade" #: scene/2d/visibility_notifier_2d.cpp msgid "" @@ -22062,23 +21589,20 @@ msgstr "" "na cena raiz editada." #: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp -#, fuzzy msgid "Pause Animations" -msgstr "Colar Animação" +msgstr "Pausar Animações" #: scene/2d/visibility_notifier_2d.cpp scene/3d/visibility_notifier.cpp msgid "Freeze Bodies" -msgstr "" +msgstr "Congelar Corpos" #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "Pause Particles" -msgstr "PartÃculas" +msgstr "Pausar PartÃculas" #: scene/2d/visibility_notifier_2d.cpp -#, fuzzy msgid "Pause Animated Sprites" -msgstr "Colar Animação" +msgstr "Pausar Sprites Animados" #: scene/2d/visibility_notifier_2d.cpp #, fuzzy @@ -22108,7 +21632,7 @@ msgstr "" #: scene/3d/arvr_nodes.cpp servers/arvr/arvr_positional_tracker.cpp msgid "Rumble" -msgstr "" +msgstr "Vibrar" #: scene/3d/arvr_nodes.cpp msgid "ARVRController must have an ARVROrigin node as its parent." @@ -22144,9 +21668,8 @@ msgid "ARVROrigin requires an ARVRCamera child node." msgstr "ARVROrigin exige um nó filho ARVRCamera." #: scene/3d/arvr_nodes.cpp servers/arvr_server.cpp -#, fuzzy msgid "World Scale" -msgstr "Escala aleatória:" +msgstr "Escala do Mundo" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22155,24 +21678,23 @@ msgstr "Nó Animation" #: scene/3d/audio_stream_player_3d.cpp msgid "Unit dB" -msgstr "" +msgstr "Unidade dB" #: scene/3d/audio_stream_player_3d.cpp msgid "Unit Size" -msgstr "" +msgstr "Tamanho da Unidade" #: scene/3d/audio_stream_player_3d.cpp msgid "Max dB" -msgstr "" +msgstr "Max dB" #: scene/3d/audio_stream_player_3d.cpp msgid "Out Of Range Mode" msgstr "" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Emission Angle" -msgstr "Cores de Emissão" +msgstr "Ângulo de Emissão" #: scene/3d/audio_stream_player_3d.cpp msgid "Degrees" @@ -22185,7 +21707,7 @@ msgstr "Animação" #: scene/3d/audio_stream_player_3d.cpp msgid "Attenuation Filter" -msgstr "" +msgstr "Filtro de Atenuação" #: scene/3d/audio_stream_player_3d.cpp #: servers/audio/effects/audio_effect_chorus.cpp @@ -22195,14 +21717,12 @@ msgstr "" #: scene/3d/audio_stream_player_3d.cpp #: servers/audio/effects/audio_effect_filter.cpp -#, fuzzy msgid "dB" -msgstr "B" +msgstr "dB" #: scene/3d/audio_stream_player_3d.cpp -#, fuzzy msgid "Doppler" -msgstr "Ativar Doppler" +msgstr "Doppler" #: scene/3d/audio_stream_player_3d.cpp #, fuzzy @@ -22212,7 +21732,7 @@ msgstr "Empacotamento" #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp #: scene/3d/reflection_probe.cpp msgid "Interior" -msgstr "" +msgstr "Interior" #: scene/3d/baked_lightmap.cpp msgid "Finding meshes and lights" @@ -22247,7 +21767,7 @@ msgstr "Bugigangas" #: scene/3d/baked_lightmap.cpp msgid "Tweaks" -msgstr "" +msgstr "Ajustes" #: scene/3d/baked_lightmap.cpp msgid "Bounces" @@ -22258,18 +21778,16 @@ msgid "Bounce Indirect Energy" msgstr "" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Use Denoiser" -msgstr "Filtro:" +msgstr "Usar Redutor de RuÃdo" #: scene/3d/baked_lightmap.cpp scene/resources/texture.cpp msgid "Use HDR" -msgstr "" +msgstr "Usar HDR" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Use Color" -msgstr "Cores" +msgstr "Usar Cor" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22277,38 +21795,32 @@ msgid "Default Texels Per Unit" msgstr "Tema Predefinido" #: scene/3d/baked_lightmap.cpp scene/resources/texture.cpp -#, fuzzy msgid "Atlas" -msgstr "Novo Atlas" +msgstr "Atlas" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Generate" -msgstr "Geral" +msgstr "Gerar" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Max Size" -msgstr "Tamanho:" +msgstr "Tamanho Máximo" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Custom Sky" -msgstr "CustomNode" +msgstr "Céu Personalizado" #: scene/3d/baked_lightmap.cpp msgid "Custom Sky Rotation Degrees" msgstr "Graus de Rotação do Céu Personalizado" #: scene/3d/baked_lightmap.cpp scene/3d/ray_cast.cpp -#, fuzzy msgid "Custom Color" -msgstr "CustomNode" +msgstr "Cor Personalizada" #: scene/3d/baked_lightmap.cpp -#, fuzzy msgid "Custom Energy" -msgstr "Mover Efeito de Barramento" +msgstr "Energia Personalizada" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22322,7 +21834,7 @@ msgstr "Navegação" #: scene/3d/baked_lightmap.cpp msgid "Image Path" -msgstr "" +msgstr "Caminho da Imagem" #: scene/3d/baked_lightmap.cpp #, fuzzy @@ -22330,13 +21842,12 @@ msgid "Light Data" msgstr "Com Dados" #: scene/3d/bone_attachment.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Bone Name" -msgstr "Nome do Nó:" +msgstr "Nome do Osso" #: scene/3d/camera.cpp msgid "Keep Aspect" -msgstr "" +msgstr "Manter Aspeto" #: scene/3d/camera.cpp scene/3d/light.cpp scene/3d/reflection_probe.cpp msgid "Cull Mask" @@ -22348,18 +21859,16 @@ msgid "Doppler Tracking" msgstr "Pista de Propriedades" #: scene/3d/camera.cpp -#, fuzzy msgid "Projection" -msgstr "Projeto" +msgstr "Projeção" #: scene/3d/camera.cpp msgid "FOV" -msgstr "" +msgstr "FOV" #: scene/3d/camera.cpp -#, fuzzy msgid "Frustum Offset" -msgstr "Compensação da grelha:" +msgstr "Deslocamento do Frustum" #: scene/3d/camera.cpp #, fuzzy @@ -22368,16 +21877,15 @@ msgstr "Mais próximo" #: scene/3d/camera.cpp msgid "Far" -msgstr "" +msgstr "Longe" #: scene/3d/camera.cpp scene/3d/collision_polygon.cpp scene/3d/spring_arm.cpp #: scene/gui/control.cpp scene/resources/default_theme/default_theme.cpp #: scene/resources/shape.cpp scene/resources/style_box.cpp #: scene/resources/texture.cpp servers/physics_2d_server.cpp #: servers/physics_server.cpp -#, fuzzy msgid "Margin" -msgstr "Definir Margem" +msgstr "Margem" #: scene/3d/camera.cpp #, fuzzy @@ -22486,28 +21994,24 @@ msgid "Ring Axis" msgstr "Avisos" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Rotate Y" -msgstr "Rodar" +msgstr "Rotacionar em Y" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Disable Z" -msgstr "Item Desativado" +msgstr "Desativar Z" #: scene/3d/cpu_particles.cpp scene/resources/particles_material.cpp msgid "Flatness" msgstr "" #: scene/3d/cull_instance.cpp servers/visual_server.cpp -#, fuzzy msgid "Portals" -msgstr "Inverter Portais" +msgstr "Portais" #: scene/3d/cull_instance.cpp -#, fuzzy msgid "Portal Mode" -msgstr "Modo Prioridade" +msgstr "Modo Portal" #: scene/3d/cull_instance.cpp msgid "Include In Bound" @@ -22515,7 +22019,7 @@ msgstr "" #: scene/3d/cull_instance.cpp msgid "Allow Merging" -msgstr "" +msgstr "Permitir Junção" #: scene/3d/cull_instance.cpp #, fuzzy @@ -22553,9 +22057,8 @@ msgid "Subdiv" msgstr "" #: scene/3d/gi_probe.cpp -#, fuzzy msgid "Dynamic Range" -msgstr "Biblioteca Dinâmica" +msgstr "Alcance Dinâmico" #: scene/3d/gi_probe.cpp scene/3d/light.cpp msgid "Normal Bias" @@ -22563,9 +22066,8 @@ msgstr "" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Pixel Size" -msgstr "Ajuste de Pixel" +msgstr "Tamanho de Pixel" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp msgid "Billboard" @@ -22585,9 +22087,8 @@ msgid "No Depth Test" msgstr "" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp scene/resources/material.cpp -#, fuzzy msgid "Fixed Size" -msgstr "Vista de Frente" +msgstr "Tamanho Fixo" #: scene/3d/label_3d.cpp scene/3d/sprite_3d.cpp msgid "Alpha Cut" @@ -22614,19 +22115,16 @@ msgstr "Forçar modulação branca" #: scene/3d/label_3d.cpp scene/resources/default_theme/default_theme.cpp #: scene/resources/dynamic_font.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Font" -msgstr "Fontes" +msgstr "Fonte" #: scene/3d/label_3d.cpp scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Horizontal Alignment" -msgstr "Horizontal:" +msgstr "Alinhamento Horizontal" #: scene/3d/label_3d.cpp -#, fuzzy msgid "Vertical Alignment" -msgstr "Filtrar sinais" +msgstr "Alinhamento Vertical" #: scene/3d/label_3d.cpp scene/gui/dialogs.cpp scene/gui/label.cpp #, fuzzy @@ -22634,14 +22132,12 @@ msgid "Autowrap" msgstr "Carregamento automático" #: scene/3d/light.cpp -#, fuzzy msgid "Indirect Energy" -msgstr "Cores de Emissão" +msgstr "Energia Indireta" #: scene/3d/light.cpp -#, fuzzy msgid "Negative" -msgstr "GDNative" +msgstr "Negativo" #: scene/3d/light.cpp scene/resources/material.cpp #: scene/resources/visual_shader.cpp @@ -22655,9 +22151,8 @@ msgid "Bake Mode" msgstr "Modo Bitmask" #: scene/3d/light.cpp -#, fuzzy msgid "Contact" -msgstr "Escolher cor" +msgstr "Contato" #: scene/3d/light.cpp #, fuzzy @@ -22665,29 +22160,24 @@ msgid "Reverse Cull Face" msgstr "Repor Volume do Barramento" #: scene/3d/light.cpp servers/visual_server.cpp -#, fuzzy msgid "Directional Shadow" -msgstr "Direções" +msgstr "Sombra Direcional" #: scene/3d/light.cpp -#, fuzzy msgid "Split 1" -msgstr "Separar" +msgstr "Dividir 1" #: scene/3d/light.cpp -#, fuzzy msgid "Split 2" -msgstr "Separar" +msgstr "Dividir 2" #: scene/3d/light.cpp -#, fuzzy msgid "Split 3" -msgstr "Separar" +msgstr "Dividir 3" #: scene/3d/light.cpp -#, fuzzy msgid "Blend Splits" -msgstr "Tempos de Mistura:" +msgstr "Divisões de Mistura" #: scene/3d/light.cpp #, fuzzy @@ -22695,9 +22185,8 @@ msgid "Bias Split Scale" msgstr "Usar Ajuste de Escala" #: scene/3d/light.cpp -#, fuzzy msgid "Depth Range" -msgstr "Profundidade" +msgstr "Alcance de Profundidade" #: scene/3d/light.cpp msgid "Omni" @@ -22719,12 +22208,11 @@ msgstr "Uma SpotLight com ângulo superior a 90 graus não cria sombras." #: scene/3d/light.cpp msgid "Spot" -msgstr "" +msgstr "Ponto" #: scene/3d/light.cpp -#, fuzzy msgid "Angle Attenuation" -msgstr "Animação" +msgstr "Atenuação Angular" #: scene/3d/mesh_instance.cpp msgid "Software Skinning" @@ -22740,6 +22228,8 @@ msgid "" "be removed in a future version. Use 'NavigationServer.map_get_path()' " "instead." msgstr "" +"O nó 'Navigation' e 'Navigation.get_simple_path()' estão depreciados e serão " +"removidos em versões futuras. Use 'NavigationServer.map_get_path()' no lugar." #: scene/3d/navigation.cpp scene/resources/curve.cpp #, fuzzy @@ -22756,9 +22246,8 @@ msgid "Agent Height Offset" msgstr "" #: scene/3d/navigation_agent.cpp -#, fuzzy msgid "Ignore Y" -msgstr "[Ignorar]" +msgstr "Ignorar Y" #: scene/3d/navigation_agent.cpp #, fuzzy @@ -22767,9 +22256,8 @@ msgid "" msgstr "O NavigationAgent pode ser apenas usado dentro de um nó espacial." #: scene/3d/navigation_mesh_instance.cpp scene/resources/mesh_library.cpp -#, fuzzy msgid "NavMesh" -msgstr "Consolidar NavMesh" +msgstr "NavMesh" #: scene/3d/navigation_obstacle.cpp #, fuzzy @@ -22827,19 +22315,16 @@ msgstr "" "definido como \"Billboard Particles\"." #: scene/3d/particles.cpp -#, fuzzy msgid "Visibility AABB" -msgstr "Alternar visibilidade" +msgstr "Visibilidade AABB" #: scene/3d/particles.cpp -#, fuzzy msgid "Draw Passes" -msgstr "Chamadas de Desenho:" +msgstr "Passos de Desenho" #: scene/3d/particles.cpp -#, fuzzy msgid "Passes" -msgstr "Chamadas de Desenho:" +msgstr "Passos" #: scene/3d/path.cpp msgid "PathFollow only works when set as a child of a Path node." @@ -22854,9 +22339,8 @@ msgstr "" "Curva do Caminho do seu progenitor." #: scene/3d/path.cpp -#, fuzzy msgid "Rotation Mode" -msgstr "Modo Rodar" +msgstr "Modo de Rotação" #: scene/3d/physics_body.cpp msgid "" @@ -22874,46 +22358,40 @@ msgid "Axis Lock" msgstr "Eixo" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear X" -msgstr "Linear" +msgstr "X Linear" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Y" -msgstr "Linear" +msgstr "Y Linear" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Z" -msgstr "Linear" +msgstr "Z Linear" #: scene/3d/physics_body.cpp msgid "Angular X" -msgstr "" +msgstr "X Angular" #: scene/3d/physics_body.cpp msgid "Angular Y" -msgstr "" +msgstr "Y Angular" #: scene/3d/physics_body.cpp msgid "Angular Z" -msgstr "" +msgstr "Z Angular" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Motion X" -msgstr "Ação" +msgstr "Movimento X" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Motion Y" -msgstr "Ação" +msgstr "Movimento Y" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Motion Z" -msgstr "Ação" +msgstr "Movimento Z" #: scene/3d/physics_body.cpp #, fuzzy @@ -22935,14 +22413,12 @@ msgstr "" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Relaxation" -msgstr "Separação:" +msgstr "Relaxamento" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Angular Limit Enabled" -msgstr "Filtrar sinais" +msgstr "Limite Angular Ativado" #: scene/3d/physics_body.cpp #, fuzzy @@ -23006,20 +22482,19 @@ msgstr "Animação" #: scene/3d/physics_body.cpp msgid "X" -msgstr "" +msgstr "X" #: scene/3d/physics_body.cpp msgid "Y" -msgstr "" +msgstr "Y" #: scene/3d/physics_body.cpp msgid "Z" -msgstr "" +msgstr "Z" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Limit Enabled" -msgstr "Linear" +msgstr "Limite Linear Ativado" #: scene/3d/physics_body.cpp #, fuzzy @@ -23037,9 +22512,8 @@ msgid "Linear Spring Damping" msgstr "Linear" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Linear Equilibrium Point" -msgstr "Linear" +msgstr "Ponto de EquilÃbrio Linear" #: scene/3d/physics_body.cpp #, fuzzy @@ -23063,7 +22537,7 @@ msgstr "Animação" #: scene/3d/physics_body.cpp scene/3d/physics_joint.cpp msgid "ERP" -msgstr "" +msgstr "ERP" #: scene/3d/physics_body.cpp #, fuzzy @@ -23080,12 +22554,11 @@ msgstr "" #: scene/3d/physics_body.cpp msgid "Angular Equilibrium Point" -msgstr "" +msgstr "Ponto de EquilÃbrio Angular" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Body Offset" -msgstr "Compensação:" +msgstr "Deslocamento do Corpo" #: scene/3d/physics_joint.cpp msgid "Node A and Node B must be PhysicsBodies" @@ -23112,18 +22585,16 @@ msgid "Solver" msgstr "" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Exclude Nodes" -msgstr "Apagar Nós" +msgstr "Excluir Nós" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Params" -msgstr "Parâmetro Alterado:" +msgstr "Parâmetros" #: scene/3d/physics_joint.cpp msgid "Angular Limit" -msgstr "" +msgstr "Limite Angular" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23145,24 +22616,20 @@ msgid "Target Velocity" msgstr "Vista Órbita Direita" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Max Impulse" -msgstr "Velocidade:" +msgstr "Impulso Máximo" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Linear Limit" -msgstr "Linear" +msgstr "Limite Linear" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Upper Distance" -msgstr "Distância de escolha:" +msgstr "Distância mais Alta" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Lower Distance" -msgstr "Distância de escolha:" +msgstr "Distância mais Baixa" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23195,9 +22662,8 @@ msgid "Angular Motion" msgstr "Animação" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Angular Ortho" -msgstr "Máximo de Erros Angulares:" +msgstr "Orto Angular" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23210,9 +22676,8 @@ msgid "Linear Motor X" msgstr "Inicializar" #: scene/3d/physics_joint.cpp -#, fuzzy msgid "Force Limit" -msgstr "Chamadas de Desenho:" +msgstr "Limite de Força" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23221,7 +22686,7 @@ msgstr "Linear" #: scene/3d/physics_joint.cpp msgid "Equilibrium Point" -msgstr "" +msgstr "Ponto de EquilÃbrio" #: scene/3d/physics_joint.cpp msgid "Angular Limit X" @@ -23310,9 +22775,8 @@ msgid "Two Way" msgstr "" #: scene/3d/portal.cpp -#, fuzzy msgid "Linked Room" -msgstr "Raiz de Edição ao Vivo:" +msgstr "Sala Vinculada" #: scene/3d/portal.cpp #, fuzzy @@ -23320,18 +22784,16 @@ msgid "Use Default Margin" msgstr "Predefinição" #: scene/3d/proximity_group.cpp -#, fuzzy msgid "Group Name" -msgstr "Agrupado" +msgstr "Nome do Grupo" #: scene/3d/proximity_group.cpp msgid "Dispatch Mode" msgstr "" #: scene/3d/proximity_group.cpp -#, fuzzy msgid "Grid Radius" -msgstr "Raio:" +msgstr "Raio da Grade" #: scene/3d/ray_cast.cpp #, fuzzy @@ -23340,7 +22802,7 @@ msgstr "Depurador" #: scene/3d/ray_cast.cpp scene/resources/style_box.cpp msgid "Thickness" -msgstr "" +msgstr "Espessura" #: scene/3d/reflection_probe.cpp scene/main/viewport.cpp #, fuzzy @@ -23348,9 +22810,8 @@ msgid "Update Mode" msgstr "Modo Rodar" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Origin Offset" -msgstr "Compensação da grelha:" +msgstr "Deslocamento da Origem" #: scene/3d/reflection_probe.cpp #, fuzzy @@ -23358,19 +22819,16 @@ msgid "Box Projection" msgstr "Projeto" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Enable Shadows" -msgstr "Ativar Ajuste" +msgstr "Ativar Sombras" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Ambient Color" -msgstr "Escolher cor" +msgstr "Cor Ambiente" #: scene/3d/reflection_probe.cpp -#, fuzzy msgid "Ambient Energy" -msgstr "Cores de Emissão" +msgstr "Energia Ambiente" #: scene/3d/reflection_probe.cpp #, fuzzy @@ -23448,38 +22906,34 @@ msgstr "Só deve existir um RoomManager na SceneTree." #: scene/3d/room_manager.cpp msgid "Main" -msgstr "" +msgstr "Principal" #: scene/3d/room_manager.cpp scene/animation/animation_blend_tree.cpp #: scene/animation/animation_player.cpp scene/animation/animation_tree.cpp #: scene/animation/animation_tree_player.cpp #: servers/audio/effects/audio_effect_delay.cpp -#, fuzzy msgid "Active" -msgstr "Ação" +msgstr "Ativo" #: scene/3d/room_manager.cpp msgid "Roomlist" msgstr "" #: scene/3d/room_manager.cpp servers/visual_server.cpp -#, fuzzy msgid "PVS" -msgstr "FPS" +msgstr "PVS" #: scene/3d/room_manager.cpp -#, fuzzy msgid "PVS Mode" -msgstr "Modo deslocamento" +msgstr "Modo PVS" #: scene/3d/room_manager.cpp -#, fuzzy msgid "PVS Filename" -msgstr "Ficheiro ZIP" +msgstr "Nome do Ficheiro PVS" #: scene/3d/room_manager.cpp servers/visual_server.cpp msgid "Gameplay" -msgstr "" +msgstr "Jogabilidade" #: scene/3d/room_manager.cpp #, fuzzy @@ -23487,19 +22941,16 @@ msgid "Gameplay Monitor" msgstr "Monitor" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Use Secondary PVS" -msgstr "Usar Ajuste de Escala" +msgstr "Usar PVS Secundário" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Merge Meshes" -msgstr "Malha" +msgstr "Mesclar Malhas" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Show Margins" -msgstr "Mostrar Origem" +msgstr "Mostrar Margens" #: scene/3d/room_manager.cpp #, fuzzy @@ -23511,18 +22962,16 @@ msgid "Overlap Warning Threshold" msgstr "" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Preview Camera" -msgstr "Pré-visualização" +msgstr "Visualizar Câmara" #: scene/3d/room_manager.cpp msgid "Portal Depth Limit" msgstr "" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Default Portal Margin" -msgstr "Definir Margem" +msgstr "Margem Padrão de Portal" #: scene/3d/room_manager.cpp #, fuzzy @@ -23607,9 +23056,8 @@ msgid "Spatial Attachment Path" msgstr "" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Physics Enabled" -msgstr "Frame de FÃsica %" +msgstr "FÃsica Ativada" #: scene/3d/soft_body.cpp #, fuzzy @@ -23621,9 +23069,8 @@ msgid "Simulation Precision" msgstr "Precisão da Simulação" #: scene/3d/soft_body.cpp -#, fuzzy msgid "Total Mass" -msgstr "Total:" +msgstr "Massa Total" #: scene/3d/soft_body.cpp msgid "Linear Stiffness" @@ -23639,7 +23086,7 @@ msgstr "" #: scene/3d/soft_body.cpp msgid "Pressure Coefficient" -msgstr "" +msgstr "Coeficiente de Pressão" #: scene/3d/soft_body.cpp msgid "Damping Coefficient" @@ -23668,18 +23115,16 @@ msgstr "" "Em vez disso, mude o tamanho das formas de colisão filhas." #: scene/3d/spatial.cpp -#, fuzzy msgid "Global Translation" -msgstr "Manter Transformação Global" +msgstr "Transformação Global" #: scene/3d/spatial.cpp msgid "Matrix" -msgstr "" +msgstr "Matriz" #: scene/3d/spatial.cpp -#, fuzzy msgid "Gizmo" -msgstr "Bugigangas" +msgstr "Gizmo" #: scene/3d/spatial_velocity_tracker.cpp #, fuzzy @@ -23692,12 +23137,11 @@ msgstr "" #: scene/3d/sprite_3d.cpp scene/gui/graph_edit.cpp msgid "Opacity" -msgstr "" +msgstr "Opacidade" #: scene/3d/sprite_3d.cpp scene/resources/material.cpp -#, fuzzy msgid "Transparent" -msgstr "Transpor" +msgstr "Transparente" #: scene/3d/sprite_3d.cpp msgid "" @@ -23721,13 +23165,12 @@ msgid "Per-Wheel Motion" msgstr "Botão roda para baixo" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Engine Force" -msgstr "Documentação Online" +msgstr "Força do Motor" #: scene/3d/vehicle_body.cpp msgid "Brake" -msgstr "" +msgstr "Freio" #: scene/3d/vehicle_body.cpp msgid "Steering" @@ -23738,9 +23181,8 @@ msgid "VehicleBody Motion" msgstr "" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Use As Traction" -msgstr "Separação:" +msgstr "Usar Como Tração" #: scene/3d/vehicle_body.cpp msgid "Use As Steering" @@ -23760,9 +23202,8 @@ msgid "Friction Slip" msgstr "Função" #: scene/3d/vehicle_body.cpp -#, fuzzy msgid "Suspension" -msgstr "Expressão" +msgstr "Suspensão" #: scene/3d/vehicle_body.cpp #, fuzzy @@ -23771,12 +23212,21 @@ msgstr "Erro" #: scene/3d/visibility_notifier.cpp msgid "AABB" -msgstr "" +msgstr "AABB" -#: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Ordenar" + +#: scene/3d/visual_instance.cpp #, fuzzy +msgid "Use AABB Center" +msgstr "Usar Ambiente" + +#: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" -msgstr "Repetir" +msgstr "Geometria" #: scene/3d/visual_instance.cpp #, fuzzy @@ -23784,9 +23234,8 @@ msgid "Material Override" msgstr "Sobrepõe" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Material Overlay" -msgstr "Mudanças de Material:" +msgstr "Sobreposição do Material" #: scene/3d/visual_instance.cpp #, fuzzy @@ -23794,9 +23243,8 @@ msgid "Cast Shadow" msgstr "Criar Nó Shader" #: scene/3d/visual_instance.cpp -#, fuzzy msgid "Extra Cull Margin" -msgstr "Argumentos de chamada extra:" +msgstr "Margem de Descarte Extra" #: scene/3d/visual_instance.cpp #, fuzzy @@ -23814,13 +23262,12 @@ msgstr "" #: scene/3d/visual_instance.cpp msgid "LOD" -msgstr "" +msgstr "LOD (NÃvel de Detalhe)" #: scene/3d/visual_instance.cpp scene/animation/skeleton_ik.cpp #: scene/resources/material.cpp -#, fuzzy msgid "Min Distance" -msgstr "Distância de escolha:" +msgstr "Distância MÃnima" #: scene/3d/visual_instance.cpp msgid "Min Hysteresis" @@ -23867,33 +23314,28 @@ msgid "Mix Mode" msgstr "Nó Mix" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Fadein Time" -msgstr "Tempo X-Fade (s):" +msgstr "Tempo de Esmaecer de Entrada" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Fadeout Time" -msgstr "Tempo X-Fade (s):" +msgstr "Tempo de Esmaecer de SaÃda" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Auto Restart" -msgstr "ReinÃcio automático:" +msgstr "ReinÃcio Automático" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Autorestart" -msgstr "ReinÃcio automático:" +msgstr "ReinÃcio Automático" #: scene/animation/animation_blend_tree.cpp msgid "Delay" -msgstr "" +msgstr "Atraso" #: scene/animation/animation_blend_tree.cpp -#, fuzzy msgid "Random Delay" -msgstr "Inclinação aleatória:" +msgstr "Atraso Aleatório" #: scene/animation/animation_blend_tree.cpp #, fuzzy @@ -23917,9 +23359,8 @@ msgstr "Adicionar Porta de Entrada" #: scene/animation/animation_blend_tree.cpp #: scene/animation/animation_node_state_machine.cpp -#, fuzzy msgid "Xfade Time" -msgstr "Tempo X-Fade (s):" +msgstr "Tempo do Esmaecer Cruzado" #: scene/animation/animation_node_state_machine.cpp #, fuzzy @@ -23952,7 +23393,7 @@ msgstr "Adicionar Animação" #: scene/animation/animation_player.cpp msgid "Reset On Save" -msgstr "" +msgstr "Redefinir ao Gravar" #: scene/animation/animation_player.cpp #, fuzzy @@ -23965,9 +23406,8 @@ msgid "Current Animation Position" msgstr "Adicionar Ponto Animação" #: scene/animation/animation_player.cpp -#, fuzzy msgid "Playback Options" -msgstr "Opções da Classe:" +msgstr "Opções de Playback" #: scene/animation/animation_player.cpp #, fuzzy @@ -24009,9 +23449,8 @@ msgid "The AnimationPlayer root node is not a valid node." msgstr "O nó raiz de AnimationPlayer não é um nó válido." #: scene/animation/animation_tree.cpp -#, fuzzy msgid "Tree Root" -msgstr "Criar Nó Raiz:" +msgstr "Nó Raiz" #: scene/animation/animation_tree.cpp #, fuzzy @@ -24067,9 +23506,8 @@ msgid "Tip Bone" msgstr "Ossos" #: scene/animation/skeleton_ik.cpp -#, fuzzy msgid "Interpolation" -msgstr "Modo de Interpolação" +msgstr "Interpolação" #: scene/animation/skeleton_ik.cpp #, fuzzy @@ -24122,7 +23560,7 @@ msgstr "Modo Seleção" #: scene/gui/aspect_ratio_container.cpp scene/gui/box_container.cpp msgid "Alignment" -msgstr "" +msgstr "Alinhamento" #: scene/gui/base_button.cpp #, fuzzy @@ -24160,11 +23598,11 @@ msgstr "Copiar Texto" #: scene/gui/button.cpp scene/gui/label.cpp scene/gui/line_edit.cpp #: scene/gui/spin_box.cpp msgid "Align" -msgstr "" +msgstr "Alinhar" #: scene/gui/button.cpp msgid "Icon Align" -msgstr "" +msgstr "Alinhamento do Ãcone" #: scene/gui/button.cpp #, fuzzy @@ -24268,14 +23706,12 @@ msgid "Grow Direction" msgstr "Direções" #: scene/gui/control.cpp scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Min Size" -msgstr "Tamanho do contorno:" +msgstr "Tamanho MÃnimo" #: scene/gui/control.cpp -#, fuzzy msgid "Pivot Offset" -msgstr "Compensação da grelha:" +msgstr "Deslocamento do Pivô" #: scene/gui/control.cpp #, fuzzy @@ -24323,7 +23759,7 @@ msgstr "Anterior" #: scene/gui/control.cpp msgid "Mouse" -msgstr "" +msgstr "Mouse" #: scene/gui/control.cpp msgid "Default Cursor Shape" @@ -24349,7 +23785,7 @@ msgstr "Propriedades do Tema" #: scene/gui/dialogs.cpp msgid "Window Title" -msgstr "" +msgstr "TÃtulo da Janela" #: scene/gui/dialogs.cpp #, fuzzy @@ -24383,14 +23819,12 @@ msgid "Right Disconnects" msgstr "Desligar" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Scroll Offset" -msgstr "Compensação da grelha:" +msgstr "Deslocamento da Rolagem" #: scene/gui/graph_edit.cpp -#, fuzzy msgid "Snap Distance" -msgstr "Distância de escolha:" +msgstr "Distância de Encaixe" #: scene/gui/graph_edit.cpp #, fuzzy @@ -24415,7 +23849,7 @@ msgstr "Mostrar ossos" #: scene/gui/graph_edit.cpp scene/gui/text_edit.cpp #: scene/resources/default_theme/default_theme.cpp msgid "Minimap" -msgstr "" +msgstr "Mini-Mapa" #: scene/gui/graph_edit.cpp msgid "Enable grid minimap." @@ -24488,9 +23922,8 @@ msgid "Fixed Column Width" msgstr "" #: scene/gui/item_list.cpp -#, fuzzy msgid "Icon Scale" -msgstr "Escala aleatória:" +msgstr "Escala de Ãcone" #: scene/gui/item_list.cpp #, fuzzy @@ -24503,9 +23936,8 @@ msgid "V Align" msgstr "Atribuir" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp -#, fuzzy msgid "Visible Characters" -msgstr "Caracteres válidos:" +msgstr "Caracteres Visiveis" #: scene/gui/label.cpp scene/gui/rich_text_label.cpp #, fuzzy @@ -24529,9 +23961,8 @@ msgid "Secret" msgstr "" #: scene/gui/line_edit.cpp -#, fuzzy msgid "Secret Character" -msgstr "Caracteres válidos:" +msgstr "Caracteres Secretos" #: scene/gui/line_edit.cpp msgid "Expand To Text Length" @@ -24584,24 +24015,23 @@ msgstr "Carregar como marcador de posição" #: scene/gui/line_edit.cpp msgid "Alpha" -msgstr "" +msgstr "Alfa" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "" +msgstr "Circunflexo" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" -msgstr "" +msgstr "Piscar" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Blink Speed" -msgstr "Velocidade:" +msgstr "Velocidade de Piscar" #: scene/gui/link_button.cpp msgid "Underline" -msgstr "" +msgstr "Sublinhado" #: scene/gui/menu_button.cpp #, fuzzy @@ -24683,9 +24113,8 @@ msgid "Allow Search" msgstr "Procurar" #: scene/gui/progress_bar.cpp -#, fuzzy msgid "Percent" -msgstr "Recente:" +msgstr "Percentagem" #: scene/gui/range.cpp msgid "If \"Exp Edit\" is enabled, \"Min Value\" must be greater than 0." @@ -24744,9 +24173,8 @@ msgid "Absolute Index" msgstr "Indentação Automática" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Elapsed Time" -msgstr "Tempos de Mistura:" +msgstr "Tempo Decorrido" #: scene/gui/rich_text_effect.cpp #, fuzzy @@ -24754,9 +24182,8 @@ msgid "Env" msgstr "Fim" #: scene/gui/rich_text_effect.cpp -#, fuzzy msgid "Character" -msgstr "Caracteres válidos:" +msgstr "Caractere" #: scene/gui/rich_text_label.cpp msgid "BBCode" @@ -24767,9 +24194,8 @@ msgid "Meta Underlined" msgstr "" #: scene/gui/rich_text_label.cpp -#, fuzzy msgid "Tab Size" -msgstr "Tamanho:" +msgstr "Tamanho da Tabulação" #: scene/gui/rich_text_label.cpp #, fuzzy @@ -24790,9 +24216,8 @@ msgid "Selection Enabled" msgstr "Apenas seleção" #: scene/gui/rich_text_label.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Override Selected Font Color" -msgstr "Configurar Perfil Selecionado:" +msgstr "Sobrescrever Cor da Fonte Selecionada" #: scene/gui/rich_text_label.cpp #, fuzzy @@ -24820,9 +24245,8 @@ msgid "Follow Focus" msgstr "Povoar superfÃcie" #: scene/gui/scroll_container.cpp -#, fuzzy msgid "Horizontal Enabled" -msgstr "Horizontal:" +msgstr "Horizontal Ativado" #: scene/gui/scroll_container.cpp #, fuzzy @@ -24843,24 +24267,20 @@ msgid "Tick Count" msgstr "Escolher cor" #: scene/gui/slider.cpp -#, fuzzy msgid "Ticks On Borders" -msgstr "em ordem:" +msgstr "Pontos Nas Bordas" #: scene/gui/spin_box.cpp -#, fuzzy msgid "Prefix" -msgstr "Prefixo:" +msgstr "Prefixo" #: scene/gui/spin_box.cpp -#, fuzzy msgid "Suffix" -msgstr "Sufixo:" +msgstr "Sufixo" #: scene/gui/split_container.cpp -#, fuzzy msgid "Split Offset" -msgstr "Compensação da grelha:" +msgstr "Deslocamento de Divisão" #: scene/gui/split_container.cpp scene/gui/tree.cpp #, fuzzy @@ -24877,9 +24297,8 @@ msgid "Tab Align" msgstr "" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp -#, fuzzy msgid "Current Tab" -msgstr "Atual:" +msgstr "Guia Atual" #: scene/gui/tab_container.cpp #, fuzzy @@ -24891,9 +24310,8 @@ msgid "All Tabs In Front" msgstr "" #: scene/gui/tab_container.cpp scene/gui/tabs.cpp -#, fuzzy msgid "Drag To Rearrange Enabled" -msgstr "Arrastar e largar para reorganizar." +msgstr "Arrastar Para Reorganizar Ativado" #: scene/gui/tab_container.cpp msgid "Use Hidden Tabs For Min Size" @@ -24922,9 +24340,8 @@ msgid "Breakpoint Gutter" msgstr "Saltar Pontos de Paragem" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Fold Gutter" -msgstr "Pasta:" +msgstr "Espaçamento de Dobra" #: scene/gui/text_edit.cpp #, fuzzy @@ -24942,19 +24359,16 @@ msgid "Wrap Enabled" msgstr "Ativar" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Scroll Vertical" -msgstr "Vertical:" +msgstr "Scroll Vertical" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Scroll Horizontal" -msgstr "Horizontal:" +msgstr "Scroll Horizontal" #: scene/gui/text_edit.cpp -#, fuzzy msgid "Draw" -msgstr "Chamadas de Desenho:" +msgstr "Desenhar" #: scene/gui/text_edit.cpp #, fuzzy @@ -25012,9 +24426,8 @@ msgid "Progress Offset" msgstr "" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Fill Mode" -msgstr "Modo Jogo:" +msgstr "Modo de Preenchimento" #: scene/gui/texture_progress.cpp scene/resources/material.cpp msgid "Tint" @@ -25030,9 +24443,8 @@ msgid "Initial Angle" msgstr "Inicializar" #: scene/gui/texture_progress.cpp -#, fuzzy msgid "Fill Degrees" -msgstr "A rodar %s graus." +msgstr "Graus de Preenchimento" #: scene/gui/texture_progress.cpp scene/resources/primitive_meshes.cpp #, fuzzy @@ -25083,9 +24495,8 @@ msgid "Hide Folding" msgstr "Desativar Botão" #: scene/gui/tree.cpp -#, fuzzy msgid "Hide Root" -msgstr "Criar Nó Raiz:" +msgstr "Esconder Raiz" #: scene/gui/tree.cpp msgid "Drop Mode Flags" @@ -25098,7 +24509,7 @@ msgstr "Adicionar Pista" #: scene/gui/video_player.cpp scene/main/scene_tree.cpp scene/main/timer.cpp msgid "Paused" -msgstr "" +msgstr "Pausado" #: scene/gui/video_player.cpp #, fuzzy @@ -25139,9 +24550,8 @@ msgid "Max Redirects" msgstr "" #: scene/main/http_request.cpp -#, fuzzy msgid "Timeout" -msgstr "Tempo expirado." +msgstr "Tempo esgotado" #: scene/main/node.cpp msgid "" @@ -25156,7 +24566,7 @@ msgstr "Separador Nomeado" #: scene/main/node.cpp msgid "Name Casing" -msgstr "" +msgstr "Capitalização do Nome" #: scene/main/node.cpp #, fuzzy @@ -25169,9 +24579,8 @@ msgid "Pause Mode" msgstr "Modo deslocamento" #: scene/main/node.cpp -#, fuzzy msgid "Physics Interpolation Mode" -msgstr "Modo de Interpolação" +msgstr "Modo de Interpolação da FÃsica" #: scene/main/node.cpp #, fuzzy @@ -25184,19 +24593,16 @@ msgid "Filename" msgstr "Renomear" #: scene/main/node.cpp -#, fuzzy msgid "Owner" -msgstr "Proprietários de:" +msgstr "Dono" #: scene/main/node.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Multiplayer" -msgstr "Multiplicar %s" +msgstr "Multijogador" #: scene/main/node.cpp -#, fuzzy msgid "Custom Multiplayer" -msgstr "Definir Múltiplo:" +msgstr "Multijogador Personalizado" #: scene/main/node.cpp #, fuzzy @@ -25229,7 +24635,7 @@ msgstr "Nova Raiz da Cena" #: scene/main/scene_tree.cpp msgid "Root" -msgstr "" +msgstr "Raiz" #: scene/main/scene_tree.cpp #, fuzzy @@ -25239,11 +24645,11 @@ msgstr "Multiplicar %s" #: scene/main/scene_tree.cpp scene/resources/mesh_library.cpp #: scene/resources/shape_2d.cpp msgid "Shapes" -msgstr "" +msgstr "Formas" #: scene/main/scene_tree.cpp msgid "Shape Color" -msgstr "" +msgstr "Cor da Forma" #: scene/main/scene_tree.cpp #, fuzzy @@ -25252,7 +24658,7 @@ msgstr "Escolher cor" #: scene/main/scene_tree.cpp msgid "Geometry Color" -msgstr "" +msgstr "Cor da Geometria" #: scene/main/scene_tree.cpp #, fuzzy @@ -25269,14 +24675,12 @@ msgid "Draw 2D Outlines" msgstr "Criar contorno" #: scene/main/scene_tree.cpp servers/visual_server.cpp -#, fuzzy msgid "Reflections" -msgstr "Direções" +msgstr "Reflexões" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Atlas Size" -msgstr "Tamanho do contorno:" +msgstr "Tamanho do Atlas" #: scene/main/scene_tree.cpp msgid "Atlas Subdiv" @@ -25288,7 +24692,7 @@ msgstr "" #: scene/main/scene_tree.cpp msgid "Use FXAA" -msgstr "" +msgstr "Usar FXAA" #: scene/main/scene_tree.cpp msgid "Use Debanding" @@ -25296,16 +24700,15 @@ msgstr "" #: scene/main/scene_tree.cpp scene/main/viewport.cpp msgid "HDR" -msgstr "" +msgstr "HDR" #: scene/main/scene_tree.cpp scene/main/viewport.cpp msgid "Use 32 BPC Depth" msgstr "" #: scene/main/scene_tree.cpp -#, fuzzy msgid "Default Environment" -msgstr "Ver ambiente" +msgstr "Ambiente Padrão" #: scene/main/scene_tree.cpp msgid "" @@ -25334,9 +24737,8 @@ msgstr "" "para tempos de espera muito baixos." #: scene/main/timer.cpp -#, fuzzy msgid "Autostart" -msgstr "ReinÃcio automático:" +msgstr "InÃcio Automático" #: scene/main/viewport.cpp #, fuzzy @@ -25362,7 +24764,7 @@ msgstr "" #: scene/main/viewport.cpp msgid "ARVR" -msgstr "" +msgstr "ARVR" #: scene/main/viewport.cpp #, fuzzy @@ -25375,16 +24777,15 @@ msgstr "" #: scene/main/viewport.cpp scene/resources/world_2d.cpp msgid "World" -msgstr "" +msgstr "Mundo" #: scene/main/viewport.cpp msgid "World 2D" -msgstr "" +msgstr "Mundo 2D" #: scene/main/viewport.cpp -#, fuzzy msgid "Transparent BG" -msgstr "Transpor" +msgstr "Fundo Transparente" #: scene/main/viewport.cpp #, fuzzy @@ -25393,7 +24794,7 @@ msgstr "Mudar valor de entrada" #: scene/main/viewport.cpp msgid "FXAA" -msgstr "" +msgstr "FXAA" #: scene/main/viewport.cpp #, fuzzy @@ -25412,7 +24813,7 @@ msgstr "Linear Esquerda" #: scene/main/viewport.cpp msgid "Render Direct To Screen" -msgstr "" +msgstr "Renderizar Diretamente ao Ecrã" #: scene/main/viewport.cpp #, fuzzy @@ -25420,9 +24821,8 @@ msgid "Debug Draw" msgstr "Depurar" #: scene/main/viewport.cpp -#, fuzzy msgid "Render Target" -msgstr "Renderizador:" +msgstr "Alvo do Renderizador" #: scene/main/viewport.cpp msgid "V Flip" @@ -25530,7 +24930,7 @@ msgstr "Navegação" #: scene/register_scene_types.cpp msgid "Use hiDPI" -msgstr "" +msgstr "Usar hiDPI" #: scene/register_scene_types.cpp #, fuzzy @@ -25550,12 +24950,11 @@ msgstr "Nó Mix" #: scene/resources/audio_stream_sample.cpp msgid "Stereo" -msgstr "" +msgstr "Stereo" #: scene/resources/concave_polygon_shape_2d.cpp -#, fuzzy msgid "Segments" -msgstr "Argumentos da Cena Principal:" +msgstr "Segmentos" #: scene/resources/curve.cpp #, fuzzy @@ -25568,7 +24967,7 @@ msgstr "" #: scene/resources/default_theme/default_theme.cpp msgid "Panel" -msgstr "" +msgstr "Painel" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25596,9 +24995,8 @@ msgid "Font Color Disabled" msgstr "Recorte desativado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "H Separation" -msgstr "Separação:" +msgstr "Separação Horizontal" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25607,7 +25005,7 @@ msgstr "Loop da Animação" #: scene/resources/default_theme/default_theme.cpp msgid "Arrow" -msgstr "" +msgstr "Seta" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25686,14 +25084,12 @@ msgid "Font Outline Modulate" msgstr "Forçar modulação branca" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Shadow Offset X" -msgstr "Deslocação X da grelha:" +msgstr "Deslocamento da Sombra em X" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Shadow Offset Y" -msgstr "Deslocação Y da grelha:" +msgstr "Deslocamento da Sombra em Y" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25751,14 +25147,12 @@ msgid "Space" msgstr "Cena Principal" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folded" -msgstr "Pasta:" +msgstr "Dobrado" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Fold" -msgstr "Pasta:" +msgstr "Dobrar" #: scene/resources/default_theme/default_theme.cpp msgid "Font Color Readonly" @@ -25922,14 +25316,12 @@ msgid "Font Color Accel" msgstr "Renomear Item Cor" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Font Color Separator" -msgstr "Operador de Cor." +msgstr "Separador de Cor da Fonte" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "V Separation" -msgstr "Separação:" +msgstr "Separação Vertical" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25982,9 +25374,8 @@ msgid "Close Offset" msgstr "Compensação da grelha:" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Port Offset" -msgstr "Compensação da grelha:" +msgstr "Deslocamento de Porta" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -25998,7 +25389,7 @@ msgstr "Selecionar" #: scene/resources/default_theme/default_theme.cpp msgid "Cursor Unfocused" -msgstr "" +msgstr "Cursor Desfocado" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26094,14 +25485,12 @@ msgid "Draw Guides" msgstr "Mostrar Guias" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Border" -msgstr "Vertical:" +msgstr "Borda da Barra de Rolagem" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Scroll Speed" -msgstr "Compensação da grelha:" +msgstr "Velocidade de Rolagem" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26109,9 +25498,8 @@ msgid "Icon Margin" msgstr "Definir Margem" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Line Separation" -msgstr "Separação:" +msgstr "Separação de Linha" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26119,9 +25507,8 @@ msgid "Tab FG" msgstr "Aba 1" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab BG" -msgstr "Aba 1" +msgstr "BG da Guia" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26130,7 +25517,7 @@ msgstr "Item Desativado" #: scene/resources/default_theme/default_theme.cpp msgid "Menu" -msgstr "" +msgstr "Menu" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26171,9 +25558,8 @@ msgid "Large" msgstr "Alvo" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Folder" -msgstr "Pasta:" +msgstr "Pasta" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26211,9 +25597,8 @@ msgid "Label Width" msgstr "Esquerda Wide" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Screen Picker" -msgstr "Operador Ecrã." +msgstr "Seletor de Ecrã" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26231,9 +25616,8 @@ msgid "Color Sample" msgstr "Cores" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset BG" -msgstr "Predefinições" +msgstr "Fundo Predefinido" #: scene/resources/default_theme/default_theme.cpp msgid "Overbright Indicator" @@ -26245,9 +25629,8 @@ msgid "Preset FG" msgstr "Predefinições" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Preset BG Icon" -msgstr "Predefinições" +msgstr "Ãcone de Fundo Predefinido" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26266,7 +25649,7 @@ msgstr "Cena Principal" #: scene/resources/default_theme/default_theme.cpp msgid "Bold Italics Font" -msgstr "" +msgstr "Fonte Negrito Itálica" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26274,14 +25657,12 @@ msgid "Mono Font" msgstr "Cena Principal" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Table H Separation" -msgstr "Separação:" +msgstr "Separação Horizontal da Tabela" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Table V Separation" -msgstr "Separação:" +msgstr "Separação Vertical da Tabela" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26310,11 +25691,11 @@ msgstr "Corte automático" #: scene/resources/default_theme/default_theme.cpp msgid "Minus" -msgstr "" +msgstr "Menos" #: scene/resources/default_theme/default_theme.cpp msgid "More" -msgstr "" +msgstr "Mais" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26374,9 +25755,8 @@ msgid "Font Path" msgstr "Caminho de Foco" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Outline Size" -msgstr "Tamanho do contorno:" +msgstr "Tamanho do Contorno" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -26389,14 +25769,12 @@ msgid "Use Mipmaps" msgstr "Sinais" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Extra Spacing" -msgstr "Opções Extra:" +msgstr "Espaçamento Extra" #: scene/resources/dynamic_font.cpp -#, fuzzy msgid "Char" -msgstr "Caracteres válidos:" +msgstr "Caractere" #: scene/resources/dynamic_font.cpp #, fuzzy @@ -26405,11 +25783,11 @@ msgstr "Com Dados" #: scene/resources/environment.cpp msgid "Background" -msgstr "" +msgstr "Plano de Fundo" #: scene/resources/environment.cpp scene/resources/sky.cpp msgid "Sky" -msgstr "" +msgstr "Céu" #: scene/resources/environment.cpp #, fuzzy @@ -26422,14 +25800,12 @@ msgid "Sky Orientation" msgstr "Documentação Online" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Rotation" -msgstr "Passo da rotação:" +msgstr "Rotação do Céu" #: scene/resources/environment.cpp -#, fuzzy msgid "Sky Rotation Degrees" -msgstr "A rodar %s graus." +msgstr "Graus de Rotação do Céu" #: scene/resources/environment.cpp msgid "Canvas Max Layer" @@ -26451,17 +25827,15 @@ msgstr "Condição" #: scene/resources/environment.cpp msgid "Fog" -msgstr "" +msgstr "Névoa" #: scene/resources/environment.cpp -#, fuzzy msgid "Sun Color" -msgstr "Armazenar o Ficheiro:" +msgstr "Cor do Sol" #: scene/resources/environment.cpp -#, fuzzy msgid "Sun Amount" -msgstr "Valor:" +msgstr "Quantidade do Sol" #: scene/resources/environment.cpp #, fuzzy @@ -26525,7 +25899,7 @@ msgstr "Exportar" #: scene/resources/environment.cpp msgid "White" -msgstr "" +msgstr "Branco" #: scene/resources/environment.cpp msgid "Auto Exposure" @@ -26550,14 +25924,12 @@ msgid "Max Steps" msgstr "Passo" #: scene/resources/environment.cpp -#, fuzzy msgid "Fade In" -msgstr "Aparecer (s):" +msgstr "Esmaecer de Entrada" #: scene/resources/environment.cpp -#, fuzzy msgid "Fade Out" -msgstr "Desvanecer (s):" +msgstr "Esmaecer de SaÃda" #: scene/resources/environment.cpp #, fuzzy @@ -26566,16 +25938,15 @@ msgstr "Profundidade" #: scene/resources/environment.cpp scene/resources/material.cpp msgid "Roughness" -msgstr "" +msgstr "Rugosidade" #: scene/resources/environment.cpp msgid "SSAO" -msgstr "" +msgstr "SSAO" #: scene/resources/environment.cpp -#, fuzzy msgid "Radius 2" -msgstr "Raio:" +msgstr "Raio 2" #: scene/resources/environment.cpp msgid "Intensity 2" @@ -26604,9 +25975,8 @@ msgid "DOF Far Blur" msgstr "" #: scene/resources/environment.cpp scene/resources/material.cpp -#, fuzzy msgid "Distance" -msgstr "Distância de escolha:" +msgstr "Distância" #: scene/resources/environment.cpp msgid "Transition" @@ -26618,7 +25988,7 @@ msgstr "" #: scene/resources/environment.cpp msgid "Glow" -msgstr "" +msgstr "Brilho" #: scene/resources/environment.cpp #, fuzzy @@ -26680,7 +26050,7 @@ msgstr "" #: scene/resources/environment.cpp msgid "Adjustments" -msgstr "" +msgstr "Ajustamentos" #: scene/resources/environment.cpp #, fuzzy @@ -26688,19 +26058,16 @@ msgid "Brightness" msgstr "Luz" #: scene/resources/environment.cpp -#, fuzzy msgid "Saturation" -msgstr "Separação:" +msgstr "Separação" #: scene/resources/environment.cpp -#, fuzzy msgid "Color Correction" -msgstr "Função Cor." +msgstr "Correção de Cor" #: scene/resources/font.cpp -#, fuzzy msgid "Ascent" -msgstr "Recente:" +msgstr "Subida" #: scene/resources/font.cpp #, fuzzy @@ -26713,9 +26080,8 @@ msgid "Raw Data" msgstr "Profundidade" #: scene/resources/gradient.cpp -#, fuzzy msgid "Offsets" -msgstr "Compensação:" +msgstr "Deslocamentos" #: scene/resources/height_map_shape.cpp msgid "Map Width" @@ -26745,9 +26111,8 @@ msgid "Use Shadow To Opacity" msgstr "" #: scene/resources/material.cpp -#, fuzzy msgid "Unshaded" -msgstr "Vista sem sombras" +msgstr "Sem sombra" #: scene/resources/material.cpp #, fuzzy @@ -26769,7 +26134,7 @@ msgstr "" #: scene/resources/material.cpp msgid "Do Not Receive Shadows" -msgstr "" +msgstr "Não Receber Sombras" #: scene/resources/material.cpp #, fuzzy @@ -26796,12 +26161,11 @@ msgstr "" #: scene/resources/material.cpp msgid "Is sRGB" -msgstr "" +msgstr "É sRGB" #: scene/resources/material.cpp servers/visual_server.cpp -#, fuzzy msgid "Parameters" -msgstr "Parâmetro Alterado:" +msgstr "Parâmetros" #: scene/resources/material.cpp #, fuzzy @@ -26840,12 +26204,11 @@ msgstr "Modo Régua" #: scene/resources/material.cpp msgid "Grow" -msgstr "" +msgstr "Crescer" #: scene/resources/material.cpp -#, fuzzy msgid "Grow Amount" -msgstr "Valor:" +msgstr "Quantidade de Crescimento" #: scene/resources/material.cpp msgid "Use Alpha Scissor" @@ -26868,11 +26231,11 @@ msgstr "Frame %" #: scene/resources/material.cpp msgid "Albedo" -msgstr "" +msgstr "Albedo" #: scene/resources/material.cpp msgid "Metallic" -msgstr "" +msgstr "Metálico" #: scene/resources/material.cpp #, fuzzy @@ -26880,9 +26243,8 @@ msgid "Texture Channel" msgstr "TextureRegion" #: scene/resources/material.cpp -#, fuzzy msgid "Emission" -msgstr "Máscara de Emissão" +msgstr "Emissão" #: scene/resources/material.cpp msgid "On UV2" @@ -26907,7 +26269,7 @@ msgstr "" #: scene/resources/material.cpp msgid "Anisotropy" -msgstr "" +msgstr "Anisotrópico" #: scene/resources/material.cpp msgid "Flowmap" @@ -26950,13 +26312,12 @@ msgid "Transmission" msgstr "Transmissão" #: scene/resources/material.cpp -#, fuzzy msgid "Refraction" -msgstr "Separação:" +msgstr "Refração" #: scene/resources/material.cpp msgid "Detail" -msgstr "" +msgstr "Detalhe" #: scene/resources/material.cpp #, fuzzy @@ -27002,7 +26363,7 @@ msgstr "Consolidar Lightmaps" #: scene/resources/mesh.cpp scene/resources/primitive_meshes.cpp msgid "Custom AABB" -msgstr "" +msgstr "AABB Personalizado" #: scene/resources/mesh_library.cpp #, fuzzy @@ -27015,14 +26376,12 @@ msgid "NavMesh Transform" msgstr "Limpar Transformação" #: scene/resources/multimesh.cpp -#, fuzzy msgid "Color Format" -msgstr "Operador de Cor." +msgstr "Formato de Cor" #: scene/resources/multimesh.cpp -#, fuzzy msgid "Transform Format" -msgstr "Transformação Abortada." +msgstr "Formato de Transformação" #: scene/resources/multimesh.cpp msgid "Custom Data Format" @@ -27035,12 +26394,11 @@ msgstr "Instância" #: scene/resources/multimesh.cpp msgid "Visible Instance Count" -msgstr "" +msgstr "Quantidade de Instâncias VisÃveis" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sampling" -msgstr "A escalar: " +msgstr "Mostragem" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -27048,27 +26406,24 @@ msgid "Partition Type" msgstr "Definir tipo de variável" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Parsed Geometry Type" -msgstr "A analisar geometria..." +msgstr "Tipo de Geometria Analisada" #: scene/resources/navigation_mesh.cpp msgid "Source Geometry Mode" msgstr "" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Source Group Name" -msgstr "Fonte" +msgstr "Origem do Nome do Grupo" #: scene/resources/navigation_mesh.cpp msgid "Cells" -msgstr "" +msgstr "Células" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Agents" -msgstr "Argumentos da Cena Principal:" +msgstr "Agentes" #: scene/resources/navigation_mesh.cpp msgid "Max Climb" @@ -27090,7 +26445,7 @@ msgstr "Mesclar a partir da Cena" #: scene/resources/navigation_mesh.cpp msgid "Edges" -msgstr "" +msgstr "Arestas" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -27099,7 +26454,7 @@ msgstr "Erro" #: scene/resources/navigation_mesh.cpp msgid "Verts Per Poly" -msgstr "" +msgstr "Vértices Por PolÃgono" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -27107,9 +26462,8 @@ msgid "Details" msgstr "Mostrar Predefinição" #: scene/resources/navigation_mesh.cpp -#, fuzzy msgid "Sample Distance" -msgstr "Distância de escolha:" +msgstr "Distância de Amostra" #: scene/resources/navigation_mesh.cpp #, fuzzy @@ -27140,7 +26494,7 @@ msgstr "Compensação:" #: scene/resources/occluder_shape.cpp msgid "Spheres" -msgstr "" +msgstr "Esferas" #: scene/resources/occluder_shape.cpp msgid "OccluderShapeSphere Set Spheres" @@ -27180,9 +26534,8 @@ msgid "Color Modifier" msgstr "Freelook Modificador de Lentidão" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Point Texture" -msgstr "Pontos de emissão:" +msgstr "Textura de Ponto" #: scene/resources/particles_material.cpp msgid "Normal Texture" @@ -27199,9 +26552,8 @@ msgid "Point Count" msgstr "Adicionar Porta de Entrada" #: scene/resources/particles_material.cpp -#, fuzzy msgid "Scale Random" -msgstr "Proporção de Escala:" +msgstr "Randomização de Escala" #: scene/resources/particles_material.cpp #, fuzzy @@ -27217,9 +26569,8 @@ msgid "Absorbent" msgstr "" #: scene/resources/plane_shape.cpp -#, fuzzy msgid "Plane" -msgstr "Plano:" +msgstr "Plano" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -27243,9 +26594,8 @@ msgid "Subdivide Depth" msgstr "" #: scene/resources/primitive_meshes.cpp -#, fuzzy msgid "Top Radius" -msgstr "Raio:" +msgstr "Raio do Topo" #: scene/resources/primitive_meshes.cpp #, fuzzy @@ -27294,9 +26644,8 @@ msgid "Bone" msgstr "Ossos" #: scene/resources/sky.cpp -#, fuzzy msgid "Radiance Size" -msgstr "Tamanho do contorno:" +msgstr "Tamanho da Radiância" #: scene/resources/sky.cpp msgid "Panorama" @@ -27308,9 +26657,8 @@ msgid "Top Color" msgstr "Próximo Piso" #: scene/resources/sky.cpp -#, fuzzy msgid "Horizon Color" -msgstr "Armazenar o Ficheiro:" +msgstr "Cor do Horizonte" #: scene/resources/sky.cpp #, fuzzy @@ -27334,7 +26682,7 @@ msgstr "Substituto" #: scene/resources/sky.cpp msgid "Longitude" -msgstr "" +msgstr "Longitude" #: scene/resources/sky.cpp msgid "Angle Min" @@ -27369,7 +26717,7 @@ msgstr "" #: scene/resources/style_box.cpp msgid "Anti Aliasing" -msgstr "" +msgstr "Anti Serrilhamento" #: scene/resources/style_box.cpp msgid "Grow Begin" @@ -27419,9 +26767,8 @@ msgid "Lossy Storage Quality" msgstr "Capturar" #: scene/resources/texture.cpp -#, fuzzy msgid "From" -msgstr "Modo Jogo:" +msgstr "À Partir de" #: scene/resources/texture.cpp #, fuzzy @@ -27595,11 +26942,11 @@ msgstr "Editar Conexão:" #: scene/resources/world_2d.cpp msgid "Canvas" -msgstr "" +msgstr "Tela" #: servers/arvr/arvr_interface.cpp msgid "Is Primary" -msgstr "" +msgstr "É Principal" #: servers/arvr/arvr_interface.cpp #, fuzzy @@ -27625,9 +26972,8 @@ msgid "Audio Stream" msgstr "Item Rádio" #: servers/audio/audio_stream.cpp -#, fuzzy msgid "Random Pitch" -msgstr "Inclinação aleatória:" +msgstr "Timbre Aleatório" #: servers/audio/effects/audio_effect_capture.cpp #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp @@ -27637,27 +26983,27 @@ msgstr "" #: servers/audio/effects/audio_effect_chorus.cpp msgid "Voice Count" -msgstr "" +msgstr "Quantidade de Vozes" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Dry" -msgstr "" +msgstr "Seco" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_reverb.cpp msgid "Wet" -msgstr "" +msgstr "Molhado" #: servers/audio/effects/audio_effect_chorus.cpp msgid "Voice" -msgstr "" +msgstr "Voz" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp msgid "Delay (ms)" -msgstr "" +msgstr "Atraso (ms)" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_phaser.cpp @@ -27672,7 +27018,7 @@ msgstr "Profundidade" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp msgid "Level dB" -msgstr "" +msgstr "NÃvel dB" #: servers/audio/effects/audio_effect_chorus.cpp #: servers/audio/effects/audio_effect_delay.cpp @@ -27684,11 +27030,11 @@ msgstr "Plano:" #: servers/audio/effects/audio_effect_compressor.cpp #: servers/audio/effects/audio_effect_filter.cpp msgid "Gain" -msgstr "" +msgstr "Ganho" #: servers/audio/effects/audio_effect_compressor.cpp msgid "Attack (µs)" -msgstr "" +msgstr "Ataque (µs)" #: servers/audio/effects/audio_effect_compressor.cpp #, fuzzy @@ -27725,7 +27071,7 @@ msgstr "Ignorar" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Pre Gain" -msgstr "" +msgstr "Pré Ganho" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Keep Hf Hz" @@ -27775,13 +27121,12 @@ msgstr "" #: servers/audio/effects/audio_effect_pitch_shift.cpp #: servers/audio/effects/audio_effect_spectrum_analyzer.cpp -#, fuzzy msgid "FFT Size" -msgstr "Tamanho:" +msgstr "Tamanho FFT" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Predelay" -msgstr "" +msgstr "Pré Atraso" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Msec" @@ -27789,7 +27134,7 @@ msgstr "" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Room Size" -msgstr "" +msgstr "Tamanho da Sala" #: servers/audio/effects/audio_effect_reverb.cpp #, fuzzy @@ -27805,9 +27150,8 @@ msgid "Pan Pullout" msgstr "" #: servers/audio/effects/audio_effect_stereo_enhance.cpp -#, fuzzy msgid "Time Pullout (ms)" -msgstr "Tempo expirado." +msgstr "Retirada de Tempo (ms)" #: servers/audio/effects/audio_effect_stereo_enhance.cpp msgid "Surround" @@ -27819,9 +27163,8 @@ msgid "Enable Audio Input" msgstr "Renomear o barramento de áudio" #: servers/audio_server.cpp -#, fuzzy msgid "Output Latency" -msgstr "SaÃda" +msgstr "Latência de SaÃda" #: servers/audio_server.cpp msgid "Channel Disable Threshold dB" @@ -27870,12 +27213,11 @@ msgstr "" #: servers/physics/space_sw.cpp servers/physics_2d/space_2d_sw.cpp msgid "Time Before Sleep" -msgstr "" +msgstr "Tempo Antes de Dormir" #: servers/physics_2d/physics_2d_server_sw.cpp -#, fuzzy msgid "BP Hash Table Size" -msgstr "Tamanho:" +msgstr "Tamanho da \"BP Hash Table\"" #: servers/physics_2d/physics_2d_server_sw.cpp msgid "Large Object Surface Threshold In Cells" @@ -27883,12 +27225,11 @@ msgstr "" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Inverse Mass" -msgstr "" +msgstr "Inverter Massa" #: servers/physics_2d_server.cpp servers/physics_server.cpp -#, fuzzy msgid "Inverse Inertia" -msgstr "Freelook Esquerda" +msgstr "Inverter Inércia" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Total Angular Damp" @@ -27911,7 +27252,7 @@ msgstr "Inicializar" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Exclude" -msgstr "" +msgstr "Excluir" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Shape RID" @@ -27924,7 +27265,7 @@ msgstr "Modo Colisão" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Collide With Areas" -msgstr "" +msgstr "Colidir com Ãreas" #: servers/physics_2d_server.cpp servers/physics_server.cpp msgid "Motion Remainder" @@ -28004,9 +27345,8 @@ msgid "Constants cannot be modified." msgstr "Constantes não podem ser modificadas." #: servers/visual/visual_server_scene.cpp -#, fuzzy msgid "Spatial Partitioning" -msgstr "A segmentar..." +msgstr "Particionamento Espacial" #: servers/visual_server.cpp #, fuzzy @@ -28045,16 +27385,15 @@ msgstr "Importar tema" #: servers/visual_server.cpp msgid "Lossless Compression" -msgstr "" +msgstr "Compressão Sem Perda" #: servers/visual_server.cpp -#, fuzzy msgid "Force PNG" -msgstr "Forçar Impulso" +msgstr "Forçar PNG" #: servers/visual_server.cpp msgid "WebP Compression Level" -msgstr "" +msgstr "NÃvel de Compressão WebP" #: servers/visual_server.cpp msgid "Time Rollover Secs" @@ -28098,7 +27437,7 @@ msgstr "Centrar Seleção" #: servers/visual_server.cpp msgid "High Quality GGX" -msgstr "" +msgstr "GGX de Alta Qualidade" #: servers/visual_server.cpp msgid "Irradiance Max Size" @@ -28172,9 +27511,8 @@ msgid "Ninepatch Mode" msgstr "Modo de Interpolação" #: servers/visual_server.cpp -#, fuzzy msgid "OpenGL" -msgstr "Abrir" +msgstr "abrir" #: servers/visual_server.cpp msgid "Batching Send Null" @@ -28194,9 +27532,8 @@ msgid "Legacy Stream" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Batching" -msgstr "A procurar..." +msgstr "Loteamento" #: servers/visual_server.cpp msgid "Use Batching" @@ -28224,9 +27561,8 @@ msgid "Scissor Area Threshold" msgstr "" #: servers/visual_server.cpp -#, fuzzy msgid "Max Join Items" -msgstr "Gerir Itens..." +msgstr "Máximo de Itens de Junção" #: servers/visual_server.cpp msgid "Batch Buffer Size" @@ -28238,7 +27574,7 @@ msgstr "" #: servers/visual_server.cpp msgid "Flash Batching" -msgstr "" +msgstr "Loteamento de Flashes" #: servers/visual_server.cpp #, fuzzy @@ -28247,15 +27583,15 @@ msgstr "Colar Frame" #: servers/visual_server.cpp msgid "GLES2" -msgstr "" +msgstr "GLES2" #: servers/visual_server.cpp msgid "Compatibility" -msgstr "" +msgstr "Compatibilidade" #: servers/visual_server.cpp msgid "Disable Half Float" -msgstr "" +msgstr "Desativar Meia Float" #: servers/visual_server.cpp #, fuzzy @@ -28269,11 +27605,11 @@ msgstr "Expressão" #: servers/visual_server.cpp msgid "UV Contract" -msgstr "" +msgstr "Contrato UV" #: servers/visual_server.cpp msgid "UV Contract Amount" -msgstr "" +msgstr "Valor do Contrato UV" #: servers/visual_server.cpp #, fuzzy @@ -28282,7 +27618,7 @@ msgstr "Usar Ajuste de Escala" #: servers/visual_server.cpp msgid "PVS Logging" -msgstr "" +msgstr "Registo PVS" #: servers/visual_server.cpp #, fuzzy @@ -28306,12 +27642,11 @@ msgstr "Ver Culling da Oclusão" #: servers/visual_server.cpp msgid "Max Active Spheres" -msgstr "" +msgstr "Máximo de Esferas Ativas" #: servers/visual_server.cpp -#, fuzzy msgid "Max Active Polygons" -msgstr "Mover PolÃgono" +msgstr "Máximo de PolÃgonos Ativos" #: servers/visual_server.cpp #, fuzzy diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po index 30ad718462..8e574f992d 100644 --- a/editor/translations/pt_BR.po +++ b/editor/translations/pt_BR.po @@ -38,7 +38,7 @@ # Pedro Pacheco <pedroxixipa@hotmail.com>, 2018, 2019. # Bruno Henrique <nimbusdroid@gmail.com>, 2018, 2019. # Luciano Scilletta <lucianoscilletta@gmail.com>, 2018. -# Julio Yagami <juliohenrique31501234@hotmail.com>, 2018, 2019. +# Julio Yagami <juliohenrique31501234@hotmail.com>, 2018, 2019, 2022. # Fernando Martinez <contact@fernandodev.com>, 2018. # Marcelo <mitissa@gmail.com>, 2018, 2019. # Walter Bolitto <wrcarval@live.com>, 2018, 2019. @@ -95,21 +95,21 @@ # Felipe Jesus Macedo <fmacedo746@gmail.com>, 2020. # José Paulo <jose.paulo1919@gmail.com>, 2020. # Necco <necco@outlook.com>, 2020. -# Marcelo Silveira Hayden <mshayden.1998@gmail.com>, 2020, 2021. +# Marcelo Silveira Hayden <mshayden.1998@gmail.com>, 2020, 2021, 2022. # GUILHERME SOUZA REIS DE MELO LOPES <guilhermesrml@unipam.edu.br>, 2020. # Gabriela Araújo <Gabirin@outlook.com.br>, 2020. # Jairo Tuboi <tuboi.jairo@gmail.com>, 2020. # Felipe Fetter <felipetfetter@gmail.com>, 2020. # Rafael Henrique Capati <rhcapati@gmail.com>, 2020. -# NogardRyuu <nogardryuu@gmail.com>, 2020, 2021. +# NogardRyuu <nogardryuu@gmail.com>, 2020, 2021, 2022. # Elton <eltondeoliveira@outlook.com>, 2020, 2021. -# ThiagoCTN <thiagocampostn@gmail.com>, 2020. +# ThiagoCTN <thiagocampostn@gmail.com>, 2020, 2022. # Alec Santos <alecsantos96@gmail.com>, 2020. # Augusto Milão <augusto.milao01@gmail.com>, 2021, 2022. # Gabriel Gavazzi Felix <mutcholoko32@gmail.com>, 2021. # Lucas Dantas <lucas.lucantas38@gmail.com>, 2021. -# Carlos Bonifacio <carlosboni.sa@gmail.com>, 2021. -# Lucas Castro <castroclucas@gmail.com>, 2021. +# Carlos Bonifacio <carlosboni.sa@gmail.com>, 2021, 2022. +# Lucas Castro <castroclucas@gmail.com>, 2021, 2022. # Ricardo Zamarrenho Carvalho Correa <ricardozcc17@gmail.com>, 2021. # Diego dos Reis Macedo <diego_dragon97@hotmail.com>, 2021. # Lucas E. <lukas.ed45@gmail.com>, 2021. @@ -153,13 +153,16 @@ # Mauricio Mazur <mauricio.mazur12@gmail.com>, 2022. # ! Zyll <emanueljunior756@gmail.com>, 2022. # Kirrby <kirrby.gaming@gmail.com>, 2022. +# Murilo Gama <murilovsky2030@gmail.com>, 2022. +# Kauã Azevedo <Kazevic@pm.me>, 2022. +# Zer0-Zer0 <dankmemerson@tutanota.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2016-05-30\n" -"PO-Revision-Date: 2022-09-27 21:37+0000\n" -"Last-Translator: Kirrby <kirrby.gaming@gmail.com>\n" +"PO-Revision-Date: 2022-12-10 02:13+0000\n" +"Last-Translator: Julio Yagami <juliohenrique31501234@hotmail.com>\n" "Language-Team: Portuguese (Brazil) <https://hosted.weblate.org/projects/" "godot-engine/godot/pt_BR/>\n" "Language: pt_BR\n" @@ -167,7 +170,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n > 1;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -1293,7 +1296,7 @@ msgstr "Manipulador de Entrada" #: editor/animation_track_editor.cpp msgid "Out Handle" -msgstr "Manipulador de SaÃda" +msgstr "Fora do controle" #: editor/animation_track_editor.cpp #: editor/import/resource_importer_texture.cpp @@ -1575,7 +1578,7 @@ msgstr "Editores" #: editor/animation_track_editor.cpp editor/editor_settings.cpp msgid "Confirm Insert Track" -msgstr "Confirmar Inserção de Trilha" +msgstr "Confirmar inserção de faixa" #. TRANSLATORS: %s will be replaced by a phrase describing the target of track. #: editor/animation_track_editor.cpp @@ -1746,7 +1749,7 @@ msgstr "" #: editor/animation_track_editor.cpp msgid "Anim Add RESET Keys" -msgstr "Anim Adicionar Teclas de RESET" +msgstr "Anim adicionar teclas de RESET" #: editor/animation_track_editor.cpp msgid "" @@ -3065,7 +3068,7 @@ msgstr "Em exportações de 32 bits, o PCK embutido não pode ser maior que 4GB. #: editor/editor_export.cpp msgid "Convert Text Resources To Binary On Export" -msgstr "Converter Recursos de Texto para Binário na Exportação" +msgstr "Converter recursos de texto para binário na exportação" #: editor/editor_feature_profile.cpp msgid "3D Editor" @@ -4416,7 +4419,7 @@ msgstr "Sempre Limpar Output no modo Play" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Open Output On Play" -msgstr "Sempre abrir a saÃda ao jogar" +msgstr "Sempre abrir a saÃda ao reproduzir" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Always Close Output On Stop" @@ -4424,7 +4427,7 @@ msgstr "Sempre fechar a saÃda ao parar" #: editor/editor_node.cpp msgid "Save On Focus Loss" -msgstr "Salvar em caso de perda de foco" +msgstr "Salvar ao perder o foco" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Save Each Scene On Quit" @@ -4456,7 +4459,7 @@ msgstr "Restaurar Cenas ao Carregar" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Show Thumbnail On Hover" -msgstr "Mostrar miniatura ao passar o mouse" +msgstr "Exibir miniatura ao passar o mouse por cima" #: editor/editor_node.cpp editor/editor_settings.cpp msgid "Inspector" @@ -4464,11 +4467,11 @@ msgstr "Inspetor" #: editor/editor_node.cpp msgid "Default Property Name Style" -msgstr "Estilo de Nome de Propriedade Padrão" +msgstr "Estilo de Nome Padrão de Propriedade" #: editor/editor_node.cpp msgid "Default Float Step" -msgstr "Passo de ponto flutuante padrão" +msgstr "Passo de Float padrão" #: editor/editor_node.cpp scene/gui/tree.cpp msgid "Disable Folding" @@ -5359,7 +5362,7 @@ msgstr "Linguagem do Editor" #: editor/editor_settings.cpp msgid "Display Scale" -msgstr "Escala de Exibição" +msgstr "Exibir Escala" #: editor/editor_settings.cpp msgid "Custom Display Scale" @@ -5367,15 +5370,15 @@ msgstr "Escala de Exibição Customizada" #: editor/editor_settings.cpp msgid "Main Font Size" -msgstr "Tamanho de Fonte Principal" +msgstr "Tamanho da Fonte Principal" #: editor/editor_settings.cpp msgid "Code Font Size" -msgstr "Tamanho de Fonte (Tipo) no Código" +msgstr "Tamanho da Fonte do Código" #: editor/editor_settings.cpp msgid "Font Antialiased" -msgstr "Fonte Com Serrilhado Suavizado" +msgstr "Fonte com Anti-aliasing" #: editor/editor_settings.cpp msgid "Font Hinting" @@ -5387,27 +5390,27 @@ msgstr "Fonte Principal" #: editor/editor_settings.cpp msgid "Main Font Bold" -msgstr "Fonte Principal (Negrito)" +msgstr "Fonte Principal com Negrito" #: editor/editor_settings.cpp msgid "Code Font" -msgstr "Fonte para Código" +msgstr "Fonte do Código" #: editor/editor_settings.cpp msgid "Dim Editor On Dialog Popup" -msgstr "Escurecer o Editor ao Abir Janela Popup" +msgstr "Escurecer Editor no Pop-up de Diálogo" #: editor/editor_settings.cpp main/main.cpp msgid "Low Processor Mode Sleep (µsec)" -msgstr "Tempo de Espera em Modo de Hibernação (µseg)" +msgstr "Modo de baixo processamento tempo (µsec)" #: editor/editor_settings.cpp msgid "Unfocused Low Processor Mode Sleep (µsec)" -msgstr "Tempo de Espera em Modo de Hibernação Quando Fora de Foco (µseg)" +msgstr "Modo de baixo processamento não focado (µsec)" #: editor/editor_settings.cpp msgid "Separate Distraction Mode" -msgstr "Modo \"Sem Distrações\" Desacoplado" +msgstr "Separar Modo Distração" #: editor/editor_settings.cpp msgid "Automatically Open Screenshots" @@ -5429,7 +5432,7 @@ msgstr "Predefinição" #: editor/editor_settings.cpp msgid "Icon And Font Color" -msgstr "Cor da Fonte e do Ãcone" +msgstr "Cores do Ãcone e da fonte" #: editor/editor_settings.cpp msgid "Base Color" @@ -5505,7 +5508,7 @@ msgstr "Tamanho da Miniatura" #: editor/editor_settings.cpp msgid "Docks" -msgstr "Docks" +msgstr "Painéis" #: editor/editor_settings.cpp msgid "Scene Tree" @@ -5702,7 +5705,7 @@ msgstr "Ordenar Prévia de Membros Automaticamente" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Cursor" -msgstr "Cursor" +msgstr "Ponteiro" #: editor/editor_settings.cpp msgid "Scroll Past End Of File" @@ -8485,7 +8488,7 @@ msgstr "Obtido:" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Failed SHA-256 hash check" -msgstr "Falha na verificação do hash SHA-256" +msgstr "Falha na verificação da hash SHA-256" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Asset Download Error:" @@ -8669,8 +8672,8 @@ msgid "" "Some mesh is invalid. Make sure the UV2 channel values are contained within " "the [0.0,1.0] square region." msgstr "" -"Alguma malha é inválida. Certifique-se de que os valores do canal UV2 estão " -"contidos na região quadrada [0.0,1.0]." +"Algum mesh é invalido. Tenha certeza que os valores do canal UV2 estão " +"contidos dentro da região quadrática [0.0,1.0]." #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -8811,8 +8814,8 @@ msgid "" "Children of containers have their anchors and margins values overridden by " "their parent." msgstr "" -"Filhos de contêineres têm suas posições e tamanhos sobrescritos pelos seus " -"pais." +"Filhos de contêineres têm seus valores de âncoras e margens substituÃdos " +"pelos seus pais." #: editor/plugins/canvas_item_editor_plugin.cpp msgid "Presets for the anchors and margins values of a Control node." @@ -11405,11 +11408,11 @@ msgstr "Orbitar Visão Para Baixo" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orbit View Left" -msgstr "Orbitar Visão para a Esquerda" +msgstr "Orbitar Visão à Esquerda" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orbit View Right" -msgstr "Orbitar Visão para a Direita" +msgstr "Orbitar Visão à Direita" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orbit View Up" @@ -11417,7 +11420,7 @@ msgstr "Orbitar Visão para Cima" #: editor/plugins/spatial_editor_plugin.cpp msgid "Orbit View 180" -msgstr "Orbitar Visão em 180" +msgstr "Orbitar Visão 180º" #: editor/plugins/spatial_editor_plugin.cpp msgid "Switch Perspective/Orthogonal View" @@ -12322,7 +12325,7 @@ msgid "" "Toggle the control picker, allowing to visually select control types for " "edit." msgstr "" -"Acionar o selecionador de controles, permitindo selecionar visualmente os " +"Acionar o selecionador de controles, permitindo visualmente selecionar os " "tipos de controles para edição." #: editor/plugins/theme_editor_preview.cpp @@ -12529,6 +12532,7 @@ msgid "Clear Transform" msgstr "Limpar Transformação" #: editor/plugins/tile_map_editor_plugin.cpp +#, fuzzy msgid "Tile Map" msgstr "Tile Map" @@ -12559,9 +12563,8 @@ msgstr "Pré-visualização do Preenchimento de Balde" #: editor/plugins/tile_map_editor_plugin.cpp #: modules/gridmap/grid_map_editor_plugin.cpp -#, fuzzy msgid "Editor Side" -msgstr "Editor" +msgstr "Lado do Editor" #: editor/plugins/tile_map_editor_plugin.cpp msgid "Display Grid" @@ -12915,9 +12918,10 @@ msgstr "Opções de Encaixe" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "Deslocamento" @@ -13003,9 +13007,8 @@ msgid "Selected Collision One Way" msgstr "Colisão em sentido único selecionada" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision One Way Margin" -msgstr "Modo Colisão" +msgstr "Margem de colisão em sentido único selecionada" #: editor/plugins/tile_set_editor_plugin.cpp msgid "Selected Navigation" @@ -13147,9 +13150,8 @@ msgid "Branch Name" msgstr "Nome do Ramo" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remotes" -msgstr "Remoto" +msgstr "Remotos" #: editor/plugins/version_control_editor_plugin.cpp msgid "Create New Remote" @@ -13160,7 +13162,6 @@ msgid "Remove Remote" msgstr "Remover remoto" #: editor/plugins/version_control_editor_plugin.cpp -#, fuzzy msgid "Remote Name" msgstr "Nome Remoto" @@ -14330,16 +14331,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Caminho de projeto inválido (mudou alguma coisa?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Não foi possÃvel carregar project.godot no caminho do projeto (erro %d). Ele " "pode estar ausente ou corrompido." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "Não foi possÃvel editar project.godot no caminho do projeto." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Não é possÃvel abrir o projeto em '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -15561,18 +15563,16 @@ msgid "Clear Inheritance? (No Undo!)" msgstr "Limpar Herança? (IrreversÃvel!)" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Show Scene Tree Root Selection" -msgstr "Seleção Central" +msgstr "Mostrar seleção da hierarquia de cenas" #: editor/scene_tree_dock.cpp msgid "Derive Script Globals By Name" msgstr "Obter Globais de Script por Nome" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Use Favorites Root Selection" -msgstr "Seleção de Frame" +msgstr "Seleção de favoritos da raÃz" #: editor/scene_tree_editor.cpp msgid "Toggle Visible" @@ -15874,7 +15874,7 @@ msgstr "Copiar Erro" #: editor/script_editor_debugger.cpp msgid "Open C++ Source on GitHub" -msgstr "Abrir Código C++ no GitHub" +msgstr "Abrir código C++ no GitHub" #: editor/script_editor_debugger.cpp msgid "Video RAM" @@ -16158,12 +16158,10 @@ msgid "Set Occluder Sphere Position" msgstr "Definir Posição Da Esfera Do Oclusor" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Polygon Point Position" msgstr "Definir Posição do Ponto do PolÃgono Oclusor" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Set Occluder Hole Point Position" msgstr "Definir Posição do Ponto do Buraco Oclusor" @@ -16172,9 +16170,8 @@ msgid "Occluder Polygon Front" msgstr "Frente do PolÃgono Oclusor" #: editor/spatial_editor_gizmos.cpp -#, fuzzy msgid "Occluder Polygon Back" -msgstr "Costas do PolÃgono Oclusor" +msgstr "Traseira do PolÃgono Oclusor" #: editor/spatial_editor_gizmos.cpp msgid "Occluder Hole" @@ -16182,7 +16179,7 @@ msgstr "Buraco Oclusor" #: main/main.cpp msgid "Godot Physics" -msgstr "Godot Physics" +msgstr "FÃsica Godot" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp @@ -16203,8 +16200,9 @@ msgid "Multithreaded Server" msgstr "Servidor com Multi-Thread" #: main/main.cpp +#, fuzzy msgid "RID Pool Prealloc" -msgstr "" +msgstr "Pre-alocação de Pool RID" #: main/main.cpp msgid "Debugger stdout" @@ -16371,9 +16369,8 @@ msgid "Enable Warnings" msgstr "Habilitar Avisos" #: main/main.cpp -#, fuzzy msgid "Frame Delay Msec" -msgstr "Seleção de Frame" +msgstr "Atraso de quadro Mseg" #: main/main.cpp msgid "Low Processor Mode" @@ -16531,14 +16528,12 @@ msgid "Auto Accept Quit" msgstr "Aceitar Sair Automaticamente" #: main/main.cpp scene/main/scene_tree.cpp -#, fuzzy msgid "Quit On Go Back" -msgstr "Sair em Voltar" +msgstr "Sair ao Voltar" #: main/main.cpp scene/main/viewport.cpp -#, fuzzy msgid "Snap Controls To Pixels" -msgstr "Encaixar nos Lados do Nó" +msgstr "Encaixar Nós de Controle nos pixels" #: main/main.cpp msgid "Dynamic Fonts" @@ -16660,9 +16655,8 @@ msgid "Path Node" msgstr "Caminho do Nó" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Interval Type" -msgstr "Criar Vertex Interno" +msgstr "Tipo de Intervalo de Caminho" #: modules/csg/csg_shape.cpp msgid "Path Interval" @@ -16677,14 +16671,13 @@ msgid "Path Rotation" msgstr "Rotação do Caminho" #: modules/csg/csg_shape.cpp -#, fuzzy msgid "Path Local" -msgstr "Tornar Local" +msgstr "Caminho Local" #: modules/csg/csg_shape.cpp #, fuzzy msgid "Path Continuous U" -msgstr "ContÃnuo" +msgstr "Caminho ContÃnuo" #: modules/csg/csg_shape.cpp msgid "Path U Distance" @@ -16917,9 +16910,8 @@ msgid "Export GLTF..." msgstr "Exportar GLTF..." #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Buffer View" -msgstr "Visão Traseira" +msgstr "Visão de Buffer" #: modules/gltf/gltf_accessor.cpp modules/gltf/gltf_buffer_view.cpp msgid "Byte Offset" @@ -16946,9 +16938,8 @@ msgid "Max" msgstr "Max" #: modules/gltf/gltf_accessor.cpp -#, fuzzy msgid "Sparse Count" -msgstr "Instância" +msgstr "Contagem Escassa" #: modules/gltf/gltf_accessor.cpp msgid "Sparse Indices Buffer View" @@ -16971,14 +16962,12 @@ msgid "Sparse Values Byte Offset" msgstr "" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Buffer" -msgstr "Visão Traseira" +msgstr "Buffer" #: modules/gltf/gltf_buffer_view.cpp -#, fuzzy msgid "Byte Length" -msgstr "Tema Padrão" +msgstr "Largura do byte" #: modules/gltf/gltf_buffer_view.cpp msgid "Byte Stride" @@ -16994,12 +16983,11 @@ msgstr "Tamanho do FOV" #: modules/gltf/gltf_camera.cpp msgid "Zfar" -msgstr "" +msgstr "Z longe" #: modules/gltf/gltf_camera.cpp -#, fuzzy msgid "Znear" -msgstr "Linear" +msgstr "Z perto" #: modules/gltf/gltf_light.cpp scene/2d/canvas_modulate.cpp #: scene/2d/cpu_particles_2d.cpp scene/2d/light_2d.cpp scene/2d/polygon_2d.cpp @@ -17030,9 +17018,8 @@ msgid "Outer Cone Angle" msgstr "Ângulo externo do cone" #: modules/gltf/gltf_mesh.cpp -#, fuzzy msgid "Blend Weights" -msgstr "Faça mapas de luz" +msgstr "Peso da mesclagem" #: modules/gltf/gltf_mesh.cpp msgid "Instance Materials" @@ -17043,13 +17030,12 @@ msgid "Parent" msgstr "Pai" #: modules/gltf/gltf_node.cpp -#, fuzzy msgid "Xform" -msgstr "Plataforma" +msgstr "" #: modules/gltf/gltf_node.cpp scene/3d/mesh_instance.cpp msgid "Skin" -msgstr "Skin" +msgstr "" #: modules/gltf/gltf_node.cpp scene/3d/spatial.cpp msgid "Translation" @@ -17085,12 +17071,11 @@ msgstr "Pontos Originais" #: modules/gltf/gltf_skin.cpp msgid "Inverse Binds" -msgstr "" +msgstr "Designações invertidas" #: modules/gltf/gltf_skin.cpp -#, fuzzy msgid "Non Joints" -msgstr "Mover Junta" +msgstr "Não-Juntas" #: modules/gltf/gltf_skin.cpp msgid "Joint I To Bone I" @@ -17102,15 +17087,15 @@ msgstr "Junta I ao Nome" #: modules/gltf/gltf_skin.cpp msgid "Godot Skin" -msgstr "" +msgstr "Skin Godot" #: modules/gltf/gltf_spec_gloss.cpp msgid "Diffuse Img" -msgstr "Difusa Img" +msgstr "Imagem Difusa" #: modules/gltf/gltf_spec_gloss.cpp msgid "Diffuse Factor" -msgstr "Difusa Fator" +msgstr "Fator de Difusão" #: modules/gltf/gltf_spec_gloss.cpp msgid "Gloss Factor" @@ -17126,30 +17111,27 @@ msgstr "" #: modules/gltf/gltf_state.cpp msgid "Json" -msgstr "Json" +msgstr "" #: modules/gltf/gltf_state.cpp msgid "Major Version" msgstr "Versão Importante" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Minor Version" -msgstr "Versão" +msgstr "Versão Minoritária" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "GLB Data" -msgstr "Com Dados" +msgstr "Dados do GLB" #: modules/gltf/gltf_state.cpp msgid "Use Named Skin Binds" msgstr "" #: modules/gltf/gltf_state.cpp -#, fuzzy msgid "Buffer Views" -msgstr "Visão Traseira" +msgstr "Visão Buffer" #: modules/gltf/gltf_state.cpp msgid "Accessors" @@ -17197,9 +17179,8 @@ msgid "Animations" msgstr "Animações" #: modules/gltf/gltf_texture.cpp -#, fuzzy msgid "Src Image" -msgstr "Mostrar Ossos" +msgstr "Imagem fonte" #: modules/gridmap/grid_map.cpp msgid "Mesh Library" @@ -17210,18 +17191,16 @@ msgid "Physics Material" msgstr "Material de FÃsica" #: modules/gridmap/grid_map.cpp scene/3d/visual_instance.cpp -#, fuzzy msgid "Use In Baked Light" -msgstr "Faça mapas de luz" +msgstr "Usar no mapa de luz" #: modules/gridmap/grid_map.cpp scene/2d/tile_map.cpp msgid "Cell" msgstr "Célula" #: modules/gridmap/grid_map.cpp -#, fuzzy msgid "Octant Size" -msgstr "Visão Frontal" +msgstr "Tamanho Octante" #: modules/gridmap/grid_map.cpp msgid "Center X" @@ -17382,7 +17361,7 @@ msgstr "Atribua um recurso MeshLibrary a este GridMap para usar seus meshes." #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Begin Bake" -msgstr "Iniciar bake" +msgstr "Iniciar Bake" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Preparing data structures" @@ -17394,7 +17373,7 @@ msgstr "Gerar buffers" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Direct lighting" -msgstr "Iluminação direta" +msgstr "Iluminação Direta" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Indirect lighting" @@ -17406,7 +17385,7 @@ msgstr "Pós-processamento" #: modules/lightmapper_cpu/lightmapper_cpu.cpp msgid "Plotting lightmaps" -msgstr "Traçando mapas de luz" +msgstr "Planejando Luzes" #: modules/lightmapper_cpu/register_types.cpp msgid "CPU Lightmapper" @@ -17448,9 +17427,8 @@ msgid "Display Width" msgstr "Largura de Tela" #: modules/mobile_vr/mobile_vr_interface.cpp -#, fuzzy msgid "Display To Lens" -msgstr "Exibir Sem Sombreamento" +msgstr "Exibir para as Lentes" #: modules/mobile_vr/mobile_vr_interface.cpp msgid "Oversample" @@ -17477,9 +17455,8 @@ msgid "Auto Update Project" msgstr "Atualizar Projeto Automaticamente" #: modules/mono/godotsharp_dirs.cpp -#, fuzzy msgid "Assembly Name" -msgstr "Nome de Exibição" +msgstr "Nome de Montagem" #: modules/mono/godotsharp_dirs.cpp msgid "Solution Directory" @@ -17569,9 +17546,8 @@ msgid "As Normal Map" msgstr "Como Mapa Normal" #: modules/opensimplex/noise_texture.cpp -#, fuzzy msgid "Bump Strength" -msgstr "Força da colisão" +msgstr "Força do Bump" #: modules/opensimplex/noise_texture.cpp msgid "Noise" @@ -17611,7 +17587,7 @@ msgstr "Strings" #: modules/upnp/upnp.cpp msgid "Discover Multicast If" -msgstr "" +msgstr "Descobrir if Multicast" #: modules/upnp/upnp.cpp msgid "Discover Local Port" @@ -17622,9 +17598,8 @@ msgid "Discover IPv6" msgstr "Descobrir IPv6" #: modules/upnp/upnp_device.cpp -#, fuzzy msgid "Description URL" -msgstr "Descrição" +msgstr "URL Descritiva" #: modules/upnp/upnp_device.cpp msgid "Service Type" @@ -18014,9 +17989,8 @@ msgid "Return" msgstr "Retornar" #: modules/visual_script/visual_script_flow_control.cpp -#, fuzzy msgid "Return Enabled" -msgstr "Executável" +msgstr "Retorno Ativado" #: modules/visual_script/visual_script_flow_control.cpp msgid "Return Type" @@ -18045,7 +18019,7 @@ msgstr "Iterador" #: modules/visual_script/visual_script_flow_control.cpp msgid "for (elem) in (input):" -msgstr "para (elem) em (input):" +msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "Input type not iterable:" @@ -18097,9 +18071,8 @@ msgid "On %s" msgstr "Em %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "On Self" -msgstr "Self" +msgstr "Em sà mesmo" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp @@ -18142,23 +18115,20 @@ msgid "Divide %s" msgstr "Dividir %s" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Mod %s" -msgstr "Mod %s" +msgstr "[code]Mod %s[/code]" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "ShiftLeft %s" -msgstr "ShiftLeft %s" +msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp msgid "ShiftRight %s" msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "BitAnd %s" -msgstr "BitAnd %s" +msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp msgid "BitOr %s" @@ -18169,12 +18139,10 @@ msgid "BitXor %s" msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Set Mode" -msgstr "Modo de Seleção" +msgstr "Modo de Definição" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "Assign Op" msgstr "Atribuir Op" @@ -18282,9 +18250,8 @@ msgid "Get Self" msgstr "Obter Sà Mesmo" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "CustomNode" -msgstr "CustomNode" +msgstr "" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -18301,9 +18268,8 @@ msgstr "" "string (erro)." #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "SubCall" -msgstr "SubCall" +msgstr "" #: modules/visual_script/visual_script_nodes.cpp scene/gui/graph_node.cpp msgid "Title" @@ -18335,11 +18301,11 @@ msgstr "Buscar VisualScript" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Yield" -msgstr "Yield" +msgstr "" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Wait" -msgstr "Esperar" +msgstr "" #: modules/visual_script/visual_script_yield_nodes.cpp msgid "Next Frame" @@ -18358,33 +18324,28 @@ msgid "Wait Time" msgstr "Tempo de Espera" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitSignal" -msgstr "WaitSignal" +msgstr "" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitNodeSignal" -msgstr "WaitNodeSignal" +msgstr "" #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "WaitInstanceSignal" -msgstr "WaitInstanceSignal" +msgstr "" #: modules/webrtc/webrtc_data_channel.cpp -#, fuzzy msgid "Write Mode" -msgstr "Modo Prioridade" +msgstr "Modo de Escrita" #: modules/webrtc/webrtc_data_channel.h msgid "WebRTC" -msgstr "WebRTC" +msgstr "" #: modules/webrtc/webrtc_data_channel.h -#, fuzzy msgid "Max Channel In Buffer (KB)" -msgstr "Tamanho do buffer do Ãndice do polÃgono da tela (KB)" +msgstr "Canal Máximo no Buffer (KB)" #: modules/websocket/websocket_client.cpp msgid "Verify SSL" @@ -18439,9 +18400,8 @@ msgid "Handshake Timeout" msgstr "Tempo de Handshake Esgotado" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Session Mode" -msgstr "Modo Região" +msgstr "Modo Sessão" #: modules/webxr/webxr_interface.cpp msgid "Required Features" @@ -18452,12 +18412,10 @@ msgid "Optional Features" msgstr "Funcionalidades Opcionais" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Requested Reference Space Types" msgstr "Tipos de Espaço de Referência Solicitados" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Reference Space Type" msgstr "Tipo de Espaço de Referência" @@ -18466,23 +18424,20 @@ msgid "Visibility State" msgstr "Estado de Visibilidade" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "Bounds Geometry" -msgstr "Tentar Novamente" +msgstr "Limita a Geometria" #: modules/webxr/webxr_interface.cpp -#, fuzzy msgid "XR Standard Mapping" -msgstr "Encaixe inteligente" +msgstr "Mapeamento XR Padrão" #: platform/android/export/export.cpp msgid "Android SDK Path" msgstr "Caminho para SDK Android" #: platform/android/export/export.cpp -#, fuzzy msgid "Debug Keystore" -msgstr "Depurador" +msgstr "Depurar Keystore" #: platform/android/export/export.cpp msgid "Debug Keystore User" @@ -18493,7 +18448,6 @@ msgid "Debug Keystore Pass" msgstr "" #: platform/android/export/export.cpp -#, fuzzy msgid "Force System User" msgstr "Forçar Usuário do Sistema" @@ -18545,14 +18499,12 @@ msgid "The package must have at least one '.' separator." msgstr "O pacote deve ter pelo menos um separador '.'." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Custom Build" -msgstr "Usar Diretório de Usuário Personalizado" +msgstr "Build Personalizada" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Use Custom Build" -msgstr "Usar Diretório de Usuário Personalizado" +msgstr "Usar Build Personalizada" #: platform/android/export/export_plugin.cpp msgid "Export Format" @@ -18571,29 +18523,24 @@ msgid "Architectures" msgstr "Arquiteturas" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Keystore" -msgstr "Depurador" +msgstr "Keystore" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Debug User" -msgstr "Depurador" +msgstr "Depurar Usuário" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp -#, fuzzy msgid "Debug Password" -msgstr "Senha" +msgstr "Depurar Senha" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Release User" -msgstr "Lançamento" +msgstr "Liberar Usuário" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Release Password" -msgstr "Senha" +msgstr "Liberar Senha" #: platform/android/export/export_plugin.cpp msgid "One Click Deploy" @@ -18636,9 +18583,8 @@ msgid "Graphics" msgstr "Gráficos" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "OpenGL Debug" -msgstr "Abrir" +msgstr "Depurar OpenGL" #: platform/android/export/export_plugin.cpp msgid "XR Features" @@ -18651,7 +18597,7 @@ msgstr "Modo XR" #: platform/android/export/export_plugin.cpp #, fuzzy msgid "Hand Tracking" -msgstr "Empacotando" +msgstr "Detecção de Mãos" #: platform/android/export/export_plugin.cpp msgid "Hand Tracking Frequency" @@ -18666,24 +18612,20 @@ msgid "Immersive Mode" msgstr "Modo Imersivo" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Small" -msgstr "Suporte" +msgstr "Suporte Pequeno" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Normal" -msgstr "Suporte" +msgstr "Suporte Normal" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Large" -msgstr "Suporte" +msgstr "Suporte Grande" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "Support Xlarge" -msgstr "Suporte" +msgstr "Suporte Extra-grande" #: platform/android/export/export_plugin.cpp msgid "User Data Backup" @@ -18702,9 +18644,8 @@ msgid "Extra Args" msgstr "Argumentos Extra" #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "APK Expansion" -msgstr "Expressão" +msgstr "Expansão APK" #: platform/android/export/export_plugin.cpp msgid "Salt" @@ -18796,7 +18737,7 @@ msgstr "Um caminho Android SDK é necessário nas Configurações do Editor." #: platform/android/export/export_plugin.cpp msgid "Invalid Android SDK path in Editor Settings." -msgstr "Caminho do Android SDK está inválido nas Configurações do Editor." +msgstr "Caminho do Android SDK inválido nas Configurações do Editor." #: platform/android/export/export_plugin.cpp msgid "Missing 'platform-tools' directory!" @@ -18815,7 +18756,7 @@ msgstr "" #: platform/android/export/export_plugin.cpp msgid "Missing 'build-tools' directory!" -msgstr "Diretório 'build-tools' está faltando!" +msgstr "Diretório 'build-tools' ausente!" #: platform/android/export/export_plugin.cpp msgid "Unable to find Android SDK build-tools' apksigner command." @@ -18852,18 +18793,16 @@ msgstr "" "utilizar plugins." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "\"Hand Tracking\" is only valid when \"XR Mode\" is \"Oculus Mobile VrApi\" " "or \"OpenXR\"." msgstr "" -"\"Hand Tracking\" só é válido quando o \"Xr Mode\" é \"Oculus Mobile VR\"." +"\"Hand Tracking\" só é válido quando o \"XR Mode\" é \"Oculus Mobile VrApi\" " +"ou \"OpenXR\"." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "\"Passthrough\" is only valid when \"XR Mode\" is \"OpenXR\"." -msgstr "" -"\"Passthrough\" só é válido quando o \"Xr Mode\" é \"Oculus Mobile VR\"." +msgstr "\"Passthrough\" só é válido quando o \"XR Mode\" é \"OpenXR\"." #: platform/android/export/export_plugin.cpp msgid "\"Export AAB\" is only valid when \"Use Custom Build\" is enabled." @@ -18872,12 +18811,11 @@ msgstr "" "habilitado." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "\"Min SDK\" can only be overridden when \"Use Custom Build\" is enabled." msgstr "" -"\"Exportar AAB\" só é válido quando \"Usar Compilação Customizada\" está " -"habilitado." +"\"Min SDK\" só pode ser substituÃdo quando \"Usar Compilação Customizada\" " +"está habilitado." #: platform/android/export/export_plugin.cpp msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." @@ -18894,12 +18832,11 @@ msgstr "" "biblioteca Godot." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "" "\"Target SDK\" can only be overridden when \"Use Custom Build\" is enabled." msgstr "" -"\"Exportar AAB\" só é válido quando \"Usar Compilação Customizada\" está " -"habilitado." +"\"Target SDK\" só pode ser substituÃdo quando \"Usar Compilação " +"Customizada\" está habilitado." #: platform/android/export/export_plugin.cpp msgid "" @@ -18917,11 +18854,10 @@ msgstr "" "não foi testado e pode ser instável." #: platform/android/export/export_plugin.cpp -#, fuzzy msgid "\"Target SDK\" version must be greater or equal to \"Min SDK\" version." msgstr "" -"Versão do \"Target Sdk\" precisa ser igual ou maior que a versão do \"Min " -"Sdk\"." +"Versão do \"Target SDK\" precisa ser igual ou maior que a versão do \"Min " +"SDK\"." #: platform/android/export/export_plugin.cpp platform/osx/export/export.cpp #: platform/windows/export/export.cpp @@ -18971,11 +18907,12 @@ msgstr "Exportando para Android" #: platform/android/export/export_plugin.cpp msgid "Invalid filename! Android App Bundle requires the *.aab extension." -msgstr "Nome de arquivo inválido! Android App Bundle requer a extensão *.aab." +msgstr "" +"Nome de arquivo inválido! O Android App Bundle requer a extensão *.aab." #: platform/android/export/export_plugin.cpp msgid "APK Expansion not compatible with Android App Bundle." -msgstr "A expansão APK não é compatÃvel com o Android App Bundle." +msgstr "Expansão do APK não é compatÃvel com Android App Bundle." #: platform/android/export/export_plugin.cpp msgid "Invalid filename! Android APK requires the *.apk extension." @@ -19091,7 +19028,6 @@ msgid "The character '%s' is not allowed in Identifier." msgstr "O caractere '%s' não é permitido no identificador." #: platform/iphone/export/export.cpp -#, fuzzy msgid "Landscape Launch Screens" msgstr "Telas de Inicialização de Paisagem" @@ -19101,15 +19037,15 @@ msgstr "IPhone 2436 X 1125" #: platform/iphone/export/export.cpp msgid "iPhone 2208 X 1242" -msgstr "iPhone 2208 X 1242" +msgstr "" #: platform/iphone/export/export.cpp msgid "iPad 1024 X 768" -msgstr "iPad 1024 X 768" +msgstr "" #: platform/iphone/export/export.cpp msgid "iPad 2048 X 1536" -msgstr "iPad 2048 X 1536" +msgstr "" #: platform/iphone/export/export.cpp msgid "Portrait Launch Screens" @@ -19117,31 +19053,31 @@ msgstr "" #: platform/iphone/export/export.cpp msgid "iPhone 640 X 960" -msgstr "iPhone 640 X 960" +msgstr "" #: platform/iphone/export/export.cpp msgid "iPhone 640 X 1136" -msgstr "iPhone 640 X 1136" +msgstr "" #: platform/iphone/export/export.cpp msgid "iPhone 750 X 1334" -msgstr "iPhone 750 X 1334" +msgstr "" #: platform/iphone/export/export.cpp msgid "iPhone 1125 X 2436" -msgstr "iPhone 1125 X 2436" +msgstr "" #: platform/iphone/export/export.cpp msgid "iPad 768 X 1024" -msgstr "iPad 768 X 1024" +msgstr "" #: platform/iphone/export/export.cpp msgid "iPad 1536 X 2048" -msgstr "iPad 1536 X 2048" +msgstr "" #: platform/iphone/export/export.cpp msgid "iPhone 1242 X 2208" -msgstr "iPhone 1242 X 2208" +msgstr "" #: platform/iphone/export/export.cpp msgid "App Store Team ID" @@ -19240,23 +19176,23 @@ msgstr "Descrições da Propriedade" #: platform/iphone/export/export.cpp msgid "iPhone 120 X 120" -msgstr "iPhone 120 X 120" +msgstr "" #: platform/iphone/export/export.cpp msgid "iPhone 180 X 180" -msgstr "iPhone 180 X 180" +msgstr "" #: platform/iphone/export/export.cpp msgid "iPad 76 X 76" -msgstr "iPad 76 X 76" +msgstr "" #: platform/iphone/export/export.cpp msgid "iPad 152 X 152" -msgstr "iPad 152 X 152" +msgstr "" #: platform/iphone/export/export.cpp msgid "iPad 167 X 167" -msgstr "iPad 167 X 167" +msgstr "" #: platform/iphone/export/export.cpp msgid "App Store 1024 X 1024" @@ -19367,9 +19303,8 @@ msgid "Export Type" msgstr "Tipo de Exportação" #: platform/javascript/export/export.cpp -#, fuzzy msgid "VRAM Texture Compression" -msgstr "Expressão" +msgstr "Compressão de Texturas na VRAM" #: platform/javascript/export/export.cpp msgid "For Desktop" @@ -19410,7 +19345,7 @@ msgstr "Teclado Virtual Experimental" #: platform/javascript/export/export.cpp msgid "Progressive Web App" -msgstr "Progressive Web App" +msgstr "Aplicativo Web Progressivo" #: platform/javascript/export/export.cpp msgid "Offline Page" @@ -19521,9 +19456,8 @@ msgid "Invalid executable file." msgstr "Arquivo executável inválido." #: platform/osx/export/codesign.cpp -#, fuzzy msgid "Can't resize signature load command." -msgstr "Não é possÃvel redimensionar o comando de carregamento da assinatura." +msgstr "Não é possÃvel redimensionar o comando de carregamento de assinatura." #: platform/osx/export/codesign.cpp msgid "Failed to create fat binary." @@ -20203,7 +20137,6 @@ msgid "Failed to rename temporary file \"%s\"." msgstr "Falha ao renomear arquivo temporário \"%s\"." #: platform/windows/export/export.cpp -#, fuzzy msgid "Identity Type" msgstr "Tipo de Identidade" @@ -20337,9 +20270,8 @@ msgid "Executable file header corrupted." msgstr "" #: platform/windows/export/export.cpp platform/x11/export/export.cpp -#, fuzzy msgid "Executable \"pck\" section not found." -msgstr "Executável seção \"pck\" não encontrado." +msgstr "Seção executável \"pck\" não encontrada." #: platform/windows/export/export.cpp msgid "Windows" @@ -20347,7 +20279,7 @@ msgstr "Windows" #: platform/windows/export/export.cpp msgid "Rcedit" -msgstr "Rcedit" +msgstr "" #: platform/windows/export/export.cpp msgid "Osslsigncode" @@ -20355,7 +20287,7 @@ msgstr "" #: platform/windows/export/export.cpp msgid "Wine" -msgstr "Wine" +msgstr "Vinho" #: platform/x11/export/export.cpp msgid "32-bit executables cannot have embedded data >= 4 GiB." @@ -20636,9 +20568,8 @@ msgid "Visible" msgstr "VisÃvel" #: scene/2d/canvas_item.cpp -#, fuzzy msgid "Self Modulate" -msgstr "Popular" +msgstr "Auto Modular" #: scene/2d/canvas_item.cpp msgid "Show Behind Parent" @@ -21088,9 +21019,8 @@ msgstr "" "Uma textura com a forma da luz deve ser fornecida na propriedade \"textura\"." #: scene/2d/light_2d.cpp scene/3d/light.cpp scene/gui/reference_rect.cpp -#, fuzzy msgid "Editor Only" -msgstr "Editor" +msgstr "Somente Editor" #: scene/2d/light_2d.cpp msgid "Texture Scale" @@ -21579,9 +21509,8 @@ msgid "Sync To Physics" msgstr "Sincronizar com a FÃsica" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp -#, fuzzy msgid "Moving Platform" -msgstr "Movendo saÃda" +msgstr "Plataforma Móvel" #: scene/2d/physics_body_2d.cpp scene/3d/physics_body.cpp msgid "Apply Velocity On Leave" @@ -21980,7 +21909,7 @@ msgstr "Gerando captura" #: scene/3d/baked_lightmap.cpp msgid "Saving lightmaps" -msgstr "Salvando mapas de luz" +msgstr "Salvando lightmaps" #: scene/3d/baked_lightmap.cpp msgid "Done" @@ -22416,9 +22345,8 @@ msgid "Bias Split Scale" msgstr "Usar Encaixe Escalar" #: scene/3d/light.cpp -#, fuzzy msgid "Depth Range" -msgstr "Profundidade" +msgstr "Alcance de Profundidade" #: scene/3d/light.cpp msgid "Omni" @@ -22604,19 +22532,16 @@ msgid "Angular Z" msgstr "Z Angular" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Motion X" -msgstr "Ação" +msgstr "Movimento X" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Motion Y" -msgstr "Ação" +msgstr "Movimento Y" #: scene/3d/physics_body.cpp -#, fuzzy msgid "Motion Z" -msgstr "Ação" +msgstr "Movimento Z" #: scene/3d/physics_body.cpp #, fuzzy @@ -23187,9 +23112,8 @@ msgid "Overlap Warning Threshold" msgstr "" #: scene/3d/room_manager.cpp -#, fuzzy msgid "Preview Camera" -msgstr "Visualização" +msgstr "Visualizar Câmera" #: scene/3d/room_manager.cpp msgid "Portal Depth Limit" @@ -23441,6 +23365,16 @@ msgstr "Erro" msgid "AABB" msgstr "AABB" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Ordenar" + +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Use AABB Center" +msgstr "Utilizar Ambient" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "Geometria" @@ -23895,7 +23829,7 @@ msgid "" "children placement behavior.\n" "If you don't intend to add a script, use a plain Control node instead." msgstr "" -"O contêiner por si só não possui propósito algum, a menos que um script " +"O contêiner por si só não tem nenhum propósito, a menos que um script " "configure seu comportamento de posicionamento dos filhos.\n" "Se você não pretende adicionar um script, use um nó de Controle simples." @@ -24071,7 +24005,7 @@ msgstr "Mini-Mapa" #: scene/gui/graph_edit.cpp msgid "Enable grid minimap." -msgstr "Ativar minimap em grade." +msgstr "Ativar o minimapa de grade." #: scene/gui/graph_node.cpp #, fuzzy @@ -24407,7 +24341,7 @@ msgstr "Caractere" #: scene/gui/rich_text_label.cpp msgid "BBCode" -msgstr "BBCode" +msgstr "" #: scene/gui/rich_text_label.cpp msgid "Meta Underlined" @@ -25345,9 +25279,8 @@ msgid "Minimum Spaces" msgstr "Cena Principal" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "BG" -msgstr "Plano de Fundo" +msgstr "" #: scene/resources/default_theme/default_theme.cpp msgid "FG" @@ -25726,9 +25659,8 @@ msgid "Tab FG" msgstr "Guia 1" #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Tab BG" -msgstr "Plano de Fundo da Aba" +msgstr "BG da Aba" #: scene/resources/default_theme/default_theme.cpp #, fuzzy @@ -26184,7 +26116,7 @@ msgstr "Depuração do Canal UV" #: scene/resources/environment.cpp msgid "Blur" -msgstr "Blur" +msgstr "" #: scene/resources/environment.cpp msgid "Edge Sharpness" @@ -26869,7 +26801,7 @@ msgstr "Tamanho da Radiância" #: scene/resources/sky.cpp msgid "Panorama" -msgstr "Panorama" +msgstr "" #: scene/resources/sky.cpp #, fuzzy @@ -26937,7 +26869,7 @@ msgstr "" #: scene/resources/style_box.cpp msgid "Anti Aliasing" -msgstr "Anti Aliasing" +msgstr "Anti Serrilhamento" #: scene/resources/style_box.cpp msgid "Grow Begin" @@ -27162,7 +27094,7 @@ msgstr "Margem de Ligação da Borda" #: scene/resources/world_2d.cpp msgid "Canvas" -msgstr "Canvas" +msgstr "Tela" #: servers/arvr/arvr_interface.cpp msgid "Is Primary" @@ -27244,7 +27176,7 @@ msgstr "NÃvel dB" #: servers/audio/effects/audio_effect_delay.cpp #: servers/audio/effects/audio_effect_panner.cpp msgid "Pan" -msgstr "Panoramizar" +msgstr "" #: servers/audio/effects/audio_effect_compressor.cpp #: servers/audio/effects/audio_effect_filter.cpp @@ -27298,7 +27230,7 @@ msgstr "" #: servers/audio/effects/audio_effect_distortion.cpp msgid "Drive" -msgstr "Drive" +msgstr "" #: servers/audio/effects/audio_effect_distortion.cpp #, fuzzy @@ -27349,7 +27281,7 @@ msgstr "Pré Atraso" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Msec" -msgstr "Msec" +msgstr "" #: servers/audio/effects/audio_effect_reverb.cpp msgid "Room Size" @@ -27607,9 +27539,8 @@ msgid "Lossless Compression" msgstr "Compressão Sem Perda" #: servers/visual_server.cpp -#, fuzzy msgid "Force PNG" -msgstr "Forçar Push" +msgstr "Forçar PNG" #: servers/visual_server.cpp msgid "WebP Compression Level" @@ -27731,9 +27662,8 @@ msgid "Ninepatch Mode" msgstr "Modo de Interpolação" #: servers/visual_server.cpp -#, fuzzy msgid "OpenGL" -msgstr "Abrir" +msgstr "abrir" #: servers/visual_server.cpp msgid "Batching Send Null" @@ -27795,7 +27725,7 @@ msgstr "" #: servers/visual_server.cpp msgid "Flash Batching" -msgstr "" +msgstr "Loteamento de Flashes" #: servers/visual_server.cpp #, fuzzy @@ -27812,7 +27742,7 @@ msgstr "Compatibilidade" #: servers/visual_server.cpp msgid "Disable Half Float" -msgstr "" +msgstr "Desativar Meia Float" #: servers/visual_server.cpp #, fuzzy @@ -27839,7 +27769,7 @@ msgstr "Usar Encaixe Escalar" #: servers/visual_server.cpp msgid "PVS Logging" -msgstr "" +msgstr "Registro PVS" #: servers/visual_server.cpp #, fuzzy @@ -27866,9 +27796,8 @@ msgid "Max Active Spheres" msgstr "Máximo de Esferas Ativas" #: servers/visual_server.cpp -#, fuzzy msgid "Max Active Polygons" -msgstr "Mover PolÃgono" +msgstr "Máximo de PolÃgonos Ativos" #: servers/visual_server.cpp #, fuzzy @@ -27880,8 +27809,9 @@ msgid "Max Simultaneous Compiles" msgstr "Compilações Simultâneas Máximas" #: servers/visual_server.cpp +#, fuzzy msgid "Log Active Async Compiles Count" -msgstr "" +msgstr "Registro do Número de Compilações AssÃncronas Ativas" #: servers/visual_server.cpp msgid "Shader Cache Size (MB)" diff --git a/editor/translations/ro.po b/editor/translations/ro.po index e01815b513..906d6aee71 100644 --- a/editor/translations/ro.po +++ b/editor/translations/ro.po @@ -19,13 +19,14 @@ # N3mEee <n3mebusiness@gmail.com>, 2021. # Psynt <nichita@cadvegra.com>, 2022. # Ilie Adrian Avramescu <himark1977@protonmail.com>, 2022. +# Andres Ene <grassiscomplex420@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-27 21:37+0000\n" -"Last-Translator: Ilie Adrian Avramescu <himark1977@protonmail.com>\n" +"PO-Revision-Date: 2022-11-22 20:37+0000\n" +"Last-Translator: Andres Ene <grassiscomplex420@gmail.com>\n" "Language-Team: Romanian <https://hosted.weblate.org/projects/godot-engine/" "godot/ro/>\n" "Language: ro\n" @@ -34,7 +35,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n==1 ? 0 : (n==0 || (n%100 > 0 && n%100 < " "20)) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -200,9 +201,8 @@ msgid "Limits" msgstr "Limite" #: core/command_queue_mt.cpp -#, fuzzy msgid "Command Queue" -msgstr "Trage: Rotire" +msgstr "Lista de comenzi" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" @@ -313,9 +313,8 @@ msgid "Blocking Handshake" msgstr "Blocare Handshake" #: core/io/udp_server.cpp -#, fuzzy msgid "Max Pending Connections" -msgstr "Modifică Conexiunea:" +msgstr "Număr maxim de conexiuni în aÈ™teptare" #: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp @@ -544,9 +543,8 @@ msgid "Instrument" msgstr "" #: core/os/input_event.cpp -#, fuzzy msgid "Controller Number" -msgstr "Linia Numărul:" +msgstr "Numărul controlerului" #: core/os/input_event.cpp msgid "Controller Value" @@ -680,9 +678,8 @@ msgid "Main Run Args" msgstr "Argumente principale ale rulării" #: core/project_settings.cpp -#, fuzzy msgid "Scene Naming" -msgstr "Calea Scenei:" +msgstr "Denumirea scenei" #: core/project_settings.cpp msgid "Search In File Extensions" @@ -818,9 +815,8 @@ msgstr "Calitate" #: core/project_settings.cpp scene/gui/file_dialog.cpp #: scene/main/scene_tree.cpp scene/resources/navigation_mesh.cpp #: servers/visual_server.cpp -#, fuzzy msgid "Filters" -msgstr "Filtre:" +msgstr "Filtre" #: core/project_settings.cpp scene/main/viewport.cpp msgid "Sharpen Intensity" @@ -840,9 +836,8 @@ msgstr "Depanare" #: core/project_settings.cpp main/main.cpp modules/gdscript/gdscript.cpp #: modules/visual_script/visual_script.cpp scene/resources/dynamic_font.cpp -#, fuzzy msgid "Settings" -msgstr "Setări:" +msgstr "Setări" #: core/project_settings.cpp editor/script_editor_debugger.cpp main/main.cpp #: modules/mono/mono_gd/gd_mono.cpp @@ -1074,9 +1069,8 @@ msgstr "" #: scene/animation/animation_blend_tree.cpp scene/gui/control.cpp #: scene/main/canvas_layer.cpp scene/resources/environment.cpp #: scene/resources/material.cpp scene/resources/particles_material.cpp -#, fuzzy msgid "Scale" -msgstr "Dimensiune:" +msgstr "Scară" #: drivers/gles3/rasterizer_scene_gles3.cpp #, fuzzy @@ -1184,16 +1178,14 @@ msgstr "Timp" #: editor/animation_track_editor.cpp editor/import/resource_importer_scene.cpp #: platform/osx/export/export.cpp -#, fuzzy msgid "Location" -msgstr "Pas RotaÈ›ie:" +msgstr "LocaÈ›ie" #: editor/animation_track_editor.cpp modules/gltf/gltf_node.cpp #: scene/2d/polygon_2d.cpp scene/2d/remote_transform_2d.cpp #: scene/3d/remote_transform.cpp scene/3d/spatial.cpp scene/gui/control.cpp -#, fuzzy msgid "Rotation" -msgstr "Pas RotaÈ›ie:" +msgstr "RotaÈ›ie" #: editor/animation_track_editor.cpp editor/script_editor_debugger.cpp #: modules/visual_script/visual_script_nodes.cpp scene/gui/range.cpp @@ -1235,14 +1227,12 @@ msgid "Stream" msgstr "" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Start Offset" -msgstr "Compensare Grilă:" +msgstr "Decalaj de pornire" #: editor/animation_track_editor.cpp -#, fuzzy msgid "End Offset" -msgstr "Compensare Grilă:" +msgstr "Decalaj de sfarsire" #: editor/animation_track_editor.cpp editor/editor_settings.cpp #: editor/import/resource_importer_scene.cpp @@ -1366,14 +1356,12 @@ msgid "Remove this track." msgstr "ȘtergeÈ›i pista selectată." #: editor/animation_track_editor.cpp -#, fuzzy msgid "Time (s):" -msgstr "Timp (s): " +msgstr "Timp (s):" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Position:" -msgstr "PoziÈ›ie" +msgstr "PoziÈ›ie:" #: editor/animation_track_editor.cpp #, fuzzy @@ -1414,9 +1402,8 @@ msgid "Out-Handle:" msgstr "Setează Mâner" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Stream:" -msgstr "ÃŽnchidere curbă" +msgstr "Curent:" #: editor/animation_track_editor.cpp #, fuzzy @@ -1646,9 +1633,8 @@ msgid "Add Method Track Key" msgstr "InseraÈ›i Pistă È™i Cheie" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Method not found in object:" -msgstr "Metoda nu a fost găsită în obiect: " +msgstr "Metoda nu a fost găsită în obiect:" #: editor/animation_track_editor.cpp msgid "Anim Move Keys" @@ -2621,9 +2607,8 @@ msgid "There is no '%s' file." msgstr "Nu este niciun '%s' în filă." #: editor/editor_audio_buses.cpp -#, fuzzy msgid "Layout:" -msgstr "Schemă" +msgstr "Dispunere:" #: editor/editor_audio_buses.cpp msgid "Invalid file, not an audio bus layout." @@ -2876,9 +2861,8 @@ msgid "Failed to export project files." msgstr "Nu s-a putut porni subprocesul!" #: editor/editor_export.cpp -#, fuzzy msgid "Can't open file to read from path \"%s\"." -msgstr "Nu pot deschide fiÅŸierul pentru scris:" +msgstr "Nu se poate deschide fiÅŸierul pentru a citi din \"%s\":" #: editor/editor_export.cpp #, fuzzy @@ -3019,9 +3003,8 @@ msgid "The given export path doesn't exist." msgstr "FiÈ™ierul nu există." #: editor/editor_export.cpp platform/javascript/export/export.cpp -#, fuzzy msgid "Template file not found: \"%s\"." -msgstr "FiÈ™ierul È™ablon nu a fost găsit:" +msgstr "FiÈ™ierul È™ablonului nu a fost găsit: \"%s\"." #: editor/editor_export.cpp #, fuzzy @@ -3325,9 +3308,8 @@ msgid "Access" msgstr "Succes!" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp -#, fuzzy msgid "Display Mode" -msgstr "Mod redare:" +msgstr "Modul de afiÈ™are" #: editor/editor_file_dialog.cpp #: editor/import/resource_importer_layered_texture.cpp @@ -3347,17 +3329,15 @@ msgstr "Mod ÃŽn Jur" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp #, fuzzy msgid "Current Dir" -msgstr "Curent:" +msgstr "Dir curent" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current File" -msgstr "Profil Curent:" +msgstr "FiÈ™ier curent" #: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp -#, fuzzy msgid "Current Path" -msgstr "Curent:" +msgstr "Calea curentă" #: editor/editor_file_dialog.cpp editor/editor_settings.cpp #: scene/gui/file_dialog.cpp @@ -4930,9 +4910,8 @@ msgid "Install from file" msgstr "Instalează Din FiÈ™ier" #: editor/editor_node.cpp -#, fuzzy msgid "Select android sources file" -msgstr "Selectează un Mesh Sursă:" +msgstr "Selectează fisierele sursa android" #: editor/editor_node.cpp msgid "" @@ -5080,9 +5059,8 @@ msgstr "Actualizare" #: editor/editor_plugin_settings.cpp platform/android/export/export_plugin.cpp #: platform/iphone/export/export.cpp platform/osx/export/export.cpp #: platform/uwp/export/export.cpp -#, fuzzy msgid "Version" -msgstr "Versiune:" +msgstr "Versiune" #: editor/editor_plugin_settings.cpp #, fuzzy @@ -5280,9 +5258,8 @@ msgstr "" #: modules/visual_script/visual_script_func_nodes.cpp #: modules/visual_script/visual_script_nodes.cpp #: modules/visual_script/visual_script_yield_nodes.cpp -#, fuzzy msgid "Base Type" -msgstr "Modificare tip bază:" +msgstr "Tip de bază" #: editor/editor_resource_picker.cpp #, fuzzy @@ -5379,9 +5356,8 @@ msgid "Font Hinting" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Main Font" -msgstr "Caracteristici active:" +msgstr "Font principal" #: editor/editor_settings.cpp msgid "Main Font Bold" @@ -5642,9 +5618,8 @@ msgid "Appearance" msgstr "" #: editor/editor_settings.cpp scene/gui/text_edit.cpp -#, fuzzy msgid "Show Line Numbers" -msgstr "Linia Numărul:" +msgstr "Afiseaza numerele liniei" #: editor/editor_settings.cpp #, fuzzy @@ -5694,9 +5669,8 @@ msgid "Show Members Overview" msgstr "" #: editor/editor_settings.cpp editor/plugins/script_editor_plugin.cpp -#, fuzzy msgid "Files" -msgstr "FiÈ™ier:" +msgstr "FiÈ™iere" #: editor/editor_settings.cpp msgid "Trim Trailing Whitespace On Save" @@ -5867,14 +5841,12 @@ msgid "Shape" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Primary Grid Steps" -msgstr "Pas Grilă:" +msgstr "PaÈ™i de grilă primară" #: editor/editor_settings.cpp -#, fuzzy msgid "Grid Size" -msgstr "Pas Grilă:" +msgstr "Dimensiunea grilei" #: editor/editor_settings.cpp msgid "Grid Division Level Max" @@ -6045,9 +6017,8 @@ msgid "Bone Color 2" msgstr "RedenumiÅ£i Autoload" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Selected Color" -msgstr "Configură Profilul Selectat:" +msgstr "Culoarea osului selectat" #: editor/editor_settings.cpp msgid "Bone IK Color" @@ -6058,9 +6029,8 @@ msgid "Bone Outline Color" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Bone Outline Size" -msgstr "Dimensiunea Conturului:" +msgstr "Dimensiunea conturului osului" #: editor/editor_settings.cpp msgid "Viewport Border Color" @@ -6198,9 +6168,8 @@ msgstr "" #. TRANSLATORS: Project Manager here refers to the tool used to create/manage Godot projects. #: editor/editor_settings.cpp -#, fuzzy msgid "Sorting Order" -msgstr "Redenumind directorul:" +msgstr "Ordinea de sortare" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Symbol Color" @@ -6215,9 +6184,8 @@ msgid "Control Flow Keyword Color" msgstr "" #: editor/editor_settings.cpp -#, fuzzy msgid "Base Type Color" -msgstr "Modificare tip bază:" +msgstr "Culoare tip de bază" #: editor/editor_settings.cpp msgid "Engine Type Color" @@ -6270,14 +6238,12 @@ msgid "Text Color" msgstr "" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Line Number Color" -msgstr "Linia Numărul:" +msgstr "Culoare numărul liniei" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Safe Line Number Color" -msgstr "Linia Numărul:" +msgstr "Culoarea numărului liniei sigură" #: editor/editor_settings.cpp scene/resources/default_theme/default_theme.cpp msgid "Caret Color" @@ -6429,17 +6395,15 @@ msgstr "Se conectează la Oglinda..." #: editor/export_template_manager.cpp #, fuzzy msgid "Can't resolve the requested address." -msgstr "Nu se poate rezolva numele gazdei:" +msgstr "Nu se poate rezolva adresa solicitată." #: editor/export_template_manager.cpp -#, fuzzy msgid "Can't connect to the mirror." -msgstr "Nu se poate conecta la gazda:" +msgstr "Nu se poate conecta la oglindă." #: editor/export_template_manager.cpp -#, fuzzy msgid "No response from the mirror." -msgstr "Nciun răspuns de la gazda:" +msgstr "Niciun răspuns de la oglinda." #: editor/export_template_manager.cpp #: editor/plugins/asset_library_editor_plugin.cpp @@ -6453,9 +6417,8 @@ msgid "Request ended up in a redirect loop." msgstr "Cerere eÈ™uată, prea multe redirecÈ›ionări" #: editor/export_template_manager.cpp -#, fuzzy msgid "Request failed:" -msgstr "Cerere EÈ™uată." +msgstr "Cerere EÈ™uată:" #: editor/export_template_manager.cpp msgid "Download complete; extracting templates..." @@ -6604,9 +6567,8 @@ msgid "Uninstall templates for the current version." msgstr "" #: editor/export_template_manager.cpp -#, fuzzy msgid "Download from:" -msgstr "Eroare Descărcare" +msgstr "DescărcaÈ›i din:" #: editor/export_template_manager.cpp #, fuzzy @@ -7098,9 +7060,8 @@ msgstr "" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp scene/2d/light_2d.cpp #: scene/gui/control.cpp -#, fuzzy msgid "Filter" -msgstr "Filtre:" +msgstr "Filtru:" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp @@ -7139,9 +7100,8 @@ msgid "Vertical" msgstr "Mută ghidul vertical" #: editor/import/resource_importer_obj.cpp -#, fuzzy msgid "Generate Tangents" -msgstr "Număr de Puncte Generate:" +msgstr "Generează tangente" #: editor/import/resource_importer_obj.cpp #, fuzzy @@ -7217,12 +7177,11 @@ msgstr "Tip Membru" #: editor/import/resource_importer_scene.cpp #, fuzzy msgid "Root Name" -msgstr "Nume Nod:" +msgstr "Nume rădăcină" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Root Scale" -msgstr "Dimensiune:" +msgstr "Dimensiune Radacina" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7230,9 +7189,8 @@ msgid "Custom Script" msgstr "Creează Nod" #: editor/import/resource_importer_scene.cpp scene/resources/texture.cpp -#, fuzzy msgid "Storage" -msgstr "FiÅŸierul se Stochează:" +msgstr "Stochare" #: editor/import/resource_importer_scene.cpp msgid "Use Legacy Names" @@ -7318,9 +7276,8 @@ msgid "Enabled" msgstr "ActivaÈ›i" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Linear Error" -msgstr "Eroare Lineară Max:" +msgstr "Eroare liniară maximă" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7328,9 +7285,8 @@ msgid "Max Angular Error" msgstr "Eroare Angulară Max:" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Max Angle" -msgstr "Valoare:" +msgstr "Unghiul maxim" #: editor/import/resource_importer_scene.cpp #, fuzzy @@ -7338,16 +7294,14 @@ msgid "Remove Unused Tracks" msgstr "Elimină Pista Anim" #: editor/import/resource_importer_scene.cpp -#, fuzzy msgid "Clips" -msgstr "SecvenÈ›e Anim:" +msgstr "Clipuri" #: editor/import/resource_importer_scene.cpp scene/2d/cpu_particles_2d.cpp #: scene/2d/particles_2d.cpp scene/3d/area.cpp scene/3d/cpu_particles.cpp #: scene/3d/particles.cpp scene/resources/environment.cpp -#, fuzzy msgid "Amount" -msgstr "Cantitate:" +msgstr "Cantitate" #: editor/import/resource_importer_scene.cpp #: editor/plugins/mesh_library_editor_plugin.cpp @@ -7455,9 +7409,8 @@ msgid "Invert Color" msgstr "Culori de Emisie" #: editor/import/resource_importer_texture.cpp -#, fuzzy msgid "Normal Map Invert Y" -msgstr "Dimensiune Aleatorie:" +msgstr "Hartă normală inversează Y" #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7479,9 +7432,8 @@ msgid "" msgstr "" #: editor/import/resource_importer_texture_atlas.cpp -#, fuzzy msgid "Atlas File" -msgstr "Dimensiunea Conturului:" +msgstr "FiÈ™ierul Atlasului" #: editor/import/resource_importer_texture_atlas.cpp #, fuzzy @@ -7498,9 +7450,8 @@ msgid "Trim Alpha Border From Region" msgstr "" #: editor/import/resource_importer_wav.cpp scene/2d/physics_body_2d.cpp -#, fuzzy msgid "Force" -msgstr "Mesh Sursă:" +msgstr "Forță" #: editor/import/resource_importer_wav.cpp msgid "8 Bit" @@ -7527,9 +7478,8 @@ msgid "Trim" msgstr "" #: editor/import/resource_importer_wav.cpp -#, fuzzy msgid "Normalize" -msgstr "Dimensiune Aleatorie:" +msgstr "NormalizaÈ›i" #: editor/import/resource_importer_wav.cpp #: scene/resources/audio_stream_sample.cpp @@ -7633,9 +7583,8 @@ msgid "Capitalized" msgstr "Proprietăți" #: editor/inspector_dock.cpp -#, fuzzy msgid "Localized" -msgstr "Dimensiune Aleatorie:" +msgstr "Localizat" #: editor/inspector_dock.cpp msgid "Localization not available for current language." @@ -7982,9 +7931,8 @@ msgid "Blend:" msgstr "Amestec:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp -#, fuzzy msgid "Parameter Changed:" -msgstr "Modificări ale Actualizării" +msgstr "Parametru modificat:" #: editor/plugins/animation_blend_tree_editor_plugin.cpp #: editor/plugins/animation_tree_player_editor_plugin.cpp @@ -8402,9 +8350,8 @@ msgid "Set the end animation. This is useful for sub-transitions." msgstr "" #: editor/plugins/animation_state_machine_editor.cpp -#, fuzzy msgid "Transition:" -msgstr "TranziÈ›ie: " +msgstr "TranziÈ›ie:" #: editor/plugins/animation_state_machine_editor.cpp msgid "Play Mode:" @@ -8673,7 +8620,7 @@ msgstr "Eroare Descărcare" #: editor/plugins/asset_library_editor_plugin.cpp #, fuzzy msgid "Available URLs" -msgstr "Profile Disponibile:" +msgstr "URL-uri disponibile" #: editor/plugins/asset_library_editor_plugin.cpp msgid "Download for this asset is already in progress!" @@ -9803,9 +9750,8 @@ msgstr "" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp -#, fuzzy msgid "Separator" -msgstr "Enumerări:" +msgstr "Separator" #: editor/plugins/item_list_editor_plugin.cpp msgid "Item %d" @@ -10237,9 +10183,8 @@ msgid "Volume" msgstr "Volum" #: editor/plugins/particles_editor_plugin.cpp -#, fuzzy msgid "Emission Source:" -msgstr "Sursă de Emisie: " +msgstr "Sursă de Emisie:" #: editor/plugins/particles_editor_plugin.cpp msgid "A processor material of type 'ParticlesMaterial' is required." @@ -10659,9 +10604,8 @@ msgid "Flip Portals" msgstr "" #: editor/plugins/room_manager_editor_plugin.cpp -#, fuzzy msgid "Room Generate Points" -msgstr "Număr de Puncte Generate:" +msgstr "Cameră Genereaza puncte" #: editor/plugins/room_manager_editor_plugin.cpp #, fuzzy @@ -13303,9 +13247,10 @@ msgstr "OpÈ›iuni Snapping" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Compensare Grilă:" @@ -14712,13 +14657,13 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "" +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Imposibil de deschis '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -18774,9 +18719,8 @@ msgid "Get Self" msgstr "Propriu" #: modules/visual_script/visual_script_nodes.cpp -#, fuzzy msgid "CustomNode" -msgstr "Creează Nod" +msgstr "Nod Custom" #: modules/visual_script/visual_script_nodes.cpp msgid "Custom node has no _step() method, can't process graph." @@ -22635,7 +22579,7 @@ msgstr "" #: scene/3d/camera.cpp scene/3d/light.cpp scene/3d/reflection_probe.cpp msgid "Cull Mask" -msgstr "" +msgstr "Masca Cull" #: scene/3d/camera.cpp #, fuzzy @@ -23987,6 +23931,15 @@ msgstr "Eroare!" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Se importă:" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "Geometria" @@ -24779,7 +24732,7 @@ msgstr "" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Caret" -msgstr "" +msgstr "Caret" #: scene/gui/line_edit.cpp scene/gui/text_edit.cpp msgid "Blink" @@ -26737,7 +26690,7 @@ msgstr "" #: scene/resources/environment.cpp msgid "Blur" -msgstr "" +msgstr "Blur" #: scene/resources/environment.cpp msgid "Edge Sharpness" diff --git a/editor/translations/ru.po b/editor/translations/ru.po index 0432de4da5..d746bb61ad 100644 --- a/editor/translations/ru.po +++ b/editor/translations/ru.po @@ -126,13 +126,14 @@ # Дмитрий <Dimega@inbox.ru>, 2022. # Vladimir Kirillovskiy <vladimir.kirillovskiy@gmail.com>, 2022. # Evgeniy Khramov <thejenjagamertjg@gmail.com>, 2022. +# kirill blaze <kirillblaze2@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-27 21:37+0000\n" -"Last-Translator: Evgeniy Khramov <thejenjagamertjg@gmail.com>\n" +"PO-Revision-Date: 2022-11-25 12:13+0000\n" +"Last-Translator: Vladimir Kirillovskiy <vladimir.kirillovskiy@gmail.com>\n" "Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/" "godot/ru/>\n" "Language: ru\n" @@ -141,7 +142,7 @@ msgstr "" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=3; plural=n%10==1 && n%100!=11 ? 0 : n%10>=2 && " "n%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -1298,9 +1299,8 @@ msgid "Animation" msgstr "ÐнимациÑ" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Easing" -msgstr "Переход Ð’-ИЗ" +msgstr "Облегчение" #: editor/animation_track_editor.cpp msgid "Anim Multi Change Keyframe Time" @@ -1443,12 +1443,10 @@ msgid "Easing:" msgstr "Переход Ð’-ИЗ:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "In-Handle:" msgstr "Обработчик Ввода:" #: editor/animation_track_editor.cpp -#, fuzzy msgid "Out-Handle:" msgstr "Обработчик Вывода:" @@ -11695,9 +11693,8 @@ msgid "New Animation" msgstr "ÐÐ¾Ð²Ð°Ñ Ð°Ð½Ð¸Ð¼Ð°Ñ†Ð¸Ñ" #: editor/plugins/sprite_frames_editor_plugin.cpp -#, fuzzy msgid "Filter animations" -msgstr "Фильтровать анимации" +msgstr "Фильтр анимации" #: editor/plugins/sprite_frames_editor_plugin.cpp msgid "Speed:" @@ -12878,9 +12875,10 @@ msgstr "Параметры привÑзки" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "Смещение" @@ -12911,9 +12909,8 @@ msgid "Texture" msgstr "ТекÑтура" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tex Offset" -msgstr "Смещение байтов" +msgstr "Смещение текÑтуры" #: editor/plugins/tile_set_editor_plugin.cpp modules/csg/csg_shape.cpp #: scene/2d/canvas_item.cpp scene/2d/particles_2d.cpp @@ -12931,44 +12928,36 @@ msgid "Tile Mode" msgstr "Режим плитки" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Autotile Bitmask Mode" msgstr "Режим битовой маÑки" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Subtile Size" msgstr "Размер контура" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Subtile Spacing" msgstr "МежÑтрочный интервал" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Occluder Offset" -msgstr "ОтверÑтие окклюдера" +msgstr "Сдвиг окклюдера" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Navigation Offset" msgstr "ЧувÑтвительноÑть навигации" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Shape Offset" -msgstr "Базовое Ñмещение" +msgstr "Смещение Формы" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Shape Transform" -msgstr "Преобразование" +msgstr "ТранÑÑ„Ð¾Ñ€Ð¼Ð°Ñ†Ð¸Ñ Ñ„Ð¾Ñ€Ð¼Ñ‹" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Selected Collision" -msgstr "ИÑпользовать Ñтолкновение" +msgstr "Выделить Ñтолкновение" #: editor/plugins/tile_set_editor_plugin.cpp #, fuzzy @@ -12991,9 +12980,8 @@ msgid "Selected Occlusion" msgstr "Выделение" #: editor/plugins/tile_set_editor_plugin.cpp -#, fuzzy msgid "Tileset Script" -msgstr "Фильтр Ñценариев" +msgstr "Скрипт набора тайлов" #: editor/plugins/tile_set_editor_plugin.cpp msgid "TileSet" @@ -14305,16 +14293,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Ðеверный путь к проекту (Что-то изменили?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Ðе удалоÑÑŒ загрузить project.godot в пути проекта (ошибка %d). Возможно, он " "отÑутÑтвует или поврежден." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "Ðе удалоÑÑŒ изменить project.godot в папке проекта." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Ðе удаётÑÑ Ð¾Ñ‚ÐºÑ€Ñ‹Ñ‚ÑŒ проект в «%s»." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -19322,11 +19311,11 @@ msgstr "" #: platform/javascript/export/export.cpp msgid "For Mobile" -msgstr "" +msgstr "Ð”Ð»Ñ Ð¼Ð¾Ð±Ð¸Ð»ÑŒÐ½Ñ‹Ñ… уÑтройÑтв" #: platform/javascript/export/export.cpp msgid "HTML" -msgstr "" +msgstr "HTML" #: platform/javascript/export/export.cpp msgid "Export Icon" @@ -23386,6 +23375,16 @@ msgstr "ÐœÐ°ÐºÑ Ð¡Ð¸Ð»Ð°" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Сортировать" + +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Use AABB Center" +msgstr "ИÑпользовать Ambient" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "ГеометриÑ" @@ -25895,9 +25894,8 @@ msgid "Height Curve" msgstr "ÐšÑ€Ð¸Ð²Ð°Ñ Ð²Ñ‹Ñоты" #: scene/resources/environment.cpp -#, fuzzy msgid "Tonemap" -msgstr "ПереназначениÑ" +msgstr "Карта тональноÑти" #: scene/resources/environment.cpp #, fuzzy @@ -26011,7 +26009,7 @@ msgstr "" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp msgid "2" -msgstr "" +msgstr "2" #: scene/resources/environment.cpp #: servers/audio/effects/audio_effect_chorus.cpp diff --git a/editor/translations/si.po b/editor/translations/si.po index 5e99894cf1..d0fcba8cfd 100644 --- a/editor/translations/si.po +++ b/editor/translations/si.po @@ -12562,9 +12562,10 @@ msgstr "à·à·Šâ€à¶»à·’à¶:" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13926,12 +13927,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22683,6 +22683,15 @@ msgstr "à¶šà·à¶©à¶´à¶" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "නිවේà·à¶± මà·à¶¯à·’ලිය" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/sk.po b/editor/translations/sk.po index ebd2256728..43c2fa6b5b 100644 --- a/editor/translations/sk.po +++ b/editor/translations/sk.po @@ -13245,9 +13245,10 @@ msgstr "Možnosti Prichytávania" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Odchýlka Mriežky:" @@ -14658,12 +14659,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -23921,6 +23921,15 @@ msgstr "Chyba!" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Importovanie:" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/sl.po b/editor/translations/sl.po index f0e227266d..864dac1b8d 100644 --- a/editor/translations/sl.po +++ b/editor/translations/sl.po @@ -13421,9 +13421,10 @@ msgstr "Možnosti pripenjanja" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Mrežni Zamik:" @@ -14850,13 +14851,13 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "" +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Ni mogoÄe odpreti '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -24167,6 +24168,15 @@ msgstr "Napaka!" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Uvažanje:" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/sq.po b/editor/translations/sq.po index f8ffd0e88d..1215b7dbcb 100644 --- a/editor/translations/sq.po +++ b/editor/translations/sq.po @@ -13106,9 +13106,10 @@ msgstr "Përshkrimi i Klasës" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14502,12 +14503,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -23576,6 +23576,15 @@ msgstr "Pasqyrë" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Duke Importuar:" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po index f2f6a5bf09..419e33c494 100644 --- a/editor/translations/sr_Cyrl.po +++ b/editor/translations/sr_Cyrl.po @@ -14116,9 +14116,10 @@ msgstr "ПоÑтавке Залепљавања" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "ОфÑет:" @@ -15791,16 +15792,15 @@ msgstr "Ðеважећа путања пројекта(нешто је Ð¸Ð·Ð¼ÐµÑ #: editor/project_manager.cpp #, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "ÐеуÑпешно учитавање project.godot-а у његовој путањи (грешка %d). Могуће да " "нешто недоÑтаје или је корумпирано." #: editor/project_manager.cpp #, fuzzy -msgid "Couldn't edit project.godot in project path." -msgstr "ÐеуÑпешна измена project.godot-а у путањи пројекта." +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Ðе могу отворити '%s'." #: editor/project_manager.cpp #, fuzzy @@ -25808,6 +25808,15 @@ msgstr "Грешка" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Сортирање" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po index 8af5b1daaf..7973756c7e 100644 --- a/editor/translations/sr_Latn.po +++ b/editor/translations/sr_Latn.po @@ -12586,9 +12586,10 @@ msgstr "KaÄenje:" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13957,12 +13958,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22819,6 +22819,15 @@ msgstr "%s GreÅ¡ka" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Postavke UreÄ‘ivaÄa..." + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/sv.po b/editor/translations/sv.po index 44b6fcf8b6..04965e6c69 100644 --- a/editor/translations/sv.po +++ b/editor/translations/sv.po @@ -32,8 +32,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-08-30 03:11+0000\n" -"Last-Translator: Björn Ã…kesson <bjorn.akesson@gmail.com>\n" +"PO-Revision-Date: 2022-09-29 19:16+0000\n" +"Last-Translator: Kristoffer Grundström <swedishsailfishosuser@tutanota.com>\n" "Language-Team: Swedish <https://hosted.weblate.org/projects/godot-engine/" "godot/sv/>\n" "Language: sv\n" @@ -41,7 +41,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.14.1\n" #: core/bind/core_bind.cpp main/main.cpp #, fuzzy @@ -7177,7 +7177,7 @@ msgstr "" #: editor/import/resource_importer_layered_texture.cpp #: editor/import/resource_importer_texture.cpp msgid "sRGB" -msgstr "" +msgstr "sRGB" #: editor/import/resource_importer_layered_texture.cpp #, fuzzy @@ -13310,9 +13310,10 @@ msgstr "Alternativ" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13515,7 +13516,7 @@ msgstr "" #: editor/plugins/version_control_editor_plugin.cpp msgid "SSH Passphrase" -msgstr "" +msgstr "Lösenordsfras för SSH" #: editor/plugins/version_control_editor_plugin.cpp #, fuzzy @@ -14713,13 +14714,13 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "" +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Kan inte öppna projekt vid '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -18486,7 +18487,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "While" -msgstr "" +msgstr "Medans" #: modules/visual_script/visual_script_flow_control.cpp msgid "while (cond):" @@ -23988,6 +23989,15 @@ msgstr "Fel" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Sortera" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/te.po b/editor/translations/te.po index fe9f95b213..22474ca4ba 100644 --- a/editor/translations/te.po +++ b/editor/translations/te.po @@ -12382,9 +12382,10 @@ msgstr "గణనలà±" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -13718,12 +13719,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -22285,6 +22285,15 @@ msgstr "" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "à°¸à±à°¥à°¿à°°à°¾à°‚కాలà±" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/th.po b/editor/translations/th.po index 6e4b0e578f..5f4ee76a4d 100644 --- a/editor/translations/th.po +++ b/editor/translations/th.po @@ -13,13 +13,14 @@ # PT 07 <porton555@gmail.com>, 2021. # SysError_ <ictsanook@hotmail.com>, 2021. # Kanda Ninthfish <akkhaporn@gmail.com>, 2022. +# Absurdnoobman <jakkalin91@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-04-18 09:10+0000\n" -"Last-Translator: Kanda Ninthfish <akkhaporn@gmail.com>\n" +"PO-Revision-Date: 2022-11-26 14:36+0000\n" +"Last-Translator: Absurdnoobman <jakkalin91@gmail.com>\n" "Language-Team: Thai <https://hosted.weblate.org/projects/godot-engine/godot/" "th/>\n" "Language: th\n" @@ -27,7 +28,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.12-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -48,9 +49,8 @@ msgid "Exit Code" msgstr "" #: core/bind/core_bind.cpp -#, fuzzy msgid "V-Sync Enabled" -msgstr "เปิด" +msgstr "เปิด V-Sync" #: core/bind/core_bind.cpp main/main.cpp msgid "V-Sync Via Compositor" @@ -114,14 +114,13 @@ msgid "Maximized" msgstr "" #: core/bind/core_bind.cpp -#, fuzzy msgid "Minimized" -msgstr "เริ่มต้น" +msgstr "ย่à¸à¸‚นาด" #: core/bind/core_bind.cpp core/project_settings.cpp scene/gui/dialogs.cpp #: scene/gui/graph_node.cpp msgid "Resizable" -msgstr "" +msgstr "ปรับขนาดได้" #: core/bind/core_bind.cpp core/os/input_event.cpp scene/2d/node_2d.cpp #: scene/2d/physics_body_2d.cpp scene/2d/remote_transform_2d.cpp @@ -185,12 +184,11 @@ msgstr "ผิดพลาด" #: core/bind/core_bind.cpp #, fuzzy msgid "Error String" -msgstr "ผิดพลาดขณะบันทึà¸" +msgstr "String ผิดพลาด" #: core/bind/core_bind.cpp -#, fuzzy msgid "Error Line" -msgstr "ผิดพลาดขณะบันทึà¸" +msgstr "บรรทัดผิดพลาด" #: core/bind/core_bind.cpp #, fuzzy @@ -213,9 +211,8 @@ msgid "Limits" msgstr "" #: core/command_queue_mt.cpp -#, fuzzy msgid "Command Queue" -msgstr "ctrl: หมุน" +msgstr "คิวคำสั่ง" #: core/command_queue_mt.cpp msgid "Multithreading Queue Size (KB)" @@ -232,7 +229,7 @@ msgstr "ฟังà¸à¹Œà¸Šà¸±à¸™" #: core/image.cpp core/packed_data_container.cpp scene/2d/polygon_2d.cpp #: scene/3d/baked_lightmap.cpp scene/3d/gi_probe.cpp msgid "Data" -msgstr "" +msgstr "ข้à¸à¸¡à¸¹à¸¥" #: core/io/file_access_network.cpp core/register_core_types.cpp #: editor/editor_file_dialog.cpp editor/editor_settings.cpp main/main.cpp @@ -13201,9 +13198,10 @@ msgstr "ตัวเลืà¸à¸à¸à¸²à¸£à¸ªà¹à¸™à¸›" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "เลื่à¸à¸™:" @@ -14635,15 +14633,16 @@ msgid "Invalid project path (changed anything?)." msgstr "ตำà¹à¸«à¸™à¹ˆà¸‡à¹‚ปรเจà¸à¸•์ผิดพลาด (ได้à¹à¸à¹‰à¹„ขà¸à¸°à¹„รไปหรืà¸à¹„ม่?)" #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "โหลดไฟล์ project.godot ในโฟลเดà¸à¸£à¹Œà¹‚ปรเจà¸à¸•์ไม่ได้ (ข้à¸à¸œà¸´à¸”พลาด %d) ไฟล์à¸à¸²à¸ˆà¸ªà¸¹à¸à¸«à¸²à¸¢à¸«à¸£à¸·à¸à¹€à¸ªà¸µà¸¢à¸«à¸²à¸¢" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "à¹à¸à¹‰à¹„ขไฟล์ project.godot ไม่ได้" +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "ไม่สามารถเปิดโปรเจà¸à¸•์ที่ '%s'" #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -24074,6 +24073,15 @@ msgstr "ผิดพลาด" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "เรียง" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" @@ -26878,7 +26886,7 @@ msgstr "ดีบั๊ภUV" #: scene/resources/environment.cpp msgid "Blur" -msgstr "" +msgstr "เบลà¸à¸£à¹Œ" #: scene/resources/environment.cpp msgid "Edge Sharpness" diff --git a/editor/translations/tl.po b/editor/translations/tl.po index bf39f11166..670e52056d 100644 --- a/editor/translations/tl.po +++ b/editor/translations/tl.po @@ -12724,9 +12724,10 @@ msgstr "Pagsasaayos ng Kalansay" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Usog:" @@ -14099,12 +14100,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -23165,6 +23165,15 @@ msgstr "Nabigo" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Pagkakaayos" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/tr.po b/editor/translations/tr.po index 8cbf35a18b..ac4b509150 100644 --- a/editor/translations/tr.po +++ b/editor/translations/tr.po @@ -85,13 +85,17 @@ # bsr <bsndrn16@gmail.com>, 2022. # Ramazan SANCAR <ramazansancar4545@gmail.com>, 2022. # Burak Orcun OZKABLAN <borcunozkablan@gmail.com>, 2022. +# arda4888 <ardagaming2006@gmail.com>, 2022. +# Dream Drunk <myemailpoly149@gmail.com>, 2022. +# alpdenthedev <ekrem_ekrem_45@hotmail.com>, 2022. +# Muhammed Said Gülberk <msgulberk@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-11 22:22+0000\n" -"Last-Translator: Burak Orcun OZKABLAN <borcunozkablan@gmail.com>\n" +"PO-Revision-Date: 2022-12-05 10:16+0000\n" +"Last-Translator: Muhammed Said Gülberk <msgulberk@gmail.com>\n" "Language-Team: Turkish <https://hosted.weblate.org/projects/godot-engine/" "godot/tr/>\n" "Language: tr\n" @@ -99,11 +103,11 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=2; plural=n != 1;\n" -"X-Generator: Weblate 4.14.1-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" -msgstr "Tablet Sürücü" +msgstr "Tablet Sürücüsü" #: core/bind/core_bind.cpp msgid "Clipboard" @@ -114,7 +118,6 @@ msgid "Current Screen" msgstr "Åžu anki Ekran" #: core/bind/core_bind.cpp -#, fuzzy msgid "Exit Code" msgstr "Çıkış Kodu" @@ -132,11 +135,11 @@ msgstr "Delta YumuÅŸatma" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode" -msgstr "Düşük İşlemci Kullanım Modu" +msgstr "İşlemci Dostu Mod" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode Sleep (µsec)" -msgstr "Düşük İşlemci Kullanımı Uyku Modu (μsn)" +msgstr "Uykulu İşlemci Modu (µsec)" #: core/bind/core_bind.cpp main/main.cpp platform/uwp/os_uwp.cpp msgid "Keep Screen On" @@ -152,7 +155,7 @@ msgstr "Maksimum Ekran Boyutu" #: core/bind/core_bind.cpp msgid "Screen Orientation" -msgstr "Ekran Yönü" +msgstr "Ekran oryantasyonu" #: core/bind/core_bind.cpp core/project_settings.cpp main/main.cpp #: platform/uwp/os_uwp.cpp @@ -161,7 +164,7 @@ msgstr "Pencere" #: core/bind/core_bind.cpp core/project_settings.cpp msgid "Borderless" -msgstr "Kenarlıksız" +msgstr "Kenarsız" #: core/bind/core_bind.cpp msgid "Per Pixel Transparency Enabled" @@ -333,7 +336,7 @@ msgstr "AÄŸ Profilcisi" #: core/io/multiplayer_api.cpp scene/animation/animation_player.cpp msgid "Root Node" -msgstr "Kök Düğüm Adı" +msgstr "Kök Düğümü" #: core/io/networked_multiplayer_peer.cpp msgid "Refuse New Connections" @@ -361,7 +364,7 @@ msgstr "Akış EÅŸi" #: core/io/stream_peer.cpp msgid "Big Endian" -msgstr "big-endian" +msgstr "Big Endian" #: core/io/stream_peer.cpp msgid "Data Array" @@ -369,7 +372,7 @@ msgstr "Veri Dizisi" #: core/io/stream_peer_ssl.cpp msgid "Blocking Handshake" -msgstr "TokalaÅŸmayı blokla" +msgstr "El Sıkışmayı Blokla" #: core/io/udp_server.cpp msgid "Max Pending Connections" @@ -388,7 +391,7 @@ msgstr "1(bir) karakter uzunluÄŸunda bir dize bekleniyor ." #: modules/mono/glue/gd_glue.cpp #: modules/visual_script/visual_script_builtin_funcs.cpp msgid "Not enough bytes for decoding bytes, or invalid format." -msgstr "Baytları çözümlemek için yetersiz miktarda bayt ya da geçersiz format." +msgstr "Baytları çözümlemek için yetersiz bayt miktarı veya geçersiz format." #: core/math/expression.cpp msgid "Invalid input %d (not passed) in expression" @@ -396,7 +399,7 @@ msgstr "İfadede geçersiz giriÅŸ %d" #: core/math/expression.cpp msgid "self can't be used because instance is null (not passed)" -msgstr "self kullanılamaz çünkü örnek boÅŸ (geçilmedi)" +msgstr "örnek boÅŸ olduÄŸu için self kullanılamaz (geçilmedi)" #: core/math/expression.cpp msgid "Invalid operands to operator %s, %s and %s." @@ -7222,6 +7225,9 @@ msgid "" "%s: Texture detected as used as a normal map in 3D. Enabling red-green " "texture compression to reduce memory usage (blue channel is discarded)." msgstr "" +"%s: Dokunun 3D'de normal haritası olarak kullanıldığı algılandı. Bellek " +"kullanımını azaltmak için kırmızı-yeÅŸil doku sıkıştırma etkinleÅŸtiriliyor. " +"(mavi kanal kullanılmıyor)." #: editor/import/resource_importer_texture.cpp #, fuzzy @@ -7251,7 +7257,7 @@ msgstr "HDR Modu" #: editor/import/resource_importer_texture.cpp msgid "BPTC LDR" -msgstr "" +msgstr "BPTC LDR" #: editor/import/resource_importer_texture.cpp #: editor/plugins/tile_set_editor_plugin.cpp scene/2d/cpu_particles_2d.cpp @@ -7359,7 +7365,7 @@ msgstr "Maximum Hz Oranı" #: editor/import/resource_importer_wav.cpp msgid "Trim" -msgstr "" +msgstr "Kırp" #: editor/import/resource_importer_wav.cpp msgid "Normalize" @@ -9535,7 +9541,7 @@ msgstr "Simge" #: editor/plugins/item_list_editor_plugin.cpp msgid "ID" -msgstr "" +msgstr "ID" #: editor/plugins/item_list_editor_plugin.cpp #: scene/resources/default_theme/default_theme.cpp @@ -10708,7 +10714,7 @@ msgstr "Script İsimlerini Listele" #: editor/plugins/script_editor_plugin.cpp msgid "Exec Flags" -msgstr "" +msgstr "Çalıştırma Bayrakları" #: editor/plugins/script_editor_plugin.cpp msgid "Clear Recent Scripts" @@ -12891,9 +12897,10 @@ msgstr "Hizalama Ayarları" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "Kaydırma" @@ -14319,16 +14326,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Geçersiz proje yolu (bir ÅŸey deÄŸiÅŸti mi?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Proje yolundaki proje.godot düzenlenemedi (error %d). Eksik veya bozulmuÅŸ " "olabilir." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "proje yolundaki proje.godot düzenlenemedi." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "'%s' adresindeki proje açılamıyor." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -15326,6 +15334,9 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"Halihazırda örneklendirilmiÅŸ bir sahnenin alt öğesi olan dal kaydedilemez.\n" +"Bu dalı kendisine ait sahneye kaydetmek için, orijinal sahneyi açın, bu dala " +"saÄŸ tıklayın, ve \"Dalı Sahne olarak Kaydet\"i seçin." #: editor/scene_tree_dock.cpp msgid "" @@ -15333,6 +15344,9 @@ msgid "" "To save this branch into its own scene, open the original scene, right click " "on this branch, and select \"Save Branch as Scene\"." msgstr "" +"Devralınan sahnenin parçası olan bir dal kaydedilemez.\n" +"Bu dalı kendisine ait sahneye kaydetmek için, orijinal sahneyi açın, bu dala " +"saÄŸ tıklayın, ve \"Dalı Sahne olarak Kaydet\"i seçin." #: editor/scene_tree_dock.cpp msgid "Save New Scene As..." @@ -15360,19 +15374,18 @@ msgid "Make Local" msgstr "YerelleÅŸtir" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Enable Scene Unique Name(s)" -msgstr "Sahne Benzersiz İsmini Etkin Kıl" +msgstr "Sahne İçi Benzersiz İsim(ler)i Etkin Kıl" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Unique names already used by another node in the scene:" -msgstr "BaÅŸka bir düğüm sahnede bu benzersiz adı zaten kullanıyor." +msgstr "" +"Halihazırda sahnedeki baÅŸka bir düğüm tarafından kullanılan benzersiz " +"isimler:" #: editor/scene_tree_dock.cpp -#, fuzzy msgid "Disable Scene Unique Name(s)" -msgstr "Sahne Benzersiz İsmini Etkisiz Kıl" +msgstr "Sahne İçi Benzersiz İsim(ler)i Etkisiz Kıl" #: editor/scene_tree_dock.cpp msgid "New Scene Root" @@ -15400,7 +15413,7 @@ msgstr "DiÄŸer Düğüm" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes from a foreign scene!" -msgstr "Yad bir sahnedeki düğümler üzerinde çalışamaz!" +msgstr "Yabancı bir sahnedeki düğümler üzerinde çalışılamaz!" #: editor/scene_tree_dock.cpp msgid "Can't operate on nodes the current scene inherits from!" @@ -15439,7 +15452,7 @@ msgstr "Sahne kaydedilirken hata." #: editor/scene_tree_dock.cpp msgid "Error duplicating scene to save it." -msgstr "Kaydetmek için sahne çoÄŸaltılırken hata." +msgstr "Sahne kaydetmek için çoÄŸaltılırken hata." #: editor/scene_tree_dock.cpp msgid "Sub-Resources" @@ -15447,11 +15460,11 @@ msgstr "Alt Kaynaklar" #: editor/scene_tree_dock.cpp msgid "Access as Scene Unique Name" -msgstr "" +msgstr "Sahne İçi Benzersiz İsim olarak EriÅŸim" #: editor/scene_tree_dock.cpp msgid "Clear Inheritance" -msgstr "Kalıtı Temizle" +msgstr "Kalıtımı Temizle" #: editor/scene_tree_dock.cpp msgid "Editable Children" @@ -15476,7 +15489,7 @@ msgstr "Alt Düğüm Ekle" #: editor/scene_tree_dock.cpp msgid "Expand/Collapse All" -msgstr "Hepsini Aç/Kapa" +msgstr "Hepsini GeniÅŸlet/Daralt" #: editor/scene_tree_dock.cpp msgid "Change Type" @@ -16193,7 +16206,7 @@ msgstr "Godot FiziÄŸi" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp msgid "Use BVH" -msgstr "" +msgstr "BVH Kullan" #: main/main.cpp servers/physics_2d/physics_2d_server_sw.cpp #: servers/visual/visual_server_scene.cpp @@ -16213,7 +16226,7 @@ msgstr "MultiNode Kur" #: main/main.cpp msgid "RID Pool Prealloc" -msgstr "" +msgstr "RID Havuzu Ön Tahsisi" #: main/main.cpp #, fuzzy @@ -16275,7 +16288,7 @@ msgstr "Sürücü Adı" #: main/main.cpp msgid "Fallback To GLES2" -msgstr "" +msgstr "GLES2'ye Geri Dön" #: main/main.cpp msgid "Use Nvidia Rect Flicker Workaround" @@ -16889,9 +16902,8 @@ msgid "Script Class" msgstr "Betik Sınıfı" #: modules/gdnative/nativescript/nativescript.cpp -#, fuzzy msgid "Icon Path" -msgstr "Yola Odaklan" +msgstr "İkon Yolu" #: modules/gdnative/register_types.cpp msgid "GDNative" @@ -16899,9 +16911,8 @@ msgstr "GDYerel" #: modules/gdscript/editor/gdscript_highlighter.cpp #: modules/gdscript/gdscript.cpp -#, fuzzy msgid "GDScript" -msgstr "Betik" +msgstr "GDScript" #: modules/gdscript/editor/gdscript_highlighter.cpp msgid "Function Definition Color" @@ -18203,7 +18214,7 @@ msgstr "" #: modules/visual_script/visual_script_flow_control.cpp msgid "Type Cast" -msgstr "Tür DeÄŸiÅŸimi" +msgstr "Tür Dönüştür" #: modules/visual_script/visual_script_flow_control.cpp msgid "Is %s?" @@ -18253,9 +18264,8 @@ msgid "Validate" msgstr "DoÄŸrula" #: modules/visual_script/visual_script_func_nodes.cpp -#, fuzzy msgid "RPC Call Mode" -msgstr "Esnetme Åžekli" +msgstr "RPC çaÄŸrı modu" #: modules/visual_script/visual_script_func_nodes.cpp msgid "Subtract %s" @@ -23138,7 +23148,7 @@ msgstr "Küçük harf" #: scene/3d/physics_joint.cpp msgid "Motor" -msgstr "" +msgstr "Motor" #: scene/3d/physics_joint.cpp #, fuzzy @@ -23771,6 +23781,16 @@ msgstr "Hata" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Sırala" + +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Use AABB Center" +msgstr "Çevreyi Kullan" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/uk.po b/editor/translations/uk.po index 07cfe5b6b1..f9a6c787a5 100644 --- a/editor/translations/uk.po +++ b/editor/translations/uk.po @@ -30,8 +30,8 @@ msgstr "" "Project-Id-Version: Ukrainian (Godot Engine)\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-27 21:37+0000\n" -"Last-Translator: Teashrock <kajitsu22@gmail.com>\n" +"PO-Revision-Date: 2022-10-03 12:44+0000\n" +"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n" "Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/" "godot/uk/>\n" "Language: uk\n" @@ -12804,9 +12804,10 @@ msgstr "Параметри прилипаннÑ" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "ЗміщеннÑ" @@ -14218,16 +14219,17 @@ msgid "Invalid project path (changed anything?)." msgstr "Ðекоректний шлÑÑ… до проєкту (щоÑÑŒ змінилоÑÑ?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ project.godot у каталозі проєкту (помилка %d). " "Можливо, файл вилучено або пошкоджено." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "Ðе вдалоÑÑ Ñ€ÐµÐ´Ð°Ð³ÑƒÐ²Ð°Ñ‚Ð¸ project.godot у каталозі проєкту." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Ðе вдалоÑÑ Ð²Ñ–Ð´ÐºÑ€Ð¸Ñ‚Ð¸ проєкт у «%s»." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -20477,7 +20479,7 @@ msgstr "Режим змішуваннÑ" #: scene/2d/canvas_item.cpp msgid "Light Mode" -msgstr "Праворуч за шириною" +msgstr "Режим оÑвітленнÑ" #: scene/2d/canvas_item.cpp msgid "Particles Animation" @@ -23232,6 +23234,16 @@ msgstr "МакÑимальна Ñила" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Сортувати" + +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Use AABB Center" +msgstr "ВикориÑтовувати адаптивний" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "ГеометріÑ" diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po index d09218a600..1046f11996 100644 --- a/editor/translations/ur_PK.po +++ b/editor/translations/ur_PK.po @@ -12827,9 +12827,10 @@ msgstr ".تمام کا انتخاب" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14217,12 +14218,11 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." +msgid "Couldn't save project at '%s' (error %d)." msgstr "" #: editor/project_manager.cpp @@ -23156,6 +23156,15 @@ msgstr "" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr ".تمام کا انتخاب" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "" diff --git a/editor/translations/vi.po b/editor/translations/vi.po index 2a0fadcf9f..b4a5f4494b 100644 --- a/editor/translations/vi.po +++ b/editor/translations/vi.po @@ -22,13 +22,14 @@ # Hung <hungthitkhia@gmail.com>, 2021. # PaweÅ‚ Fertyk <pfertyk@pfertyk.me>, 2022. # MInhTriet <luckyblockblack@gmail.com>, 2022. +# Nháºt Huy <nhat.huy.7996@gmail.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-08-17 18:20+0000\n" -"Last-Translator: MInhTriet <luckyblockblack@gmail.com>\n" +"PO-Revision-Date: 2022-11-30 15:16+0000\n" +"Last-Translator: Nháºt Huy <nhat.huy.7996@gmail.com>\n" "Language-Team: Vietnamese <https://hosted.weblate.org/projects/godot-engine/" "godot/vi/>\n" "Language: vi\n" @@ -36,7 +37,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14-dev\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -63,9 +64,8 @@ msgid "V-Sync Via Compositor" msgstr "V-Sync thông qua Compositor" #: core/bind/core_bind.cpp main/main.cpp -#, fuzzy msgid "Delta Smoothing" -msgstr "Delta smoothing" +msgstr "Dealta smooth" #: core/bind/core_bind.cpp msgid "Low Processor Usage Mode" @@ -162,9 +162,8 @@ msgid "Target FPS" msgstr "FPS cần đạt tá»›i" #: core/bind/core_bind.cpp -#, fuzzy msgid "Time Scale" -msgstr "Nút TimeScale" +msgstr "độ giãn nở thá»i gian" #: core/bind/core_bind.cpp main/main.cpp #, fuzzy @@ -13042,9 +13041,10 @@ msgstr "Tùy chá»n DÃnh" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp #, fuzzy msgid "Offset" msgstr "Äá»™ dá»i:" @@ -14457,16 +14457,17 @@ msgid "Invalid project path (changed anything?)." msgstr "ÄÆ°á»ng dẫn dá»± án không hợp lệ (bạn có thay đổi Ä‘iá»u gì?)." #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "Không thể nạp 'project.godot' trong đưá»ng dẫn dá»± án (lá»—i %d). Nó có thể bị " "thiếu hoặc đã há»ng." #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "Không thể chỉnh sá»a 'project.godot' trong đưá»ng dẫn dá»± án." +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "Không thể mở dá»± án tại '%s'." #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -23932,6 +23933,15 @@ msgstr "Lá»—i" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "Sắp xếp" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po index 1aeaea7087..52f072e946 100644 --- a/editor/translations/zh_CN.po +++ b/editor/translations/zh_CN.po @@ -84,12 +84,15 @@ # nitenook <admin@alterbaum.net>, 2021. # jker <cxgmfy@163.com>, 2021. # Ankar <1511276198@qq.com>, 2022. +# 风é’å±± <idleman@yeah.net>, 2022. +# 1104 EXSPIRAVIT_ <m18621006730@gmail.com>, 2022. +# ChairC <974833488@qq.com>, 2022. msgid "" msgstr "" "Project-Id-Version: Chinese (Simplified) (Godot Engine)\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: 2018-01-20 12:15+0200\n" -"PO-Revision-Date: 2022-09-22 15:26+0000\n" +"PO-Revision-Date: 2022-12-05 08:51+0000\n" "Last-Translator: Haoyu Qiu <timothyqiu32@gmail.com>\n" "Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hans/>\n" @@ -98,7 +101,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -142,11 +145,11 @@ msgstr "å±å¹•常亮" #: core/bind/core_bind.cpp msgid "Min Window Size" -msgstr "çª—å£æœ€å°å¤§å°" +msgstr "最å°çª—å£å¤§å°" #: core/bind/core_bind.cpp msgid "Max Window Size" -msgstr "çª—å£æœ€å¤§å¤§å°" +msgstr "最大窗å£å¤§å°" #: core/bind/core_bind.cpp msgid "Screen Orientation" @@ -4148,7 +4151,7 @@ msgstr "" #: editor/editor_node.cpp msgid "Scene '%s' has broken dependencies:" -msgstr "场景 “%s†的ä¾èµ–å·²è¢«ç ´å:" +msgstr "场景 “%s†的ä¾èµ–å·²æŸå:" #: editor/editor_node.cpp msgid "Clear Recent Scenes" @@ -5637,12 +5640,12 @@ msgstr "选择框颜色" #: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp msgid "3D Gizmos" -msgstr "3D 控制器" +msgstr "3D å°å·¥å…·" #: editor/editor_settings.cpp editor/plugins/path_editor_plugin.cpp #: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp msgid "Gizmo Colors" -msgstr "控制器颜色" +msgstr "å°å·¥å…·é¢œè‰²" #: editor/editor_settings.cpp msgid "Instanced" @@ -7920,7 +7923,7 @@ msgstr "强制用白色调和" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Include Gizmos (3D)" -msgstr "包括控制器(3D)" +msgstr "包括å°å·¥å…·ï¼ˆ3D)" #: editor/plugins/animation_player_editor_plugin.cpp msgid "Pin AnimationPlayer" @@ -8439,7 +8442,7 @@ msgstr "åˆ›å»ºå…‰ç…§è´´å›¾å¤±è´¥ï¼Œåˆ‡ç¡®ä¿æ–‡ä»¶æ˜¯å¯å†™çš„。" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "Failed determining lightmap size. Maximum lightmap size too small?" -msgstr "æ— æ³•ç¡®å®šå…‰ç…§è´´å›¾å¤§å°ã€‚最大光照贴图大å°å¤ªå°ï¼Ÿ" +msgstr "æ— æ³•ç¡®å®šå…‰ç…§è´´å›¾å¤§å°ã€‚最大光照贴图尺寸太å°ï¼Ÿ" #: editor/plugins/baked_lightmap_editor_plugin.cpp msgid "" @@ -10984,7 +10987,7 @@ msgstr "查看环境" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Gizmos" -msgstr "查看控制器" +msgstr "查看å°å·¥å…·" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Information" @@ -11090,9 +11093,9 @@ msgid "" msgstr "" "点击以切æ¢å¯è§çжæ€ã€‚\n" "\n" -"ç眼:控制器å¯è§ã€‚\n" -"é—眼:控制器éšè—。\n" -"åŠç眼:控制器也å¯ç©¿è¿‡ä¸é€æ˜Žçš„表é¢å¯è§ï¼ˆâ€œX å…‰â€ï¼‰ã€‚" +"ç眼:å°å·¥å…·å¯è§ã€‚\n" +"é—眼:å°å·¥å…·éšè—。\n" +"åŠç眼:å°å·¥å…·ä¹Ÿå¯ç©¿è¿‡ä¸é€æ˜Žçš„表é¢å¯è§ï¼ˆâ€œX å…‰â€ï¼‰ã€‚" #: editor/plugins/spatial_editor_plugin.cpp msgid "Snap Nodes to Floor" @@ -11224,7 +11227,7 @@ msgstr "4 个视窗" #: editor/plugins/spatial_editor_plugin.cpp msgid "Gizmos" -msgstr "控制器" +msgstr "å°å·¥å…·" #: editor/plugins/spatial_editor_plugin.cpp msgid "View Origin" @@ -11309,19 +11312,19 @@ msgstr "åŽç½®" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Size" -msgstr "æ“作控制器大å°" +msgstr "æ“作å°å·¥å…·å¤§å°" #: editor/plugins/spatial_editor_plugin.cpp msgid "Manipulator Gizmo Opacity" -msgstr "æ“作控制器ä¸é€æ˜Žåº¦" +msgstr "æ“作å°å·¥å…·ä¸é€æ˜Žåº¦" #: editor/plugins/spatial_editor_plugin.cpp msgid "Show Viewport Rotation Gizmo" -msgstr "显示视区旋转控制器" +msgstr "显示视区旋转å°å·¥å…·" #: editor/plugins/spatial_editor_plugin.cpp msgid "Unnamed Gizmo" -msgstr "æœªå‘½åæŽ§åˆ¶å™¨" +msgstr "未命åå°å·¥å…·" #: editor/plugins/sprite_editor_plugin.cpp msgid "Create Mesh2D" @@ -12636,9 +12639,10 @@ msgstr "å¸é™„选项" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "åç§»" @@ -14006,15 +14010,16 @@ msgid "Invalid project path (changed anything?)." msgstr "é¡¹ç›®è·¯å¾„æ— æ•ˆï¼ˆè¢«å¤–éƒ¨ä¿®æ”¹ï¼Ÿï¼‰ã€‚" #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" "æ— æ³•åœ¨é¡¹ç›®è·¯å¾„ä¸åŠ è½½ project.godot 文件(错误 %d)。该文件å¯èƒ½ç¼ºå¤±æˆ–å·²æŸå。" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "æ— æ³•åœ¨é¡¹ç›®è·¯å¾„ä¸‹ç¼–è¾‘ project.godot 文件。" +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "æ— æ³•æ‰“å¼€ä½äºŽâ€œ%sâ€çš„项目。" #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -16418,7 +16423,7 @@ msgstr "æ·»åŠ æž¶æž„é¡¹" #: modules/gdnative/gdnative_library_editor_plugin.cpp msgid "GDNativeLibrary" -msgstr "GDNative 库" +msgstr "GDNativeLibrary" #: modules/gdnative/gdnative_library_singleton_editor.cpp msgid "Enabled GDNative Singleton" @@ -20691,7 +20696,7 @@ msgstr "NavigationAgent2D åªèƒ½åœ¨ç»§æ‰¿ Node2D 的父节点下使用。" #: scene/2d/navigation_obstacle_2d.cpp scene/3d/navigation_obstacle.cpp msgid "Estimate Radius" -msgstr "估计åŠå¾„" +msgstr "ä¼°ç®—åŠå¾„" #: scene/2d/navigation_obstacle_2d.cpp msgid "" @@ -21033,7 +21038,7 @@ msgstr "内部顶点数" #: scene/2d/position_2d.cpp msgid "Gizmo Extents" -msgstr "控制器大å°" +msgstr "å°å·¥å…·èŒƒå›´" #: scene/2d/ray_cast_2d.cpp scene/3d/ray_cast.cpp msgid "Exclude Parent" @@ -22607,7 +22612,7 @@ msgstr "矩阵" #: scene/3d/spatial.cpp msgid "Gizmo" -msgstr "控制器" +msgstr "å°å·¥å…·" #: scene/3d/spatial_velocity_tracker.cpp msgid "Track Physics Step" @@ -22693,6 +22698,16 @@ msgstr "最大力度" msgid "AABB" msgstr "AABB" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "排åº" + +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Use AABB Center" +msgstr "使用环境光" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp msgid "Geometry" msgstr "å‡ ä½•ä½“" @@ -25193,7 +25208,7 @@ msgstr "亮度" #: scene/resources/environment.cpp msgid "Saturation" -msgstr "对比度" +msgstr "饱和度" #: scene/resources/environment.cpp msgid "Color Correction" diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po index f8529ea3ca..8af64cfc4e 100644 --- a/editor/translations/zh_HK.po +++ b/editor/translations/zh_HK.po @@ -13397,9 +13397,10 @@ msgstr "é¸é …" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "" @@ -14821,13 +14822,13 @@ msgstr "" #: editor/project_manager.cpp msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "" +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "ä¸èƒ½é€£æŽ¥ã€‚" #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -24070,6 +24071,15 @@ msgstr "錯誤!" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "排åºï¼š" + +#: scene/3d/visual_instance.cpp +msgid "Use AABB Center" +msgstr "" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po index 4cd08539e4..dd54885310 100644 --- a/editor/translations/zh_TW.po +++ b/editor/translations/zh_TW.po @@ -43,8 +43,8 @@ msgstr "" "Project-Id-Version: Godot Engine editor\n" "Report-Msgid-Bugs-To: https://github.com/godotengine/godot\n" "POT-Creation-Date: \n" -"PO-Revision-Date: 2022-09-27 21:37+0000\n" -"Last-Translator: nitenook <admin@alterbaum.net>\n" +"PO-Revision-Date: 2022-10-16 07:25+0000\n" +"Last-Translator: BinotaLIU <me@binota.org>\n" "Language-Team: Chinese (Traditional) <https://hosted.weblate.org/projects/" "godot-engine/godot/zh_Hant/>\n" "Language: zh_TW\n" @@ -52,7 +52,7 @@ msgstr "" "Content-Type: text/plain; charset=UTF-8\n" "Content-Transfer-Encoding: 8bit\n" "Plural-Forms: nplurals=1; plural=0;\n" -"X-Generator: Weblate 4.14.1\n" +"X-Generator: Weblate 4.15-dev\n" #: core/bind/core_bind.cpp main/main.cpp msgid "Tablet Driver" @@ -4148,7 +4148,7 @@ msgstr "刪除é…ç½®" #: editor/editor_node.cpp editor/import_dock.cpp #: editor/script_create_dialog.cpp msgid "Default" -msgstr "默èª" +msgstr "é è¨" #: editor/editor_node.cpp editor/editor_resource_picker.cpp #: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp @@ -12591,9 +12591,10 @@ msgstr "å¸é™„é¸é …" #: scene/2d/path_2d.cpp scene/2d/polygon_2d.cpp scene/2d/sprite.cpp #: scene/3d/cpu_particles.cpp scene/3d/label_3d.cpp scene/3d/path.cpp #: scene/3d/physics_body.cpp scene/3d/soft_body.cpp scene/3d/sprite_3d.cpp -#: scene/gui/graph_node.cpp scene/gui/rich_text_effect.cpp -#: scene/main/canvas_layer.cpp scene/resources/material.cpp -#: scene/resources/particles_material.cpp scene/resources/style_box.cpp +#: scene/3d/visual_instance.cpp scene/gui/graph_node.cpp +#: scene/gui/rich_text_effect.cpp scene/main/canvas_layer.cpp +#: scene/resources/material.cpp scene/resources/particles_material.cpp +#: scene/resources/style_box.cpp msgid "Offset" msgstr "åç§»" @@ -13962,14 +13963,15 @@ msgid "Invalid project path (changed anything?)." msgstr "䏿£ç¢ºçš„專案路徑(有修改了什麼嗎?)。" #: editor/project_manager.cpp +#, fuzzy msgid "" -"Couldn't load project.godot in project path (error %d). It may be missing or " -"corrupted." +"Couldn't load project at '%s' (error %d). It may be missing or corrupted." msgstr "無法自專案路徑內載入 project.godot(錯誤 %d)。檔案å¯èƒ½éºå¤±æˆ–ææ¯€ã€‚" #: editor/project_manager.cpp -msgid "Couldn't edit project.godot in project path." -msgstr "無法在專案路徑ä¸ç·¨è¼¯ project.godot。" +#, fuzzy +msgid "Couldn't save project at '%s' (error %d)." +msgstr "無法於「%sã€æ‰“開專案。" #: editor/project_manager.cpp msgid "Couldn't create project.godot in project path." @@ -17240,7 +17242,7 @@ msgstr "ç™¼ç¾æœ¬åœ°é€šè¨ŠåŸ " #: modules/upnp/upnp.cpp msgid "Discover IPv6" -msgstr "DiscoverIPv6" +msgstr "Discover IPv6" #: modules/upnp/upnp_device.cpp #, fuzzy @@ -18168,7 +18170,7 @@ msgstr "è‡ªé©æ‡‰å‰æ™¯ 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Adaptive Background 432 X 432" -msgstr "" +msgstr "è‡ªé©æ‡‰èƒŒæ™¯ 432 X 432" #: platform/android/export/export_plugin.cpp msgid "Package name is missing." @@ -18201,7 +18203,7 @@ msgstr "剪下節點" #: platform/android/export/export_plugin.cpp msgid "Use Custom Build" -msgstr "" +msgstr "使用自定義建構" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18234,7 +18236,7 @@ msgstr "除錯工具" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp msgid "Debug Password" -msgstr "" +msgstr "åµéŒ¯å¯†ç¢¼" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18248,7 +18250,7 @@ msgstr "發行" #: platform/android/export/export_plugin.cpp msgid "One Click Deploy" -msgstr "" +msgstr "一éµéƒ¨ç½²" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18257,7 +18259,7 @@ msgstr "嵿Ÿ¥å‰ä¸€å€‹å¯¦é«”" #: platform/android/export/export_plugin.cpp msgid "Code" -msgstr "" +msgstr "程å¼ç¢¼" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp #, fuzzy @@ -18279,7 +18281,7 @@ msgstr "åˆ†é¡žç‚ºéŠæˆ²" #: platform/android/export/export_plugin.cpp msgid "Retain Data On Uninstall" -msgstr "" +msgstr "å–æ¶ˆå®‰è£æ™‚ä¿ç•™è³‡æ–™" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18312,11 +18314,11 @@ msgstr "æ£åœ¨æ‰“包" #: platform/android/export/export_plugin.cpp msgid "Hand Tracking Frequency" -msgstr "" +msgstr "æ‰‹å‹¢è¿½è¹¤é »çŽ‡" #: platform/android/export/export_plugin.cpp msgid "Passthrough" -msgstr "" +msgstr "ç©¿é€" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18350,7 +18352,7 @@ msgstr "使用者界é¢" #: platform/android/export/export_plugin.cpp msgid "Allow" -msgstr "" +msgstr "å…許" #: platform/android/export/export_plugin.cpp platform/uwp/export/export.cpp #, fuzzy @@ -18368,7 +18370,7 @@ msgstr "è¨å®šè¡¨ç¤ºå¼" #: platform/android/export/export_plugin.cpp msgid "Salt" -msgstr "" +msgstr "Salt" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -18488,6 +18490,10 @@ msgid "" "Note that the singleton was also renamed from \"GodotPayments\" to " "\"GodotGooglePlayBilling\"." msgstr "" +"「android/modulesã€å°ˆæ¡ˆè¨å®šä¸åŒ…å«äº†ç„¡æ•ˆçš„「GodotPaymentV3ã€ï¼ˆåœ¨ Godot 3.2.2 " +"ä¸å·²æ›´æ”¹ï¼‰ã€‚\n" +"請將其更æ›ç‚ºç¬¬ä¸€æ–¹çš„「GodotGooglePlayBillingã€å¤–掛。\n" +"請注æ„,該單例已從「GodotPaymentsã€æ›´æ”¹ç‚ºã€ŒGodotGooglePlayBillingã€ã€‚" #: platform/android/export/export_plugin.cpp msgid "\"Use Custom Build\" must be enabled to use the plugins." @@ -18519,13 +18525,13 @@ msgstr "å°ã€ŒMin Sdkã€çš„修改僅在「Use Custom Buildã€å•Ÿç”¨æ™‚有效。" #: platform/android/export/export_plugin.cpp msgid "\"Min SDK\" should be a valid integer, but got \"%s\" which is invalid." -msgstr "" +msgstr "ã€Œæœ€å° SDKã€æ‡‰ç‚ºæœ‰æ•ˆæ•´æ•¸ï¼Œä½†ç›®å‰å€¼ç‚ºç„¡æ•ˆçš„「%sã€ã€‚" #: platform/android/export/export_plugin.cpp msgid "" "\"Min SDK\" cannot be lower than %d, which is the version needed by the " "Godot library." -msgstr "" +msgstr "ã€Œæœ€å° SDKã€ä¸å¯ä½Žæ–¼ %dï¼Œå› Godot 函å¼åº«éœ€è¦è©²æœ€å°ç‰ˆæœ¬ã€‚" #: platform/android/export/export_plugin.cpp #, fuzzy @@ -23175,6 +23181,16 @@ msgstr "錯誤" msgid "AABB" msgstr "" +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Sorting" +msgstr "排åº" + +#: scene/3d/visual_instance.cpp +#, fuzzy +msgid "Use AABB Center" +msgstr "使用環境通é“" + #: scene/3d/visual_instance.cpp scene/resources/navigation_mesh.cpp #, fuzzy msgid "Geometry" diff --git a/main/main.cpp b/main/main.cpp index c2e2238482..7e1fd38e14 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -36,8 +36,8 @@ #include "core/crypto/crypto.h" #include "core/debugger/engine_debugger.h" #include "core/extension/extension_api_dump.h" -#include "core/extension/gdnative_interface_dump.gen.h" -#include "core/extension/native_extension_manager.h" +#include "core/extension/gdextension_interface_dump.gen.h" +#include "core/extension/gdextension_manager.h" #include "core/input/input.h" #include "core/input/input_map.h" #include "core/io/dir_access.h" @@ -202,7 +202,7 @@ static MovieWriter *movie_writer = nullptr; static bool disable_vsync = false; static bool print_fps = false; #ifdef TOOLS_ENABLED -static bool dump_gdnative_interface = false; +static bool dump_gdextension_interface = false; static bool dump_extension_api = false; #endif bool profile_gpu = false; @@ -423,7 +423,7 @@ void Main::print_help(const char *p_binary) { OS::get_singleton()->print(" --doctool [<path>] Dump the engine API reference to the given <path> (defaults to current dir) in XML format, merging if existing files are found.\n"); OS::get_singleton()->print(" --no-docbase Disallow dumping the base types (used with --doctool).\n"); OS::get_singleton()->print(" --build-solutions Build the scripting solutions (e.g. for C# projects). Implies --editor and requires a valid project to edit.\n"); - OS::get_singleton()->print(" --dump-gdextension-interface Generate GDExtension header file 'gdnative_interface.h' in the current folder. This file is the base file required to implement a GDExtension.\n"); + OS::get_singleton()->print(" --dump-gdextension-interface Generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension.\n"); OS::get_singleton()->print(" --dump-extension-api Generate JSON dump of the Godot API for GDExtension bindings named 'extension_api.json' in the current folder.\n"); OS::get_singleton()->print(" --startup-benchmark Benchmark the startup time and print it to console.\n"); OS::get_singleton()->print(" --startup-benchmark-file <path> Benchmark the startup time and save it to a given file in JSON format.\n"); @@ -473,7 +473,7 @@ Error Main::test_setup() { register_server_types(); XRServer::set_xr_mode(XRServer::XRMODE_OFF); // Skip in tests. initialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS); - NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS); + GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS); translation_server->setup(); //register translations, load them, etc. if (!locale.is_empty()) { @@ -488,14 +488,14 @@ Error Main::test_setup() { register_driver_types(); initialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE); - NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE); + GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_SCENE); #ifdef TOOLS_ENABLED ClassDB::set_current_api(ClassDB::API_EDITOR); register_editor_types(); initialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR); - NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR); + GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_EDITOR); ClassDB::set_current_api(ClassDB::API_CORE); #endif @@ -547,12 +547,12 @@ void Main::test_cleanup() { ResourceSaver::remove_custom_savers(); #ifdef TOOLS_ENABLED - NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR); + GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_EDITOR); uninitialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR); unregister_editor_types(); #endif - NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE); + GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SCENE); uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE); unregister_platform_apis(); unregister_driver_types(); @@ -560,7 +560,7 @@ void Main::test_cleanup() { finalize_theme_db(); - NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS); + GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS); uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS); unregister_server_types(); @@ -1063,8 +1063,8 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph // Register as an editor instance to use low-end fallback if relevant. editor = true; cmdline_tool = true; - dump_gdnative_interface = true; - print_line("Dumping gdnative interface header file"); + dump_gdextension_interface = true; + print_line("Dumping GDExtension interface header file"); // Hack. Not needed but otherwise we end up detecting that this should // run the project instead of a cmdline tool. // Needs full refactoring to fix properly. @@ -1862,6 +1862,8 @@ Error Main::setup(const char *execpath, int argc, char *argv[], bool p_second_ph GLOBAL_DEF_BASIC("xr/openxr/reference_space", "1"); ProjectSettings::get_singleton()->set_custom_property_info("xr/openxr/reference_space", PropertyInfo(Variant::INT, "xr/openxr/reference_space", PROPERTY_HINT_ENUM, "Local,Stage")); + GLOBAL_DEF_BASIC("xr/openxr/submit_depth_buffer", false); + #ifdef TOOLS_ENABLED // Disabled for now, using XR inside of the editor we'll be working on during the coming months. @@ -1960,7 +1962,7 @@ Error Main::setup2(Thread::ID p_main_tid_override) { register_server_types(); initialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS); - NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS); + GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS); if (p_main_tid_override) { Thread::main_thread_id = p_main_tid_override; @@ -2119,7 +2121,7 @@ Error Main::setup2(Thread::ID p_main_tid_override) { MAIN_PRINT("Main: Setup Logo"); -#if defined(WEB_ENABLED) || defined(ANDROID_ENABLED) +#if !defined(TOOLS_ENABLED) && (defined(WEB_ENABLED) || defined(ANDROID_ENABLED)) bool show_logo = false; #else bool show_logo = true; @@ -2233,13 +2235,7 @@ Error Main::setup2(Thread::ID p_main_tid_override) { if (bool(GLOBAL_DEF("input_devices/pointing/emulate_touch_from_mouse", false)) && !(editor || project_manager)) { - bool found_touchscreen = false; - for (int i = 0; i < DisplayServer::get_singleton()->get_screen_count(); i++) { - if (DisplayServer::get_singleton()->screen_is_touchscreen(i)) { - found_touchscreen = true; - } - } - if (!found_touchscreen) { + if (!DisplayServer::get_singleton()->is_touchscreen_available()) { //only if no touchscreen ui hint, set emulation id->set_emulate_touch_from_mouse(true); } @@ -2325,13 +2321,13 @@ Error Main::setup2(Thread::ID p_main_tid_override) { register_driver_types(); initialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE); - NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE); + GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_SCENE); #ifdef TOOLS_ENABLED ClassDB::set_current_api(ClassDB::API_EDITOR); register_editor_types(); initialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR); - NativeExtensionManager::get_singleton()->initialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR); + GDExtensionManager::get_singleton()->initialize_extensions(GDExtension::INITIALIZATION_LEVEL_EDITOR); ClassDB::set_current_api(ClassDB::API_CORE); @@ -2589,15 +2585,16 @@ bool Main::start() { return false; } - if (dump_gdnative_interface) { - GDNativeInterfaceDump::generate_gdnative_interface_file("gdnative_interface.h"); + if (dump_gdextension_interface) { + GDExtensionInterfaceDump::generate_gdextension_interface_file("gdextension_interface.h"); } if (dump_extension_api) { - NativeExtensionAPIDump::generate_extension_json_file("extension_api.json"); + GDExtensionAPIDump::generate_extension_json_file("extension_api.json"); } - if (dump_gdnative_interface || dump_extension_api) { + if (dump_gdextension_interface || dump_extension_api) { + OS::get_singleton()->set_exit_code(EXIT_SUCCESS); return false; } @@ -3332,6 +3329,8 @@ void Main::cleanup(bool p_force) { ResourceLoader::clear_translation_remaps(); ResourceLoader::clear_path_remaps(); + ResourceLoader::clear_thread_load_tasks(); + ScriptServer::finish_languages(); // Sync pending commands that may have been queued from a different thread during ScriptServer finalization @@ -3347,7 +3346,7 @@ void Main::cleanup(bool p_force) { } #ifdef TOOLS_ENABLED - NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_EDITOR); + GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_EDITOR); uninitialize_modules(MODULE_INITIALIZATION_LEVEL_EDITOR); unregister_editor_types(); @@ -3355,7 +3354,7 @@ void Main::cleanup(bool p_force) { ImageLoader::cleanup(); - NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SCENE); + GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SCENE); uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SCENE); unregister_platform_apis(); @@ -3365,9 +3364,10 @@ void Main::cleanup(bool p_force) { finalize_theme_db(); // Before deinitializing server extensions, finalize servers which may be loaded as extensions. + finalize_navigation_server(); finalize_physics(); - NativeExtensionManager::get_singleton()->deinitialize_extensions(NativeExtension::INITIALIZATION_LEVEL_SERVERS); + GDExtensionManager::get_singleton()->deinitialize_extensions(GDExtension::INITIALIZATION_LEVEL_SERVERS); uninitialize_modules(MODULE_INITIALIZATION_LEVEL_SERVERS); unregister_server_types(); @@ -3388,7 +3388,6 @@ void Main::cleanup(bool p_force) { OS::get_singleton()->finalize(); - finalize_navigation_server(); finalize_display(); if (input) { diff --git a/methods.py b/methods.py index f4afead9f4..99a59b49e3 100644 --- a/methods.py +++ b/methods.py @@ -774,7 +774,7 @@ def generate_vs_project(env, num_jobs): for platform in ModuleConfigs.PLATFORMS ] self.arg_dict["runfile"] += [ - f'bin\\godot.windows.{config}{ModuleConfigs.DEV_SUFFIX}{".double" if env["float"] == "64" else ""}.{plat_id}{f".{name}" if name else ""}.exe' + f'bin\\godot.windows.{config}{ModuleConfigs.DEV_SUFFIX}{".double" if env["precision"] == "double" else ""}.{plat_id}{f".{name}" if name else ""}.exe' for config in ModuleConfigs.CONFIGURATIONS for plat_id in ModuleConfigs.PLATFORM_IDS ] @@ -820,8 +820,8 @@ def generate_vs_project(env, num_jobs): if env["custom_modules"]: common_build_postfix.append("custom_modules=%s" % env["custom_modules"]) - if env["float"] == "64": - common_build_postfix.append("float=64") + if env["precision"] == "double": + common_build_postfix.append("precision=double") result = " ^& ".join(common_build_prefix + [" ".join([commands] + common_build_postfix)]) return result diff --git a/misc/dist/linux/godot.6 b/misc/dist/linux/godot.6 index 2af0cb1965..2481869d8a 100644 --- a/misc/dist/linux/godot.6 +++ b/misc/dist/linux/godot.6 @@ -157,7 +157,7 @@ Disallow dumping the base types (used with \fB\-\-doctool\fR). Build the scripting solutions (e.g. for C# projects). Implies \-\-editor and requires a valid project to edit. .TP \fB\-\-dump\-gdextension\-interface\fR -Generate GDExtension header file 'gdnative_interface.h' in the current folder. This file is the base file required to implement a GDExtension. +Generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension. .TP \fB\-\-dump\-extension\-api\fR Generate JSON dump of the Godot API for GDExtension bindings named 'extension_api.json' in the current folder. diff --git a/misc/dist/shell/_godot.zsh-completion b/misc/dist/shell/_godot.zsh-completion index 7b3e01d277..8e2f6a92bd 100644 --- a/misc/dist/shell/_godot.zsh-completion +++ b/misc/dist/shell/_godot.zsh-completion @@ -86,7 +86,7 @@ _arguments \ '--doctool[dump the engine API reference to the given path in XML format, merging if existing files are found]:path to base Godot build directory (optional):_dirs' \ '--no-docbase[disallow dumping the base types (used with --doctool)]' \ '--build-solutions[build the scripting solutions (e.g. for C# projects)]' \ - '--dump-gdextension-interface[generate GDExtension header file 'gdnative_interface.h' in the current folder. This file is the base file required to implement a GDExtension.]' \ + '--dump-gdextension-interface[generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension.]' \ '--dump-extension-api[generate JSON dump of the Godot API for GDExtension bindings named "extension_api.json" in the current folder]' \ '--startup-benchmark[benchmark the startup time and print it to console]' \ '--startup-benchmark-file[benchmark the startup time and save it to a given file in JSON format]:path to output JSON file' \ diff --git a/misc/dist/shell/godot.fish b/misc/dist/shell/godot.fish index c6edf75112..83680214f2 100644 --- a/misc/dist/shell/godot.fish +++ b/misc/dist/shell/godot.fish @@ -107,7 +107,7 @@ complete -c godot -l validate-conversion-3to4 -d "Shows what elements will be re complete -c godot -l doctool -d "Dump the engine API reference to the given path in XML format, merging if existing files are found" -r complete -c godot -l no-docbase -d "Disallow dumping the base types (used with --doctool)" complete -c godot -l build-solutions -d "Build the scripting solutions (e.g. for C# projects)" -complete -c godot -l dump-gdextension-interface -d "Generate GDExtension header file 'gdnative_interface.h' in the current folder. This file is the base file required to implement a GDExtension" +complete -c godot -l dump-gdextension-interface -d "Generate GDExtension header file 'gdextension_interface.h' in the current folder. This file is the base file required to implement a GDExtension" complete -c godot -l dump-extension-api -d "Generate JSON dump of the Godot API for GDExtension bindings named 'extension_api.json' in the current folder" complete -c godot -l startup-benchmark -d "Benchmark the startup time and print it to console" complete -c godot -l startup-benchmark-file -d "Benchmark the startup time and save it to a given file in JSON format" -x diff --git a/misc/scripts/compare_extension_api.py b/misc/scripts/compare_extension_api.py deleted file mode 100755 index f96db4278c..0000000000 --- a/misc/scripts/compare_extension_api.py +++ /dev/null @@ -1,11 +0,0 @@ -#!/usr/bin/env python -# -*- coding: utf-8 -*- - -import sys - -# TODO: -# Add a process that compares the original godot-cpp/godot-headers/extension_api.json with the new extension_api.json (both passed as arguments) and reports any API calls that have been removed. -# If we only have additions or no changes to the file, we pass -# For now we deem this too early because the API isn't stable enough yet. - -sys.exit(0) diff --git a/modules/gdscript/doc_classes/@GDScript.xml b/modules/gdscript/doc_classes/@GDScript.xml index 4981750b7d..fd748ea569 100644 --- a/modules/gdscript/doc_classes/@GDScript.xml +++ b/modules/gdscript/doc_classes/@GDScript.xml @@ -106,6 +106,7 @@ <param index="0" name="instance" type="Object" /> <description> Returns the passed [param instance] converted to a Dictionary. Can be useful for serializing. + [b]Note:[/b] Cannot be used to serialize objects with built-in scripts attached or objects allocated within built-in scripts. [codeblock] var foo = "bar" func _ready(): diff --git a/modules/gdscript/gdscript.cpp b/modules/gdscript/gdscript.cpp index c8195de640..1fe1561559 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -478,7 +478,7 @@ void GDScript::_clear_doc() { void GDScript::_update_doc() { _clear_doc(); - doc.script_path = "\"" + get_path().get_slice("://", 1) + "\""; + doc.script_path = vformat(R"("%s")", get_script_path().get_slice("://", 1)); if (!name.is_empty()) { doc.name = name; } else { @@ -701,6 +701,7 @@ bool GDScript::_update_exports(bool *r_err, bool p_recursive_call, PlaceHolderSc Variant default_value; if (member.variable->initializer && member.variable->initializer->is_constant) { default_value = member.variable->initializer->reduced_value; + GDScriptCompiler::convert_to_initializer_type(default_value, member.variable); } member_default_values_cache[member.variable->identifier->name] = default_value; } break; @@ -801,9 +802,9 @@ void GDScript::update_exports() { String GDScript::_get_debug_path() const { if (is_built_in() && !get_name().is_empty()) { - return get_name() + " (" + get_path() + ")"; + return vformat("%s(%s)", get_name(), get_script_path()); } else { - return get_path(); + return get_script_path(); } } @@ -904,7 +905,7 @@ Error GDScript::reload(bool p_keep_state) { for (const GDScriptWarning &warning : parser.get_warnings()) { if (EngineDebugger::is_active()) { Vector<ScriptLanguage::StackInfo> si; - EngineDebugger::get_script_debugger()->send_error("", get_path(), warning.start_line, warning.get_name(), warning.get_message(), false, ERR_HANDLER_WARNING, si); + EngineDebugger::get_script_debugger()->send_error("", get_script_path(), warning.start_line, warning.get_name(), warning.get_message(), false, ERR_HANDLER_WARNING, si); } } #endif @@ -1027,6 +1028,10 @@ void GDScript::set_path(const String &p_path, bool p_take_over) { } } +String GDScript::get_script_path() const { + return path; +} + Error GDScript::load_source_code(const String &p_path) { if (p_path.is_empty() || ResourceLoader::get_resource_type(p_path.get_slice("::", 0)) == "PackedScene") { return OK; @@ -1106,21 +1111,27 @@ bool GDScript::inherits_script(const Ref<Script> &p_script) const { GDScript *GDScript::find_class(const String &p_qualified_name) { String first = p_qualified_name.get_slice("::", 0); + Vector<String> class_names; GDScript *result = nullptr; + // Empty initial name means start here. if (first.is_empty() || first == name) { + class_names = p_qualified_name.split("::"); result = this; - } else if (first == get_root_script()->path) { + } else if (p_qualified_name.begins_with(get_root_script()->path)) { + // Script path could have a class path separator("::") in it. + class_names = p_qualified_name.trim_prefix(get_root_script()->path).split("::"); result = get_root_script(); } else if (HashMap<StringName, Ref<GDScript>>::Iterator E = subclasses.find(first)) { + class_names = p_qualified_name.split("::"); result = E->value.ptr(); } else if (_owner != nullptr) { // Check parent scope. return _owner->find_class(p_qualified_name); } - int name_count = p_qualified_name.get_slice_count("::"); - for (int i = 1; result != nullptr && i < name_count; i++) { - String current_name = p_qualified_name.get_slice("::", i); + // Starts at index 1 because index 0 was handled above. + for (int i = 1; result != nullptr && i < class_names.size(); i++) { + String current_name = class_names[i]; if (HashMap<StringName, Ref<GDScript>>::Iterator E = result->subclasses.find(current_name)) { result = E->value.ptr(); } else { @@ -1132,11 +1143,12 @@ GDScript *GDScript::find_class(const String &p_qualified_name) { return result; } -bool GDScript::is_subclass(const GDScript *p_script) { +bool GDScript::has_class(const GDScript *p_script) { String fqn = p_script->fully_qualified_name; - if (!fqn.is_empty() && fqn != fully_qualified_name && fqn.begins_with(fully_qualified_name)) { - String fqn_rest = fqn.substr(fully_qualified_name.length()); - return find_class(fqn_rest) == p_script; + if (fully_qualified_name.is_empty() && fqn.get_slice("::", 0).is_empty()) { + return p_script == this; + } else if (fqn.begins_with(fully_qualified_name)) { + return p_script == find_class(fqn.trim_prefix(fully_qualified_name)); } return false; } @@ -1283,15 +1295,10 @@ String GDScript::_get_gdscript_reference_class_name(const GDScript *p_gdscript) } GDScript *GDScript::_get_gdscript_from_variant(const Variant &p_variant) { - Variant::Type type = p_variant.get_type(); - if (type != Variant::Type::OBJECT) - return nullptr; - Object *obj = p_variant; - if (obj == nullptr) { + if (obj == nullptr || obj->get_instance_id().is_null()) { return nullptr; } - return Object::cast_to<GDScript>(obj); } @@ -1347,13 +1354,11 @@ void GDScript::_get_dependencies(RBSet<GDScript *> &p_dependencies, const GDScri GDScript::GDScript() : script_list(this) { -#ifdef DEBUG_ENABLED { MutexLock lock(GDScriptLanguage::get_singleton()->mutex); GDScriptLanguage::get_singleton()->script_list.add(&script_list); } -#endif } void GDScript::_save_orphaned_subclasses() { @@ -1487,13 +1492,11 @@ GDScript::~GDScript() { } } -#ifdef DEBUG_ENABLED { MutexLock lock(GDScriptLanguage::get_singleton()->mutex); GDScriptLanguage::get_singleton()->script_list.remove(&script_list); } -#endif if (GDScriptCache::singleton) { // Cache may have been already destroyed at engine shutdown. GDScriptCache::remove_script(get_path()); @@ -1963,6 +1966,16 @@ void GDScriptLanguage::add_named_global_constant(const StringName &p_name, const named_globals[p_name] = p_value; } +Variant GDScriptLanguage::get_any_global_constant(const StringName &p_name) { + if (named_globals.has(p_name)) { + return named_globals[p_name]; + } + if (globals.has(p_name)) { + return _global_array[globals[p_name]]; + } + ERR_FAIL_V_MSG(Variant(), vformat("Could not find any global constant with name: %s.", p_name)); +} + void GDScriptLanguage::remove_named_global_constant(const StringName &p_name) { ERR_FAIL_COND(!named_globals.has(p_name)); named_globals.erase(p_name); @@ -2164,7 +2177,8 @@ void GDScriptLanguage::reload_all_scripts() { SelfList<GDScript> *elem = script_list.first(); while (elem) { - if (elem->self()->get_path().is_resource_file()) { + // Scripts will reload all subclasses, so only reload root scripts. + if (elem->self()->is_root_script() && elem->self()->get_path().is_resource_file()) { print_verbose("GDScript: Found: " + elem->self()->get_path()); scripts.push_back(Ref<GDScript>(elem->self())); //cast to gdscript to avoid being erased by accident } @@ -2193,7 +2207,8 @@ void GDScriptLanguage::reload_tool_script(const Ref<Script> &p_script, bool p_so SelfList<GDScript> *elem = script_list.first(); while (elem) { - if (elem->self()->get_path().is_resource_file()) { + // Scripts will reload all subclasses, so only reload root scripts. + if (elem->self()->is_root_script() && elem->self()->get_path().is_resource_file()) { scripts.push_back(Ref<GDScript>(elem->self())); //cast to gdscript to avoid being erased by accident } elem = elem->next(); @@ -2594,8 +2609,7 @@ Ref<GDScript> GDScriptLanguage::get_script_by_fully_qualified_name(const String SelfList<GDScript> *elem = script_list.first(); while (elem) { GDScript *scr = elem->self(); - scr = scr->find_class(p_name); - if (scr != nullptr) { + if (scr->fully_qualified_name == p_name) { return scr; } elem = elem->next(); diff --git a/modules/gdscript/gdscript.h b/modules/gdscript/gdscript.h index 2df89d812c..39367e377b 100644 --- a/modules/gdscript/gdscript.h +++ b/modules/gdscript/gdscript.h @@ -187,7 +187,7 @@ public: bool inherits_script(const Ref<Script> &p_script) const override; GDScript *find_class(const String &p_qualified_name); - bool is_subclass(const GDScript *p_script); + bool has_class(const GDScript *p_script); GDScript *get_root_script(); bool is_root_script() const { return _owner == nullptr; } String get_fully_qualified_name() const { return fully_qualified_name; } @@ -240,6 +240,7 @@ public: virtual Error reload(bool p_keep_state = false) override; virtual void set_path(const String &p_path, bool p_take_over = false) override; + String get_script_path() const; Error load_source_code(const String &p_path); Error load_byte_code(const String &p_path); @@ -432,7 +433,7 @@ public: csi.write[_debug_call_stack_pos - i - 1].line = _call_stack[i].line ? *_call_stack[i].line : 0; if (_call_stack[i].function) { csi.write[_debug_call_stack_pos - i - 1].func = _call_stack[i].function->get_name(); - csi.write[_debug_call_stack_pos - i - 1].file = _call_stack[i].function->get_script()->get_path(); + csi.write[_debug_call_stack_pos - i - 1].file = _call_stack[i].function->get_script()->get_script_path(); } } return csi; @@ -454,6 +455,9 @@ public: _FORCE_INLINE_ Variant *get_global_array() { return _global_array; } _FORCE_INLINE_ const HashMap<StringName, int> &get_global_map() const { return globals; } _FORCE_INLINE_ const HashMap<StringName, Variant> &get_named_globals_map() const { return named_globals; } + // These two functions should be used when behavior needs to be consistent between in-editor and running the scene + bool has_any_global_constant(const StringName &p_name) { return named_globals.has(p_name) || globals.has(p_name); } + Variant get_any_global_constant(const StringName &p_name); _FORCE_INLINE_ static GDScriptLanguage *get_singleton() { return singleton; } diff --git a/modules/gdscript/gdscript_analyzer.cpp b/modules/gdscript/gdscript_analyzer.cpp index 663d72038d..0aea2b9c16 100644 --- a/modules/gdscript/gdscript_analyzer.cpp +++ b/modules/gdscript/gdscript_analyzer.cpp @@ -219,15 +219,76 @@ Error GDScriptAnalyzer::check_class_member_name_conflict(const GDScriptParser::C return OK; } -Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, bool p_recursive) { - if (p_class->base_type.is_set()) { - // Already resolved +void GDScriptAnalyzer::get_class_node_current_scope_classes(GDScriptParser::ClassNode *p_node, List<GDScriptParser::ClassNode *> *p_list) { + if (p_list->find(p_node) != nullptr) { + return; + } + p_list->push_back(p_node); + + // TODO: Try to solve class inheritance if not yet resolving. + + // Prioritize node base type over its outer class + if (p_node->base_type.class_type != nullptr) { + get_class_node_current_scope_classes(p_node->base_type.class_type, p_list); + } + + if (p_node->outer != nullptr) { + get_class_node_current_scope_classes(p_node->outer, p_list); + } +} + +Error GDScriptAnalyzer::resolve_class_inheritance(GDScriptParser::ClassNode *p_class, const GDScriptParser::Node *p_source) { + if (p_source == nullptr && parser->has_class(p_class)) { + p_source = p_class; + } + + if (p_class->base_type.is_resolving()) { + push_error(vformat(R"(Could not resolve class "%s": Cyclic reference.)", type_from_metatype(p_class->get_datatype()).to_string()), p_source); + return ERR_PARSE_ERROR; + } + + if (!p_class->base_type.has_no_type()) { + // Already resolved. + return OK; + } + + if (!parser->has_class(p_class)) { + String script_path = p_class->get_datatype().script_path; + Ref<GDScriptParserRef> parser_ref = get_parser_for(script_path); + if (parser_ref.is_null()) { + push_error(vformat(R"(Could not find script "%s".)", script_path), p_source); + return ERR_PARSE_ERROR; + } + + Error err = parser_ref->raise_status(GDScriptParserRef::PARSED); + if (err) { + push_error(vformat(R"(Could not parse script "%s": %s.)", script_path, error_names[err]), p_source); + return ERR_PARSE_ERROR; + } + + ERR_FAIL_COND_V_MSG(!parser_ref->get_parser()->has_class(p_class), ERR_PARSE_ERROR, R"(Parser bug: Mismatched external parser.)"); + + GDScriptAnalyzer *other_analyzer = parser_ref->get_analyzer(); + GDScriptParser *other_parser = parser_ref->get_parser(); + + int error_count = other_parser->errors.size(); + other_analyzer->resolve_class_inheritance(p_class); + if (other_parser->errors.size() > error_count) { + push_error(vformat(R"(Could not resolve inheritance for class "%s".)", p_class->fqcn), p_source); + return ERR_PARSE_ERROR; + } + return OK; } + GDScriptParser::ClassNode *previous_class = parser->current_class; + parser->current_class = p_class; + if (p_class->identifier) { StringName class_name = p_class->identifier->name; - if (class_exists(class_name)) { + if (GDScriptParser::get_builtin_type(class_name) < Variant::VARIANT_MAX) { + push_error(vformat(R"(Class "%s" hides a built-in type.)", class_name), p_class->identifier); + } else if (class_exists(class_name)) { push_error(vformat(R"(Class "%s" hides a native class.)", class_name), p_class->identifier); } else if (ScriptServer::is_global_class(class_name) && (ScriptServer::get_global_class_path(class_name) != parser->script_path || p_class != parser->head)) { push_error(vformat(R"(Class "%s" hides a global script class.)", class_name), p_class->identifier); @@ -236,7 +297,9 @@ Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, } } - GDScriptParser::DataType result; + GDScriptParser::DataType resolving_datatype; + resolving_datatype.kind = GDScriptParser::DataType::RESOLVING; + p_class->base_type = resolving_datatype; // Set datatype for class. GDScriptParser::DataType class_type; @@ -249,6 +312,7 @@ Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, class_type.builtin_type = Variant::OBJECT; p_class->set_datatype(class_type); + GDScriptParser::DataType result; if (!p_class->extends_used) { result.type_source = GDScriptParser::DataType::ANNOTATED_INFERRED; result.kind = GDScriptParser::DataType::NATIVE; @@ -270,7 +334,7 @@ Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, return ERR_PARSE_ERROR; } - Error err = ext_parser->raise_status(GDScriptParserRef::INTERFACE_SOLVED); + Error err = ext_parser->raise_status(GDScriptParserRef::INHERITANCE_SOLVED); if (err != OK) { push_error(vformat(R"(Could not resolve super class inheritance from "%s".)", p_class->extends_path), p_class); return err; @@ -297,7 +361,7 @@ Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, return ERR_PARSE_ERROR; } - Error err = base_parser->raise_status(GDScriptParserRef::INTERFACE_SOLVED); + Error err = base_parser->raise_status(GDScriptParserRef::INHERITANCE_SOLVED); if (err != OK) { push_error(vformat(R"(Could not resolve super class inheritance from "%s".)", name), p_class); return err; @@ -306,7 +370,7 @@ Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, } } else if (ProjectSettings::get_singleton()->has_autoload(name) && ProjectSettings::get_singleton()->get_autoload(name).is_singleton) { const ProjectSettings::AutoloadInfo &info = ProjectSettings::get_singleton()->get_autoload(name); - if (info.path.get_extension().to_lower() != ".gd") { + if (info.path.get_extension().to_lower() != GDScriptLanguage::get_singleton()->get_extension()) { push_error(vformat(R"(Singleton %s is not a GDScript.)", info.name), p_class); return ERR_PARSE_ERROR; } @@ -317,22 +381,24 @@ Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, return ERR_PARSE_ERROR; } - Error err = info_parser->raise_status(GDScriptParserRef::INTERFACE_SOLVED); + Error err = info_parser->raise_status(GDScriptParserRef::INHERITANCE_SOLVED); if (err != OK) { push_error(vformat(R"(Could not resolve super class inheritance from "%s".)", name), p_class); return err; } + base = info_parser->get_parser()->head->get_datatype(); } else if (class_exists(name) && ClassDB::can_instantiate(name)) { base.kind = GDScriptParser::DataType::NATIVE; base.native_type = name; } else { // Look for other classes in script. - GDScriptParser::ClassNode *look_class = p_class; bool found = false; - while (look_class != nullptr) { + List<GDScriptParser::ClassNode *> script_classes; + get_class_node_current_scope_classes(p_class, &script_classes); + for (GDScriptParser::ClassNode *look_class : script_classes) { if (look_class->identifier && look_class->identifier->name == name) { if (!look_class->get_datatype().is_set()) { - Error err = resolve_inheritance(look_class, false); + Error err = resolve_class_inheritance(look_class, p_class); if (err) { return err; } @@ -341,19 +407,12 @@ Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, found = true; break; } - if (look_class->members_indices.has(name) && look_class->get_member(name).type == GDScriptParser::ClassNode::Member::CLASS) { - GDScriptParser::ClassNode::Member member = look_class->get_member(name); - if (!member.m_class->get_datatype().is_set()) { - Error err = resolve_inheritance(member.m_class, false); - if (err) { - return err; - } - } - base = member.m_class->get_datatype(); + if (look_class->has_member(name)) { + resolve_class_member(look_class, name, p_class); + base = look_class->get_member(name).get_datatype(); found = true; break; } - look_class = look_class->outer; } if (!found) { @@ -386,7 +445,7 @@ Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, result = base; } - if (!result.is_set()) { + if (!result.is_set() || result.has_no_type()) { // TODO: More specific error messages. push_error(vformat(R"(Could not resolve inheritance for class "%s".)", p_class->identifier == nullptr ? "<main>" : p_class->identifier->name), p_class); return ERR_PARSE_ERROR; @@ -406,10 +465,21 @@ Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, class_type.native_type = result.native_type; p_class->set_datatype(class_type); + parser->current_class = previous_class; + + return OK; +} + +Error GDScriptAnalyzer::resolve_class_inheritance(GDScriptParser::ClassNode *p_class, bool p_recursive) { + Error err = resolve_class_inheritance(p_class); + if (err) { + return err; + } + if (p_recursive) { for (int i = 0; i < p_class->members.size(); i++) { if (p_class->members[i].type == GDScriptParser::ClassNode::Member::CLASS) { - Error err = resolve_inheritance(p_class->members[i].m_class, true); + err = resolve_class_inheritance(p_class->members[i].m_class, true); if (err) { return err; } @@ -421,14 +491,29 @@ Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, } GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::TypeNode *p_type) { - GDScriptParser::DataType result; + GDScriptParser::DataType bad_type; + bad_type.kind = GDScriptParser::DataType::VARIANT; + bad_type.type_source = GDScriptParser::DataType::INFERRED; if (p_type == nullptr) { - result.kind = GDScriptParser::DataType::VARIANT; - return result; + return bad_type; + } + + if (p_type->get_datatype().is_resolving()) { + push_error(R"(Could not resolve datatype: Cyclic reference.)", p_type); + return bad_type; } - result.type_source = result.ANNOTATED_EXPLICIT; + if (!p_type->get_datatype().has_no_type()) { + return p_type->get_datatype(); + } + + GDScriptParser::DataType resolving_datatype; + resolving_datatype.kind = GDScriptParser::DataType::RESOLVING; + p_type->set_datatype(resolving_datatype); + + GDScriptParser::DataType result; + result.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT; result.builtin_type = Variant::OBJECT; if (p_type->type_chain.is_empty()) { @@ -442,29 +527,21 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type StringName first = p_type->type_chain[0]->name; if (first == SNAME("Variant")) { - result.kind = GDScriptParser::DataType::VARIANT; if (p_type->type_chain.size() > 1) { - push_error(R"("Variant" type don't contain nested types.)", p_type->type_chain[1]); - return GDScriptParser::DataType(); + // TODO: Variant does actually have a nested Type though. + push_error(R"(Variant doesn't contain nested types.)", p_type->type_chain[1]); + return bad_type; } - return result; - } - - if (first == SNAME("Object")) { + result.kind = GDScriptParser::DataType::VARIANT; + } else if (first == SNAME("Object")) { + // Object is treated like a native type, not a built-in. result.kind = GDScriptParser::DataType::NATIVE; result.native_type = SNAME("Object"); - if (p_type->type_chain.size() > 1) { - push_error(R"("Object" type don't contain nested types.)", p_type->type_chain[1]); - return GDScriptParser::DataType(); - } - return result; - } - - if (GDScriptParser::get_builtin_type(first) < Variant::VARIANT_MAX) { + } else if (GDScriptParser::get_builtin_type(first) < Variant::VARIANT_MAX) { // Built-in types. if (p_type->type_chain.size() > 1) { push_error(R"(Built-in types don't contain nested types.)", p_type->type_chain[1]); - return GDScriptParser::DataType(); + return bad_type; } result.kind = GDScriptParser::DataType::BUILTIN; result.builtin_type = GDScriptParser::get_builtin_type(first); @@ -490,9 +567,9 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type String ext = path.get_extension(); if (ext == GDScriptLanguage::get_singleton()->get_extension()) { Ref<GDScriptParserRef> ref = get_parser_for(path); - if (!ref.is_valid() || ref->raise_status(GDScriptParserRef::INTERFACE_SOLVED) != OK) { + if (!ref.is_valid() || ref->raise_status(GDScriptParserRef::INHERITANCE_SOLVED) != OK) { push_error(vformat(R"(Could not parse global class "%s" from "%s".)", first, ScriptServer::get_global_class_path(first)), p_type); - return GDScriptParser::DataType(); + return bad_type; } result = ref->get_parser()->head->get_datatype(); } else { @@ -507,9 +584,9 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type } else if (ProjectSettings::get_singleton()->has_autoload(first) && ProjectSettings::get_singleton()->get_autoload(first).is_singleton) { const ProjectSettings::AutoloadInfo &autoload = ProjectSettings::get_singleton()->get_autoload(first); Ref<GDScriptParserRef> ref = get_parser_for(autoload.path); - if (ref->raise_status(GDScriptParserRef::INTERFACE_SOLVED) != OK) { + if (ref->raise_status(GDScriptParserRef::INHERITANCE_SOLVED) != OK) { push_error(vformat(R"(Could not parse singleton "%s" from "%s".)", first, autoload.path), p_type); - return GDScriptParser::DataType(); + return bad_type; } result = ref->get_parser()->head->get_datatype(); } else if (ClassDB::has_enum(parser->current_class->base_type.native_type, first)) { @@ -517,38 +594,36 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type result = make_native_enum_type(parser->current_class->base_type.native_type, first); } else { // Classes in current scope. - GDScriptParser::ClassNode *script_class = parser->current_class; - bool found = false; - while (!found && script_class != nullptr) { + List<GDScriptParser::ClassNode *> script_classes; + get_class_node_current_scope_classes(parser->current_class, &script_classes); + for (GDScriptParser::ClassNode *script_class : script_classes) { if (script_class->identifier && script_class->identifier->name == first) { result = script_class->get_datatype(); - found = true; break; } if (script_class->members_indices.has(first)) { - GDScriptParser::ClassNode::Member member = script_class->members[script_class->members_indices[first]]; + resolve_class_member(script_class, first, p_type); + + GDScriptParser::ClassNode::Member member = script_class->get_member(first); switch (member.type) { case GDScriptParser::ClassNode::Member::CLASS: - result = member.m_class->get_datatype(); - found = true; + result = member.get_datatype(); break; case GDScriptParser::ClassNode::Member::ENUM: - result = member.m_enum->get_datatype(); - found = true; + result = member.get_datatype(); break; case GDScriptParser::ClassNode::Member::CONSTANT: - if (member.constant->get_datatype().is_meta_type) { - result = member.constant->get_datatype(); + if (member.get_datatype().is_meta_type) { + result = member.get_datatype(); result.is_meta_type = false; - found = true; break; } else if (Ref<Script>(member.constant->initializer->reduced_value).is_valid()) { Ref<GDScript> gdscript = member.constant->initializer->reduced_value; if (gdscript.is_valid()) { - Ref<GDScriptParserRef> ref = get_parser_for(gdscript->get_path()); - if (ref->raise_status(GDScriptParserRef::INTERFACE_SOLVED) != OK) { - push_error(vformat(R"(Could not parse script from "%s".)", gdscript->get_path()), p_type); - return GDScriptParser::DataType(); + Ref<GDScriptParserRef> ref = get_parser_for(gdscript->get_script_path()); + if (ref->raise_status(GDScriptParserRef::INHERITANCE_SOLVED) != OK) { + push_error(vformat(R"(Could not parse script from "%s".)", gdscript->get_script_path()), p_type); + return bad_type; } result = ref->get_parser()->head->get_datatype(); result.is_meta_type = false; @@ -566,16 +641,14 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type [[fallthrough]]; default: push_error(vformat(R"("%s" is a %s but does not contain a type.)", first, member.get_type_name()), p_type); - return GDScriptParser::DataType(); + return bad_type; } } - script_class = script_class->outer; } } if (!result.is_set()) { push_error(vformat(R"("%s" was not found in the current scope.)", first), p_type); - result.kind = GDScriptParser::DataType::VARIANT; // Leave Variant anyway so future type check don't use an unresolved type. - return result; + return bad_type; } if (p_type->type_chain.size() > 1) { @@ -586,27 +659,26 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type result = p_type->type_chain[i]->get_datatype(); if (!result.is_set()) { push_error(vformat(R"(Could not find type "%s" under base "%s".)", p_type->type_chain[i]->name, base.to_string()), p_type->type_chain[1]); - result.kind = GDScriptParser::DataType::VARIANT; // Leave Variant anyway so future type check don't use an unresolved type. - return result; + return bad_type; } else if (!result.is_meta_type) { push_error(vformat(R"(Member "%s" under base "%s" is not a valid type.)", p_type->type_chain[i]->name, base.to_string()), p_type->type_chain[1]); - result.kind = GDScriptParser::DataType::VARIANT; // Leave Variant anyway so future type check don't use an unresolved type. - return result; + return bad_type; } } } else if (result.kind == GDScriptParser::DataType::NATIVE) { // Only enums allowed for native. - if (ClassDB::has_enum(result.native_type, p_type->type_chain[1]->name)) { - if (p_type->type_chain.size() > 2) { - push_error(R"(Enums cannot contain nested types.)", p_type->type_chain[2]); - } else { - result = make_native_enum_type(result.native_type, p_type->type_chain[1]->name); - } + if (!ClassDB::has_enum(result.native_type, p_type->type_chain[1]->name)) { + push_error(vformat(R"(Could not find nested type "%s" under base "%s".)", p_type->type_chain[1]->name, result.to_string()), p_type->type_chain[1]); + return bad_type; + } + if (p_type->type_chain.size() > 2) { + push_error(R"(Enums cannot contain nested types.)", p_type->type_chain[2]); + return bad_type; } + result = make_native_enum_type(result.native_type, p_type->type_chain[1]->name); } else { push_error(vformat(R"(Could not find nested type "%s" under base "%s".)", p_type->type_chain[1]->name, result.to_string()), p_type->type_chain[1]); - result.kind = GDScriptParser::DataType::VARIANT; // Leave Variant anyway so future type check don't use an unresolved type. - return result; + return bad_type; } } @@ -618,22 +690,77 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type return result; } -void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_class) { - if (p_class->resolved_interface) { +void GDScriptAnalyzer::resolve_class_member(GDScriptParser::ClassNode *p_class, StringName p_name, const GDScriptParser::Node *p_source) { + ERR_FAIL_COND(!p_class->has_member(p_name)); + resolve_class_member(p_class, p_class->members_indices[p_name], p_source); +} + +void GDScriptAnalyzer::resolve_class_member(GDScriptParser::ClassNode *p_class, int p_index, const GDScriptParser::Node *p_source) { + ERR_FAIL_INDEX(p_index, p_class->members.size()); + + GDScriptParser::ClassNode::Member &member = p_class->members.write[p_index]; + if (p_source == nullptr && parser->has_class(p_class)) { + p_source = member.get_source_node(); + } + + if (member.get_datatype().is_resolving()) { + push_error(vformat(R"(Could not resolve member "%s": Cyclic reference.)", member.get_name()), p_source); + return; + } + + if (member.get_datatype().is_set()) { + return; + } + + if (!parser->has_class(p_class)) { + String script_path = p_class->get_datatype().script_path; + Ref<GDScriptParserRef> parser_ref = get_parser_for(script_path); + if (parser_ref.is_null()) { + push_error(vformat(R"(Could not find script "%s" (While resolving "%s").)", script_path, member.get_name()), p_source); + return; + } + + Error err = parser_ref->raise_status(GDScriptParserRef::PARSED); + if (err) { + push_error(vformat(R"(Could not resolve script "%s": %s (While resolving "%s").)", script_path, error_names[err], member.get_name()), p_source); + return; + } + + ERR_FAIL_COND_MSG(!parser_ref->get_parser()->has_class(p_class), R"(Parser bug: Mismatched external parser.)"); + + GDScriptAnalyzer *other_analyzer = parser_ref->get_analyzer(); + GDScriptParser *other_parser = parser_ref->get_parser(); + + int error_count = other_parser->errors.size(); + other_analyzer->resolve_class_member(p_class, p_index); + if (other_parser->errors.size() > error_count) { + push_error(vformat(R"(Could not resolve member "%s".)", member.get_name()), p_source); + } + return; } - p_class->resolved_interface = true; + + // If it's already resolving, that's ok. + if (!p_class->base_type.is_resolving()) { + Error err = resolve_class_inheritance(p_class); + if (err) { + return; + } + } GDScriptParser::ClassNode *previous_class = parser->current_class; parser->current_class = p_class; - for (int i = 0; i < p_class->members.size(); i++) { - GDScriptParser::ClassNode::Member member = p_class->members[i]; + GDScriptParser::DataType resolving_datatype; + resolving_datatype.kind = GDScriptParser::DataType::RESOLVING; + { switch (member.type) { case GDScriptParser::ClassNode::Member::VARIABLE: { check_class_member_name_conflict(p_class, member.variable->identifier->name, member.variable); + member.variable->set_datatype(resolving_datatype); + GDScriptParser::DataType datatype; datatype.kind = GDScriptParser::DataType::VARIANT; datatype.type_source = GDScriptParser::DataType::UNDETECTED; @@ -645,7 +772,6 @@ void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_clas } if (member.variable->initializer != nullptr) { - member.variable->set_datatype(datatype); // Allow recursive usage. reduce_expression(member.variable->initializer); if ((member.variable->infer_datatype || (member.variable->datatype_specifier != nullptr && specified_type.has_container_element_type())) && member.variable->initializer->type == GDScriptParser::Node::ARRAY) { // Typed array. @@ -656,18 +782,14 @@ void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_clas } } datatype = member.variable->initializer->get_datatype(); + if (datatype.type_source != GDScriptParser::DataType::UNDETECTED) { datatype.type_source = GDScriptParser::DataType::INFERRED; } - } - // Check if initializer is an unset identifier (ie: a variable within scope, but declared below) - if (member.variable->initializer && !member.variable->initializer->get_datatype().is_set()) { - if (member.variable->initializer->type == GDScriptParser::Node::IDENTIFIER) { - GDScriptParser::IdentifierNode *initializer_identifier = static_cast<GDScriptParser::IdentifierNode *>(member.variable->initializer); - push_error(vformat(R"(Identifier "%s" must be declared above current variable.)", initializer_identifier->name), member.variable->initializer); - } else { - ERR_PRINT("Parser bug (please report): tried to assign unset node without an identifier."); + if (!datatype.is_set()) { + push_error(vformat(R"(Could not resolve initializer for member "%s".)", member.variable->identifier->name), member.variable->initializer); + datatype.kind = GDScriptParser::DataType::VARIANT; } } @@ -719,10 +841,9 @@ void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_clas case GDScriptParser::ClassNode::Member::CONSTANT: { check_class_member_name_conflict(p_class, member.constant->identifier->name, member.constant); - reduce_expression(member.constant->initializer); + member.constant->set_datatype(resolving_datatype); GDScriptParser::DataType specified_type; - if (member.constant->datatype_specifier != nullptr) { specified_type = resolve_datatype(member.constant->datatype_specifier); specified_type.is_meta_type = false; @@ -730,7 +851,9 @@ void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_clas GDScriptParser::DataType datatype; if (member.constant->initializer) { + reduce_expression(member.constant->initializer); datatype = member.constant->initializer->get_datatype(); + if (member.constant->initializer->type == GDScriptParser::Node::ARRAY) { GDScriptParser::ArrayNode *array = static_cast<GDScriptParser::ArrayNode *>(member.constant->initializer); const_fold_array(array); @@ -743,6 +866,11 @@ void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_clas const_fold_dictionary(static_cast<GDScriptParser::DictionaryNode *>(member.constant->initializer)); } + if (!datatype.is_set()) { + push_error(vformat(R"(Could not resolve initializer for member "%s".)", member.constant->identifier->name), member.constant->initializer); + datatype.kind = GDScriptParser::DataType::VARIANT; + } + if (!member.constant->initializer->is_constant) { push_error(R"(Initializer for a constant must be a constant expression.)", member.constant->initializer); } @@ -771,6 +899,8 @@ void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_clas case GDScriptParser::ClassNode::Member::SIGNAL: { check_class_member_name_conflict(p_class, member.signal->identifier->name, member.signal); + member.signal->set_datatype(resolving_datatype); + for (int j = 0; j < member.signal->parameters.size(); j++) { GDScriptParser::DataType signal_type = resolve_datatype(member.signal->parameters[j]->datatype_specifier); signal_type.is_meta_type = false; @@ -792,6 +922,8 @@ void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_clas case GDScriptParser::ClassNode::Member::ENUM: { check_class_member_name_conflict(p_class, member.m_enum->identifier->name, member.m_enum); + member.m_enum->set_datatype(resolving_datatype); + GDScriptParser::DataType enum_type; enum_type.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT; enum_type.kind = GDScriptParser::DataType::ENUM; @@ -801,7 +933,7 @@ void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_clas enum_type.is_meta_type = true; enum_type.is_constant = true; - // Enums can't be nested, so we can safely override this. + const GDScriptParser::EnumNode *prev_enum = current_enum; current_enum = member.m_enum; for (int j = 0; j < member.m_enum->values.size(); j++) { @@ -829,7 +961,7 @@ void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_clas enum_type.enum_values[element.identifier->name] = element.value; } - current_enum = nullptr; + current_enum = prev_enum; member.m_enum->set_datatype(enum_type); @@ -839,15 +971,18 @@ void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_clas } } break; case GDScriptParser::ClassNode::Member::FUNCTION: - resolve_function_signature(member.function); + resolve_function_signature(member.function, p_source); break; case GDScriptParser::ClassNode::Member::ENUM_VALUE: { if (member.enum_value.custom_value) { check_class_member_name_conflict(p_class, member.enum_value.identifier->name, member.enum_value.custom_value); + member.enum_value.identifier->set_datatype(resolving_datatype); + + const GDScriptParser::EnumNode *prev_enum = current_enum; current_enum = member.enum_value.parent_enum; reduce_expression(member.enum_value.custom_value); - current_enum = nullptr; + current_enum = prev_enum; if (!member.enum_value.custom_value->is_constant) { push_error(R"(Enum values must be constant.)", member.enum_value.custom_value); @@ -861,18 +996,30 @@ void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_clas check_class_member_name_conflict(p_class, member.enum_value.identifier->name, member.enum_value.parent_enum); if (member.enum_value.index > 0) { - member.enum_value.value = member.enum_value.parent_enum->values[member.enum_value.index - 1].value + 1; + const GDScriptParser::EnumNode::Value &prev_value = member.enum_value.parent_enum->values[member.enum_value.index - 1]; + resolve_class_member(p_class, prev_value.identifier->name, member.enum_value.identifier); + member.enum_value.value = prev_value.value + 1; } else { member.enum_value.value = 0; } member.enum_value.resolved = true; } + // Also update the original references. - member.enum_value.parent_enum->values.write[member.enum_value.index] = member.enum_value; - p_class->members.write[i].enum_value = member.enum_value; + member.enum_value.parent_enum->values.set(member.enum_value.index, member.enum_value); + + GDScriptParser::DataType datatype; + datatype.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT; + datatype.kind = GDScriptParser::DataType::BUILTIN; + datatype.builtin_type = Variant::INT; + member.enum_value.identifier->set_datatype(datatype); } break; case GDScriptParser::ClassNode::Member::CLASS: check_class_member_name_conflict(p_class, member.m_class->identifier->name, member.m_class); + // If it's already resolving, that's ok. + if (!member.m_class->base_type.is_resolving()) { + resolve_class_inheritance(member.m_class, p_source); + } break; case GDScriptParser::ClassNode::Member::GROUP: // No-op, but needed to silence warnings. @@ -883,28 +1030,123 @@ void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_clas } } - // Recurse nested classes. - for (int i = 0; i < p_class->members.size(); i++) { - GDScriptParser::ClassNode::Member member = p_class->members[i]; - if (member.type != GDScriptParser::ClassNode::Member::CLASS) { - continue; + parser->current_class = previous_class; +} + +void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_class, const GDScriptParser::Node *p_source) { + if (p_source == nullptr && parser->has_class(p_class)) { + p_source = p_class; + } + + if (!p_class->resolved_interface) { + if (!parser->has_class(p_class)) { + String script_path = p_class->get_datatype().script_path; + Ref<GDScriptParserRef> parser_ref = get_parser_for(script_path); + if (parser_ref.is_null()) { + push_error(vformat(R"(Could not find script "%s".)", script_path), p_source); + return; + } + + Error err = parser_ref->raise_status(GDScriptParserRef::PARSED); + if (err) { + push_error(vformat(R"(Could not resolve script "%s": %s.)", script_path, error_names[err]), p_source); + return; + } + + ERR_FAIL_COND_MSG(!parser_ref->get_parser()->has_class(p_class), R"(Parser bug: Mismatched external parser.)"); + + GDScriptAnalyzer *other_analyzer = parser_ref->get_analyzer(); + GDScriptParser *other_parser = parser_ref->get_parser(); + + int error_count = other_parser->errors.size(); + other_analyzer->resolve_class_interface(p_class); + if (other_parser->errors.size() > error_count) { + push_error(vformat(R"(Could not resolve class "%s".)", p_class->fqcn), p_source); + } + + return; } + p_class->resolved_interface = true; - resolve_class_interface(member.m_class); + if (resolve_class_inheritance(p_class) != OK) { + return; + } + + GDScriptParser::DataType base_type = p_class->base_type; + if (base_type.kind == GDScriptParser::DataType::CLASS) { + GDScriptParser::ClassNode *base_class = base_type.class_type; + resolve_class_interface(base_class, p_class); + } + + for (int i = 0; i < p_class->members.size(); i++) { + resolve_class_member(p_class, i); + } } +} - parser->current_class = previous_class; +void GDScriptAnalyzer::resolve_class_interface(GDScriptParser::ClassNode *p_class, bool p_recursive) { + resolve_class_interface(p_class); + + if (p_recursive) { + for (int i = 0; i < p_class->members.size(); i++) { + GDScriptParser::ClassNode::Member member = p_class->members[i]; + if (member.type == GDScriptParser::ClassNode::Member::CLASS) { + resolve_class_interface(member.m_class, true); + } + } + } } -void GDScriptAnalyzer::resolve_class_body(GDScriptParser::ClassNode *p_class) { +void GDScriptAnalyzer::resolve_class_body(GDScriptParser::ClassNode *p_class, const GDScriptParser::Node *p_source) { + if (p_source == nullptr && parser->has_class(p_class)) { + p_source = p_class; + } + if (p_class->resolved_body) { return; } + + if (!parser->has_class(p_class)) { + String script_path = p_class->get_datatype().script_path; + Ref<GDScriptParserRef> parser_ref = get_parser_for(script_path); + if (parser_ref.is_null()) { + push_error(vformat(R"(Could not find script "%s".)", script_path), p_source); + return; + } + + Error err = parser_ref->raise_status(GDScriptParserRef::PARSED); + if (err) { + push_error(vformat(R"(Could not resolve script "%s": %s.)", script_path, error_names[err]), p_source); + return; + } + + ERR_FAIL_COND_MSG(!parser_ref->get_parser()->has_class(p_class), R"(Parser bug: Mismatched external parser.)"); + + GDScriptAnalyzer *other_analyzer = parser_ref->get_analyzer(); + GDScriptParser *other_parser = parser_ref->get_parser(); + + int error_count = other_parser->errors.size(); + other_analyzer->resolve_class_body(p_class); + if (other_parser->errors.size() > error_count) { + push_error(vformat(R"(Could not resolve class "%s".)", p_class->fqcn), p_source); + } + + return; + } + p_class->resolved_body = true; GDScriptParser::ClassNode *previous_class = parser->current_class; parser->current_class = p_class; + resolve_class_interface(p_class, p_source); + + GDScriptParser::DataType base_type = p_class->base_type; + if (base_type.kind == GDScriptParser::DataType::CLASS) { + GDScriptParser::ClassNode *base_class = base_type.class_type; + resolve_class_body(base_class, p_class); + } + // Do functions and properties now. for (int i = 0; i < p_class->members.size(); i++) { GDScriptParser::ClassNode::Member member = p_class->members[i]; @@ -947,18 +1189,6 @@ void GDScriptAnalyzer::resolve_class_body(GDScriptParser::ClassNode *p_class) { } } - parser->current_class = previous_class; - - // Recurse nested classes. - for (int i = 0; i < p_class->members.size(); i++) { - GDScriptParser::ClassNode::Member member = p_class->members[i]; - if (member.type != GDScriptParser::ClassNode::Member::CLASS) { - continue; - } - - resolve_class_body(member.m_class); - } - // Check unused variables and datatypes of property getters and setters. for (int i = 0; i < p_class->members.size(); i++) { GDScriptParser::ClassNode::Member member = p_class->members[i]; @@ -1046,6 +1276,21 @@ void GDScriptAnalyzer::resolve_class_body(GDScriptParser::ClassNode *p_class) { } } } + + parser->current_class = previous_class; +} + +void GDScriptAnalyzer::resolve_class_body(GDScriptParser::ClassNode *p_class, bool p_recursive) { + resolve_class_body(p_class); + + if (p_recursive) { + for (int i = 0; i < p_class->members.size(); i++) { + GDScriptParser::ClassNode::Member member = p_class->members[i]; + if (member.type == GDScriptParser::ClassNode::Member::CLASS) { + resolve_class_body(member.m_class, true); + } + } + } } void GDScriptAnalyzer::resolve_node(GDScriptParser::Node *p_node, bool p_is_root) { @@ -1055,8 +1300,10 @@ void GDScriptAnalyzer::resolve_node(GDScriptParser::Node *p_node, bool p_is_root case GDScriptParser::Node::NONE: break; // Unreachable. case GDScriptParser::Node::CLASS: - resolve_class_interface(static_cast<GDScriptParser::ClassNode *>(p_node)); - resolve_class_body(static_cast<GDScriptParser::ClassNode *>(p_node)); + if (OK == resolve_class_inheritance(static_cast<GDScriptParser::ClassNode *>(p_node), true)) { + resolve_class_interface(static_cast<GDScriptParser::ClassNode *>(p_node), true); + resolve_class_body(static_cast<GDScriptParser::ClassNode *>(p_node), true); + } break; case GDScriptParser::Node::CONSTANT: resolve_constant(static_cast<GDScriptParser::ConstantNode *>(p_node)); @@ -1138,7 +1385,16 @@ void GDScriptAnalyzer::resolve_annotation(GDScriptParser::AnnotationNode *p_anno // TODO: Add second validation function for annotations, so they can use checked types. } -void GDScriptAnalyzer::resolve_function_signature(GDScriptParser::FunctionNode *p_function) { +void GDScriptAnalyzer::resolve_function_signature(GDScriptParser::FunctionNode *p_function, const GDScriptParser::Node *p_source) { + if (p_source == nullptr) { + p_source = p_function; + } + + if (p_function->get_datatype().is_resolving()) { + push_error(vformat(R"(Could not resolve function "%s": Cyclic reference.)", p_function->identifier->name), p_source); + return; + } + if (p_function->resolved_signature) { return; } @@ -1147,6 +1403,12 @@ void GDScriptAnalyzer::resolve_function_signature(GDScriptParser::FunctionNode * GDScriptParser::FunctionNode *previous_function = parser->current_function; parser->current_function = p_function; + GDScriptParser::DataType prev_datatype = p_function->get_datatype(); + + GDScriptParser::DataType resolving_datatype; + resolving_datatype.kind = GDScriptParser::DataType::RESOLVING; + p_function->set_datatype(resolving_datatype); + #ifdef TOOLS_ENABLED int default_value_count = 0; #endif // TOOLS_ENABLED @@ -1251,6 +1513,10 @@ void GDScriptAnalyzer::resolve_function_signature(GDScriptParser::FunctionNode * #endif // TOOLS_ENABLED } + if (p_function->get_datatype().is_resolving()) { + p_function->set_datatype(prev_datatype); + } + parser->current_function = previous_function; } @@ -1584,7 +1850,7 @@ void GDScriptAnalyzer::resolve_constant(GDScriptParser::ConstantNode *p_constant } if (p_constant->datatype_specifier != nullptr) { - if (!is_type_compatible(explicit_type, type)) { + if (!is_type_compatible(explicit_type, type, true)) { push_error(vformat(R"(Assigned value for constant "%s" has type %s which is not compatible with defined type %s.)", p_constant->identifier->name, type.to_string(), explicit_type.to_string()), p_constant->initializer); #ifdef DEBUG_ENABLED } else if (explicit_type.builtin_type == Variant::INT && type.builtin_type == Variant::FLOAT) { @@ -2160,7 +2426,7 @@ void GDScriptAnalyzer::reduce_binary_op(GDScriptParser::BinaryOpNode *p_binary_o GDScriptParser::DataType test_type = right_type; test_type.is_meta_type = false; - if (!is_type_compatible(test_type, p_binary_op->left_operand->get_datatype(), false)) { + if (!is_type_compatible(test_type, left_type, false)) { push_error(vformat(R"(Expression is of type "%s" so it can't be of type "%s".)"), p_binary_op->left_operand); p_binary_op->reduced_value = false; } else { @@ -2194,11 +2460,11 @@ void GDScriptAnalyzer::reduce_binary_op(GDScriptParser::BinaryOpNode *p_binary_o GDScriptParser::DataType test_type = right_type; test_type.is_meta_type = false; - if (!is_type_compatible(test_type, p_binary_op->left_operand->get_datatype(), false)) { + if (!is_type_compatible(test_type, left_type, false)) { // Test reverse as well to consider for subtypes. - if (!is_type_compatible(p_binary_op->left_operand->get_datatype(), test_type, false)) { - if (p_binary_op->left_operand->get_datatype().is_hard_type()) { - push_error(vformat(R"(Expression is of type "%s" so it can't be of type "%s".)", p_binary_op->left_operand->get_datatype().to_string(), test_type.to_string()), p_binary_op->left_operand); + if (!is_type_compatible(left_type, test_type, false)) { + if (left_type.is_hard_type()) { + push_error(vformat(R"(Expression is of type "%s" so it can't be of type "%s".)", left_type.to_string(), test_type.to_string()), p_binary_op->left_operand); } else { // TODO: Warning. mark_node_unsafe(p_binary_op); @@ -2676,7 +2942,7 @@ void GDScriptAnalyzer::reduce_cast(GDScriptParser::CastNode *p_cast) { } void GDScriptAnalyzer::reduce_dictionary(GDScriptParser::DictionaryNode *p_dictionary) { - HashMap<Variant, GDScriptParser::ExpressionNode *, VariantHasher, VariantComparator> elements; + HashMap<Variant, GDScriptParser::ExpressionNode *, VariantHasher, StringLikeVariantComparator> elements; for (int i = 0; i < p_dictionary->elements.size(); i++) { const GDScriptParser::DictionaryNode::Pair &element = p_dictionary->elements[i]; @@ -2734,7 +3000,7 @@ GDScriptParser::DataType GDScriptAnalyzer::make_global_class_meta_type(const Str return type; } - Error err = ref->raise_status(GDScriptParserRef::INTERFACE_SOLVED); + Error err = ref->raise_status(GDScriptParserRef::INHERITANCE_SOLVED); if (err) { push_error(vformat(R"(Could not resolve class "%s", because of a parser error.)", p_class_name), p_source); type.type_source = GDScriptParser::DataType::UNDETECTED; @@ -2757,6 +3023,10 @@ GDScriptParser::DataType GDScriptAnalyzer::make_global_class_meta_type(const Str } void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNode *p_identifier, GDScriptParser::DataType *p_base) { + if (!p_identifier->get_datatype().has_no_type()) { + return; + } + GDScriptParser::DataType base; if (p_base == nullptr) { base = type_from_metatype(parser->current_class->get_datatype()); @@ -2849,16 +3119,16 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod p_identifier->set_datatype(base_class->get_datatype()); return; } + if (base_class->has_member(name)) { - const GDScriptParser::ClassNode::Member &member = base_class->get_member(name); + resolve_class_member(base_class, name, p_identifier); + + GDScriptParser::ClassNode::Member member = base_class->get_member(name); p_identifier->set_datatype(member.get_datatype()); switch (member.type) { case GDScriptParser::ClassNode::Member::CONSTANT: - // For out-of-order resolution: - reduce_expression(member.constant->initializer); p_identifier->is_constant = true; p_identifier->reduced_value = member.constant->initializer->reduced_value; - p_identifier->set_datatype(member.constant->initializer->get_datatype()); p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_CONSTANT; p_identifier->constant_source = member.constant; break; @@ -2876,13 +3146,17 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod p_identifier->source = GDScriptParser::IdentifierNode::MEMBER_SIGNAL; break; case GDScriptParser::ClassNode::Member::FUNCTION: - resolve_function_signature(member.function); p_identifier->set_datatype(make_callable_type(member.function->info)); break; case GDScriptParser::ClassNode::Member::CLASS: - // For out-of-order resolution: - resolve_class_interface(member.m_class); - p_identifier->set_datatype(member.m_class->get_datatype()); + if (p_base != nullptr && p_base->is_constant) { + Error err = OK; + GDScript *scr = GDScriptCache::get_full_script(base.script_path, err).ptr(); + ERR_FAIL_COND_MSG(err != OK, "Error while getting subscript full script."); + scr = scr->find_class(p_identifier->get_datatype().class_type->fqcn); + p_identifier->reduced_value = scr; + p_identifier->is_constant = true; + } break; default: break; // Type already set. @@ -2891,41 +3165,38 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod } // Check outer constants. // TODO: Allow outer static functions. - GDScriptParser::ClassNode *outer = base_class->outer; - while (outer != nullptr) { - if (outer->has_member(name)) { - const GDScriptParser::ClassNode::Member &member = outer->get_member(name); - switch (member.type) { - case GDScriptParser::ClassNode::Member::CONSTANT: { - // TODO: Make sure loops won't cause problem. And make special error message for those. - // For out-of-order resolution: - reduce_expression(member.constant->initializer); - p_identifier->set_datatype(member.get_datatype()); - p_identifier->is_constant = true; - p_identifier->reduced_value = member.constant->initializer->reduced_value; - return; - } break; - case GDScriptParser::ClassNode::Member::ENUM_VALUE: { - p_identifier->set_datatype(member.get_datatype()); - p_identifier->is_constant = true; - p_identifier->reduced_value = member.enum_value.value; - return; - } break; - case GDScriptParser::ClassNode::Member::ENUM: { - p_identifier->set_datatype(member.get_datatype()); - p_identifier->is_constant = false; - return; - } break; - case GDScriptParser::ClassNode::Member::CLASS: { - resolve_class_interface(member.m_class); - p_identifier->set_datatype(member.m_class->get_datatype()); - return; - } break; - default: - break; + if (base_class->outer != nullptr) { + List<GDScriptParser::ClassNode *> script_classes; + get_class_node_current_scope_classes(base_class->outer, &script_classes); + for (GDScriptParser::ClassNode *script_class : script_classes) { + if (script_class->has_member(name)) { + resolve_class_member(script_class, name, p_identifier); + + GDScriptParser::ClassNode::Member member = script_class->get_member(name); + switch (member.type) { + case GDScriptParser::ClassNode::Member::CONSTANT: + // TODO: Make sure loops won't cause problem. And make special error message for those. + p_identifier->set_datatype(member.get_datatype()); + p_identifier->is_constant = true; + p_identifier->reduced_value = member.constant->initializer->reduced_value; + return; + case GDScriptParser::ClassNode::Member::ENUM_VALUE: + p_identifier->set_datatype(member.get_datatype()); + p_identifier->is_constant = true; + p_identifier->reduced_value = member.enum_value.value; + return; + case GDScriptParser::ClassNode::Member::ENUM: + p_identifier->set_datatype(member.get_datatype()); + p_identifier->is_constant = false; + return; + case GDScriptParser::ClassNode::Member::CLASS: + p_identifier->set_datatype(member.get_datatype()); + return; + default: + break; + } } } - outer = outer->outer; } base_class = base_class->base_type.class_type; @@ -3126,21 +3397,21 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident if (ResourceLoader::get_resource_type(autoload.path) == "GDScript") { Ref<GDScriptParserRef> singl_parser = get_parser_for(autoload.path); if (singl_parser.is_valid()) { - Error err = singl_parser->raise_status(GDScriptParserRef::INTERFACE_SOLVED); + Error err = singl_parser->raise_status(GDScriptParserRef::INHERITANCE_SOLVED); if (err == OK) { result = type_from_metatype(singl_parser->get_parser()->head->get_datatype()); } } } else if (ResourceLoader::get_resource_type(autoload.path) == "PackedScene") { - if (GDScriptLanguage::get_singleton()->get_named_globals_map().has(name)) { - Variant constant = GDScriptLanguage::get_singleton()->get_named_globals_map()[name]; + if (GDScriptLanguage::get_singleton()->has_any_global_constant(name)) { + Variant constant = GDScriptLanguage::get_singleton()->get_any_global_constant(name); Node *node = Object::cast_to<Node>(constant); if (node != nullptr) { - Ref<Script> scr = node->get_script(); + Ref<GDScript> scr = node->get_script(); if (scr.is_valid()) { - Ref<GDScriptParserRef> singl_parser = get_parser_for(scr->get_path()); + Ref<GDScriptParserRef> singl_parser = get_parser_for(scr->get_script_path()); if (singl_parser.is_valid()) { - Error err = singl_parser->raise_status(GDScriptParserRef::INTERFACE_SOLVED); + Error err = singl_parser->raise_status(GDScriptParserRef::INHERITANCE_SOLVED); if (err == OK) { result = type_from_metatype(singl_parser->get_parser()->head->get_datatype()); } @@ -3155,17 +3426,8 @@ void GDScriptAnalyzer::reduce_identifier(GDScriptParser::IdentifierNode *p_ident } } - if (GDScriptLanguage::get_singleton()->get_global_map().has(name)) { - int idx = GDScriptLanguage::get_singleton()->get_global_map()[name]; - Variant constant = GDScriptLanguage::get_singleton()->get_global_array()[idx]; - p_identifier->set_datatype(type_from_variant(constant, p_identifier)); - p_identifier->is_constant = true; - p_identifier->reduced_value = constant; - return; - } - - if (GDScriptLanguage::get_singleton()->get_named_globals_map().has(name)) { - Variant constant = GDScriptLanguage::get_singleton()->get_named_globals_map()[name]; + if (GDScriptLanguage::get_singleton()->has_any_global_constant(name)) { + Variant constant = GDScriptLanguage::get_singleton()->get_any_global_constant(name); p_identifier->set_datatype(type_from_variant(constant, p_identifier)); p_identifier->is_constant = true; p_identifier->reduced_value = constant; @@ -3332,54 +3594,44 @@ void GDScriptAnalyzer::reduce_subscript(GDScriptParser::SubscriptNode *p_subscri if (p_subscript->attribute == nullptr) { return; } - if (p_subscript->base->is_constant) { + + GDScriptParser::DataType base_type = p_subscript->base->get_datatype(); + bool valid = false; + // If the base is a metatype, use the analyzer instead. + if (p_subscript->base->is_constant && !base_type.is_meta_type) { // Just try to get it. - bool valid = false; Variant value = p_subscript->base->reduced_value.get_named(p_subscript->attribute->name, valid); - - // If it's a GDScript instance, try to get the full script. Maybe it's not still completely loaded. - Ref<GDScript> gdscr = Ref<GDScript>(p_subscript->base->reduced_value); - if (!valid && gdscr.is_valid()) { - Error err = OK; - GDScriptCache::get_full_script(gdscr->get_path(), err); - if (err == OK) { - value = p_subscript->base->reduced_value.get_named(p_subscript->attribute->name, valid); - } - } - - if (!valid) { - push_error(vformat(R"(Cannot get member "%s" from "%s".)", p_subscript->attribute->name, p_subscript->base->reduced_value), p_subscript->index); - result_type.kind = GDScriptParser::DataType::VARIANT; - } else { + if (valid) { p_subscript->is_constant = true; p_subscript->reduced_value = value; result_type = type_from_variant(value, p_subscript); } + } else if (base_type.is_variant() || !base_type.is_hard_type()) { + valid = true; + result_type.kind = GDScriptParser::DataType::VARIANT; + mark_node_unsafe(p_subscript); } else { - GDScriptParser::DataType base_type = p_subscript->base->get_datatype(); - - if (base_type.is_variant() || !base_type.is_hard_type()) { - result_type.kind = GDScriptParser::DataType::VARIANT; - mark_node_unsafe(p_subscript); - } else { - reduce_identifier_from_base(p_subscript->attribute, &base_type); - GDScriptParser::DataType attr_type = p_subscript->attribute->get_datatype(); - if (attr_type.is_set()) { - result_type = attr_type; - p_subscript->is_constant = p_subscript->attribute->is_constant; - p_subscript->reduced_value = p_subscript->attribute->reduced_value; - } else { - if (base_type.kind == GDScriptParser::DataType::BUILTIN) { - push_error(vformat(R"(Cannot find member "%s" in base "%s".)", p_subscript->attribute->name, base_type.to_string()), p_subscript->attribute); + reduce_identifier_from_base(p_subscript->attribute, &base_type); + GDScriptParser::DataType attr_type = p_subscript->attribute->get_datatype(); + if (attr_type.is_set()) { + valid = true; + result_type = attr_type; + p_subscript->is_constant = p_subscript->attribute->is_constant; + p_subscript->reduced_value = p_subscript->attribute->reduced_value; + } else if (!base_type.is_meta_type || !base_type.is_constant) { + valid = base_type.kind != GDScriptParser::DataType::BUILTIN; #ifdef DEBUG_ENABLED - } else { - parser->push_warning(p_subscript, GDScriptWarning::UNSAFE_PROPERTY_ACCESS, p_subscript->attribute->name, base_type.to_string()); -#endif - } - result_type.kind = GDScriptParser::DataType::VARIANT; + if (valid) { + parser->push_warning(p_subscript, GDScriptWarning::UNSAFE_PROPERTY_ACCESS, p_subscript->attribute->name, base_type.to_string()); } +#endif + result_type.kind = GDScriptParser::DataType::VARIANT; } } + if (!valid) { + push_error(vformat(R"(Cannot find member "%s" in base "%s".)", p_subscript->attribute->name, type_from_metatype(base_type).to_string()), p_subscript->attribute); + result_type.kind = GDScriptParser::DataType::VARIANT; + } } else { if (p_subscript->index == nullptr) { return; @@ -3432,7 +3684,7 @@ void GDScriptAnalyzer::reduce_subscript(GDScriptParser::SubscriptNode *p_subscri case Variant::QUATERNION: case Variant::AABB: case Variant::OBJECT: - error = index_type.builtin_type != Variant::STRING; + error = index_type.builtin_type != Variant::STRING && index_type.builtin_type != Variant::STRING_NAME; break; // Expect String or number. case Variant::BASIS: @@ -3446,11 +3698,11 @@ void GDScriptAnalyzer::reduce_subscript(GDScriptParser::SubscriptNode *p_subscri case Variant::TRANSFORM3D: case Variant::PROJECTION: error = index_type.builtin_type != Variant::INT && index_type.builtin_type != Variant::FLOAT && - index_type.builtin_type != Variant::STRING; + index_type.builtin_type != Variant::STRING && index_type.builtin_type != Variant::STRING_NAME; break; // Expect String or int. case Variant::COLOR: - error = index_type.builtin_type != Variant::INT && index_type.builtin_type != Variant::STRING; + error = index_type.builtin_type != Variant::INT && index_type.builtin_type != Variant::STRING && index_type.builtin_type != Variant::STRING_NAME; break; // Don't support indexing, but we will check it later. case Variant::RID: @@ -3634,19 +3886,23 @@ void GDScriptAnalyzer::reduce_unary_op(GDScriptParser::UnaryOpNode *p_unary_op) return; } + GDScriptParser::DataType operand_type = p_unary_op->operand->get_datatype(); + if (p_unary_op->operand->is_constant) { p_unary_op->is_constant = true; p_unary_op->reduced_value = Variant::evaluate(p_unary_op->variant_op, p_unary_op->operand->reduced_value, Variant()); result = type_from_variant(p_unary_op->reduced_value, p_unary_op); - } else if (p_unary_op->operand->get_datatype().is_variant()) { + } + + if (operand_type.is_variant()) { result.kind = GDScriptParser::DataType::VARIANT; mark_node_unsafe(p_unary_op); } else { bool valid = false; - result = get_operation_type(p_unary_op->variant_op, p_unary_op->operand->get_datatype(), valid, p_unary_op); + result = get_operation_type(p_unary_op->variant_op, operand_type, valid, p_unary_op); if (!valid) { - push_error(vformat(R"(Invalid operand of type "%s" for unary operator "%s".)", p_unary_op->operand->get_datatype().to_string(), Variant::get_operator_name(p_unary_op->variant_op)), p_unary_op->operand); + push_error(vformat(R"(Invalid operand of type "%s" for unary operator "%s".)", operand_type.to_string(), Variant::get_operator_name(p_unary_op->variant_op)), p_unary_op); } } @@ -3714,7 +3970,13 @@ GDScriptParser::DataType GDScriptAnalyzer::type_from_variant(const Variant &p_va result.builtin_type = p_value.get_type(); result.type_source = GDScriptParser::DataType::ANNOTATED_EXPLICIT; // Constant has explicit type. - if (p_value.get_type() == Variant::OBJECT) { + if (p_value.get_type() == Variant::NIL) { + // A null value is a variant, not void. + result.kind = GDScriptParser::DataType::VARIANT; + } else if (p_value.get_type() == Variant::OBJECT) { + // Object is treated as a native type, not a builtin type. + result.kind = GDScriptParser::DataType::NATIVE; + Object *obj = p_value; if (!obj) { return GDScriptParser::DataType(); @@ -3729,43 +3991,42 @@ GDScriptParser::DataType GDScriptAnalyzer::type_from_variant(const Variant &p_va scr = obj->get_script(); } if (scr.is_valid()) { - result.script_type = scr; result.script_path = scr->get_path(); Ref<GDScript> gds = scr; if (gds.is_valid()) { result.kind = GDScriptParser::DataType::CLASS; // This might be an inner class, so we want to get the parser for the root. // But still get the inner class from that tree. - GDScript *current = gds.ptr(); - List<StringName> class_chain; - while (current->_owner) { - // Push to front so it's in reverse. - class_chain.push_front(current->name); - current = current->_owner; - } - - Ref<GDScriptParserRef> ref = get_parser_for(current->get_path()); + String script_path = gds->get_script_path(); + Ref<GDScriptParserRef> ref = get_parser_for(script_path); if (ref.is_null()) { - push_error("Could not find script in path.", p_source); + push_error(vformat(R"(Could not find script "%s".)", script_path), p_source); GDScriptParser::DataType error_type; error_type.kind = GDScriptParser::DataType::VARIANT; return error_type; } - ref->raise_status(GDScriptParserRef::INTERFACE_SOLVED); - - GDScriptParser::ClassNode *found = ref->get_parser()->head; - - // It should be okay to assume this exists, since we have a complete script already. - for (const StringName &E : class_chain) { - found = found->get_member(E).m_class; + Error err = ref->raise_status(GDScriptParserRef::INHERITANCE_SOLVED); + GDScriptParser::ClassNode *found = nullptr; + if (err == OK) { + found = ref->get_parser()->find_class(gds->fully_qualified_name); + if (found != nullptr) { + err = resolve_class_inheritance(found, p_source); + } + } + if (err || found == nullptr) { + push_error(vformat(R"(Could not resolve script "%s".)", script_path), p_source); + GDScriptParser::DataType error_type; + error_type.kind = GDScriptParser::DataType::VARIANT; + return error_type; } result.class_type = found; result.script_path = ref->get_parser()->script_path; } else { result.kind = GDScriptParser::DataType::SCRIPT; + result.native_type = scr->get_instance_base_type(); } - result.native_type = scr->get_instance_base_type(); + result.script_type = scr; } else { result.kind = GDScriptParser::DataType::NATIVE; if (result.native_type == GDScriptNativeClass::get_class_static()) { @@ -3889,8 +4150,12 @@ bool GDScriptAnalyzer::get_function_signature(GDScriptParser::Node *p_source, bo push_error(vformat(R"(Member "%s" is not a function.)", function_name), p_source); return false; } + + resolve_class_member(base_class, function_name, p_source); found_function = base_class->get_member(function_name).function; } + + resolve_class_inheritance(base_class, p_source); base_class = base_class->base_type.class_type; } @@ -4059,12 +4324,10 @@ bool GDScriptAnalyzer::is_shadowing(GDScriptParser::IdentifierNode *p_local, con base_class = base_class->base_type.class_type; } - StringName base_native = base.native_type; - - ERR_FAIL_COND_V_MSG(!class_exists(base_native), false, "Non-existent native base class."); - - StringName parent = base_native; + StringName parent = base.native_type; while (parent != StringName()) { + ERR_FAIL_COND_V_MSG(!class_exists(parent), false, "Non-existent native base class."); + if (ClassDB::has_method(parent, name, true)) { parser->push_warning(p_local, GDScriptWarning::SHADOWED_VARIABLE_BASE_CLASS, p_context, p_local->name, "method", parent); return true; @@ -4179,7 +4442,7 @@ bool GDScriptAnalyzer::is_type_compatible(const GDScriptParser::DataType &p_targ // Variant array can't be appended to typed array. valid = false; } else { - valid = is_type_compatible(p_target.get_container_element_type(), p_source.get_container_element_type(), false); + valid = is_type_compatible(p_target.get_container_element_type(), p_source.get_container_element_type(), p_allow_implicit_conversion); } } } @@ -4254,6 +4517,7 @@ bool GDScriptAnalyzer::is_type_compatible(const GDScriptParser::DataType &p_targ case GDScriptParser::DataType::VARIANT: case GDScriptParser::DataType::BUILTIN: case GDScriptParser::DataType::ENUM: + case GDScriptParser::DataType::RESOLVING: case GDScriptParser::DataType::UNRESOLVED: break; // Already solved before. } @@ -4290,6 +4554,7 @@ bool GDScriptAnalyzer::is_type_compatible(const GDScriptParser::DataType &p_targ case GDScriptParser::DataType::VARIANT: case GDScriptParser::DataType::BUILTIN: case GDScriptParser::DataType::ENUM: + case GDScriptParser::DataType::RESOLVING: case GDScriptParser::DataType::UNRESOLVED: break; // Already solved before. } @@ -4304,6 +4569,10 @@ void GDScriptAnalyzer::push_error(const String &p_message, const GDScriptParser: void GDScriptAnalyzer::mark_node_unsafe(const GDScriptParser::Node *p_node) { #ifdef DEBUG_ENABLED + if (p_node == nullptr) { + return; + } + for (int i = p_node->start_line; i <= p_node->end_line; i++) { parser->unsafe_lines.insert(i); } @@ -4336,39 +4605,46 @@ Ref<GDScriptParserRef> GDScriptAnalyzer::get_parser_for(const String &p_path) { } Error GDScriptAnalyzer::resolve_inheritance() { - return resolve_inheritance(parser->head); + return resolve_class_inheritance(parser->head, true); } Error GDScriptAnalyzer::resolve_interface() { - resolve_class_interface(parser->head); + resolve_class_interface(parser->head, true); return parser->errors.is_empty() ? OK : ERR_PARSE_ERROR; } Error GDScriptAnalyzer::resolve_body() { - resolve_class_body(parser->head); + resolve_class_body(parser->head, true); return parser->errors.is_empty() ? OK : ERR_PARSE_ERROR; } -Error GDScriptAnalyzer::resolve_program() { - resolve_class_interface(parser->head); - resolve_class_body(parser->head); - +Error GDScriptAnalyzer::resolve_dependencies() { for (KeyValue<String, Ref<GDScriptParserRef>> &K : depended_parsers) { if (K.value.is_null()) { return ERR_PARSE_ERROR; } - K.value->raise_status(GDScriptParserRef::FULLY_SOLVED); + K.value->raise_status(GDScriptParserRef::INHERITANCE_SOLVED); } + return parser->errors.is_empty() ? OK : ERR_PARSE_ERROR; } Error GDScriptAnalyzer::analyze() { parser->errors.clear(); - Error err = resolve_inheritance(parser->head); + Error err = OK; + + err = resolve_inheritance(); if (err) { return err; } - return resolve_program(); + + resolve_interface(); + resolve_body(); + if (!parser->errors.is_empty()) { + return ERR_PARSE_ERROR; + } + + return resolve_dependencies(); } GDScriptAnalyzer::GDScriptAnalyzer(GDScriptParser *p_parser) { diff --git a/modules/gdscript/gdscript_analyzer.h b/modules/gdscript/gdscript_analyzer.h index 23a3ad39a5..a4d9efb094 100644 --- a/modules/gdscript/gdscript_analyzer.h +++ b/modules/gdscript/gdscript_analyzer.h @@ -50,18 +50,22 @@ class GDScriptAnalyzer { Error check_native_member_name_conflict(const StringName &p_member_name, const GDScriptParser::Node *p_member_node, const StringName &p_native_type_string); Error check_class_member_name_conflict(const GDScriptParser::ClassNode *p_class_node, const StringName &p_member_name, const GDScriptParser::Node *p_member_node); - Error resolve_inheritance(GDScriptParser::ClassNode *p_class, bool p_recursive = true); + void get_class_node_current_scope_classes(GDScriptParser::ClassNode *p_node, List<GDScriptParser::ClassNode *> *p_list); + + Error resolve_class_inheritance(GDScriptParser::ClassNode *p_class, const GDScriptParser::Node *p_source = nullptr); + Error resolve_class_inheritance(GDScriptParser::ClassNode *p_class, bool p_recursive); GDScriptParser::DataType resolve_datatype(GDScriptParser::TypeNode *p_type); void decide_suite_type(GDScriptParser::Node *p_suite, GDScriptParser::Node *p_statement); - // This traverses the tree to resolve all TypeNodes. - Error resolve_program(); - void resolve_annotation(GDScriptParser::AnnotationNode *p_annotation); - void resolve_class_interface(GDScriptParser::ClassNode *p_class); - void resolve_class_body(GDScriptParser::ClassNode *p_class); - void resolve_function_signature(GDScriptParser::FunctionNode *p_function); + void resolve_class_member(GDScriptParser::ClassNode *p_class, StringName p_name, const GDScriptParser::Node *p_source = nullptr); + void resolve_class_member(GDScriptParser::ClassNode *p_class, int p_index, const GDScriptParser::Node *p_source = nullptr); + void resolve_class_interface(GDScriptParser::ClassNode *p_class, const GDScriptParser::Node *p_source = nullptr); + void resolve_class_interface(GDScriptParser::ClassNode *p_class, bool p_recursive); + void resolve_class_body(GDScriptParser::ClassNode *p_class, const GDScriptParser::Node *p_source = nullptr); + void resolve_class_body(GDScriptParser::ClassNode *p_class, bool p_recursive); + void resolve_function_signature(GDScriptParser::FunctionNode *p_function, const GDScriptParser::Node *p_source = nullptr); void resolve_function_body(GDScriptParser::FunctionNode *p_function); void resolve_node(GDScriptParser::Node *p_node, bool p_is_root = true); void resolve_suite(GDScriptParser::SuiteNode *p_suite); @@ -113,7 +117,7 @@ class GDScriptAnalyzer { GDScriptParser::DataType get_operation_type(Variant::Operator p_operation, const GDScriptParser::DataType &p_a, bool &r_valid, const GDScriptParser::Node *p_source); void update_array_literal_element_type(const GDScriptParser::DataType &p_base_type, GDScriptParser::ArrayNode *p_array_literal); bool is_type_compatible(const GDScriptParser::DataType &p_target, const GDScriptParser::DataType &p_source, bool p_allow_implicit_conversion = false, const GDScriptParser::Node *p_source_node = nullptr); - void push_error(const String &p_message, const GDScriptParser::Node *p_origin); + void push_error(const String &p_message, const GDScriptParser::Node *p_origin = nullptr); void mark_node_unsafe(const GDScriptParser::Node *p_node); void mark_lambda_use_self(); bool class_exists(const StringName &p_class) const; @@ -126,6 +130,7 @@ public: Error resolve_inheritance(); Error resolve_interface(); Error resolve_body(); + Error resolve_dependencies(); Error analyze(); GDScriptAnalyzer(GDScriptParser *p_parser); diff --git a/modules/gdscript/gdscript_byte_codegen.cpp b/modules/gdscript/gdscript_byte_codegen.cpp index fa158591fd..1bc83fbbb5 100644 --- a/modules/gdscript/gdscript_byte_codegen.cpp +++ b/modules/gdscript/gdscript_byte_codegen.cpp @@ -164,7 +164,7 @@ void GDScriptByteCodeGenerator::write_start(GDScript *p_script, const StringName function->name = p_function_name; function->_script = p_script; - function->source = p_script->get_path(); + function->source = p_script->get_script_path(); #ifdef DEBUG_ENABLED function->func_cname = (String(function->source) + " - " + String(p_function_name)).utf8(); diff --git a/modules/gdscript/gdscript_cache.cpp b/modules/gdscript/gdscript_cache.cpp index 699ce67933..6faf2dde73 100644 --- a/modules/gdscript/gdscript_cache.cpp +++ b/modules/gdscript/gdscript_cache.cpp @@ -50,6 +50,13 @@ GDScriptParser *GDScriptParserRef::get_parser() const { return parser; } +GDScriptAnalyzer *GDScriptParserRef::get_analyzer() { + if (analyzer == nullptr) { + analyzer = memnew(GDScriptAnalyzer(parser)); + } + return analyzer; +} + Error GDScriptParserRef::raise_status(Status p_new_status) { ERR_FAIL_COND_V(parser == nullptr, ERR_INVALID_DATA); @@ -64,23 +71,22 @@ Error GDScriptParserRef::raise_status(Status p_new_status) { result = parser->parse(GDScriptCache::get_source_code(path), path, false); break; case PARSED: { - analyzer = memnew(GDScriptAnalyzer(parser)); status = INHERITANCE_SOLVED; - Error inheritance_result = analyzer->resolve_inheritance(); + Error inheritance_result = get_analyzer()->resolve_inheritance(); if (result == OK) { result = inheritance_result; } } break; case INHERITANCE_SOLVED: { status = INTERFACE_SOLVED; - Error interface_result = analyzer->resolve_interface(); + Error interface_result = get_analyzer()->resolve_interface(); if (result == OK) { result = interface_result; } } break; case INTERFACE_SOLVED: { status = FULLY_SOLVED; - Error body_result = analyzer->resolve_body(); + Error body_result = get_analyzer()->resolve_body(); if (result == OK) { result = body_result; } @@ -128,6 +134,10 @@ void GDScriptCache::move_script(const String &p_from, const String &p_to) { MutexLock lock(singleton->mutex); + if (singleton->cleared) { + return; + } + for (KeyValue<String, HashSet<String>> &E : singleton->packed_scene_dependencies) { if (E.value.has(p_from)) { E.value.insert(p_to); @@ -158,6 +168,10 @@ void GDScriptCache::remove_script(const String &p_path) { MutexLock lock(singleton->mutex); + if (singleton->cleared) { + return; + } + for (KeyValue<String, HashSet<String>> &E : singleton->packed_scene_dependencies) { if (!E.value.has(p_path)) { continue; @@ -371,6 +385,10 @@ void GDScriptCache::clear_unreferenced_packed_scenes() { MutexLock lock(singleton->mutex); + if (singleton->cleared) { + return; + } + for (KeyValue<String, HashSet<String>> &E : singleton->packed_scene_dependencies) { if (E.value.size() > 0 || !ResourceLoader::is_imported(E.key)) { continue; @@ -388,6 +406,11 @@ void GDScriptCache::clear() { MutexLock lock(singleton->mutex); + if (singleton->cleared) { + return; + } + singleton->cleared = true; + RBSet<Ref<GDScriptParserRef>> parser_map_refs; for (KeyValue<String, GDScriptParserRef *> &E : singleton->parser_map) { parser_map_refs.insert(E.value); @@ -398,6 +421,9 @@ void GDScriptCache::clear() { E->clear(); } + singleton->packed_scene_dependencies.clear(); + singleton->packed_scene_cache.clear(); + parser_map_refs.clear(); singleton->parser_map.clear(); singleton->shallow_gdscript_cache.clear(); @@ -412,7 +438,8 @@ GDScriptCache::GDScriptCache() { } GDScriptCache::~GDScriptCache() { - destructing = true; - clear(); + if (!cleared) { + clear(); + } singleton = nullptr; } diff --git a/modules/gdscript/gdscript_cache.h b/modules/gdscript/gdscript_cache.h index e7e1901d5d..43a45bfef6 100644 --- a/modules/gdscript/gdscript_cache.h +++ b/modules/gdscript/gdscript_cache.h @@ -65,6 +65,7 @@ public: bool is_valid() const; Status get_status() const; GDScriptParser *get_parser() const; + GDScriptAnalyzer *get_analyzer(); Error raise_status(Status p_new_status); void clear(); @@ -87,7 +88,7 @@ class GDScriptCache { static GDScriptCache *singleton; - bool destructing = false; + bool cleared = false; Mutex mutex; @@ -104,13 +105,6 @@ public: static Ref<PackedScene> get_packed_scene(const String &p_path, Error &r_error, const String &p_owner = ""); static void clear_unreferenced_packed_scenes(); - static bool is_destructing() { - if (singleton == nullptr) { - return true; - } - return singleton->destructing; - }; - static void clear(); GDScriptCache(); diff --git a/modules/gdscript/gdscript_codegen.h b/modules/gdscript/gdscript_codegen.h index 5972481c3a..6a94c25c88 100644 --- a/modules/gdscript/gdscript_codegen.h +++ b/modules/gdscript/gdscript_codegen.h @@ -59,7 +59,7 @@ public: type = p_type; } Address(AddressMode p_mode, uint32_t p_address, const GDScriptDataType &p_type = GDScriptDataType()) { - mode = p_mode, + mode = p_mode; address = p_address; type = p_type; } diff --git a/modules/gdscript/gdscript_compiler.cpp b/modules/gdscript/gdscript_compiler.cpp index ea93e1ebfc..50588110c4 100644 --- a/modules/gdscript/gdscript_compiler.cpp +++ b/modules/gdscript/gdscript_compiler.cpp @@ -117,8 +117,7 @@ GDScriptDataType GDScriptCompiler::_gdtype_from_datatype(const GDScriptParser::D result.builtin_type = p_datatype.builtin_type; result.native_type = p_datatype.native_type; - String root_name = p_datatype.class_type->fqcn.get_slice("::", 0); - bool is_local_class = !root_name.is_empty() && root_name == main_script->fully_qualified_name; + bool is_local_class = parser->has_class(p_datatype.class_type); Ref<GDScript> script; if (is_local_class) { @@ -157,6 +156,7 @@ GDScriptDataType GDScriptCompiler::_gdtype_from_datatype(const GDScriptParser::D result.builtin_type = Variant::INT; } break; + case GDScriptParser::DataType::RESOLVING: case GDScriptParser::DataType::UNRESOLVED: { ERR_PRINT("Parser bug: converting unresolved type."); return GDScriptDataType(); @@ -1256,9 +1256,30 @@ GDScriptCodeGenerator::Address GDScriptCompiler::_parse_match_pattern(CodeGen &c equality_type.kind = GDScriptDataType::BUILTIN; equality_type.builtin_type = Variant::BOOL; + GDScriptCodeGenerator::Address type_string_addr = codegen.add_constant(Variant::STRING); + GDScriptCodeGenerator::Address type_string_name_addr = codegen.add_constant(Variant::STRING_NAME); + // Check type equality. GDScriptCodeGenerator::Address type_equality_addr = codegen.add_temporary(equality_type); codegen.generator->write_binary_operator(type_equality_addr, Variant::OP_EQUAL, p_type_addr, literal_type_addr); + + // Check if StringName <-> String comparison is possible. + GDScriptCodeGenerator::Address type_comp_addr_1 = codegen.add_temporary(equality_type); + GDScriptCodeGenerator::Address type_comp_addr_2 = codegen.add_temporary(equality_type); + + codegen.generator->write_binary_operator(type_comp_addr_1, Variant::OP_EQUAL, p_type_addr, type_string_addr); + codegen.generator->write_binary_operator(type_comp_addr_2, Variant::OP_EQUAL, literal_type_addr, type_string_name_addr); + codegen.generator->write_binary_operator(type_comp_addr_1, Variant::OP_AND, type_comp_addr_1, type_comp_addr_2); + codegen.generator->write_binary_operator(type_equality_addr, Variant::OP_OR, type_equality_addr, type_comp_addr_1); + + codegen.generator->write_binary_operator(type_comp_addr_1, Variant::OP_EQUAL, p_type_addr, type_string_name_addr); + codegen.generator->write_binary_operator(type_comp_addr_2, Variant::OP_EQUAL, literal_type_addr, type_string_addr); + codegen.generator->write_binary_operator(type_comp_addr_1, Variant::OP_AND, type_comp_addr_1, type_comp_addr_2); + codegen.generator->write_binary_operator(type_equality_addr, Variant::OP_OR, type_equality_addr, type_comp_addr_1); + + codegen.generator->pop_temporary(); // Remove type_comp_addr_2 from stack. + codegen.generator->pop_temporary(); // Remove type_comp_addr_1 from stack. + codegen.generator->write_and_left_operand(type_equality_addr); // Get literal. @@ -2096,8 +2117,8 @@ GDScriptFunction *GDScriptCompiler::_parse_function(Error &r_error, GDScript *p_ if (EngineDebugger::is_active()) { String signature; // Path. - if (!p_script->get_path().is_empty()) { - signature += p_script->get_path(); + if (!p_script->get_script_path().is_empty()) { + signature += p_script->get_script_path(); } // Location. if (p_func) { @@ -2278,7 +2299,7 @@ Error GDScriptCompiler::_populate_class_members(GDScript *p_script, const GDScri return ERR_COMPILATION_FAILED; } - if (base.ptr() == main_script || main_script->is_subclass(base.ptr())) { + if (main_script->has_class(base.ptr())) { Error err = _populate_class_members(base.ptr(), p_class->base_type.class_type, p_keep_state); if (err) { return err; @@ -2368,6 +2389,7 @@ Error GDScriptCompiler::_populate_class_members(GDScript *p_script, const GDScri #ifdef TOOLS_ENABLED if (variable->initializer != nullptr && variable->initializer->is_constant) { p_script->member_default_values[name] = variable->initializer->reduced_value; + GDScriptCompiler::convert_to_initializer_type(p_script->member_default_values[name], variable); } else { p_script->member_default_values.erase(name); } @@ -2625,6 +2647,20 @@ Error GDScriptCompiler::_compile_class(GDScript *p_script, const GDScriptParser: return OK; } +void GDScriptCompiler::convert_to_initializer_type(Variant &p_variant, const GDScriptParser::VariableNode *p_node) { + // Set p_variant to the value of p_node's initializer, with the type of p_node's variable. + GDScriptParser::DataType member_t = p_node->datatype; + GDScriptParser::DataType init_t = p_node->initializer->datatype; + if (member_t.is_hard_type() && init_t.is_hard_type() && + member_t.kind == GDScriptParser::DataType::BUILTIN && init_t.kind == GDScriptParser::DataType::BUILTIN) { + if (Variant::can_convert_strict(init_t.builtin_type, member_t.builtin_type)) { + Variant *v = &p_node->initializer->reduced_value; + Callable::CallError ce; + Variant::construct(member_t.builtin_type, p_variant, const_cast<const Variant **>(&v), 1, ce); + } + } +} + void GDScriptCompiler::make_scripts(GDScript *p_script, const GDScriptParser::ClassNode *p_class, bool p_keep_state) { p_script->fully_qualified_name = p_class->fqcn; p_script->name = p_class->identifier ? p_class->identifier->name : ""; diff --git a/modules/gdscript/gdscript_compiler.h b/modules/gdscript/gdscript_compiler.h index cba585e5a5..fc5aa05190 100644 --- a/modules/gdscript/gdscript_compiler.h +++ b/modules/gdscript/gdscript_compiler.h @@ -140,6 +140,7 @@ class GDScriptCompiler { bool within_await = false; public: + static void convert_to_initializer_type(Variant &p_variant, const GDScriptParser::VariableNode *p_node); static void make_scripts(GDScript *p_script, const GDScriptParser::ClassNode *p_class, bool p_keep_state); Error compile(const GDScriptParser *p_parser, GDScript *p_script, bool p_keep_state = false); diff --git a/modules/gdscript/gdscript_editor.cpp b/modules/gdscript/gdscript_editor.cpp index 6d5936ad2e..79387d1bf6 100644 --- a/modules/gdscript/gdscript_editor.cpp +++ b/modules/gdscript/gdscript_editor.cpp @@ -1612,7 +1612,7 @@ static bool _guess_expression_type(GDScriptParser::CompletionContext &p_context, } } - if (!found) { + if (!found && base.value.get_type() != Variant::NIL) { found = _guess_method_return_type_from_base(c, base, call->function_name, r_type); } } @@ -2272,6 +2272,11 @@ static bool _guess_method_return_type_from_base(GDScriptParser::CompletionContex if (base_type.class_type->has_function(p_method)) { const GDScriptParser::FunctionNode *method = base_type.class_type->get_member(p_method).function; if (!is_static || method->is_static) { + if (method->get_datatype().is_set() && !method->get_datatype().is_variant()) { + r_type.type = method->get_datatype(); + return true; + } + int last_return_line = -1; const GDScriptParser::ExpressionNode *last_returned_value = nullptr; GDScriptParser::CompletionContext c = p_context; @@ -2285,10 +2290,6 @@ static bool _guess_method_return_type_from_base(GDScriptParser::CompletionContex if (_guess_expression_type(c, last_returned_value, r_type)) { return true; } - if (method->get_datatype().is_set() && !method->get_datatype().is_variant()) { - r_type.type = method->get_datatype(); - return true; - } } } } @@ -2624,7 +2625,7 @@ static void _find_call_arguments(GDScriptParser::CompletionContext &p_context, c } } - if (p_context.base != nullptr && subscript->is_attribute) { + if (subscript->is_attribute) { bool found_type = _get_subscript_type(p_context, subscript, base_type, &base); if (!found_type) { @@ -3288,6 +3289,7 @@ static Error _lookup_symbol_from_base(const GDScriptParser::DataType &p_base, co parser.parse(p_code, p_path, true); GDScriptParser::CompletionContext context = parser.get_completion_context(); + context.base = p_owner; // Allows class functions with the names like built-ins to be handled properly. if (context.type != GDScriptParser::COMPLETION_ATTRIBUTE) { @@ -3460,7 +3462,9 @@ static Error _lookup_symbol_from_base(const GDScriptParser::DataType &p_base, co break; } GDScriptCompletionIdentifier base; - if (!_guess_expression_type(context, subscript->base, base)) { + + bool found_type = _get_subscript_type(context, subscript, base.type); + if (!found_type && !_guess_expression_type(context, subscript->base, base)) { break; } diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp index f2aafe9f0c..103269f0f5 100644 --- a/modules/gdscript/gdscript_parser.cpp +++ b/modules/gdscript/gdscript_parser.cpp @@ -642,6 +642,53 @@ void GDScriptParser::parse_program() { clear_unused_annotations(); } +GDScriptParser::ClassNode *GDScriptParser::find_class(const String &p_qualified_name) const { + String first = p_qualified_name.get_slice("::", 0); + + Vector<String> class_names; + GDScriptParser::ClassNode *result = nullptr; + // Empty initial name means start at the head. + if (first.is_empty() || (head->identifier && first == head->identifier->name)) { + class_names = p_qualified_name.split("::"); + result = head; + } else if (p_qualified_name.begins_with(script_path)) { + // Script path could have a class path separator("::") in it. + class_names = p_qualified_name.trim_prefix(script_path).split("::"); + result = head; + } else if (head->has_member(first)) { + class_names = p_qualified_name.split("::"); + GDScriptParser::ClassNode::Member member = head->get_member(first); + if (member.type == GDScriptParser::ClassNode::Member::CLASS) { + result = member.m_class; + } + } + + // Starts at index 1 because index 0 was handled above. + for (int i = 1; result != nullptr && i < class_names.size(); i++) { + String current_name = class_names[i]; + GDScriptParser::ClassNode *next = nullptr; + if (result->has_member(current_name)) { + GDScriptParser::ClassNode::Member member = result->get_member(current_name); + if (member.type == GDScriptParser::ClassNode::Member::CLASS) { + next = member.m_class; + } + } + result = next; + } + + return result; +} + +bool GDScriptParser::has_class(const GDScriptParser::ClassNode *p_class) const { + if (head->fqcn.is_empty() && p_class->fqcn.get_slice("::", 0).is_empty()) { + return p_class == head; + } else if (p_class->fqcn.begins_with(head->fqcn)) { + return find_class(p_class->fqcn.trim_prefix(head->fqcn)) == p_class; + } + + return false; +} + GDScriptParser::ClassNode *GDScriptParser::parse_class() { ClassNode *n_class = alloc_node<ClassNode>(); @@ -2240,7 +2287,7 @@ GDScriptParser::IdentifierNode *GDScriptParser::parse_identifier() { GDScriptParser::ExpressionNode *GDScriptParser::parse_identifier(ExpressionNode *p_previous_operand, bool p_can_assign) { if (!previous.is_identifier()) { - ERR_FAIL_V_MSG(nullptr, "Parser bug: parsing literal node without literal token."); + ERR_FAIL_V_MSG(nullptr, "Parser bug: parsing identifier node without identifier token."); } IdentifierNode *identifier = alloc_node<IdentifierNode>(); complete_extents(identifier); @@ -4042,11 +4089,12 @@ String GDScriptParser::DataType::to_string() const { } case ENUM: return enum_type.operator String() + " (enum)"; + case RESOLVING: case UNRESOLVED: return "<unresolved type>"; } - ERR_FAIL_V_MSG("<unresolved type", "Kind set outside the enum range."); + ERR_FAIL_V_MSG("<unresolved type>", "Kind set outside the enum range."); } static Variant::Type _variant_type_to_typed_array_element_type(Variant::Type p_type) { diff --git a/modules/gdscript/gdscript_parser.h b/modules/gdscript/gdscript_parser.h index d092a2a5e9..540ef1c561 100644 --- a/modules/gdscript/gdscript_parser.h +++ b/modules/gdscript/gdscript_parser.h @@ -107,6 +107,7 @@ public: CLASS, // GDScript. ENUM, // Enumeration. VARIANT, // Can be any type. + RESOLVING, // Currently resolving. UNRESOLVED, }; Kind kind = UNRESOLVED; @@ -133,9 +134,10 @@ public: MethodInfo method_info; // For callable/signals. HashMap<StringName, int64_t> enum_values; // For enums. - _FORCE_INLINE_ bool is_set() const { return kind != UNRESOLVED; } + _FORCE_INLINE_ bool is_set() const { return kind != RESOLVING && kind != UNRESOLVED; } + _FORCE_INLINE_ bool is_resolving() const { return kind == RESOLVING; } _FORCE_INLINE_ bool has_no_type() const { return type_source == UNDETECTED; } - _FORCE_INLINE_ bool is_variant() const { return kind == VARIANT || kind == UNRESOLVED; } + _FORCE_INLINE_ bool is_variant() const { return kind == VARIANT || kind == RESOLVING || kind == UNRESOLVED; } _FORCE_INLINE_ bool is_hard_type() const { return type_source > INFERRED; } String to_string() const; @@ -188,6 +190,7 @@ public: return script_type == p_other.script_type; case CLASS: return class_type == p_other.class_type; + case RESOLVING: case UNRESOLVED: break; } @@ -516,6 +519,32 @@ public: }; EnumNode::Value enum_value; + String get_name() const { + switch (type) { + case UNDEFINED: + return "<undefined member>"; + case CLASS: + // All class-type members have an id. + return m_class->identifier->name; + case CONSTANT: + return constant->identifier->name; + case FUNCTION: + return function->identifier->name; + case SIGNAL: + return signal->identifier->name; + case VARIABLE: + return variable->identifier->name; + case ENUM: + // All enum-type members have an id. + return m_enum->identifier->name; + case ENUM_VALUE: + return enum_value.identifier->name; + case GROUP: + return annotation->export_info.name; + } + return ""; + } + String get_type_name() const { switch (type) { case UNDEFINED: @@ -576,31 +605,42 @@ public: return variable->get_datatype(); case ENUM: return m_enum->get_datatype(); - case ENUM_VALUE: { - // Always integer. - DataType out_type; - out_type.type_source = DataType::ANNOTATED_EXPLICIT; - out_type.kind = DataType::BUILTIN; - out_type.builtin_type = Variant::INT; - return out_type; - } - case SIGNAL: { - DataType out_type; - out_type.type_source = DataType::ANNOTATED_EXPLICIT; - out_type.kind = DataType::BUILTIN; - out_type.builtin_type = Variant::SIGNAL; - // TODO: Add parameter info. - return out_type; - } - case GROUP: { + case ENUM_VALUE: + return enum_value.identifier->get_datatype(); + case SIGNAL: + return signal->get_datatype(); + case GROUP: return DataType(); - } case UNDEFINED: return DataType(); } ERR_FAIL_V_MSG(DataType(), "Reaching unhandled type."); } + Node *get_source_node() const { + switch (type) { + case CLASS: + return m_class; + case CONSTANT: + return constant; + case FUNCTION: + return function; + case VARIABLE: + return variable; + case ENUM: + return m_enum; + case ENUM_VALUE: + return enum_value.identifier; + case SIGNAL: + return signal; + case GROUP: + return annotation; + case UNDEFINED: + return nullptr; + } + ERR_FAIL_V_MSG(nullptr, "Reaching unhandled type."); + } + Member() {} Member(ClassNode *p_class) { @@ -1430,6 +1470,8 @@ public: Error parse(const String &p_source_code, const String &p_script_path, bool p_for_completion); ClassNode *get_tree() const { return head; } bool is_tool() const { return _is_tool; } + ClassNode *find_class(const String &p_qualified_name) const; + bool has_class(const GDScriptParser::ClassNode *p_class) const; static Variant::Type get_builtin_type(const StringName &p_type); CompletionContext get_completion_context() const { return completion_context; } diff --git a/modules/gdscript/gdscript_utility_functions.cpp b/modules/gdscript/gdscript_utility_functions.cpp index bcbe8b8d2b..27b6792e84 100644 --- a/modules/gdscript/gdscript_utility_functions.cpp +++ b/modules/gdscript/gdscript_utility_functions.cpp @@ -294,6 +294,7 @@ struct GDScriptUtilityFunctionsDefinitions { } GDScript *p = base.ptr(); + String path = p->get_script_path(); Vector<StringName> sname; while (p->_owner) { @@ -302,7 +303,7 @@ struct GDScriptUtilityFunctionsDefinitions { } sname.reverse(); - if (!p->path.is_resource_file()) { + if (!path.is_resource_file()) { r_error.error = Callable::CallError::CALL_ERROR_INVALID_ARGUMENT; r_error.argument = 0; r_error.expected = Variant::DICTIONARY; @@ -317,7 +318,7 @@ struct GDScriptUtilityFunctionsDefinitions { Dictionary d; d["@subpath"] = cp; - d["@path"] = p->get_path(); + d["@path"] = path; for (const KeyValue<StringName, GDScript::MemberInfo> &E : base->member_indices) { if (!d.has(E.key)) { diff --git a/modules/gdscript/gdscript_vm.cpp b/modules/gdscript/gdscript_vm.cpp index c73ba798aa..fdcc0625d7 100644 --- a/modules/gdscript/gdscript_vm.cpp +++ b/modules/gdscript/gdscript_vm.cpp @@ -2227,7 +2227,7 @@ Variant GDScriptFunction::call(GDScriptInstance *p_instance, const Variant **p_a } #ifdef DEBUG_ENABLED gdfs->state.function_name = name; - gdfs->state.script_path = _script->get_path(); + gdfs->state.script_path = _script->get_script_path(); #endif gdfs->state.defarg = defarg; gdfs->function = this; diff --git a/modules/gdscript/language_server/godot_lsp.h b/modules/gdscript/language_server/godot_lsp.h index 024da1cab7..8b58d7731e 100644 --- a/modules/gdscript/language_server/godot_lsp.h +++ b/modules/gdscript/language_server/godot_lsp.h @@ -702,7 +702,7 @@ struct DiagnosticRelatedInformation { Dictionary to_json() const { Dictionary dict; - dict["location"] = location.to_json(), + dict["location"] = location.to_json(); dict["message"] = message; return dict; } diff --git a/modules/gdscript/tests/scripts/analyzer/errors/class_name_shadows_builtin_type.out b/modules/gdscript/tests/scripts/analyzer/errors/class_name_shadows_builtin_type.out index 87863baf75..b9a1d301ad 100644 --- a/modules/gdscript/tests/scripts/analyzer/errors/class_name_shadows_builtin_type.out +++ b/modules/gdscript/tests/scripts/analyzer/errors/class_name_shadows_builtin_type.out @@ -1,2 +1,2 @@ GDTEST_ANALYZER_ERROR -The member "Vector2" cannot have the same name as a builtin type. +Class "Vector2" hides a built-in type. diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_inheritance.gd b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_inheritance.gd new file mode 100644 index 0000000000..d2f6404cd2 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_inheritance.gd @@ -0,0 +1,8 @@ +func test(): + print(InnerA.new()) + +class InnerA extends InnerB: + pass + +class InnerB extends InnerA: + pass diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_inheritance.out b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_inheritance.out new file mode 100644 index 0000000000..75a94baa17 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_inheritance.out @@ -0,0 +1,2 @@ +GDTEST_ANALYZER_ERROR +Cyclic inheritance. diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_const.gd b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_const.gd new file mode 100644 index 0000000000..4292534951 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_const.gd @@ -0,0 +1,5 @@ +func test(): + print(c1) + +const c1 = c2 +const c2 = c1 diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_const.out b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_const.out new file mode 100644 index 0000000000..e71b3fc56a --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_const.out @@ -0,0 +1,2 @@ +GDTEST_ANALYZER_ERROR +Could not resolve member "c1": Cyclic reference. diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_enum.gd b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_enum.gd new file mode 100644 index 0000000000..1caef3d366 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_enum.gd @@ -0,0 +1,5 @@ +func test(): + print(E1.V) + +enum E1 {V = E2.V} +enum E2 {V = E1.V} diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_enum.out b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_enum.out new file mode 100644 index 0000000000..1b6569ba3a --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_enum.out @@ -0,0 +1,2 @@ +GDTEST_ANALYZER_ERROR +Could not resolve member "E1": Cyclic reference. diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_enum_value.gd b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_enum_value.gd new file mode 100644 index 0000000000..237758f340 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_enum_value.gd @@ -0,0 +1,5 @@ +func test(): + print(EV1) + +enum {EV1 = EV2} +enum {EV2 = EV1} diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_enum_value.out b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_enum_value.out new file mode 100644 index 0000000000..233f5fee25 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_enum_value.out @@ -0,0 +1,2 @@ +GDTEST_ANALYZER_ERROR +Could not resolve member "EV1": Cyclic reference. diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_external.gd b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_external.gd new file mode 100644 index 0000000000..52e0d60389 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_external.gd @@ -0,0 +1,6 @@ +func test(): + print(v) + +var v = A.v + +const A = preload("cyclic_ref_external_a.notest.gd") diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_external.out b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_external.out new file mode 100644 index 0000000000..64a6bd417d --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_external.out @@ -0,0 +1,2 @@ +GDTEST_ANALYZER_ERROR +Could not resolve member "v". diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_external_a.notest.gd b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_external_a.notest.gd new file mode 100644 index 0000000000..9ef1769250 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_external_a.notest.gd @@ -0,0 +1,3 @@ +const B = preload("cyclic_ref_external.gd") + +var v = B.v diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_func.gd b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_func.gd new file mode 100644 index 0000000000..b610464c44 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_func.gd @@ -0,0 +1,9 @@ +func test(): + print(f1()) + print(f2()) + +static func f1(p := f2()) -> int: + return 1 + +static func f2(p := f1()) -> int: + return 2 diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_func.out b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_func.out new file mode 100644 index 0000000000..d3ec4b0692 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_func.out @@ -0,0 +1,2 @@ +GDTEST_ANALYZER_ERROR +Could not resolve member "f1": Cyclic reference. diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_override.gd b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_override.gd new file mode 100644 index 0000000000..f750715838 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_override.gd @@ -0,0 +1,12 @@ +func test(): + print(v) + +var v := InnerA.new().f() + +class InnerA: + func f(p := InnerB.new().f()) -> int: + return 1 + +class InnerB extends InnerA: + func f(p := 1) -> int: + return super.f() diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_override.out b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_override.out new file mode 100644 index 0000000000..6bca25b330 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_override.out @@ -0,0 +1,2 @@ +GDTEST_ANALYZER_ERROR +Could not resolve member "f": Cyclic reference. diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_var.gd b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_var.gd new file mode 100644 index 0000000000..6913888724 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_var.gd @@ -0,0 +1,5 @@ +func test(): + print(v1) + +var v1 := v2 +var v2 := v1 diff --git a/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_var.out b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_var.out new file mode 100644 index 0000000000..c337882d9c --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/cyclic_ref_var.out @@ -0,0 +1,2 @@ +GDTEST_ANALYZER_ERROR +Could not resolve member "v1": Cyclic reference. diff --git a/modules/gdscript/tests/scripts/analyzer/errors/dictionary_string_stringname_equivalent.gd b/modules/gdscript/tests/scripts/analyzer/errors/dictionary_string_stringname_equivalent.gd new file mode 100644 index 0000000000..4dd2b556ee --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/dictionary_string_stringname_equivalent.gd @@ -0,0 +1,9 @@ +# https://github.com/godotengine/godot/issues/62957 + +func test(): + var dict = { + &"key": "StringName", + "key": "String" + } + + print("Invalid dictionary: %s" % dict) diff --git a/modules/gdscript/tests/scripts/analyzer/errors/dictionary_string_stringname_equivalent.out b/modules/gdscript/tests/scripts/analyzer/errors/dictionary_string_stringname_equivalent.out new file mode 100644 index 0000000000..189d8a7955 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/dictionary_string_stringname_equivalent.out @@ -0,0 +1,2 @@ +GDTEST_ANALYZER_ERROR +Key "key" was already used in this dictionary (at line 5). diff --git a/modules/gdscript/tests/scripts/analyzer/errors/outer_class_lookup.gd b/modules/gdscript/tests/scripts/analyzer/errors/outer_class_lookup.gd new file mode 100644 index 0000000000..65c0d9dabc --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/outer_class_lookup.gd @@ -0,0 +1,12 @@ +class A: + class B: + func test(): + print(A.B.D) + +class C: + class D: + pass + +func test(): + var inst = A.B.new() + inst.test() diff --git a/modules/gdscript/tests/scripts/analyzer/errors/outer_class_lookup.out b/modules/gdscript/tests/scripts/analyzer/errors/outer_class_lookup.out new file mode 100644 index 0000000000..6baed366f6 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/errors/outer_class_lookup.out @@ -0,0 +1,2 @@ +GDTEST_ANALYZER_ERROR +Cannot find member "D" in base "B". diff --git a/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.gd b/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.gd new file mode 100644 index 0000000000..eb0003eed8 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.gd @@ -0,0 +1,15 @@ + +var m_string_array: Array[String] = [&"abc"] +var m_stringname_array: Array[StringName] = ["abc"] + +func test(): + print(m_string_array) + print(m_stringname_array) + + # Converted to String when initialized + var string_array: Array[String] = [&"abc"] + print(string_array) + + # Converted to StringName when initialized + var stringname_array: Array[StringName] = ["abc"] + print(stringname_array) diff --git a/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.out b/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.out new file mode 100644 index 0000000000..09c199bde1 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.out @@ -0,0 +1,5 @@ +GDTEST_OK +["abc"] +[&"abc"] +["abc"] +[&"abc"] diff --git a/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution.gd b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution.gd new file mode 100644 index 0000000000..7881a0feb6 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution.gd @@ -0,0 +1,14 @@ +const A: = preload("base_outer_resolution_a.notest.gd") +const B: = preload("base_outer_resolution_b.notest.gd") +const C: = preload("base_outer_resolution_c.notest.gd") + +const Extend: = preload("base_outer_resolution_extend.notest.gd") + +func test() -> void: + Extend.test_a(A.new()) + Extend.test_b(B.new()) + Extend.InnerClass.test_c(C.new()) + Extend.InnerClass.InnerInnerClass.test_a_b_c(A.new(), B.new(), C.new()) + Extend.InnerClass.InnerInnerClass.test_enum(C.TestEnum.HELLO_WORLD) + Extend.InnerClass.InnerInnerClass.test_a_prime(A.APrime.new()) + diff --git a/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution.out b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution.out new file mode 100644 index 0000000000..bd27bd31f6 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution.out @@ -0,0 +1,7 @@ +GDTEST_OK +true +true +true +true +true +true diff --git a/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_a.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_a.notest.gd new file mode 100644 index 0000000000..966c8bfc8f --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_a.notest.gd @@ -0,0 +1,2 @@ +class APrime: + pass diff --git a/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_b.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_b.notest.gd new file mode 100644 index 0000000000..e69de29bb2 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_b.notest.gd diff --git a/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_base.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_base.notest.gd new file mode 100644 index 0000000000..666b147ced --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_base.notest.gd @@ -0,0 +1,4 @@ +const A: = preload("base_outer_resolution_a.notest.gd") + +class InnerClassInBase: + const C: = preload("base_outer_resolution_c.notest.gd") diff --git a/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_c.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_c.notest.gd new file mode 100644 index 0000000000..814be35314 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_c.notest.gd @@ -0,0 +1,3 @@ +enum TestEnum { + HELLO_WORLD +} diff --git a/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_extend.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_extend.notest.gd new file mode 100644 index 0000000000..fbd28779d4 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/base_outer_resolution_extend.notest.gd @@ -0,0 +1,23 @@ +extends "base_outer_resolution_base.notest.gd" + +const B: = preload("base_outer_resolution_b.notest.gd") + +static func test_a(a: A) -> void: + print(a is A) + +static func test_b(b: B) -> void: + print(b is B) + +class InnerClass extends InnerClassInBase: + static func test_c(c: C) -> void: + print(c is C) + + class InnerInnerClass: + static func test_a_b_c(a: A, b: B, c: C) -> void: + print(a is A and b is B and c is C) + + static func test_enum(test_enum: C.TestEnum) -> void: + print(test_enum == C.TestEnum.HELLO_WORLD) + + static func test_a_prime(a_prime: A.APrime) -> void: + print(a_prime is A.APrime) diff --git a/modules/gdscript/tests/scripts/analyzer/features/inner_class_constant_assignment.gd b/modules/gdscript/tests/scripts/analyzer/features/inner_class_constant_assignment.gd new file mode 100644 index 0000000000..ed5fb18b73 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/inner_class_constant_assignment.gd @@ -0,0 +1,7 @@ +const External = preload("inner_class_constant_assignment_external.notest.gd") +const ExternalInnerClass = External.InnerClass + +func test(): + var inst_external: ExternalInnerClass = ExternalInnerClass.new() + inst_external.x = 4.0 + print(inst_external.x) diff --git a/modules/gdscript/tests/scripts/analyzer/features/inner_class_constant_assignment.out b/modules/gdscript/tests/scripts/analyzer/features/inner_class_constant_assignment.out new file mode 100644 index 0000000000..15666c46ad --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/inner_class_constant_assignment.out @@ -0,0 +1,2 @@ +GDTEST_OK +4 diff --git a/modules/gdscript/tests/scripts/analyzer/features/inner_class_constant_assignment_external.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/inner_class_constant_assignment_external.notest.gd new file mode 100644 index 0000000000..788c99d469 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/inner_class_constant_assignment_external.notest.gd @@ -0,0 +1,2 @@ +class InnerClass: + var x: = 3.0 diff --git a/modules/gdscript/tests/scripts/analyzer/features/out_of_order.gd b/modules/gdscript/tests/scripts/analyzer/features/out_of_order.gd new file mode 100644 index 0000000000..11349cc916 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/out_of_order.gd @@ -0,0 +1,51 @@ +func test(): + print("v1: ", v1) + print("v1 is String: ", v1 is String) + print("v2: ", v2) + print("v2 is bool: ", v2 is bool) + print("c1: ", c1) + print("c1 is int: ", c1 is int) + print("c2: ", c2) + print("c2 is int: ", c2 is int) + print("E1.V1: ", E1.V1) + print("E1.V2: ", E1.V2) + print("E2.V: ", E2.V) + print("EV1: ", EV1) + print("EV2: ", EV2) + print("EV3: ", EV3) + +var v1 := InnerA.new().fn() + +class InnerA extends InnerAB: + func fn(p2 := E1.V2) -> String: + return "%s, p2=%s" % [super.fn(), p2] + + class InnerAB: + func fn(p1 := c1) -> String: + return "p1=%s" % p1 + +var v2 := f() + +func f() -> bool: + return true + +const c1 := E1.V1 + +enum E1 { + V1 = E2.V + 2, + V2 = V1 - 1 +} + +enum E2 {V = 2} + +const c2 := EV2 + +enum { + EV1 = 42, + UNUSED = EV3, + EV2 +} + +enum { + EV3 = EV1 + 1 +} diff --git a/modules/gdscript/tests/scripts/analyzer/features/out_of_order.out b/modules/gdscript/tests/scripts/analyzer/features/out_of_order.out new file mode 100644 index 0000000000..b1e75d611d --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/out_of_order.out @@ -0,0 +1,15 @@ +GDTEST_OK +v1: p1=4, p2=3 +v1 is String: true +v2: true +v2 is bool: true +c1: 4 +c1 is int: true +c2: 44 +c2 is int: true +E1.V1: 4 +E1.V2: 3 +E2.V: 2 +EV1: 42 +EV2: 44 +EV3: 43 diff --git a/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external.gd b/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external.gd new file mode 100644 index 0000000000..0b162bdff8 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external.gd @@ -0,0 +1,39 @@ +const B = preload("out_of_order_external_a.notest.gd") + +func test(): + print("v1: ", v1) + print("v1 is String: ", v1 is String) + print("v2: ", v2) + print("v2 is bool: ", v2 is bool) + print("c1: ", c1) + print("c1 is int: ", c1 is int) + print("c2: ", c2) + print("c2 is int: ", c2 is int) + print("E1.V1: ", E1.V1) + print("E1.V2: ", E1.V2) + print("B.E2.V: ", B.E2.V) + print("EV1: ", EV1) + print("EV2: ", EV2) + print("B.EV3: ", B.EV3) + +var v1 := Inner.new().fn() + +class Inner extends B.Inner: + func fn(p2 := E1.V2) -> String: + return "%s, p2=%s" % [super.fn(), p2] + +var v2 := B.new().f() + +const c1 := E1.V1 + +enum E1 { + V1 = B.E2.V + 2, + V2 = V1 - 1 +} + +const c2 := EV2 + +enum { + EV1 = 42, + EV2 = B.EV3 + 1 +} diff --git a/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external.out b/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external.out new file mode 100644 index 0000000000..437f782fe6 --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external.out @@ -0,0 +1,15 @@ +GDTEST_OK +v1: p1=4, p2=3 +v1 is String: true +v2: true +v2 is bool: true +c1: 4 +c1 is int: true +c2: 44 +c2 is int: true +E1.V1: 4 +E1.V2: 3 +B.E2.V: 2 +EV1: 42 +EV2: 44 +B.EV3: 43 diff --git a/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external_a.notest.gd b/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external_a.notest.gd new file mode 100644 index 0000000000..d276f72fcf --- /dev/null +++ b/modules/gdscript/tests/scripts/analyzer/features/out_of_order_external_a.notest.gd @@ -0,0 +1,12 @@ +const A = preload("out_of_order_external.gd") + +class Inner: + func fn(p1 := A.c1) -> String: + return "p1=%s" % p1 + +func f(p := A.c1) -> bool: + return p is int + +enum E2 {V = 2} + +enum {EV3 = A.EV1 + 1} diff --git a/modules/gdscript/tests/scripts/runtime/features/array_string_stringname_equivalent.gd b/modules/gdscript/tests/scripts/runtime/features/array_string_stringname_equivalent.gd new file mode 100644 index 0000000000..5303fb04e2 --- /dev/null +++ b/modules/gdscript/tests/scripts/runtime/features/array_string_stringname_equivalent.gd @@ -0,0 +1,35 @@ +# https://github.com/godotengine/godot/issues/63965 + +func test(): + var array_str: Array = [] + array_str.push_back("godot") + print("StringName in Array: ", &"godot" in array_str) + + var array_sname: Array = [] + array_sname.push_back(&"godot") + print("String in Array: ", "godot" in array_sname) + + # Not equal because the values are different types. + print("Arrays not equal: ", array_str != array_sname) + + var string_array: Array[String] = [] + var stringname_array: Array[StringName] = [] + + assert(!string_array.push_back(&"abc")) + print("Array[String] insert converted: ", typeof(string_array[0]) == TYPE_STRING) + + assert(!stringname_array.push_back("abc")) + print("Array[StringName] insert converted: ", typeof(stringname_array[0]) == TYPE_STRING_NAME) + + print("StringName in Array[String]: ", &"abc" in string_array) + print("String in Array[StringName]: ", "abc" in stringname_array) + + var packed_string_array: PackedStringArray = [] + assert(!packed_string_array.push_back("abc")) + print("StringName in PackedStringArray: ", &"abc" in packed_string_array) + + assert(!string_array.push_back("abc")) + print("StringName finds String in Array: ", string_array.find(&"abc")) + + assert(!stringname_array.push_back(&"abc")) + print("String finds StringName in Array: ", stringname_array.find("abc")) diff --git a/modules/gdscript/tests/scripts/runtime/features/array_string_stringname_equivalent.out b/modules/gdscript/tests/scripts/runtime/features/array_string_stringname_equivalent.out new file mode 100644 index 0000000000..98ab78e8f1 --- /dev/null +++ b/modules/gdscript/tests/scripts/runtime/features/array_string_stringname_equivalent.out @@ -0,0 +1,11 @@ +GDTEST_OK +StringName in Array: true +String in Array: true +Arrays not equal: true +Array[String] insert converted: true +Array[StringName] insert converted: true +StringName in Array[String]: true +String in Array[StringName]: true +StringName in PackedStringArray: true +StringName finds String in Array: 0 +String finds StringName in Array: 0 diff --git a/modules/gdscript/tests/scripts/runtime/features/dictionary_string_stringname_equivalent.gd b/modules/gdscript/tests/scripts/runtime/features/dictionary_string_stringname_equivalent.gd new file mode 100644 index 0000000000..1f15026f17 --- /dev/null +++ b/modules/gdscript/tests/scripts/runtime/features/dictionary_string_stringname_equivalent.gd @@ -0,0 +1,17 @@ +# https://github.com/godotengine/godot/issues/62957 + +func test(): + var string_dict = {} + string_dict["abc"] = 42 + var stringname_dict = {} + stringname_dict[&"abc"] = 24 + + print("String key is TYPE_STRING: ", typeof(string_dict.keys()[0]) == TYPE_STRING) + print("StringName key is TYPE_STRING: ", typeof(stringname_dict.keys()[0]) == TYPE_STRING) + + print("StringName gets String: ", string_dict.get(&"abc")) + print("String gets StringName: ", stringname_dict.get("abc")) + + stringname_dict[&"abc"] = 42 + # They compare equal because StringName keys are converted to String. + print("String Dictionary == StringName Dictionary: ", string_dict == stringname_dict) diff --git a/modules/gdscript/tests/scripts/runtime/features/dictionary_string_stringname_equivalent.out b/modules/gdscript/tests/scripts/runtime/features/dictionary_string_stringname_equivalent.out new file mode 100644 index 0000000000..ab5b89d55c --- /dev/null +++ b/modules/gdscript/tests/scripts/runtime/features/dictionary_string_stringname_equivalent.out @@ -0,0 +1,6 @@ +GDTEST_OK +String key is TYPE_STRING: true +StringName key is TYPE_STRING: true +StringName gets String: 42 +String gets StringName: 24 +String Dictionary == StringName Dictionary: true diff --git a/modules/gdscript/tests/scripts/runtime/features/match_string_stringname_equivalent.gd b/modules/gdscript/tests/scripts/runtime/features/match_string_stringname_equivalent.gd new file mode 100644 index 0000000000..55be021a90 --- /dev/null +++ b/modules/gdscript/tests/scripts/runtime/features/match_string_stringname_equivalent.gd @@ -0,0 +1,14 @@ +# https://github.com/godotengine/godot/issues/60145 + +func test(): + match "abc": + &"abc": + print("String matched StringName") + _: + print("no match") + + match &"abc": + "abc": + print("StringName matched String") + _: + print("no match") diff --git a/modules/gdscript/tests/scripts/runtime/features/match_string_stringname_equivalent.out b/modules/gdscript/tests/scripts/runtime/features/match_string_stringname_equivalent.out new file mode 100644 index 0000000000..9d5a18da3d --- /dev/null +++ b/modules/gdscript/tests/scripts/runtime/features/match_string_stringname_equivalent.out @@ -0,0 +1,3 @@ +GDTEST_OK +String matched StringName +StringName matched String diff --git a/modules/gdscript/tests/scripts/runtime/features/string_stringname_equivalent.gd b/modules/gdscript/tests/scripts/runtime/features/string_stringname_equivalent.gd new file mode 100644 index 0000000000..f8bd46523e --- /dev/null +++ b/modules/gdscript/tests/scripts/runtime/features/string_stringname_equivalent.gd @@ -0,0 +1,11 @@ +# https://github.com/godotengine/godot/issues/64171 + +func test(): + print("Compare ==: ", "abc" == &"abc") + print("Compare ==: ", &"abc" == "abc") + print("Compare !=: ", "abc" != &"abc") + print("Compare !=: ", &"abc" != "abc") + + print("Concat: ", "abc" + &"def") + print("Concat: ", &"abc" + "def") + print("Concat: ", &"abc" + &"def") diff --git a/modules/gdscript/tests/scripts/runtime/features/string_stringname_equivalent.out b/modules/gdscript/tests/scripts/runtime/features/string_stringname_equivalent.out new file mode 100644 index 0000000000..7e9c364b60 --- /dev/null +++ b/modules/gdscript/tests/scripts/runtime/features/string_stringname_equivalent.out @@ -0,0 +1,8 @@ +GDTEST_OK +Compare ==: true +Compare ==: true +Compare !=: false +Compare !=: false +Concat: abcdef +Concat: abcdef +Concat: abcdef diff --git a/modules/gltf/doc_classes/GLTFDocumentExtension.xml b/modules/gltf/doc_classes/GLTFDocumentExtension.xml index 87d3d9bcb0..6004de32f1 100644 --- a/modules/gltf/doc_classes/GLTFDocumentExtension.xml +++ b/modules/gltf/doc_classes/GLTFDocumentExtension.xml @@ -42,10 +42,11 @@ </method> <method name="_export_preflight" qualifiers="virtual"> <return type="int" /> - <param index="0" name="root" type="Node" /> + <param index="0" name="state" type="GLTFState" /> + <param index="1" name="root" type="Node" /> <description> Part of the export process. This method is run first, before all other parts of the export process. - The return value is used to determine if this GLTFDocumentExtension class should be used for exporting a given GLTF file. If [constant OK], the export will use this GLTFDocumentExtension class. If not overridden, [constant OK] is returned. + The return value is used to determine if this [GLTFDocumentExtension] instance should be used for exporting a given GLTF file. If [constant OK], the export will use this [GLTFDocumentExtension] instance. If not overridden, [constant OK] is returned. </description> </method> <method name="_generate_scene_node" qualifiers="virtual"> @@ -99,7 +100,7 @@ <param index="1" name="extensions" type="PackedStringArray" /> <description> Part of the import process. This method is run first, before all other parts of the import process. - The return value is used to determine if this GLTFDocumentExtension class should be used for importing a given GLTF file. If [constant OK], the import will use this GLTFDocumentExtension class. If not overridden, [constant OK] is returned. + The return value is used to determine if this [GLTFDocumentExtension] instance should be used for importing a given GLTF file. If [constant OK], the import will use this [GLTFDocumentExtension] instance. If not overridden, [constant OK] is returned. </description> </method> <method name="_parse_node_extensions" qualifiers="virtual"> @@ -109,7 +110,7 @@ <param index="2" name="extensions" type="Dictionary" /> <description> Part of the import process. This method is run after [method _get_supported_extensions] and before [method _generate_scene_node]. - Runs when parsing the node extensions of a GLTFNode. This method can be used to process the extension JSON data into a format that can be used by [method _generate_scene_node]. + Runs when parsing the node extensions of a GLTFNode. This method can be used to process the extension JSON data into a format that can be used by [method _generate_scene_node]. The return value should be a member of the [enum Error] enum. </description> </method> </methods> diff --git a/modules/gltf/editor/editor_scene_exporter_gltf_plugin.cpp b/modules/gltf/editor/editor_scene_exporter_gltf_plugin.cpp index 0c0b134bd1..fe63afcc56 100644 --- a/modules/gltf/editor/editor_scene_exporter_gltf_plugin.cpp +++ b/modules/gltf/editor/editor_scene_exporter_gltf_plugin.cpp @@ -33,18 +33,10 @@ #include "editor_scene_exporter_gltf_plugin.h" #include "../gltf_document.h" -#include "../gltf_state.h" -#include "core/config/project_settings.h" -#include "core/error/error_list.h" -#include "core/object/object.h" -#include "core/templates/vector.h" #include "editor/editor_file_dialog.h" #include "editor/editor_file_system.h" #include "editor/editor_node.h" -#include "scene/3d/mesh_instance_3d.h" -#include "scene/gui/check_box.h" -#include "scene/main/node.h" String SceneExporterGLTFPlugin::get_name() const { return "ConvertGLTF2"; diff --git a/modules/gltf/editor/editor_scene_importer_blend.cpp b/modules/gltf/editor/editor_scene_importer_blend.cpp index 7007ea5d13..4dafa746bc 100644 --- a/modules/gltf/editor/editor_scene_importer_blend.cpp +++ b/modules/gltf/editor/editor_scene_importer_blend.cpp @@ -33,7 +33,6 @@ #ifdef TOOLS_ENABLED #include "../gltf_document.h" -#include "../gltf_state.h" #include "core/config/project_settings.h" #include "editor/editor_file_dialog.h" @@ -42,8 +41,6 @@ #include "editor/editor_settings.h" #include "main/main.h" #include "scene/gui/line_edit.h" -#include "scene/main/node.h" -#include "scene/resources/animation.h" #ifdef WINDOWS_ENABLED // Code by Pedro Estebanez (https://github.com/godotengine/godot/pull/59766) diff --git a/modules/gltf/editor/editor_scene_importer_fbx.cpp b/modules/gltf/editor/editor_scene_importer_fbx.cpp index 14f2117413..27e0052c1a 100644 --- a/modules/gltf/editor/editor_scene_importer_fbx.cpp +++ b/modules/gltf/editor/editor_scene_importer_fbx.cpp @@ -33,12 +33,10 @@ #ifdef TOOLS_ENABLED #include "../gltf_document.h" -#include "../gltf_state.h" #include "core/config/project_settings.h" #include "editor/editor_settings.h" -#include "scene/main/node.h" -#include "scene/resources/animation.h" +#include "main/main.h" uint32_t EditorSceneFormatImporterFBX::get_import_flags() const { return ImportFlags::IMPORT_SCENE | ImportFlags::IMPORT_ANIMATION; @@ -114,4 +112,30 @@ void EditorSceneFormatImporterFBX::get_import_options(const String &p_path, List<ResourceImporter::ImportOption> *r_options) { } +bool EditorFileSystemImportFormatSupportQueryFBX::is_active() const { + String fbx2gltf_path = EDITOR_GET("filesystem/import/fbx/fbx2gltf_path"); + return !FileAccess::exists(fbx2gltf_path); +} + +Vector<String> EditorFileSystemImportFormatSupportQueryFBX::get_file_extensions() const { + Vector<String> ret; + ret.push_back("fbx"); + return ret; +} + +bool EditorFileSystemImportFormatSupportQueryFBX::query() { + FBXImporterManager::get_singleton()->show_dialog(true); + + while (true) { + OS::get_singleton()->delay_usec(1); + DisplayServer::get_singleton()->process_events(); + Main::iteration(); + if (!FBXImporterManager::get_singleton()->is_visible()) { + break; + } + } + + return false; +} + #endif // TOOLS_ENABLED diff --git a/modules/gltf/editor/editor_scene_importer_fbx.h b/modules/gltf/editor/editor_scene_importer_fbx.h index 6bf9f3e033..82179cc460 100644 --- a/modules/gltf/editor/editor_scene_importer_fbx.h +++ b/modules/gltf/editor/editor_scene_importer_fbx.h @@ -33,6 +33,8 @@ #ifdef TOOLS_ENABLED +#include "editor/editor_file_system.h" +#include "editor/fbx_importer_manager.h" #include "editor/import/resource_importer_scene.h" class Animation; @@ -53,6 +55,15 @@ public: const HashMap<StringName, Variant> &p_options) override; }; +class EditorFileSystemImportFormatSupportQueryFBX : public EditorFileSystemImportFormatSupportQuery { + GDCLASS(EditorFileSystemImportFormatSupportQueryFBX, EditorFileSystemImportFormatSupportQuery); + +public: + virtual bool is_active() const override; + virtual Vector<String> get_file_extensions() const override; + virtual bool query() override; +}; + #endif // TOOLS_ENABLED #endif // EDITOR_SCENE_IMPORTER_FBX_H diff --git a/modules/gltf/editor/editor_scene_importer_gltf.cpp b/modules/gltf/editor/editor_scene_importer_gltf.cpp index 3cf49a3046..bd1ba85abf 100644 --- a/modules/gltf/editor/editor_scene_importer_gltf.cpp +++ b/modules/gltf/editor/editor_scene_importer_gltf.cpp @@ -33,9 +33,6 @@ #include "editor_scene_importer_gltf.h" #include "../gltf_document.h" -#include "../gltf_state.h" - -#include "scene/resources/animation.h" uint32_t EditorSceneFormatImporterGLTF::get_import_flags() const { return ImportFlags::IMPORT_SCENE | ImportFlags::IMPORT_ANIMATION; @@ -63,7 +60,12 @@ Node *EditorSceneFormatImporterGLTF::import_scene(const String &p_path, uint32_t if (p_options.has("animation/import")) { state->set_create_animations(bool(p_options["animation/import"])); } - return doc->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"]); + + if (p_options.has("animation/trimming")) { + return doc->generate_scene(state, (float)p_options["animation/fps"], (bool)p_options["animation/trimming"]); + } else { + return doc->generate_scene(state, (float)p_options["animation/fps"], false); + } } #endif // TOOLS_ENABLED diff --git a/modules/gltf/extensions/gltf_document_extension.cpp b/modules/gltf/extensions/gltf_document_extension.cpp index f997fe8f66..630a62ba5c 100644 --- a/modules/gltf/extensions/gltf_document_extension.cpp +++ b/modules/gltf/extensions/gltf_document_extension.cpp @@ -40,7 +40,7 @@ void GLTFDocumentExtension::_bind_methods() { GDVIRTUAL_BIND(_import_node, "state", "gltf_node", "json", "node"); GDVIRTUAL_BIND(_import_post, "state", "root"); // Export process. - GDVIRTUAL_BIND(_export_preflight, "root"); + GDVIRTUAL_BIND(_export_preflight, "state", "root"); GDVIRTUAL_BIND(_convert_scene_node, "state", "gltf_node", "scene_node"); GDVIRTUAL_BIND(_export_node, "state", "gltf_node", "json", "node"); GDVIRTUAL_BIND(_export_post, "state"); @@ -102,10 +102,10 @@ Error GLTFDocumentExtension::import_post(Ref<GLTFState> p_state, Node *p_root) { } // Export process. -Error GLTFDocumentExtension::export_preflight(Node *p_root) { +Error GLTFDocumentExtension::export_preflight(Ref<GLTFState> p_state, Node *p_root) { ERR_FAIL_NULL_V(p_root, ERR_INVALID_PARAMETER); int err = OK; - GDVIRTUAL_CALL(_export_preflight, p_root, err); + GDVIRTUAL_CALL(_export_preflight, p_state, p_root, err); return Error(err); } diff --git a/modules/gltf/extensions/gltf_document_extension.h b/modules/gltf/extensions/gltf_document_extension.h index 7cc9ca592f..66cb9a3c33 100644 --- a/modules/gltf/extensions/gltf_document_extension.h +++ b/modules/gltf/extensions/gltf_document_extension.h @@ -49,7 +49,7 @@ public: virtual Error import_node(Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node, Dictionary &r_json, Node *p_node); virtual Error import_post(Ref<GLTFState> p_state, Node *p_node); // Export process. - virtual Error export_preflight(Node *p_state); + virtual Error export_preflight(Ref<GLTFState> p_state, Node *p_root); virtual void convert_scene_node(Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node, Node *p_scene_node); virtual Error export_node(Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node, Dictionary &r_json, Node *p_node); virtual Error export_post(Ref<GLTFState> p_state); @@ -63,7 +63,7 @@ public: GDVIRTUAL4R(int, _import_node, Ref<GLTFState>, Ref<GLTFNode>, Dictionary, Node *); GDVIRTUAL2R(int, _import_post, Ref<GLTFState>, Node *); // Export process. - GDVIRTUAL1R(int, _export_preflight, Node *); + GDVIRTUAL2R(int, _export_preflight, Ref<GLTFState>, Node *); GDVIRTUAL3(_convert_scene_node, Ref<GLTFState>, Ref<GLTFNode>, Node *); GDVIRTUAL4R(int, _export_node, Ref<GLTFState>, Ref<GLTFNode>, Dictionary, Node *); GDVIRTUAL1R(int, _export_post, Ref<GLTFState>); diff --git a/modules/gltf/extensions/gltf_document_extension_convert_importer_mesh.cpp b/modules/gltf/extensions/gltf_document_extension_convert_importer_mesh.cpp index 49496afb62..cfa498af65 100644 --- a/modules/gltf/extensions/gltf_document_extension_convert_importer_mesh.cpp +++ b/modules/gltf/extensions/gltf_document_extension_convert_importer_mesh.cpp @@ -30,9 +30,7 @@ #include "gltf_document_extension_convert_importer_mesh.h" -#include "../gltf_state.h" - -#include "core/error/error_macros.h" +#include "scene/3d/importer_mesh_instance_3d.h" #include "scene/3d/mesh_instance_3d.h" #include "scene/resources/importer_mesh.h" diff --git a/modules/gltf/extensions/gltf_document_extension_convert_importer_mesh.h b/modules/gltf/extensions/gltf_document_extension_convert_importer_mesh.h index 00e664e73f..4fbfa0e066 100644 --- a/modules/gltf/extensions/gltf_document_extension_convert_importer_mesh.h +++ b/modules/gltf/extensions/gltf_document_extension_convert_importer_mesh.h @@ -33,10 +33,6 @@ #include "gltf_document_extension.h" -#include "scene/3d/importer_mesh_instance_3d.h" -#include "scene/3d/mesh_instance_3d.h" -#include "scene/resources/importer_mesh.h" - class GLTFDocumentExtensionConvertImporterMesh : public GLTFDocumentExtension { GDCLASS(GLTFDocumentExtensionConvertImporterMesh, GLTFDocumentExtension); diff --git a/modules/gltf/extensions/gltf_light.cpp b/modules/gltf/extensions/gltf_light.cpp index d00bead61c..0379c62c9d 100644 --- a/modules/gltf/extensions/gltf_light.cpp +++ b/modules/gltf/extensions/gltf_light.cpp @@ -30,6 +30,8 @@ #include "gltf_light.h" +#include "scene/3d/light_3d.h" + void GLTFLight::_bind_methods() { ClassDB::bind_static_method("GLTFLight", D_METHOD("from_node", "light_node"), &GLTFLight::from_node); ClassDB::bind_method(D_METHOD("to_node"), &GLTFLight::to_node); diff --git a/modules/gltf/extensions/gltf_light.h b/modules/gltf/extensions/gltf_light.h index 04980e144c..85284f1d0e 100644 --- a/modules/gltf/extensions/gltf_light.h +++ b/modules/gltf/extensions/gltf_light.h @@ -31,9 +31,9 @@ #ifndef GLTF_LIGHT_H #define GLTF_LIGHT_H -#include "core/config/engine.h" #include "core/io/resource.h" -#include "scene/3d/light_3d.h" + +class Light3D; // https://github.com/KhronosGroup/glTF/blob/main/extensions/2.0/Khronos/KHR_lights_punctual diff --git a/modules/gltf/extensions/gltf_spec_gloss.cpp b/modules/gltf/extensions/gltf_spec_gloss.cpp index 83af91bfcc..0645f31e01 100644 --- a/modules/gltf/extensions/gltf_spec_gloss.cpp +++ b/modules/gltf/extensions/gltf_spec_gloss.cpp @@ -30,6 +30,8 @@ #include "gltf_spec_gloss.h" +#include "core/io/image.h" + void GLTFSpecGloss::_bind_methods() { ClassDB::bind_method(D_METHOD("get_diffuse_img"), &GLTFSpecGloss::get_diffuse_img); ClassDB::bind_method(D_METHOD("set_diffuse_img", "diffuse_img"), &GLTFSpecGloss::set_diffuse_img); diff --git a/modules/gltf/extensions/gltf_spec_gloss.h b/modules/gltf/extensions/gltf_spec_gloss.h index 2b4d3ee609..56474acd03 100644 --- a/modules/gltf/extensions/gltf_spec_gloss.h +++ b/modules/gltf/extensions/gltf_spec_gloss.h @@ -31,9 +31,10 @@ #ifndef GLTF_SPEC_GLOSS_H #define GLTF_SPEC_GLOSS_H -#include "core/io/image.h" #include "core/io/resource.h" +class Image; + // KHR_materials_pbrSpecularGlossiness is an archived GLTF extension. // This means that it is deprecated and not recommended for new files. // However, it is still supported for loading old files. diff --git a/modules/gltf/gltf_defines.h b/modules/gltf/gltf_defines.h index 23bf33869e..7b990e6573 100644 --- a/modules/gltf/gltf_defines.h +++ b/modules/gltf/gltf_defines.h @@ -36,9 +36,10 @@ // Godot classes used by GLTF headers. class BoneAttachment3D; class CSGShape3D; -class DirectionalLight3D; class GridMap; +class ImporterMeshInstance3D; class Light3D; +class MeshInstance3D; class MultiMeshInstance3D; class Skeleton3D; class Skin; diff --git a/modules/gltf/gltf_document.cpp b/modules/gltf/gltf_document.cpp index a3685daf0e..d858f76b28 100644 --- a/modules/gltf/gltf_document.cpp +++ b/modules/gltf/gltf_document.cpp @@ -31,31 +31,23 @@ #include "gltf_document.h" #include "extensions/gltf_spec_gloss.h" -#include "gltf_state.h" #include "core/crypto/crypto_core.h" -#include "core/error/error_macros.h" #include "core/io/dir_access.h" #include "core/io/file_access.h" #include "core/io/file_access_memory.h" #include "core/io/json.h" #include "core/io/stream_peer.h" #include "core/math/disjoint_set.h" -#include "core/math/vector2.h" -#include "core/variant/dictionary.h" -#include "core/variant/typed_array.h" -#include "core/variant/variant.h" #include "core/version.h" #include "drivers/png/png_driver_common.h" -#include "scene/2d/node_2d.h" +#include "scene/3d/bone_attachment_3d.h" +#include "scene/3d/camera_3d.h" +#include "scene/3d/importer_mesh_instance_3d.h" +#include "scene/3d/light_3d.h" #include "scene/3d/mesh_instance_3d.h" #include "scene/3d/multimesh_instance_3d.h" -#include "scene/3d/node_3d.h" -#include "scene/animation/animation_player.h" -#include "scene/resources/importer_mesh.h" -#include "scene/resources/material.h" -#include "scene/resources/mesh.h" -#include "scene/resources/multimesh.h" +#include "scene/resources/skin.h" #include "scene/resources/surface_tool.h" #include "modules/modules_enabled.gen.h" // For csg, gridmap. @@ -111,147 +103,147 @@ static Ref<ImporterMesh> _mesh_to_importer_mesh(Ref<Mesh> p_mesh) { return importer_mesh; } -Error GLTFDocument::_serialize(Ref<GLTFState> state, const String &p_path) { - if (!state->buffers.size()) { - state->buffers.push_back(Vector<uint8_t>()); +Error GLTFDocument::_serialize(Ref<GLTFState> p_state, const String &p_path) { + if (!p_state->buffers.size()) { + p_state->buffers.push_back(Vector<uint8_t>()); } /* STEP CONVERT MESH INSTANCES */ - _convert_mesh_instances(state); + _convert_mesh_instances(p_state); /* STEP SERIALIZE CAMERAS */ - Error err = _serialize_cameras(state); + Error err = _serialize_cameras(p_state); if (err != OK) { return Error::FAILED; } /* STEP 3 CREATE SKINS */ - err = _serialize_skins(state); + err = _serialize_skins(p_state); if (err != OK) { return Error::FAILED; } /* STEP SERIALIZE MESHES (we have enough info now) */ - err = _serialize_meshes(state); + err = _serialize_meshes(p_state); if (err != OK) { return Error::FAILED; } /* STEP SERIALIZE TEXTURES */ - err = _serialize_materials(state); + err = _serialize_materials(p_state); if (err != OK) { return Error::FAILED; } /* STEP SERIALIZE TEXTURE SAMPLERS */ - err = _serialize_texture_samplers(state); + err = _serialize_texture_samplers(p_state); if (err != OK) { return Error::FAILED; } /* STEP SERIALIZE ANIMATIONS */ - err = _serialize_animations(state); + err = _serialize_animations(p_state); if (err != OK) { return Error::FAILED; } /* STEP SERIALIZE ACCESSORS */ - err = _encode_accessors(state); + err = _encode_accessors(p_state); if (err != OK) { return Error::FAILED; } /* STEP SERIALIZE IMAGES */ - err = _serialize_images(state, p_path); + err = _serialize_images(p_state, p_path); if (err != OK) { return Error::FAILED; } /* STEP SERIALIZE TEXTURES */ - err = _serialize_textures(state); + err = _serialize_textures(p_state); if (err != OK) { return Error::FAILED; } - for (GLTFBufferViewIndex i = 0; i < state->buffer_views.size(); i++) { - state->buffer_views.write[i]->buffer = 0; + for (GLTFBufferViewIndex i = 0; i < p_state->buffer_views.size(); i++) { + p_state->buffer_views.write[i]->buffer = 0; } /* STEP SERIALIZE BUFFER VIEWS */ - err = _encode_buffer_views(state); + err = _encode_buffer_views(p_state); if (err != OK) { return Error::FAILED; } /* STEP SERIALIZE NODES */ - err = _serialize_nodes(state); + err = _serialize_nodes(p_state); if (err != OK) { return Error::FAILED; } /* STEP SERIALIZE SCENE */ - err = _serialize_scenes(state); + err = _serialize_scenes(p_state); if (err != OK) { return Error::FAILED; } /* STEP SERIALIZE LIGHTS */ - err = _serialize_lights(state); + err = _serialize_lights(p_state); if (err != OK) { return Error::FAILED; } /* STEP SERIALIZE EXTENSIONS */ - err = _serialize_gltf_extensions(state); + err = _serialize_gltf_extensions(p_state); if (err != OK) { return Error::FAILED; } /* STEP SERIALIZE VERSION */ - err = _serialize_version(state); + err = _serialize_version(p_state); if (err != OK) { return Error::FAILED; } for (Ref<GLTFDocumentExtension> ext : document_extensions) { ERR_CONTINUE(ext.is_null()); - err = ext->export_post(state); + err = ext->export_post(p_state); ERR_FAIL_COND_V(err != OK, err); } return OK; } -Error GLTFDocument::_serialize_gltf_extensions(Ref<GLTFState> state) const { - Vector<String> extensions_used = state->extensions_used; - Vector<String> extensions_required = state->extensions_required; - if (!state->lights.is_empty()) { +Error GLTFDocument::_serialize_gltf_extensions(Ref<GLTFState> p_state) const { + Vector<String> extensions_used = p_state->extensions_used; + Vector<String> extensions_required = p_state->extensions_required; + if (!p_state->lights.is_empty()) { extensions_used.push_back("KHR_lights_punctual"); } - if (state->use_khr_texture_transform) { + if (p_state->use_khr_texture_transform) { extensions_used.push_back("KHR_texture_transform"); extensions_required.push_back("KHR_texture_transform"); } if (!extensions_used.is_empty()) { extensions_used.sort(); - state->json["extensionsUsed"] = extensions_used; + p_state->json["extensionsUsed"] = extensions_used; } if (!extensions_required.is_empty()) { extensions_required.sort(); - state->json["extensionsRequired"] = extensions_required; + p_state->json["extensionsRequired"] = extensions_required; } return OK; } -Error GLTFDocument::_serialize_scenes(Ref<GLTFState> state) { +Error GLTFDocument::_serialize_scenes(Ref<GLTFState> p_state) { Array scenes; const int loaded_scene = 0; - state->json["scene"] = loaded_scene; + p_state->json["scene"] = loaded_scene; - if (state->nodes.size()) { + if (p_state->nodes.size()) { Dictionary s; - if (!state->scene_name.is_empty()) { - s["name"] = state->scene_name; + if (!p_state->scene_name.is_empty()) { + s["name"] = p_state->scene_name; } Array nodes; @@ -259,21 +251,21 @@ Error GLTFDocument::_serialize_scenes(Ref<GLTFState> state) { s["nodes"] = nodes; scenes.push_back(s); } - state->json["scenes"] = scenes; + p_state->json["scenes"] = scenes; return OK; } -Error GLTFDocument::_parse_json(const String &p_path, Ref<GLTFState> state) { +Error GLTFDocument::_parse_json(const String &p_path, Ref<GLTFState> p_state) { Error err; - Ref<FileAccess> f = FileAccess::open(p_path, FileAccess::READ, &err); - if (f.is_null()) { + Ref<FileAccess> file = FileAccess::open(p_path, FileAccess::READ, &err); + if (file.is_null()) { return err; } Vector<uint8_t> array; - array.resize(f->get_length()); - f->get_buffer(array.ptrw(), array.size()); + array.resize(file->get_length()); + file->get_buffer(array.ptrw(), array.size()); String text; text.parse_utf8((const char *)array.ptr(), array.size()); @@ -283,26 +275,26 @@ Error GLTFDocument::_parse_json(const String &p_path, Ref<GLTFState> state) { _err_print_error("", p_path.utf8().get_data(), json.get_error_line(), json.get_error_message().utf8().get_data(), false, ERR_HANDLER_SCRIPT); return err; } - state->json = json.get_data(); + p_state->json = json.get_data(); return OK; } -Error GLTFDocument::_parse_glb(Ref<FileAccess> f, Ref<GLTFState> state) { - ERR_FAIL_NULL_V(f, ERR_INVALID_PARAMETER); - ERR_FAIL_NULL_V(state, ERR_INVALID_PARAMETER); - ERR_FAIL_COND_V(f->get_position() != 0, ERR_FILE_CANT_READ); - uint32_t magic = f->get_32(); +Error GLTFDocument::_parse_glb(Ref<FileAccess> p_file, Ref<GLTFState> p_state) { + ERR_FAIL_NULL_V(p_file, ERR_INVALID_PARAMETER); + ERR_FAIL_NULL_V(p_state, ERR_INVALID_PARAMETER); + ERR_FAIL_COND_V(p_file->get_position() != 0, ERR_FILE_CANT_READ); + uint32_t magic = p_file->get_32(); ERR_FAIL_COND_V(magic != 0x46546C67, ERR_FILE_UNRECOGNIZED); //glTF - f->get_32(); // version - f->get_32(); // length - uint32_t chunk_length = f->get_32(); - uint32_t chunk_type = f->get_32(); + p_file->get_32(); // version + p_file->get_32(); // length + uint32_t chunk_length = p_file->get_32(); + uint32_t chunk_type = p_file->get_32(); ERR_FAIL_COND_V(chunk_type != 0x4E4F534A, ERR_PARSE_ERROR); //JSON Vector<uint8_t> json_data; json_data.resize(chunk_length); - uint32_t len = f->get_buffer(json_data.ptrw(), chunk_length); + uint32_t len = p_file->get_buffer(json_data.ptrw(), chunk_length); ERR_FAIL_COND_V(len != chunk_length, ERR_FILE_CORRUPT); String text; @@ -315,21 +307,21 @@ Error GLTFDocument::_parse_glb(Ref<FileAccess> f, Ref<GLTFState> state) { return err; } - state->json = json.get_data(); + p_state->json = json.get_data(); //data? - chunk_length = f->get_32(); - chunk_type = f->get_32(); + chunk_length = p_file->get_32(); + chunk_type = p_file->get_32(); - if (f->eof_reached()) { + if (p_file->eof_reached()) { return OK; //all good } ERR_FAIL_COND_V(chunk_type != 0x004E4942, ERR_PARSE_ERROR); //BIN - state->glb_data.resize(chunk_length); - len = f->get_buffer(state->glb_data.ptrw(), chunk_length); + p_state->glb_data.resize(chunk_length); + len = p_file->get_buffer(p_state->glb_data.ptrw(), chunk_length); ERR_FAIL_COND_V(len != chunk_length, ERR_FILE_CORRUPT); return OK; @@ -402,11 +394,11 @@ static Vector<real_t> _xform_to_array(const Transform3D p_transform) { return array; } -Error GLTFDocument::_serialize_nodes(Ref<GLTFState> state) { +Error GLTFDocument::_serialize_nodes(Ref<GLTFState> p_state) { Array nodes; - for (int i = 0; i < state->nodes.size(); i++) { + for (int i = 0; i < p_state->nodes.size(); i++) { Dictionary node; - Ref<GLTFNode> gltf_node = state->nodes[i]; + Ref<GLTFNode> gltf_node = p_state->nodes[i]; Dictionary extensions; node["extensions"] = extensions; if (!gltf_node->get_name().is_empty()) { @@ -453,18 +445,18 @@ Error GLTFDocument::_serialize_nodes(Ref<GLTFState> state) { for (Ref<GLTFDocumentExtension> ext : document_extensions) { ERR_CONTINUE(ext.is_null()); - ERR_CONTINUE(!state->scene_nodes.find(i)); - Error err = ext->export_node(state, gltf_node, node, state->scene_nodes[i]); + ERR_CONTINUE(!p_state->scene_nodes.find(i)); + Error err = ext->export_node(p_state, gltf_node, node, p_state->scene_nodes[i]); ERR_CONTINUE(err != OK); } nodes.push_back(node); } - state->json["nodes"] = nodes; + p_state->json["nodes"] = nodes; return OK; } -String GLTFDocument::_gen_unique_name(Ref<GLTFState> state, const String &p_name) { +String GLTFDocument::_gen_unique_name(Ref<GLTFState> p_state, const String &p_name) { const String s_name = p_name.validate_node_name(); String u_name; @@ -475,13 +467,13 @@ String GLTFDocument::_gen_unique_name(Ref<GLTFState> state, const String &p_name if (index > 1) { u_name += itos(index); } - if (!state->unique_names.has(u_name)) { + if (!p_state->unique_names.has(u_name)) { break; } index++; } - state->unique_names.insert(u_name); + p_state->unique_names.insert(u_name); return u_name; } @@ -497,7 +489,7 @@ String GLTFDocument::_sanitize_animation_name(const String &p_name) { return anim_name; } -String GLTFDocument::_gen_unique_animation_name(Ref<GLTFState> state, const String &p_name) { +String GLTFDocument::_gen_unique_animation_name(Ref<GLTFState> p_state, const String &p_name) { const String s_name = _sanitize_animation_name(p_name); String u_name; @@ -508,13 +500,13 @@ String GLTFDocument::_gen_unique_animation_name(Ref<GLTFState> state, const Stri if (index > 1) { u_name += itos(index); } - if (!state->unique_animation_names.has(u_name)) { + if (!p_state->unique_animation_names.has(u_name)) { break; } index++; } - state->unique_animation_names.insert(u_name); + p_state->unique_animation_names.insert(u_name); return u_name; } @@ -526,7 +518,7 @@ String GLTFDocument::_sanitize_bone_name(const String &p_name) { return bone_name; } -String GLTFDocument::_gen_unique_bone_name(Ref<GLTFState> state, const GLTFSkeletonIndex skel_i, const String &p_name) { +String GLTFDocument::_gen_unique_bone_name(Ref<GLTFState> p_state, const GLTFSkeletonIndex p_skel_i, const String &p_name) { String s_name = _sanitize_bone_name(p_name); if (s_name.is_empty()) { s_name = "bone"; @@ -539,23 +531,23 @@ String GLTFDocument::_gen_unique_bone_name(Ref<GLTFState> state, const GLTFSkele if (index > 1) { u_name += "_" + itos(index); } - if (!state->skeletons[skel_i]->unique_names.has(u_name)) { + if (!p_state->skeletons[p_skel_i]->unique_names.has(u_name)) { break; } index++; } - state->skeletons.write[skel_i]->unique_names.insert(u_name); + p_state->skeletons.write[p_skel_i]->unique_names.insert(u_name); return u_name; } -Error GLTFDocument::_parse_scenes(Ref<GLTFState> state) { - ERR_FAIL_COND_V(!state->json.has("scenes"), ERR_FILE_CORRUPT); - const Array &scenes = state->json["scenes"]; +Error GLTFDocument::_parse_scenes(Ref<GLTFState> p_state) { + ERR_FAIL_COND_V(!p_state->json.has("scenes"), ERR_FILE_CORRUPT); + const Array &scenes = p_state->json["scenes"]; int loaded_scene = 0; - if (state->json.has("scene")) { - loaded_scene = state->json["scene"]; + if (p_state->json.has("scene")) { + loaded_scene = p_state->json["scene"]; } else { WARN_PRINT("The load-time scene is not defined in the glTF2 file. Picking the first scene."); } @@ -566,22 +558,22 @@ Error GLTFDocument::_parse_scenes(Ref<GLTFState> state) { ERR_FAIL_COND_V(!s.has("nodes"), ERR_UNAVAILABLE); const Array &nodes = s["nodes"]; for (int j = 0; j < nodes.size(); j++) { - state->root_nodes.push_back(nodes[j]); + p_state->root_nodes.push_back(nodes[j]); } if (s.has("name") && !String(s["name"]).is_empty() && !((String)s["name"]).begins_with("Scene")) { - state->scene_name = _gen_unique_name(state, s["name"]); + p_state->scene_name = _gen_unique_name(p_state, s["name"]); } else { - state->scene_name = _gen_unique_name(state, state->filename); + p_state->scene_name = _gen_unique_name(p_state, p_state->filename); } } return OK; } -Error GLTFDocument::_parse_nodes(Ref<GLTFState> state) { - ERR_FAIL_COND_V(!state->json.has("nodes"), ERR_FILE_CORRUPT); - const Array &nodes = state->json["nodes"]; +Error GLTFDocument::_parse_nodes(Ref<GLTFState> p_state) { + ERR_FAIL_COND_V(!p_state->json.has("nodes"), ERR_FILE_CORRUPT); + const Array &nodes = p_state->json["nodes"]; for (int i = 0; i < nodes.size(); i++) { Ref<GLTFNode> node; node.instantiate(); @@ -627,8 +619,8 @@ Error GLTFDocument::_parse_nodes(Ref<GLTFState> state) { } for (Ref<GLTFDocumentExtension> ext : document_extensions) { ERR_CONTINUE(ext.is_null()); - Error err = ext->parse_node_extensions(state, node, extensions); - ERR_CONTINUE_MSG(err != OK, "GLTF: Encountered error " + itos(err) + " when parsing node extensions for node " + node->get_name() + " in file " + state->filename + ". Continuing."); + Error err = ext->parse_node_extensions(p_state, node, extensions); + ERR_CONTINUE_MSG(err != OK, "GLTF: Encountered error " + itos(err) + " when parsing node extensions for node " + node->get_name() + " in file " + p_state->filename + ". Continuing."); } } @@ -639,35 +631,35 @@ Error GLTFDocument::_parse_nodes(Ref<GLTFState> state) { } } - state->nodes.push_back(node); + p_state->nodes.push_back(node); } // build the hierarchy - for (GLTFNodeIndex node_i = 0; node_i < state->nodes.size(); node_i++) { - for (int j = 0; j < state->nodes[node_i]->children.size(); j++) { - GLTFNodeIndex child_i = state->nodes[node_i]->children[j]; + for (GLTFNodeIndex node_i = 0; node_i < p_state->nodes.size(); node_i++) { + for (int j = 0; j < p_state->nodes[node_i]->children.size(); j++) { + GLTFNodeIndex child_i = p_state->nodes[node_i]->children[j]; - ERR_FAIL_INDEX_V(child_i, state->nodes.size(), ERR_FILE_CORRUPT); - ERR_CONTINUE(state->nodes[child_i]->parent != -1); //node already has a parent, wtf. + ERR_FAIL_INDEX_V(child_i, p_state->nodes.size(), ERR_FILE_CORRUPT); + ERR_CONTINUE(p_state->nodes[child_i]->parent != -1); //node already has a parent, wtf. - state->nodes.write[child_i]->parent = node_i; + p_state->nodes.write[child_i]->parent = node_i; } } - _compute_node_heights(state); + _compute_node_heights(p_state); return OK; } -void GLTFDocument::_compute_node_heights(Ref<GLTFState> state) { - state->root_nodes.clear(); - for (GLTFNodeIndex node_i = 0; node_i < state->nodes.size(); ++node_i) { - Ref<GLTFNode> node = state->nodes[node_i]; +void GLTFDocument::_compute_node_heights(Ref<GLTFState> p_state) { + p_state->root_nodes.clear(); + for (GLTFNodeIndex node_i = 0; node_i < p_state->nodes.size(); ++node_i) { + Ref<GLTFNode> node = p_state->nodes[node_i]; node->height = 0; GLTFNodeIndex current_i = node_i; while (current_i >= 0) { - const GLTFNodeIndex parent_i = state->nodes[current_i]->parent; + const GLTFNodeIndex parent_i = p_state->nodes[current_i]->parent; if (parent_i >= 0) { ++node->height; } @@ -675,7 +667,7 @@ void GLTFDocument::_compute_node_heights(Ref<GLTFState> state) { } if (node->height == 0) { - state->root_nodes.push_back(node_i); + p_state->root_nodes.push_back(node_i); } } } @@ -698,86 +690,86 @@ static Vector<uint8_t> _parse_base64_uri(const String &uri) { return buf; } -Error GLTFDocument::_encode_buffer_glb(Ref<GLTFState> state, const String &p_path) { - print_verbose("glTF: Total buffers: " + itos(state->buffers.size())); +Error GLTFDocument::_encode_buffer_glb(Ref<GLTFState> p_state, const String &p_path) { + print_verbose("glTF: Total buffers: " + itos(p_state->buffers.size())); - if (!state->buffers.size()) { + if (!p_state->buffers.size()) { return OK; } Array buffers; - if (state->buffers.size()) { - Vector<uint8_t> buffer_data = state->buffers[0]; + if (p_state->buffers.size()) { + Vector<uint8_t> buffer_data = p_state->buffers[0]; Dictionary gltf_buffer; gltf_buffer["byteLength"] = buffer_data.size(); buffers.push_back(gltf_buffer); } - for (GLTFBufferIndex i = 1; i < state->buffers.size() - 1; i++) { - Vector<uint8_t> buffer_data = state->buffers[i]; + for (GLTFBufferIndex i = 1; i < p_state->buffers.size() - 1; i++) { + Vector<uint8_t> buffer_data = p_state->buffers[i]; Dictionary gltf_buffer; String filename = p_path.get_basename().get_file() + itos(i) + ".bin"; String path = p_path.get_base_dir() + "/" + filename; Error err; - Ref<FileAccess> f = FileAccess::open(path, FileAccess::WRITE, &err); - if (f.is_null()) { + Ref<FileAccess> file = FileAccess::open(path, FileAccess::WRITE, &err); + if (file.is_null()) { return err; } if (buffer_data.size() == 0) { return OK; } - f->create(FileAccess::ACCESS_RESOURCES); - f->store_buffer(buffer_data.ptr(), buffer_data.size()); + file->create(FileAccess::ACCESS_RESOURCES); + file->store_buffer(buffer_data.ptr(), buffer_data.size()); gltf_buffer["uri"] = filename; gltf_buffer["byteLength"] = buffer_data.size(); buffers.push_back(gltf_buffer); } - state->json["buffers"] = buffers; + p_state->json["buffers"] = buffers; return OK; } -Error GLTFDocument::_encode_buffer_bins(Ref<GLTFState> state, const String &p_path) { - print_verbose("glTF: Total buffers: " + itos(state->buffers.size())); +Error GLTFDocument::_encode_buffer_bins(Ref<GLTFState> p_state, const String &p_path) { + print_verbose("glTF: Total buffers: " + itos(p_state->buffers.size())); - if (!state->buffers.size()) { + if (!p_state->buffers.size()) { return OK; } Array buffers; - for (GLTFBufferIndex i = 0; i < state->buffers.size(); i++) { - Vector<uint8_t> buffer_data = state->buffers[i]; + for (GLTFBufferIndex i = 0; i < p_state->buffers.size(); i++) { + Vector<uint8_t> buffer_data = p_state->buffers[i]; Dictionary gltf_buffer; String filename = p_path.get_basename().get_file() + itos(i) + ".bin"; String path = p_path.get_base_dir() + "/" + filename; Error err; - Ref<FileAccess> f = FileAccess::open(path, FileAccess::WRITE, &err); - if (f.is_null()) { + Ref<FileAccess> file = FileAccess::open(path, FileAccess::WRITE, &err); + if (file.is_null()) { return err; } if (buffer_data.size() == 0) { return OK; } - f->create(FileAccess::ACCESS_RESOURCES); - f->store_buffer(buffer_data.ptr(), buffer_data.size()); + file->create(FileAccess::ACCESS_RESOURCES); + file->store_buffer(buffer_data.ptr(), buffer_data.size()); gltf_buffer["uri"] = filename; gltf_buffer["byteLength"] = buffer_data.size(); buffers.push_back(gltf_buffer); } - state->json["buffers"] = buffers; + p_state->json["buffers"] = buffers; return OK; } -Error GLTFDocument::_parse_buffers(Ref<GLTFState> state, const String &p_base_path) { - if (!state->json.has("buffers")) { +Error GLTFDocument::_parse_buffers(Ref<GLTFState> p_state, const String &p_base_path) { + if (!p_state->json.has("buffers")) { return OK; } - const Array &buffers = state->json["buffers"]; + const Array &buffers = p_state->json["buffers"]; for (GLTFBufferIndex i = 0; i < buffers.size(); i++) { - if (i == 0 && state->glb_data.size()) { - state->buffers.push_back(state->glb_data); + if (i == 0 && p_state->glb_data.size()) { + p_state->buffers.push_back(p_state->glb_data); } else { const Dictionary &buffer = buffers[i]; @@ -803,22 +795,22 @@ Error GLTFDocument::_parse_buffers(Ref<GLTFState> state, const String &p_base_pa ERR_FAIL_COND_V(!buffer.has("byteLength"), ERR_PARSE_ERROR); int byteLength = buffer["byteLength"]; ERR_FAIL_COND_V(byteLength < buffer_data.size(), ERR_PARSE_ERROR); - state->buffers.push_back(buffer_data); + p_state->buffers.push_back(buffer_data); } } } - print_verbose("glTF: Total buffers: " + itos(state->buffers.size())); + print_verbose("glTF: Total buffers: " + itos(p_state->buffers.size())); return OK; } -Error GLTFDocument::_encode_buffer_views(Ref<GLTFState> state) { +Error GLTFDocument::_encode_buffer_views(Ref<GLTFState> p_state) { Array buffers; - for (GLTFBufferViewIndex i = 0; i < state->buffer_views.size(); i++) { + for (GLTFBufferViewIndex i = 0; i < p_state->buffer_views.size(); i++) { Dictionary d; - Ref<GLTFBufferView> buffer_view = state->buffer_views[i]; + Ref<GLTFBufferView> buffer_view = p_state->buffer_views[i]; d["buffer"] = buffer_view->buffer; d["byteLength"] = buffer_view->byte_length; @@ -836,19 +828,19 @@ Error GLTFDocument::_encode_buffer_views(Ref<GLTFState> state) { ERR_FAIL_COND_V(!d.has("byteLength"), ERR_INVALID_DATA); buffers.push_back(d); } - print_verbose("glTF: Total buffer views: " + itos(state->buffer_views.size())); + print_verbose("glTF: Total buffer views: " + itos(p_state->buffer_views.size())); if (!buffers.size()) { return OK; } - state->json["bufferViews"] = buffers; + p_state->json["bufferViews"] = buffers; return OK; } -Error GLTFDocument::_parse_buffer_views(Ref<GLTFState> state) { - if (!state->json.has("bufferViews")) { +Error GLTFDocument::_parse_buffer_views(Ref<GLTFState> p_state) { + if (!p_state->json.has("bufferViews")) { return OK; } - const Array &buffers = state->json["bufferViews"]; + const Array &buffers = p_state->json["bufferViews"]; for (GLTFBufferViewIndex i = 0; i < buffers.size(); i++) { const Dictionary &d = buffers[i]; @@ -873,20 +865,20 @@ Error GLTFDocument::_parse_buffer_views(Ref<GLTFState> state) { buffer_view->indices = target == GLTFDocument::ELEMENT_ARRAY_BUFFER; } - state->buffer_views.push_back(buffer_view); + p_state->buffer_views.push_back(buffer_view); } - print_verbose("glTF: Total buffer views: " + itos(state->buffer_views.size())); + print_verbose("glTF: Total buffer views: " + itos(p_state->buffer_views.size())); return OK; } -Error GLTFDocument::_encode_accessors(Ref<GLTFState> state) { +Error GLTFDocument::_encode_accessors(Ref<GLTFState> p_state) { Array accessors; - for (GLTFAccessorIndex i = 0; i < state->accessors.size(); i++) { + for (GLTFAccessorIndex i = 0; i < p_state->accessors.size(); i++) { Dictionary d; - Ref<GLTFAccessor> accessor = state->accessors[i]; + Ref<GLTFAccessor> accessor = p_state->accessors[i]; d["componentType"] = accessor->component_type; d["count"] = accessor->count; d["type"] = _get_accessor_type_name(accessor->type); @@ -932,9 +924,9 @@ Error GLTFDocument::_encode_accessors(Ref<GLTFState> state) { if (!accessors.size()) { return OK; } - state->json["accessors"] = accessors; - ERR_FAIL_COND_V(!state->json.has("accessors"), ERR_FILE_CORRUPT); - print_verbose("glTF: Total accessors: " + itos(state->accessors.size())); + p_state->json["accessors"] = accessors; + ERR_FAIL_COND_V(!p_state->json.has("accessors"), ERR_FILE_CORRUPT); + print_verbose("glTF: Total accessors: " + itos(p_state->accessors.size())); return OK; } @@ -993,11 +985,11 @@ GLTFType GLTFDocument::_get_type_from_str(const String &p_string) { ERR_FAIL_V(GLTFType::TYPE_SCALAR); } -Error GLTFDocument::_parse_accessors(Ref<GLTFState> state) { - if (!state->json.has("accessors")) { +Error GLTFDocument::_parse_accessors(Ref<GLTFState> p_state) { + if (!p_state->json.has("accessors")) { return OK; } - const Array &accessors = state->json["accessors"]; + const Array &accessors = p_state->json["accessors"]; for (GLTFAccessorIndex i = 0; i < accessors.size(); i++) { const Dictionary &d = accessors[i]; @@ -1060,10 +1052,10 @@ Error GLTFDocument::_parse_accessors(Ref<GLTFState> state) { } } - state->accessors.push_back(accessor); + p_state->accessors.push_back(accessor); } - print_verbose("glTF: Total accessors: " + itos(state->accessors.size())); + print_verbose("glTF: Total accessors: " + itos(p_state->accessors.size())); return OK; } @@ -1108,33 +1100,33 @@ String GLTFDocument::_get_type_name(const GLTFType p_component) { return names[p_component]; } -Error GLTFDocument::_encode_buffer_view(Ref<GLTFState> state, const double *src, const int count, const GLTFType type, const int component_type, const bool normalized, const int byte_offset, const bool for_vertex, GLTFBufferViewIndex &r_accessor) { +Error GLTFDocument::_encode_buffer_view(Ref<GLTFState> p_state, const double *p_src, const int p_count, const GLTFType p_type, const int p_component_type, const bool p_normalized, const int p_byte_offset, const bool p_for_vertex, GLTFBufferViewIndex &r_accessor) { const int component_count_for_type[7] = { 1, 2, 3, 4, 4, 9, 16 }; - const int component_count = component_count_for_type[type]; - const int component_size = _get_component_type_size(component_type); + const int component_count = component_count_for_type[p_type]; + const int component_size = _get_component_type_size(p_component_type); ERR_FAIL_COND_V(component_size == 0, FAILED); int skip_every = 0; int skip_bytes = 0; //special case of alignments, as described in spec - switch (component_type) { + switch (p_component_type) { case COMPONENT_TYPE_BYTE: case COMPONENT_TYPE_UNSIGNED_BYTE: { - if (type == TYPE_MAT2) { + if (p_type == TYPE_MAT2) { skip_every = 2; skip_bytes = 2; } - if (type == TYPE_MAT3) { + if (p_type == TYPE_MAT3) { skip_every = 3; skip_bytes = 1; } } break; case COMPONENT_TYPE_SHORT: case COMPONENT_TYPE_UNSIGNED_SHORT: { - if (type == TYPE_MAT3) { + if (p_type == TYPE_MAT3) { skip_every = 6; skip_bytes = 4; } @@ -1145,39 +1137,39 @@ Error GLTFDocument::_encode_buffer_view(Ref<GLTFState> state, const double *src, Ref<GLTFBufferView> bv; bv.instantiate(); - const uint32_t offset = bv->byte_offset = byte_offset; - Vector<uint8_t> &gltf_buffer = state->buffers.write[0]; + const uint32_t offset = bv->byte_offset = p_byte_offset; + Vector<uint8_t> &gltf_buffer = p_state->buffers.write[0]; - int stride = _get_component_type_size(component_type); - if (for_vertex && stride % 4) { + int stride = _get_component_type_size(p_component_type); + if (p_for_vertex && stride % 4) { stride += 4 - (stride % 4); //according to spec must be multiple of 4 } //use to debug - print_verbose("glTF: encoding type " + _get_type_name(type) + " component type: " + _get_component_type_name(component_type) + " stride: " + itos(stride) + " amount " + itos(count)); + print_verbose("glTF: encoding type " + _get_type_name(p_type) + " component type: " + _get_component_type_name(p_component_type) + " stride: " + itos(stride) + " amount " + itos(p_count)); - print_verbose("glTF: encoding accessor offset " + itos(byte_offset) + " view offset: " + itos(bv->byte_offset) + " total buffer len: " + itos(gltf_buffer.size()) + " view len " + itos(bv->byte_length)); + print_verbose("glTF: encoding accessor offset " + itos(p_byte_offset) + " view offset: " + itos(bv->byte_offset) + " total buffer len: " + itos(gltf_buffer.size()) + " view len " + itos(bv->byte_length)); - const int buffer_end = (stride * (count - 1)) + _get_component_type_size(component_type); + const int buffer_end = (stride * (p_count - 1)) + _get_component_type_size(p_component_type); // TODO define bv->byte_stride bv->byte_offset = gltf_buffer.size(); - switch (component_type) { + switch (p_component_type) { case COMPONENT_TYPE_BYTE: { Vector<int8_t> buffer; - buffer.resize(count * component_count); + buffer.resize(p_count * component_count); int32_t dst_i = 0; - for (int i = 0; i < count; i++) { + for (int i = 0; i < p_count; i++) { for (int j = 0; j < component_count; j++) { if (skip_every && j > 0 && (j % skip_every) == 0) { dst_i += skip_bytes; } - double d = *src; - if (normalized) { + double d = *p_src; + if (p_normalized) { buffer.write[dst_i] = d * 128.0; } else { buffer.write[dst_i] = d; } - src++; + p_src++; dst_i++; } } @@ -1188,20 +1180,20 @@ Error GLTFDocument::_encode_buffer_view(Ref<GLTFState> state, const double *src, } break; case COMPONENT_TYPE_UNSIGNED_BYTE: { Vector<uint8_t> buffer; - buffer.resize(count * component_count); + buffer.resize(p_count * component_count); int32_t dst_i = 0; - for (int i = 0; i < count; i++) { + for (int i = 0; i < p_count; i++) { for (int j = 0; j < component_count; j++) { if (skip_every && j > 0 && (j % skip_every) == 0) { dst_i += skip_bytes; } - double d = *src; - if (normalized) { + double d = *p_src; + if (p_normalized) { buffer.write[dst_i] = d * 255.0; } else { buffer.write[dst_i] = d; } - src++; + p_src++; dst_i++; } } @@ -1210,20 +1202,20 @@ Error GLTFDocument::_encode_buffer_view(Ref<GLTFState> state, const double *src, } break; case COMPONENT_TYPE_SHORT: { Vector<int16_t> buffer; - buffer.resize(count * component_count); + buffer.resize(p_count * component_count); int32_t dst_i = 0; - for (int i = 0; i < count; i++) { + for (int i = 0; i < p_count; i++) { for (int j = 0; j < component_count; j++) { if (skip_every && j > 0 && (j % skip_every) == 0) { dst_i += skip_bytes; } - double d = *src; - if (normalized) { + double d = *p_src; + if (p_normalized) { buffer.write[dst_i] = d * 32768.0; } else { buffer.write[dst_i] = d; } - src++; + p_src++; dst_i++; } } @@ -1234,20 +1226,20 @@ Error GLTFDocument::_encode_buffer_view(Ref<GLTFState> state, const double *src, } break; case COMPONENT_TYPE_UNSIGNED_SHORT: { Vector<uint16_t> buffer; - buffer.resize(count * component_count); + buffer.resize(p_count * component_count); int32_t dst_i = 0; - for (int i = 0; i < count; i++) { + for (int i = 0; i < p_count; i++) { for (int j = 0; j < component_count; j++) { if (skip_every && j > 0 && (j % skip_every) == 0) { dst_i += skip_bytes; } - double d = *src; - if (normalized) { + double d = *p_src; + if (p_normalized) { buffer.write[dst_i] = d * 65535.0; } else { buffer.write[dst_i] = d; } - src++; + p_src++; dst_i++; } } @@ -1258,16 +1250,16 @@ Error GLTFDocument::_encode_buffer_view(Ref<GLTFState> state, const double *src, } break; case COMPONENT_TYPE_INT: { Vector<int> buffer; - buffer.resize(count * component_count); + buffer.resize(p_count * component_count); int32_t dst_i = 0; - for (int i = 0; i < count; i++) { + for (int i = 0; i < p_count; i++) { for (int j = 0; j < component_count; j++) { if (skip_every && j > 0 && (j % skip_every) == 0) { dst_i += skip_bytes; } - double d = *src; + double d = *p_src; buffer.write[dst_i] = d; - src++; + p_src++; dst_i++; } } @@ -1278,16 +1270,16 @@ Error GLTFDocument::_encode_buffer_view(Ref<GLTFState> state, const double *src, } break; case COMPONENT_TYPE_FLOAT: { Vector<float> buffer; - buffer.resize(count * component_count); + buffer.resize(p_count * component_count); int32_t dst_i = 0; - for (int i = 0; i < count; i++) { + for (int i = 0; i < p_count; i++) { for (int j = 0; j < component_count; j++) { if (skip_every && j > 0 && (j % skip_every) == 0) { dst_i += skip_bytes; } - double d = *src; + double d = *p_src; buffer.write[dst_i] = d; - src++; + p_src++; dst_i++; } } @@ -1300,53 +1292,53 @@ Error GLTFDocument::_encode_buffer_view(Ref<GLTFState> state, const double *src, ERR_FAIL_COND_V(buffer_end > bv->byte_length, ERR_INVALID_DATA); ERR_FAIL_COND_V((int)(offset + buffer_end) > gltf_buffer.size(), ERR_INVALID_DATA); - r_accessor = bv->buffer = state->buffer_views.size(); - state->buffer_views.push_back(bv); + r_accessor = bv->buffer = p_state->buffer_views.size(); + p_state->buffer_views.push_back(bv); return OK; } -Error GLTFDocument::_decode_buffer_view(Ref<GLTFState> state, double *dst, const GLTFBufferViewIndex p_buffer_view, const int skip_every, const int skip_bytes, const int element_size, const int count, const GLTFType type, const int component_count, const int component_type, const int component_size, const bool normalized, const int byte_offset, const bool for_vertex) { - const Ref<GLTFBufferView> bv = state->buffer_views[p_buffer_view]; +Error GLTFDocument::_decode_buffer_view(Ref<GLTFState> p_state, double *p_dst, const GLTFBufferViewIndex p_buffer_view, const int p_skip_every, const int p_skip_bytes, const int p_element_size, const int p_count, const GLTFType p_type, const int p_component_count, const int p_component_type, const int p_component_size, const bool p_normalized, const int p_byte_offset, const bool p_for_vertex) { + const Ref<GLTFBufferView> bv = p_state->buffer_views[p_buffer_view]; - int stride = element_size; + int stride = p_element_size; if (bv->byte_stride != -1) { stride = bv->byte_stride; } - if (for_vertex && stride % 4) { + if (p_for_vertex && stride % 4) { stride += 4 - (stride % 4); //according to spec must be multiple of 4 } - ERR_FAIL_INDEX_V(bv->buffer, state->buffers.size(), ERR_PARSE_ERROR); + ERR_FAIL_INDEX_V(bv->buffer, p_state->buffers.size(), ERR_PARSE_ERROR); - const uint32_t offset = bv->byte_offset + byte_offset; - Vector<uint8_t> buffer = state->buffers[bv->buffer]; //copy on write, so no performance hit + const uint32_t offset = bv->byte_offset + p_byte_offset; + Vector<uint8_t> buffer = p_state->buffers[bv->buffer]; //copy on write, so no performance hit const uint8_t *bufptr = buffer.ptr(); //use to debug - print_verbose("glTF: type " + _get_type_name(type) + " component type: " + _get_component_type_name(component_type) + " stride: " + itos(stride) + " amount " + itos(count)); - print_verbose("glTF: accessor offset " + itos(byte_offset) + " view offset: " + itos(bv->byte_offset) + " total buffer len: " + itos(buffer.size()) + " view len " + itos(bv->byte_length)); + print_verbose("glTF: type " + _get_type_name(p_type) + " component type: " + _get_component_type_name(p_component_type) + " stride: " + itos(stride) + " amount " + itos(p_count)); + print_verbose("glTF: accessor offset " + itos(p_byte_offset) + " view offset: " + itos(bv->byte_offset) + " total buffer len: " + itos(buffer.size()) + " view len " + itos(bv->byte_length)); - const int buffer_end = (stride * (count - 1)) + element_size; + const int buffer_end = (stride * (p_count - 1)) + p_element_size; ERR_FAIL_COND_V(buffer_end > bv->byte_length, ERR_PARSE_ERROR); ERR_FAIL_COND_V((int)(offset + buffer_end) > buffer.size(), ERR_PARSE_ERROR); //fill everything as doubles - for (int i = 0; i < count; i++) { + for (int i = 0; i < p_count; i++) { const uint8_t *src = &bufptr[offset + i * stride]; - for (int j = 0; j < component_count; j++) { - if (skip_every && j > 0 && (j % skip_every) == 0) { - src += skip_bytes; + for (int j = 0; j < p_component_count; j++) { + if (p_skip_every && j > 0 && (j % p_skip_every) == 0) { + src += p_skip_bytes; } double d = 0; - switch (component_type) { + switch (p_component_type) { case COMPONENT_TYPE_BYTE: { int8_t b = int8_t(*src); - if (normalized) { + if (p_normalized) { d = (double(b) / 128.0); } else { d = double(b); @@ -1354,7 +1346,7 @@ Error GLTFDocument::_decode_buffer_view(Ref<GLTFState> state, double *dst, const } break; case COMPONENT_TYPE_UNSIGNED_BYTE: { uint8_t b = *src; - if (normalized) { + if (p_normalized) { d = (double(b) / 255.0); } else { d = double(b); @@ -1362,7 +1354,7 @@ Error GLTFDocument::_decode_buffer_view(Ref<GLTFState> state, double *dst, const } break; case COMPONENT_TYPE_SHORT: { int16_t s = *(int16_t *)src; - if (normalized) { + if (p_normalized) { d = (double(s) / 32768.0); } else { d = double(s); @@ -1370,7 +1362,7 @@ Error GLTFDocument::_decode_buffer_view(Ref<GLTFState> state, double *dst, const } break; case COMPONENT_TYPE_UNSIGNED_SHORT: { uint16_t s = *(uint16_t *)src; - if (normalized) { + if (p_normalized) { d = (double(s) / 65535.0); } else { d = double(s); @@ -1384,16 +1376,16 @@ Error GLTFDocument::_decode_buffer_view(Ref<GLTFState> state, double *dst, const } break; } - *dst++ = d; - src += component_size; + *p_dst++ = d; + src += p_component_size; } } return OK; } -int GLTFDocument::_get_component_type_size(const int component_type) { - switch (component_type) { +int GLTFDocument::_get_component_type_size(const int p_component_type) { + switch (p_component_type) { case COMPONENT_TYPE_BYTE: case COMPONENT_TYPE_UNSIGNED_BYTE: return 1; @@ -1413,13 +1405,13 @@ int GLTFDocument::_get_component_type_size(const int component_type) { return 0; } -Vector<double> GLTFDocument::_decode_accessor(Ref<GLTFState> state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { +Vector<double> GLTFDocument::_decode_accessor(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { //spec, for reference: //https://github.com/KhronosGroup/glTF/tree/master/specification/2.0#data-alignment - ERR_FAIL_INDEX_V(p_accessor, state->accessors.size(), Vector<double>()); + ERR_FAIL_INDEX_V(p_accessor, p_state->accessors.size(), Vector<double>()); - const Ref<GLTFAccessor> a = state->accessors[p_accessor]; + const Ref<GLTFAccessor> a = p_state->accessors[p_accessor]; const int component_count_for_type[7] = { 1, 2, 3, 4, 4, 9, 16 @@ -1464,9 +1456,9 @@ Vector<double> GLTFDocument::_decode_accessor(Ref<GLTFState> state, const GLTFAc double *dst = dst_buffer.ptrw(); if (a->buffer_view >= 0) { - ERR_FAIL_INDEX_V(a->buffer_view, state->buffer_views.size(), Vector<double>()); + ERR_FAIL_INDEX_V(a->buffer_view, p_state->buffer_views.size(), Vector<double>()); - const Error err = _decode_buffer_view(state, dst, a->buffer_view, skip_every, skip_bytes, element_size, a->count, a->type, component_count, a->component_type, component_size, a->normalized, a->byte_offset, p_for_vertex); + const Error err = _decode_buffer_view(p_state, dst, a->buffer_view, skip_every, skip_bytes, element_size, a->count, a->type, component_count, a->component_type, component_size, a->normalized, a->byte_offset, p_for_vertex); if (err != OK) { return Vector<double>(); } @@ -1483,14 +1475,14 @@ Vector<double> GLTFDocument::_decode_accessor(Ref<GLTFState> state, const GLTFAc indices.resize(a->sparse_count); const int indices_component_size = _get_component_type_size(a->sparse_indices_component_type); - Error err = _decode_buffer_view(state, indices.ptrw(), a->sparse_indices_buffer_view, 0, 0, indices_component_size, a->sparse_count, TYPE_SCALAR, 1, a->sparse_indices_component_type, indices_component_size, false, a->sparse_indices_byte_offset, false); + Error err = _decode_buffer_view(p_state, indices.ptrw(), a->sparse_indices_buffer_view, 0, 0, indices_component_size, a->sparse_count, TYPE_SCALAR, 1, a->sparse_indices_component_type, indices_component_size, false, a->sparse_indices_byte_offset, false); if (err != OK) { return Vector<double>(); } Vector<double> data; data.resize(component_count * a->sparse_count); - err = _decode_buffer_view(state, data.ptrw(), a->sparse_values_buffer_view, skip_every, skip_bytes, element_size, a->sparse_count, a->type, component_count, a->component_type, component_size, a->normalized, a->sparse_values_byte_offset, p_for_vertex); + err = _decode_buffer_view(p_state, data.ptrw(), a->sparse_values_buffer_view, skip_every, skip_bytes, element_size, a->sparse_count, a->type, component_count, a->component_type, component_size, a->normalized, a->sparse_values_byte_offset, p_for_vertex); if (err != OK) { return Vector<double>(); } @@ -1507,7 +1499,7 @@ Vector<double> GLTFDocument::_decode_accessor(Ref<GLTFState> state, const GLTFAc return dst_buffer; } -GLTFAccessorIndex GLTFDocument::_encode_accessor_as_ints(Ref<GLTFState> state, const Vector<int32_t> p_attribs, const bool p_for_vertex) { +GLTFAccessorIndex GLTFDocument::_encode_accessor_as_ints(Ref<GLTFState> p_state, const Vector<int32_t> p_attribs, const bool p_for_vertex) { if (p_attribs.size() == 0) { return -1; } @@ -1540,7 +1532,7 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_ints(Ref<GLTFState> state, c Ref<GLTFAccessor> accessor; accessor.instantiate(); GLTFBufferIndex buffer_view_i; - int64_t size = state->buffers[0].size(); + int64_t size = p_state->buffers[0].size(); const GLTFType type = GLTFType::TYPE_SCALAR; const int component_type = GLTFDocument::COMPONENT_TYPE_INT; @@ -1551,17 +1543,17 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_ints(Ref<GLTFState> state, c accessor->type = type; accessor->component_type = component_type; accessor->byte_offset = 0; - Error err = _encode_buffer_view(state, attribs.ptr(), attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); + Error err = _encode_buffer_view(p_state, attribs.ptr(), attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); if (err != OK) { return -1; } accessor->buffer_view = buffer_view_i; - state->accessors.push_back(accessor); - return state->accessors.size() - 1; + p_state->accessors.push_back(accessor); + return p_state->accessors.size() - 1; } -Vector<int> GLTFDocument::_decode_accessor_as_ints(Ref<GLTFState> state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { - const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex); +Vector<int> GLTFDocument::_decode_accessor_as_ints(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { + const Vector<double> attribs = _decode_accessor(p_state, p_accessor, p_for_vertex); Vector<int> ret; if (attribs.size() == 0) { @@ -1579,8 +1571,8 @@ Vector<int> GLTFDocument::_decode_accessor_as_ints(Ref<GLTFState> state, const G return ret; } -Vector<float> GLTFDocument::_decode_accessor_as_floats(Ref<GLTFState> state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { - const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex); +Vector<float> GLTFDocument::_decode_accessor_as_floats(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { + const Vector<double> attribs = _decode_accessor(p_state, p_accessor, p_for_vertex); Vector<float> ret; if (attribs.size() == 0) { @@ -1598,7 +1590,7 @@ Vector<float> GLTFDocument::_decode_accessor_as_floats(Ref<GLTFState> state, con return ret; } -GLTFAccessorIndex GLTFDocument::_encode_accessor_as_vec2(Ref<GLTFState> state, const Vector<Vector2> p_attribs, const bool p_for_vertex) { +GLTFAccessorIndex GLTFDocument::_encode_accessor_as_vec2(Ref<GLTFState> p_state, const Vector<Vector2> p_attribs, const bool p_for_vertex) { if (p_attribs.size() == 0) { return -1; } @@ -1624,7 +1616,7 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_vec2(Ref<GLTFState> state, c Ref<GLTFAccessor> accessor; accessor.instantiate(); GLTFBufferIndex buffer_view_i; - int64_t size = state->buffers[0].size(); + int64_t size = p_state->buffers[0].size(); const GLTFType type = GLTFType::TYPE_VEC2; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; @@ -1635,16 +1627,16 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_vec2(Ref<GLTFState> state, c accessor->type = type; accessor->component_type = component_type; accessor->byte_offset = 0; - Error err = _encode_buffer_view(state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); + Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); if (err != OK) { return -1; } accessor->buffer_view = buffer_view_i; - state->accessors.push_back(accessor); - return state->accessors.size() - 1; + p_state->accessors.push_back(accessor); + return p_state->accessors.size() - 1; } -GLTFAccessorIndex GLTFDocument::_encode_accessor_as_color(Ref<GLTFState> state, const Vector<Color> p_attribs, const bool p_for_vertex) { +GLTFAccessorIndex GLTFDocument::_encode_accessor_as_color(Ref<GLTFState> p_state, const Vector<Color> p_attribs, const bool p_for_vertex) { if (p_attribs.size() == 0) { return -1; } @@ -1673,7 +1665,7 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_color(Ref<GLTFState> state, Ref<GLTFAccessor> accessor; accessor.instantiate(); GLTFBufferIndex buffer_view_i; - int64_t size = state->buffers[0].size(); + int64_t size = p_state->buffers[0].size(); const GLTFType type = GLTFType::TYPE_VEC4; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; @@ -1684,31 +1676,31 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_color(Ref<GLTFState> state, accessor->type = type; accessor->component_type = component_type; accessor->byte_offset = 0; - Error err = _encode_buffer_view(state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); + Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); if (err != OK) { return -1; } accessor->buffer_view = buffer_view_i; - state->accessors.push_back(accessor); - return state->accessors.size() - 1; + p_state->accessors.push_back(accessor); + return p_state->accessors.size() - 1; } -void GLTFDocument::_calc_accessor_min_max(int i, const int element_count, Vector<double> &type_max, Vector<double> attribs, Vector<double> &type_min) { - if (i == 0) { - for (int32_t type_i = 0; type_i < element_count; type_i++) { - type_max.write[type_i] = attribs[(i * element_count) + type_i]; - type_min.write[type_i] = attribs[(i * element_count) + type_i]; +void GLTFDocument::_calc_accessor_min_max(int p_i, const int p_element_count, Vector<double> &p_type_max, Vector<double> p_attribs, Vector<double> &p_type_min) { + if (p_i == 0) { + for (int32_t type_i = 0; type_i < p_element_count; type_i++) { + p_type_max.write[type_i] = p_attribs[(p_i * p_element_count) + type_i]; + p_type_min.write[type_i] = p_attribs[(p_i * p_element_count) + type_i]; } } - for (int32_t type_i = 0; type_i < element_count; type_i++) { - type_max.write[type_i] = MAX(attribs[(i * element_count) + type_i], type_max[type_i]); - type_min.write[type_i] = MIN(attribs[(i * element_count) + type_i], type_min[type_i]); - type_max.write[type_i] = _filter_number(type_max.write[type_i]); - type_min.write[type_i] = _filter_number(type_min.write[type_i]); + for (int32_t type_i = 0; type_i < p_element_count; type_i++) { + p_type_max.write[type_i] = MAX(p_attribs[(p_i * p_element_count) + type_i], p_type_max[type_i]); + p_type_min.write[type_i] = MIN(p_attribs[(p_i * p_element_count) + type_i], p_type_min[type_i]); + p_type_max.write[type_i] = _filter_number(p_type_max.write[type_i]); + p_type_min.write[type_i] = _filter_number(p_type_min.write[type_i]); } } -GLTFAccessorIndex GLTFDocument::_encode_accessor_as_weights(Ref<GLTFState> state, const Vector<Color> p_attribs, const bool p_for_vertex) { +GLTFAccessorIndex GLTFDocument::_encode_accessor_as_weights(Ref<GLTFState> p_state, const Vector<Color> p_attribs, const bool p_for_vertex) { if (p_attribs.size() == 0) { return -1; } @@ -1738,7 +1730,7 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_weights(Ref<GLTFState> state Ref<GLTFAccessor> accessor; accessor.instantiate(); GLTFBufferIndex buffer_view_i; - int64_t size = state->buffers[0].size(); + int64_t size = p_state->buffers[0].size(); const GLTFType type = GLTFType::TYPE_VEC4; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; @@ -1749,16 +1741,16 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_weights(Ref<GLTFState> state accessor->type = type; accessor->component_type = component_type; accessor->byte_offset = 0; - Error err = _encode_buffer_view(state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); + Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); if (err != OK) { return -1; } accessor->buffer_view = buffer_view_i; - state->accessors.push_back(accessor); - return state->accessors.size() - 1; + p_state->accessors.push_back(accessor); + return p_state->accessors.size() - 1; } -GLTFAccessorIndex GLTFDocument::_encode_accessor_as_joints(Ref<GLTFState> state, const Vector<Color> p_attribs, const bool p_for_vertex) { +GLTFAccessorIndex GLTFDocument::_encode_accessor_as_joints(Ref<GLTFState> p_state, const Vector<Color> p_attribs, const bool p_for_vertex) { if (p_attribs.size() == 0) { return -1; } @@ -1785,7 +1777,7 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_joints(Ref<GLTFState> state, Ref<GLTFAccessor> accessor; accessor.instantiate(); GLTFBufferIndex buffer_view_i; - int64_t size = state->buffers[0].size(); + int64_t size = p_state->buffers[0].size(); const GLTFType type = GLTFType::TYPE_VEC4; const int component_type = GLTFDocument::COMPONENT_TYPE_UNSIGNED_SHORT; @@ -1796,16 +1788,16 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_joints(Ref<GLTFState> state, accessor->type = type; accessor->component_type = component_type; accessor->byte_offset = 0; - Error err = _encode_buffer_view(state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); + Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); if (err != OK) { return -1; } accessor->buffer_view = buffer_view_i; - state->accessors.push_back(accessor); - return state->accessors.size() - 1; + p_state->accessors.push_back(accessor); + return p_state->accessors.size() - 1; } -GLTFAccessorIndex GLTFDocument::_encode_accessor_as_quaternions(Ref<GLTFState> state, const Vector<Quaternion> p_attribs, const bool p_for_vertex) { +GLTFAccessorIndex GLTFDocument::_encode_accessor_as_quaternions(Ref<GLTFState> p_state, const Vector<Quaternion> p_attribs, const bool p_for_vertex) { if (p_attribs.size() == 0) { return -1; } @@ -1834,7 +1826,7 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_quaternions(Ref<GLTFState> s Ref<GLTFAccessor> accessor; accessor.instantiate(); GLTFBufferIndex buffer_view_i; - int64_t size = state->buffers[0].size(); + int64_t size = p_state->buffers[0].size(); const GLTFType type = GLTFType::TYPE_VEC4; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; @@ -1845,17 +1837,17 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_quaternions(Ref<GLTFState> s accessor->type = type; accessor->component_type = component_type; accessor->byte_offset = 0; - Error err = _encode_buffer_view(state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); + Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); if (err != OK) { return -1; } accessor->buffer_view = buffer_view_i; - state->accessors.push_back(accessor); - return state->accessors.size() - 1; + p_state->accessors.push_back(accessor); + return p_state->accessors.size() - 1; } -Vector<Vector2> GLTFDocument::_decode_accessor_as_vec2(Ref<GLTFState> state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { - const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex); +Vector<Vector2> GLTFDocument::_decode_accessor_as_vec2(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { + const Vector<double> attribs = _decode_accessor(p_state, p_accessor, p_for_vertex); Vector<Vector2> ret; if (attribs.size() == 0) { @@ -1874,7 +1866,7 @@ Vector<Vector2> GLTFDocument::_decode_accessor_as_vec2(Ref<GLTFState> state, con return ret; } -GLTFAccessorIndex GLTFDocument::_encode_accessor_as_floats(Ref<GLTFState> state, const Vector<real_t> p_attribs, const bool p_for_vertex) { +GLTFAccessorIndex GLTFDocument::_encode_accessor_as_floats(Ref<GLTFState> p_state, const Vector<real_t> p_attribs, const bool p_for_vertex) { if (p_attribs.size() == 0) { return -1; } @@ -1899,7 +1891,7 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_floats(Ref<GLTFState> state, Ref<GLTFAccessor> accessor; accessor.instantiate(); GLTFBufferIndex buffer_view_i; - int64_t size = state->buffers[0].size(); + int64_t size = p_state->buffers[0].size(); const GLTFType type = GLTFType::TYPE_SCALAR; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; @@ -1910,16 +1902,16 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_floats(Ref<GLTFState> state, accessor->type = type; accessor->component_type = component_type; accessor->byte_offset = 0; - Error err = _encode_buffer_view(state, attribs.ptr(), attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); + Error err = _encode_buffer_view(p_state, attribs.ptr(), attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); if (err != OK) { return -1; } accessor->buffer_view = buffer_view_i; - state->accessors.push_back(accessor); - return state->accessors.size() - 1; + p_state->accessors.push_back(accessor); + return p_state->accessors.size() - 1; } -GLTFAccessorIndex GLTFDocument::_encode_accessor_as_vec3(Ref<GLTFState> state, const Vector<Vector3> p_attribs, const bool p_for_vertex) { +GLTFAccessorIndex GLTFDocument::_encode_accessor_as_vec3(Ref<GLTFState> p_state, const Vector<Vector3> p_attribs, const bool p_for_vertex) { if (p_attribs.size() == 0) { return -1; } @@ -1945,7 +1937,7 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_vec3(Ref<GLTFState> state, c Ref<GLTFAccessor> accessor; accessor.instantiate(); GLTFBufferIndex buffer_view_i; - int64_t size = state->buffers[0].size(); + int64_t size = p_state->buffers[0].size(); const GLTFType type = GLTFType::TYPE_VEC3; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; @@ -1956,16 +1948,16 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_vec3(Ref<GLTFState> state, c accessor->type = type; accessor->component_type = component_type; accessor->byte_offset = 0; - Error err = _encode_buffer_view(state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); + Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); if (err != OK) { return -1; } accessor->buffer_view = buffer_view_i; - state->accessors.push_back(accessor); - return state->accessors.size() - 1; + p_state->accessors.push_back(accessor); + return p_state->accessors.size() - 1; } -GLTFAccessorIndex GLTFDocument::_encode_accessor_as_xform(Ref<GLTFState> state, const Vector<Transform3D> p_attribs, const bool p_for_vertex) { +GLTFAccessorIndex GLTFDocument::_encode_accessor_as_xform(Ref<GLTFState> p_state, const Vector<Transform3D> p_attribs, const bool p_for_vertex) { if (p_attribs.size() == 0) { return -1; } @@ -2013,7 +2005,7 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_xform(Ref<GLTFState> state, Ref<GLTFAccessor> accessor; accessor.instantiate(); GLTFBufferIndex buffer_view_i; - int64_t size = state->buffers[0].size(); + int64_t size = p_state->buffers[0].size(); const GLTFType type = GLTFType::TYPE_MAT4; const int component_type = GLTFDocument::COMPONENT_TYPE_FLOAT; @@ -2024,17 +2016,17 @@ GLTFAccessorIndex GLTFDocument::_encode_accessor_as_xform(Ref<GLTFState> state, accessor->type = type; accessor->component_type = component_type; accessor->byte_offset = 0; - Error err = _encode_buffer_view(state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); + Error err = _encode_buffer_view(p_state, attribs.ptr(), p_attribs.size(), type, component_type, accessor->normalized, size, p_for_vertex, buffer_view_i); if (err != OK) { return -1; } accessor->buffer_view = buffer_view_i; - state->accessors.push_back(accessor); - return state->accessors.size() - 1; + p_state->accessors.push_back(accessor); + return p_state->accessors.size() - 1; } -Vector<Vector3> GLTFDocument::_decode_accessor_as_vec3(Ref<GLTFState> state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { - const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex); +Vector<Vector3> GLTFDocument::_decode_accessor_as_vec3(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { + const Vector<double> attribs = _decode_accessor(p_state, p_accessor, p_for_vertex); Vector<Vector3> ret; if (attribs.size() == 0) { @@ -2053,15 +2045,15 @@ Vector<Vector3> GLTFDocument::_decode_accessor_as_vec3(Ref<GLTFState> state, con return ret; } -Vector<Color> GLTFDocument::_decode_accessor_as_color(Ref<GLTFState> state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { - const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex); +Vector<Color> GLTFDocument::_decode_accessor_as_color(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { + const Vector<double> attribs = _decode_accessor(p_state, p_accessor, p_for_vertex); Vector<Color> ret; if (attribs.size() == 0) { return ret; } - const int type = state->accessors[p_accessor]->type; + const int type = p_state->accessors[p_accessor]->type; ERR_FAIL_COND_V(!(type == TYPE_VEC3 || type == TYPE_VEC4), ret); int vec_len = 3; if (type == TYPE_VEC4) { @@ -2079,8 +2071,8 @@ Vector<Color> GLTFDocument::_decode_accessor_as_color(Ref<GLTFState> state, cons } return ret; } -Vector<Quaternion> GLTFDocument::_decode_accessor_as_quaternion(Ref<GLTFState> state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { - const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex); +Vector<Quaternion> GLTFDocument::_decode_accessor_as_quaternion(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { + const Vector<double> attribs = _decode_accessor(p_state, p_accessor, p_for_vertex); Vector<Quaternion> ret; if (attribs.size() == 0) { @@ -2098,8 +2090,8 @@ Vector<Quaternion> GLTFDocument::_decode_accessor_as_quaternion(Ref<GLTFState> s } return ret; } -Vector<Transform2D> GLTFDocument::_decode_accessor_as_xform2d(Ref<GLTFState> state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { - const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex); +Vector<Transform2D> GLTFDocument::_decode_accessor_as_xform2d(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { + const Vector<double> attribs = _decode_accessor(p_state, p_accessor, p_for_vertex); Vector<Transform2D> ret; if (attribs.size() == 0) { @@ -2115,8 +2107,8 @@ Vector<Transform2D> GLTFDocument::_decode_accessor_as_xform2d(Ref<GLTFState> sta return ret; } -Vector<Basis> GLTFDocument::_decode_accessor_as_basis(Ref<GLTFState> state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { - const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex); +Vector<Basis> GLTFDocument::_decode_accessor_as_basis(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { + const Vector<double> attribs = _decode_accessor(p_state, p_accessor, p_for_vertex); Vector<Basis> ret; if (attribs.size() == 0) { @@ -2133,8 +2125,8 @@ Vector<Basis> GLTFDocument::_decode_accessor_as_basis(Ref<GLTFState> state, cons return ret; } -Vector<Transform3D> GLTFDocument::_decode_accessor_as_xform(Ref<GLTFState> state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { - const Vector<double> attribs = _decode_accessor(state, p_accessor, p_for_vertex); +Vector<Transform3D> GLTFDocument::_decode_accessor_as_xform(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex) { + const Vector<double> attribs = _decode_accessor(p_state, p_accessor, p_for_vertex); Vector<Transform3D> ret; if (attribs.size() == 0) { @@ -2152,15 +2144,15 @@ Vector<Transform3D> GLTFDocument::_decode_accessor_as_xform(Ref<GLTFState> state return ret; } -Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { +Error GLTFDocument::_serialize_meshes(Ref<GLTFState> p_state) { Array meshes; - for (GLTFMeshIndex gltf_mesh_i = 0; gltf_mesh_i < state->meshes.size(); gltf_mesh_i++) { + for (GLTFMeshIndex gltf_mesh_i = 0; gltf_mesh_i < p_state->meshes.size(); gltf_mesh_i++) { print_verbose("glTF: Serializing mesh: " + itos(gltf_mesh_i)); - Ref<ImporterMesh> import_mesh = state->meshes.write[gltf_mesh_i]->get_mesh(); + Ref<ImporterMesh> import_mesh = p_state->meshes.write[gltf_mesh_i]->get_mesh(); if (import_mesh.is_null()) { continue; } - Array instance_materials = state->meshes.write[gltf_mesh_i]->get_instance_materials(); + Array instance_materials = p_state->meshes.write[gltf_mesh_i]->get_instance_materials(); Array primitives; Dictionary gltf_mesh; Array target_names; @@ -2213,7 +2205,7 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { { Vector<Vector3> a = array[Mesh::ARRAY_VERTEX]; ERR_FAIL_COND_V(!a.size(), ERR_INVALID_DATA); - attributes["POSITION"] = _encode_accessor_as_vec3(state, a, true); + attributes["POSITION"] = _encode_accessor_as_vec3(p_state, a, true); vertex_num = a.size(); } { @@ -2230,7 +2222,7 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { out.a = a[(i * 4) + 3]; attribs.write[i] = out; } - attributes["TANGENT"] = _encode_accessor_as_color(state, attribs, true); + attributes["TANGENT"] = _encode_accessor_as_color(p_state, attribs, true); } } { @@ -2242,19 +2234,19 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { for (int i = 0; i < ret_size; i++) { attribs.write[i] = Vector3(a[i]).normalized(); } - attributes["NORMAL"] = _encode_accessor_as_vec3(state, attribs, true); + attributes["NORMAL"] = _encode_accessor_as_vec3(p_state, attribs, true); } } { Vector<Vector2> a = array[Mesh::ARRAY_TEX_UV]; if (a.size()) { - attributes["TEXCOORD_0"] = _encode_accessor_as_vec2(state, a, true); + attributes["TEXCOORD_0"] = _encode_accessor_as_vec2(p_state, a, true); } } { Vector<Vector2> a = array[Mesh::ARRAY_TEX_UV2]; if (a.size()) { - attributes["TEXCOORD_1"] = _encode_accessor_as_vec2(state, a, true); + attributes["TEXCOORD_1"] = _encode_accessor_as_vec2(p_state, a, true); } } for (int custom_i = 0; custom_i < 3; custom_i++) { @@ -2283,7 +2275,7 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { if (!attributes.has(gltf_texcoord_key)) { Vector<Vector2> empty; empty.resize(vertex_num); - attributes[gltf_texcoord_key] = _encode_accessor_as_vec2(state, empty, true); + attributes[gltf_texcoord_key] = _encode_accessor_as_vec2(p_state, empty, true); } } @@ -2304,25 +2296,25 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { } } gltf_texcoord_key = vformat("TEXCOORD_%d", texcoord_i); - attributes[gltf_texcoord_key] = _encode_accessor_as_vec2(state, first_channel, true); + attributes[gltf_texcoord_key] = _encode_accessor_as_vec2(p_state, first_channel, true); gltf_texcoord_key = vformat("TEXCOORD_%d", texcoord_i + 1); - attributes[gltf_texcoord_key] = _encode_accessor_as_vec2(state, second_channel, true); + attributes[gltf_texcoord_key] = _encode_accessor_as_vec2(p_state, second_channel, true); } } { Vector<Color> a = array[Mesh::ARRAY_COLOR]; if (a.size()) { - attributes["COLOR_0"] = _encode_accessor_as_color(state, a, true); + attributes["COLOR_0"] = _encode_accessor_as_color(p_state, a, true); } } HashMap<int, int> joint_i_to_bone_i; - for (GLTFNodeIndex node_i = 0; node_i < state->nodes.size(); node_i++) { + for (GLTFNodeIndex node_i = 0; node_i < p_state->nodes.size(); node_i++) { GLTFSkinIndex skin_i = -1; - if (state->nodes[node_i]->mesh == gltf_mesh_i) { - skin_i = state->nodes[node_i]->skin; + if (p_state->nodes[node_i]->mesh == gltf_mesh_i) { + skin_i = p_state->nodes[node_i]->skin; } if (skin_i != -1) { - joint_i_to_bone_i = state->skins[skin_i]->joint_i_to_bone_i; + joint_i_to_bone_i = p_state->skins[skin_i]->joint_i_to_bone_i; break; } } @@ -2342,7 +2334,7 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { attribs.write[array_i] = Color(joint_0, joint_1, joint_2, joint_3); } } - attributes["JOINTS_0"] = _encode_accessor_as_joints(state, attribs, true); + attributes["JOINTS_0"] = _encode_accessor_as_joints(p_state, attribs, true); } else if ((a.size() / (JOINT_GROUP_SIZE * 2)) >= vertex_array.size()) { Vector<Color> joints_0; joints_0.resize(vertex_num); @@ -2363,8 +2355,8 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { joint_1.a = a[vertex_i * weights_8_count + 7]; joints_1.write[vertex_i] = joint_1; } - attributes["JOINTS_0"] = _encode_accessor_as_joints(state, joints_0, true); - attributes["JOINTS_1"] = _encode_accessor_as_joints(state, joints_1, true); + attributes["JOINTS_0"] = _encode_accessor_as_joints(p_state, joints_0, true); + attributes["JOINTS_1"] = _encode_accessor_as_joints(p_state, joints_1, true); } } { @@ -2377,7 +2369,7 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { for (int i = 0; i < vertex_count; i++) { attribs.write[i] = Color(a[(i * JOINT_GROUP_SIZE) + 0], a[(i * JOINT_GROUP_SIZE) + 1], a[(i * JOINT_GROUP_SIZE) + 2], a[(i * JOINT_GROUP_SIZE) + 3]); } - attributes["WEIGHTS_0"] = _encode_accessor_as_weights(state, attribs, true); + attributes["WEIGHTS_0"] = _encode_accessor_as_weights(p_state, attribs, true); } else if ((a.size() / (JOINT_GROUP_SIZE * 2)) >= vertex_array.size()) { Vector<Color> weights_0; weights_0.resize(vertex_num); @@ -2398,8 +2390,8 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { weight_1.a = a[vertex_i * weights_8_count + 7]; weights_1.write[vertex_i] = weight_1; } - attributes["WEIGHTS_0"] = _encode_accessor_as_weights(state, weights_0, true); - attributes["WEIGHTS_1"] = _encode_accessor_as_weights(state, weights_1, true); + attributes["WEIGHTS_0"] = _encode_accessor_as_weights(p_state, weights_0, true); + attributes["WEIGHTS_1"] = _encode_accessor_as_weights(p_state, weights_1, true); } } { @@ -2412,7 +2404,7 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { SWAP(mesh_indices.write[k + 0], mesh_indices.write[k + 2]); } } - primitive["indices"] = _encode_accessor_as_ints(state, mesh_indices, true); + primitive["indices"] = _encode_accessor_as_ints(p_state, mesh_indices, true); } else { if (primitive_type == Mesh::PRIMITIVE_TRIANGLES) { //generate indices because they need to be swapped for CW/CCW @@ -2431,7 +2423,7 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { generated_indices.write[k + 2] = k + 1; } } - primitive["indices"] = _encode_accessor_as_ints(state, generated_indices, true); + primitive["indices"] = _encode_accessor_as_ints(p_state, generated_indices, true); } } } @@ -2456,12 +2448,12 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { } } - t["POSITION"] = _encode_accessor_as_vec3(state, varr, true); + t["POSITION"] = _encode_accessor_as_vec3(p_state, varr, true); } Vector<Vector3> narr = array_morph[Mesh::ARRAY_NORMAL]; if (narr.size()) { - t["NORMAL"] = _encode_accessor_as_vec3(state, narr, true); + t["NORMAL"] = _encode_accessor_as_vec3(p_state, narr, true); } Vector<real_t> tarr = array_morph[Mesh::ARRAY_TANGENT]; if (tarr.size()) { @@ -2474,7 +2466,7 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { vec3.y = tarr[(i * 4) + 1]; vec3.z = tarr[(i * 4) + 2]; } - t["TANGENT"] = _encode_accessor_as_vec3(state, attribs, true); + t["TANGENT"] = _encode_accessor_as_vec3(p_state, attribs, true); } targets.push_back(t); } @@ -2489,14 +2481,14 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { mat = import_mesh->get_surface_material(surface_i); } if (mat.is_valid()) { - HashMap<Ref<Material>, GLTFMaterialIndex>::Iterator material_cache_i = state->material_cache.find(mat); + HashMap<Ref<Material>, GLTFMaterialIndex>::Iterator material_cache_i = p_state->material_cache.find(mat); if (material_cache_i && material_cache_i->value != -1) { primitive["material"] = material_cache_i->value; } else { - GLTFMaterialIndex mat_i = state->materials.size(); - state->materials.push_back(mat); + GLTFMaterialIndex mat_i = p_state->materials.size(); + p_state->materials.push_back(mat); primitive["material"] = mat_i; - state->material_cache.insert(mat, mat_i); + p_state->material_cache.insert(mat, mat_i); } } @@ -2513,8 +2505,8 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { weights.resize(target_names.size()); for (int name_i = 0; name_i < target_names.size(); name_i++) { real_t weight = 0.0; - if (name_i < state->meshes.write[gltf_mesh_i]->get_blend_weights().size()) { - weight = state->meshes.write[gltf_mesh_i]->get_blend_weights()[name_i]; + if (name_i < p_state->meshes.write[gltf_mesh_i]->get_blend_weights().size()) { + weight = p_state->meshes.write[gltf_mesh_i]->get_blend_weights()[name_i]; } weights[name_i] = weight; } @@ -2534,18 +2526,18 @@ Error GLTFDocument::_serialize_meshes(Ref<GLTFState> state) { if (!meshes.size()) { return OK; } - state->json["meshes"] = meshes; + p_state->json["meshes"] = meshes; print_verbose("glTF: Total meshes: " + itos(meshes.size())); return OK; } -Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { - if (!state->json.has("meshes")) { +Error GLTFDocument::_parse_meshes(Ref<GLTFState> p_state) { + if (!p_state->json.has("meshes")) { return OK; } - Array meshes = state->json["meshes"]; + Array meshes = p_state->json["meshes"]; for (GLTFMeshIndex i = 0; i < meshes.size(); i++) { print_verbose("glTF: Parsing mesh: " + itos(i)); Dictionary d = meshes[i]; @@ -2564,7 +2556,7 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { if (d.has("name") && !String(d["name"]).is_empty()) { mesh_name = d["name"]; } - import_mesh->set_name(_gen_unique_name(state, vformat("%s_%s", state->scene_name, mesh_name))); + import_mesh->set_name(_gen_unique_name(p_state, vformat("%s_%s", p_state->scene_name, mesh_name))); for (int j = 0; j < primitives.size(); j++) { uint32_t flags = 0; @@ -2600,21 +2592,21 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { ERR_FAIL_COND_V(!a.has("POSITION"), ERR_PARSE_ERROR); int32_t vertex_num = 0; if (a.has("POSITION")) { - PackedVector3Array vertices = _decode_accessor_as_vec3(state, a["POSITION"], true); + PackedVector3Array vertices = _decode_accessor_as_vec3(p_state, a["POSITION"], true); array[Mesh::ARRAY_VERTEX] = vertices; vertex_num = vertices.size(); } if (a.has("NORMAL")) { - array[Mesh::ARRAY_NORMAL] = _decode_accessor_as_vec3(state, a["NORMAL"], true); + array[Mesh::ARRAY_NORMAL] = _decode_accessor_as_vec3(p_state, a["NORMAL"], true); } if (a.has("TANGENT")) { - array[Mesh::ARRAY_TANGENT] = _decode_accessor_as_floats(state, a["TANGENT"], true); + array[Mesh::ARRAY_TANGENT] = _decode_accessor_as_floats(p_state, a["TANGENT"], true); } if (a.has("TEXCOORD_0")) { - array[Mesh::ARRAY_TEX_UV] = _decode_accessor_as_vec2(state, a["TEXCOORD_0"], true); + array[Mesh::ARRAY_TEX_UV] = _decode_accessor_as_vec2(p_state, a["TEXCOORD_0"], true); } if (a.has("TEXCOORD_1")) { - array[Mesh::ARRAY_TEX_UV2] = _decode_accessor_as_vec2(state, a["TEXCOORD_1"], true); + array[Mesh::ARRAY_TEX_UV2] = _decode_accessor_as_vec2(p_state, a["TEXCOORD_1"], true); } for (int custom_i = 0; custom_i < 3; custom_i++) { Vector<float> cur_custom; @@ -2625,12 +2617,12 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { String gltf_texcoord_key = vformat("TEXCOORD_%d", texcoord_i); int num_channels = 0; if (a.has(gltf_texcoord_key)) { - texcoord_first = _decode_accessor_as_vec2(state, a[gltf_texcoord_key], true); + texcoord_first = _decode_accessor_as_vec2(p_state, a[gltf_texcoord_key], true); num_channels = 2; } gltf_texcoord_key = vformat("TEXCOORD_%d", texcoord_i + 1); if (a.has(gltf_texcoord_key)) { - texcoord_second = _decode_accessor_as_vec2(state, a[gltf_texcoord_key], true); + texcoord_second = _decode_accessor_as_vec2(p_state, a[gltf_texcoord_key], true); num_channels = 4; } if (!num_channels) { @@ -2671,14 +2663,14 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { } } if (a.has("COLOR_0")) { - array[Mesh::ARRAY_COLOR] = _decode_accessor_as_color(state, a["COLOR_0"], true); + array[Mesh::ARRAY_COLOR] = _decode_accessor_as_color(p_state, a["COLOR_0"], true); has_vertex_color = true; } if (a.has("JOINTS_0") && !a.has("JOINTS_1")) { - array[Mesh::ARRAY_BONES] = _decode_accessor_as_ints(state, a["JOINTS_0"], true); + array[Mesh::ARRAY_BONES] = _decode_accessor_as_ints(p_state, a["JOINTS_0"], true); } else if (a.has("JOINTS_0") && a.has("JOINTS_1")) { - PackedInt32Array joints_0 = _decode_accessor_as_ints(state, a["JOINTS_0"], true); - PackedInt32Array joints_1 = _decode_accessor_as_ints(state, a["JOINTS_1"], true); + PackedInt32Array joints_0 = _decode_accessor_as_ints(p_state, a["JOINTS_0"], true); + PackedInt32Array joints_1 = _decode_accessor_as_ints(p_state, a["JOINTS_1"], true); ERR_FAIL_COND_V(joints_0.size() != joints_1.size(), ERR_INVALID_DATA); int32_t weight_8_count = JOINT_GROUP_SIZE * 2; Vector<int> joints; @@ -2696,7 +2688,7 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { array[Mesh::ARRAY_BONES] = joints; } if (a.has("WEIGHTS_0") && !a.has("WEIGHTS_1")) { - Vector<float> weights = _decode_accessor_as_floats(state, a["WEIGHTS_0"], true); + Vector<float> weights = _decode_accessor_as_floats(p_state, a["WEIGHTS_0"], true); { //gltf does not seem to normalize the weights for some reason.. int wc = weights.size(); float *w = weights.ptrw(); @@ -2717,8 +2709,8 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { } array[Mesh::ARRAY_WEIGHTS] = weights; } else if (a.has("WEIGHTS_0") && a.has("WEIGHTS_1")) { - Vector<float> weights_0 = _decode_accessor_as_floats(state, a["WEIGHTS_0"], true); - Vector<float> weights_1 = _decode_accessor_as_floats(state, a["WEIGHTS_1"], true); + Vector<float> weights_0 = _decode_accessor_as_floats(p_state, a["WEIGHTS_0"], true); + Vector<float> weights_1 = _decode_accessor_as_floats(p_state, a["WEIGHTS_1"], true); Vector<float> weights; ERR_FAIL_COND_V(weights_0.size() != weights_1.size(), ERR_INVALID_DATA); int32_t weight_8_count = JOINT_GROUP_SIZE * 2; @@ -2763,7 +2755,7 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { } if (p.has("indices")) { - Vector<int> indices = _decode_accessor_as_ints(state, p["indices"], false); + Vector<int> indices = _decode_accessor_as_ints(p_state, p["indices"], false); if (primitive == Mesh::PRIMITIVE_TRIANGLES) { //swap around indices, convert ccw to cw for front face @@ -2837,7 +2829,7 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { } if (t.has("POSITION")) { - Vector<Vector3> varr = _decode_accessor_as_vec3(state, t["POSITION"], true); + Vector<Vector3> varr = _decode_accessor_as_vec3(p_state, t["POSITION"], true); const Vector<Vector3> src_varr = array[Mesh::ARRAY_VERTEX]; const int size = src_varr.size(); ERR_FAIL_COND_V(size == 0, ERR_PARSE_ERROR); @@ -2859,7 +2851,7 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { array_copy[Mesh::ARRAY_VERTEX] = varr; } if (t.has("NORMAL")) { - Vector<Vector3> narr = _decode_accessor_as_vec3(state, t["NORMAL"], true); + Vector<Vector3> narr = _decode_accessor_as_vec3(p_state, t["NORMAL"], true); const Vector<Vector3> src_narr = array[Mesh::ARRAY_NORMAL]; int size = src_narr.size(); ERR_FAIL_COND_V(size == 0, ERR_PARSE_ERROR); @@ -2881,7 +2873,7 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { array_copy[Mesh::ARRAY_NORMAL] = narr; } if (t.has("TANGENT")) { - const Vector<Vector3> tangents_v3 = _decode_accessor_as_vec3(state, t["TANGENT"], true); + const Vector<Vector3> tangents_v3 = _decode_accessor_as_vec3(p_state, t["TANGENT"], true); const Vector<float> src_tangents = array[Mesh::ARRAY_TANGENT]; ERR_FAIL_COND_V(src_tangents.size() == 0, ERR_PARSE_ERROR); @@ -2939,11 +2931,11 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { Ref<Material> mat; String mat_name; - if (!state->discard_meshes_and_materials) { + if (!p_state->discard_meshes_and_materials) { if (p.has("material")) { const int material = p["material"]; - ERR_FAIL_INDEX_V(material, state->materials.size(), ERR_FILE_CORRUPT); - Ref<Material> mat3d = state->materials[material]; + ERR_FAIL_INDEX_V(material, p_state->materials.size(), ERR_FILE_CORRUPT); + Ref<Material> mat3d = p_state->materials[material]; ERR_FAIL_NULL_V(mat3d, ERR_FILE_CORRUPT); Ref<BaseMaterial3D> base_material = mat3d; @@ -2985,22 +2977,22 @@ Error GLTFDocument::_parse_meshes(Ref<GLTFState> state) { mesh->set_blend_weights(blend_weights); mesh->set_mesh(import_mesh); - state->meshes.push_back(mesh); + p_state->meshes.push_back(mesh); } - print_verbose("glTF: Total meshes: " + itos(state->meshes.size())); + print_verbose("glTF: Total meshes: " + itos(p_state->meshes.size())); return OK; } -Error GLTFDocument::_serialize_images(Ref<GLTFState> state, const String &p_path) { +Error GLTFDocument::_serialize_images(Ref<GLTFState> p_state, const String &p_path) { Array images; - for (int i = 0; i < state->images.size(); i++) { + for (int i = 0; i < p_state->images.size(); i++) { Dictionary d; - ERR_CONTINUE(state->images[i].is_null()); + ERR_CONTINUE(p_state->images[i].is_null()); - Ref<Image> image = state->images[i]->get_image(); + Ref<Image> image = p_state->images[i]->get_image(); ERR_CONTINUE(image.is_null()); if (p_path.to_lower().ends_with("glb") || p_path.is_empty()) { @@ -3011,8 +3003,8 @@ Error GLTFDocument::_serialize_images(Ref<GLTFState> state, const String &p_path const GLTFBufferIndex bi = 0; bv->buffer = bi; - bv->byte_offset = state->buffers[bi].size(); - ERR_FAIL_INDEX_V(bi, state->buffers.size(), ERR_PARAMETER_RANGE_ERROR); + bv->byte_offset = p_state->buffers[bi].size(); + ERR_FAIL_INDEX_V(bi, p_state->buffers.size(), ERR_PARAMETER_RANGE_ERROR); Vector<uint8_t> buffer; Ref<ImageTexture> img_tex = image; @@ -3023,21 +3015,21 @@ Error GLTFDocument::_serialize_images(Ref<GLTFState> state, const String &p_path ERR_FAIL_COND_V_MSG(err, err, "Can't convert image to PNG."); bv->byte_length = buffer.size(); - state->buffers.write[bi].resize(state->buffers[bi].size() + bv->byte_length); - memcpy(&state->buffers.write[bi].write[bv->byte_offset], buffer.ptr(), buffer.size()); - ERR_FAIL_COND_V(bv->byte_offset + bv->byte_length > state->buffers[bi].size(), ERR_FILE_CORRUPT); + p_state->buffers.write[bi].resize(p_state->buffers[bi].size() + bv->byte_length); + memcpy(&p_state->buffers.write[bi].write[bv->byte_offset], buffer.ptr(), buffer.size()); + ERR_FAIL_COND_V(bv->byte_offset + bv->byte_length > p_state->buffers[bi].size(), ERR_FILE_CORRUPT); - state->buffer_views.push_back(bv); - bvi = state->buffer_views.size() - 1; + p_state->buffer_views.push_back(bv); + bvi = p_state->buffer_views.size() - 1; d["bufferView"] = bvi; d["mimeType"] = "image/png"; } else { ERR_FAIL_COND_V(p_path.is_empty(), ERR_INVALID_PARAMETER); - String img_name = state->images[i]->get_name(); + String img_name = p_state->images[i]->get_name(); if (img_name.is_empty()) { img_name = itos(i); } - img_name = _gen_unique_name(state, img_name); + img_name = _gen_unique_name(p_state, img_name); img_name = img_name.pad_zeros(3) + ".png"; String texture_dir = "textures"; String path = p_path.get_base_dir(); @@ -3052,25 +3044,25 @@ Error GLTFDocument::_serialize_images(Ref<GLTFState> state, const String &p_path images.push_back(d); } - print_verbose("Total images: " + itos(state->images.size())); + print_verbose("Total images: " + itos(p_state->images.size())); if (!images.size()) { return OK; } - state->json["images"] = images; + p_state->json["images"] = images; return OK; } -Error GLTFDocument::_parse_images(Ref<GLTFState> state, const String &p_base_path) { - ERR_FAIL_NULL_V(state, ERR_INVALID_PARAMETER); - if (!state->json.has("images")) { +Error GLTFDocument::_parse_images(Ref<GLTFState> p_state, const String &p_base_path) { + ERR_FAIL_NULL_V(p_state, ERR_INVALID_PARAMETER); + if (!p_state->json.has("images")) { return OK; } // Ref: https://github.com/KhronosGroup/glTF/blob/master/specification/2.0/README.md#images - const Array &images = state->json["images"]; + const Array &images = p_state->json["images"]; for (int i = 0; i < images.size(); i++) { const Dictionary &d = images[i]; @@ -3108,7 +3100,7 @@ Error GLTFDocument::_parse_images(Ref<GLTFState> state, const String &p_base_pat !uri.begins_with("data:image/png;base64") && !uri.begins_with("data:image/jpeg;base64")) { WARN_PRINT(vformat("glTF: Image index '%d' uses an unsupported URI data type: %s. Skipping it.", i, uri)); - state->images.push_back(Ref<Texture2D>()); // Placeholder to keep count. + p_state->images.push_back(Ref<Texture2D>()); // Placeholder to keep count. continue; } data = _parse_base64_uri(uri); @@ -3133,7 +3125,7 @@ Error GLTFDocument::_parse_images(Ref<GLTFState> state, const String &p_base_pat // the material), so we do this only as fallback. Ref<Texture2D> texture = ResourceLoader::load(uri); if (texture.is_valid()) { - state->images.push_back(texture); + p_state->images.push_back(texture); continue; } else if (mimetype == "image/png" || mimetype == "image/jpeg") { // Fallback to loading as byte array. @@ -3142,14 +3134,14 @@ Error GLTFDocument::_parse_images(Ref<GLTFState> state, const String &p_base_pat data = FileAccess::get_file_as_bytes(uri); if (data.size() == 0) { WARN_PRINT(vformat("glTF: Image index '%d' couldn't be loaded as a buffer of MIME type '%s' from URI: %s. Skipping it.", i, mimetype, uri)); - state->images.push_back(Ref<Texture2D>()); // Placeholder to keep count. + p_state->images.push_back(Ref<Texture2D>()); // Placeholder to keep count. continue; } data_ptr = data.ptr(); data_size = data.size(); } else { WARN_PRINT(vformat("glTF: Image index '%d' couldn't be loaded from URI: %s. Skipping it.", i, uri)); - state->images.push_back(Ref<Texture2D>()); // Placeholder to keep count. + p_state->images.push_back(Ref<Texture2D>()); // Placeholder to keep count. continue; } } @@ -3160,16 +3152,16 @@ Error GLTFDocument::_parse_images(Ref<GLTFState> state, const String &p_base_pat const GLTFBufferViewIndex bvi = d["bufferView"]; - ERR_FAIL_INDEX_V(bvi, state->buffer_views.size(), ERR_PARAMETER_RANGE_ERROR); + ERR_FAIL_INDEX_V(bvi, p_state->buffer_views.size(), ERR_PARAMETER_RANGE_ERROR); - Ref<GLTFBufferView> bv = state->buffer_views[bvi]; + Ref<GLTFBufferView> bv = p_state->buffer_views[bvi]; const GLTFBufferIndex bi = bv->buffer; - ERR_FAIL_INDEX_V(bi, state->buffers.size(), ERR_PARAMETER_RANGE_ERROR); + ERR_FAIL_INDEX_V(bi, p_state->buffers.size(), ERR_PARAMETER_RANGE_ERROR); - ERR_FAIL_COND_V(bv->byte_offset + bv->byte_length > state->buffers[bi].size(), ERR_FILE_CORRUPT); + ERR_FAIL_COND_V(bv->byte_offset + bv->byte_length > p_state->buffers[bi].size(), ERR_FILE_CORRUPT); - data_ptr = &state->buffers[bi][bv->byte_offset]; + data_ptr = &p_state->buffers[bi][bv->byte_offset]; data_size = bv->byte_length; } @@ -3202,26 +3194,26 @@ Error GLTFDocument::_parse_images(Ref<GLTFState> state, const String &p_base_pat // Now we've done our best, fix your scenes. if (img.is_null()) { ERR_PRINT(vformat("glTF: Couldn't load image index '%d' with its given mimetype: %s.", i, mimetype)); - state->images.push_back(Ref<Texture2D>()); + p_state->images.push_back(Ref<Texture2D>()); continue; } - state->images.push_back(ImageTexture::create_from_image(img)); + p_state->images.push_back(ImageTexture::create_from_image(img)); } - print_verbose("glTF: Total images: " + itos(state->images.size())); + print_verbose("glTF: Total images: " + itos(p_state->images.size())); return OK; } -Error GLTFDocument::_serialize_textures(Ref<GLTFState> state) { - if (!state->textures.size()) { +Error GLTFDocument::_serialize_textures(Ref<GLTFState> p_state) { + if (!p_state->textures.size()) { return OK; } Array textures; - for (int32_t i = 0; i < state->textures.size(); i++) { + for (int32_t i = 0; i < p_state->textures.size(); i++) { Dictionary d; - Ref<GLTFTexture> t = state->textures[i]; + Ref<GLTFTexture> t = p_state->textures[i]; ERR_CONTINUE(t->get_src_image() == -1); d["source"] = t->get_src_image(); @@ -3231,17 +3223,17 @@ Error GLTFDocument::_serialize_textures(Ref<GLTFState> state) { } textures.push_back(d); } - state->json["textures"] = textures; + p_state->json["textures"] = textures; return OK; } -Error GLTFDocument::_parse_textures(Ref<GLTFState> state) { - if (!state->json.has("textures")) { +Error GLTFDocument::_parse_textures(Ref<GLTFState> p_state) { + if (!p_state->json.has("textures")) { return OK; } - const Array &textures = state->json["textures"]; + const Array &textures = p_state->json["textures"]; for (GLTFTextureIndex i = 0; i < textures.size(); i++) { const Dictionary &d = textures[i]; @@ -3255,96 +3247,96 @@ Error GLTFDocument::_parse_textures(Ref<GLTFState> state) { } else { t->set_sampler(-1); } - state->textures.push_back(t); + p_state->textures.push_back(t); } return OK; } -GLTFTextureIndex GLTFDocument::_set_texture(Ref<GLTFState> state, Ref<Texture2D> p_texture, StandardMaterial3D::TextureFilter p_filter_mode, bool p_repeats) { +GLTFTextureIndex GLTFDocument::_set_texture(Ref<GLTFState> p_state, Ref<Texture2D> p_texture, StandardMaterial3D::TextureFilter p_filter_mode, bool p_repeats) { ERR_FAIL_COND_V(p_texture.is_null(), -1); Ref<GLTFTexture> gltf_texture; gltf_texture.instantiate(); ERR_FAIL_COND_V(p_texture->get_image().is_null(), -1); - GLTFImageIndex gltf_src_image_i = state->images.size(); - state->images.push_back(p_texture); + GLTFImageIndex gltf_src_image_i = p_state->images.size(); + p_state->images.push_back(p_texture); gltf_texture->set_src_image(gltf_src_image_i); - gltf_texture->set_sampler(_set_sampler_for_mode(state, p_filter_mode, p_repeats)); - GLTFTextureIndex gltf_texture_i = state->textures.size(); - state->textures.push_back(gltf_texture); + gltf_texture->set_sampler(_set_sampler_for_mode(p_state, p_filter_mode, p_repeats)); + GLTFTextureIndex gltf_texture_i = p_state->textures.size(); + p_state->textures.push_back(gltf_texture); return gltf_texture_i; } -Ref<Texture2D> GLTFDocument::_get_texture(Ref<GLTFState> state, const GLTFTextureIndex p_texture) { - ERR_FAIL_INDEX_V(p_texture, state->textures.size(), Ref<Texture2D>()); - const GLTFImageIndex image = state->textures[p_texture]->get_src_image(); +Ref<Texture2D> GLTFDocument::_get_texture(Ref<GLTFState> p_state, const GLTFTextureIndex p_texture) { + ERR_FAIL_INDEX_V(p_texture, p_state->textures.size(), Ref<Texture2D>()); + const GLTFImageIndex image = p_state->textures[p_texture]->get_src_image(); - ERR_FAIL_INDEX_V(image, state->images.size(), Ref<Texture2D>()); + ERR_FAIL_INDEX_V(image, p_state->images.size(), Ref<Texture2D>()); - return state->images[image]; + return p_state->images[image]; } -GLTFTextureSamplerIndex GLTFDocument::_set_sampler_for_mode(Ref<GLTFState> state, StandardMaterial3D::TextureFilter p_filter_mode, bool p_repeats) { - for (int i = 0; i < state->texture_samplers.size(); ++i) { - if (state->texture_samplers[i]->get_filter_mode() == p_filter_mode) { +GLTFTextureSamplerIndex GLTFDocument::_set_sampler_for_mode(Ref<GLTFState> p_state, StandardMaterial3D::TextureFilter p_filter_mode, bool p_repeats) { + for (int i = 0; i < p_state->texture_samplers.size(); ++i) { + if (p_state->texture_samplers[i]->get_filter_mode() == p_filter_mode) { return i; } } - GLTFTextureSamplerIndex gltf_sampler_i = state->texture_samplers.size(); + GLTFTextureSamplerIndex gltf_sampler_i = p_state->texture_samplers.size(); Ref<GLTFTextureSampler> gltf_sampler; gltf_sampler.instantiate(); gltf_sampler->set_filter_mode(p_filter_mode); gltf_sampler->set_wrap_mode(p_repeats); - state->texture_samplers.push_back(gltf_sampler); + p_state->texture_samplers.push_back(gltf_sampler); return gltf_sampler_i; } -Ref<GLTFTextureSampler> GLTFDocument::_get_sampler_for_texture(Ref<GLTFState> state, const GLTFTextureIndex p_texture) { - ERR_FAIL_INDEX_V(p_texture, state->textures.size(), Ref<Texture2D>()); - const GLTFTextureSamplerIndex sampler = state->textures[p_texture]->get_sampler(); +Ref<GLTFTextureSampler> GLTFDocument::_get_sampler_for_texture(Ref<GLTFState> p_state, const GLTFTextureIndex p_texture) { + ERR_FAIL_INDEX_V(p_texture, p_state->textures.size(), Ref<Texture2D>()); + const GLTFTextureSamplerIndex sampler = p_state->textures[p_texture]->get_sampler(); if (sampler == -1) { - return state->default_texture_sampler; + return p_state->default_texture_sampler; } else { - ERR_FAIL_INDEX_V(sampler, state->texture_samplers.size(), Ref<GLTFTextureSampler>()); + ERR_FAIL_INDEX_V(sampler, p_state->texture_samplers.size(), Ref<GLTFTextureSampler>()); - return state->texture_samplers[sampler]; + return p_state->texture_samplers[sampler]; } } -Error GLTFDocument::_serialize_texture_samplers(Ref<GLTFState> state) { - if (!state->texture_samplers.size()) { +Error GLTFDocument::_serialize_texture_samplers(Ref<GLTFState> p_state) { + if (!p_state->texture_samplers.size()) { return OK; } Array samplers; - for (int32_t i = 0; i < state->texture_samplers.size(); ++i) { + for (int32_t i = 0; i < p_state->texture_samplers.size(); ++i) { Dictionary d; - Ref<GLTFTextureSampler> s = state->texture_samplers[i]; + Ref<GLTFTextureSampler> s = p_state->texture_samplers[i]; d["magFilter"] = s->get_mag_filter(); d["minFilter"] = s->get_min_filter(); d["wrapS"] = s->get_wrap_s(); d["wrapT"] = s->get_wrap_t(); samplers.push_back(d); } - state->json["samplers"] = samplers; + p_state->json["samplers"] = samplers; return OK; } -Error GLTFDocument::_parse_texture_samplers(Ref<GLTFState> state) { - state->default_texture_sampler.instantiate(); - state->default_texture_sampler->set_min_filter(GLTFTextureSampler::FilterMode::LINEAR_MIPMAP_LINEAR); - state->default_texture_sampler->set_mag_filter(GLTFTextureSampler::FilterMode::LINEAR); - state->default_texture_sampler->set_wrap_s(GLTFTextureSampler::WrapMode::REPEAT); - state->default_texture_sampler->set_wrap_t(GLTFTextureSampler::WrapMode::REPEAT); +Error GLTFDocument::_parse_texture_samplers(Ref<GLTFState> p_state) { + p_state->default_texture_sampler.instantiate(); + p_state->default_texture_sampler->set_min_filter(GLTFTextureSampler::FilterMode::LINEAR_MIPMAP_LINEAR); + p_state->default_texture_sampler->set_mag_filter(GLTFTextureSampler::FilterMode::LINEAR); + p_state->default_texture_sampler->set_wrap_s(GLTFTextureSampler::WrapMode::REPEAT); + p_state->default_texture_sampler->set_wrap_t(GLTFTextureSampler::WrapMode::REPEAT); - if (!state->json.has("samplers")) { + if (!p_state->json.has("samplers")) { return OK; } - const Array &samplers = state->json["samplers"]; + const Array &samplers = p_state->json["samplers"]; for (int i = 0; i < samplers.size(); ++i) { const Dictionary &d = samplers[i]; @@ -3374,195 +3366,197 @@ Error GLTFDocument::_parse_texture_samplers(Ref<GLTFState> state) { sampler->set_wrap_t(GLTFTextureSampler::WrapMode::DEFAULT); } - state->texture_samplers.push_back(sampler); + p_state->texture_samplers.push_back(sampler); } return OK; } -Error GLTFDocument::_serialize_materials(Ref<GLTFState> state) { +Error GLTFDocument::_serialize_materials(Ref<GLTFState> p_state) { Array materials; - for (int32_t i = 0; i < state->materials.size(); i++) { + for (int32_t i = 0; i < p_state->materials.size(); i++) { Dictionary d; - Ref<Material> material = state->materials[i]; + Ref<Material> material = p_state->materials[i]; if (material.is_null()) { materials.push_back(d); continue; } if (!material->get_name().is_empty()) { - d["name"] = _gen_unique_name(state, material->get_name()); + d["name"] = _gen_unique_name(p_state, material->get_name()); } + Ref<BaseMaterial3D> base_material = material; - if (base_material.is_valid()) { - Dictionary mr; - { - Array arr; - const Color c = base_material->get_albedo().srgb_to_linear(); - arr.push_back(c.r); - arr.push_back(c.g); - arr.push_back(c.b); - arr.push_back(c.a); - mr["baseColorFactor"] = arr; + if (base_material.is_null()) { + materials.push_back(d); + continue; + } + + Dictionary mr; + { + Array arr; + const Color c = base_material->get_albedo().srgb_to_linear(); + arr.push_back(c.r); + arr.push_back(c.g); + arr.push_back(c.b); + arr.push_back(c.a); + mr["baseColorFactor"] = arr; + } + { + Dictionary bct; + Ref<Texture2D> albedo_texture = base_material->get_texture(BaseMaterial3D::TEXTURE_ALBEDO); + GLTFTextureIndex gltf_texture_index = -1; + + if (albedo_texture.is_valid() && albedo_texture->get_image().is_valid()) { + albedo_texture->set_name(material->get_name() + "_albedo"); + gltf_texture_index = _set_texture(p_state, albedo_texture, base_material->get_texture_filter(), base_material->get_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT)); } - { - Dictionary bct; - if (base_material.is_valid()) { - Ref<Texture2D> albedo_texture = base_material->get_texture(BaseMaterial3D::TEXTURE_ALBEDO); - GLTFTextureIndex gltf_texture_index = -1; - - if (albedo_texture.is_valid() && albedo_texture->get_image().is_valid()) { - albedo_texture->set_name(material->get_name() + "_albedo"); - gltf_texture_index = _set_texture(state, albedo_texture, base_material->get_texture_filter(), base_material->get_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT)); - } - if (gltf_texture_index != -1) { - bct["index"] = gltf_texture_index; - Dictionary extensions = _serialize_texture_transform_uv1(material); - if (!extensions.is_empty()) { - bct["extensions"] = extensions; - state->use_khr_texture_transform = true; - } - mr["baseColorTexture"] = bct; - } + if (gltf_texture_index != -1) { + bct["index"] = gltf_texture_index; + Dictionary extensions = _serialize_texture_transform_uv1(material); + if (!extensions.is_empty()) { + bct["extensions"] = extensions; + p_state->use_khr_texture_transform = true; + } + mr["baseColorTexture"] = bct; + } + } + + mr["metallicFactor"] = base_material->get_metallic(); + mr["roughnessFactor"] = base_material->get_roughness(); + bool has_roughness = base_material->get_texture(BaseMaterial3D::TEXTURE_ROUGHNESS).is_valid() && base_material->get_texture(BaseMaterial3D::TEXTURE_ROUGHNESS)->get_image().is_valid(); + bool has_ao = base_material->get_feature(BaseMaterial3D::FEATURE_AMBIENT_OCCLUSION) && base_material->get_texture(BaseMaterial3D::TEXTURE_AMBIENT_OCCLUSION).is_valid(); + bool has_metalness = base_material->get_texture(BaseMaterial3D::TEXTURE_METALLIC).is_valid() && base_material->get_texture(BaseMaterial3D::TEXTURE_METALLIC)->get_image().is_valid(); + if (has_ao || has_roughness || has_metalness) { + Dictionary mrt; + Ref<Texture2D> roughness_texture = base_material->get_texture(BaseMaterial3D::TEXTURE_ROUGHNESS); + BaseMaterial3D::TextureChannel roughness_channel = base_material->get_roughness_texture_channel(); + Ref<Texture2D> metallic_texture = base_material->get_texture(BaseMaterial3D::TEXTURE_METALLIC); + BaseMaterial3D::TextureChannel metalness_channel = base_material->get_metallic_texture_channel(); + Ref<Texture2D> ao_texture = base_material->get_texture(BaseMaterial3D::TEXTURE_AMBIENT_OCCLUSION); + BaseMaterial3D::TextureChannel ao_channel = base_material->get_ao_texture_channel(); + Ref<ImageTexture> orm_texture; + orm_texture.instantiate(); + Ref<Image> orm_image; + orm_image.instantiate(); + int32_t height = 0; + int32_t width = 0; + Ref<Image> ao_image; + if (has_ao) { + height = ao_texture->get_height(); + width = ao_texture->get_width(); + ao_image = ao_texture->get_image(); + Ref<ImageTexture> img_tex = ao_image; + if (img_tex.is_valid()) { + ao_image = img_tex->get_image(); + } + if (ao_image->is_compressed()) { + ao_image->decompress(); + } + } + Ref<Image> roughness_image; + if (has_roughness) { + height = roughness_texture->get_height(); + width = roughness_texture->get_width(); + roughness_image = roughness_texture->get_image(); + Ref<ImageTexture> img_tex = roughness_image; + if (img_tex.is_valid()) { + roughness_image = img_tex->get_image(); + } + if (roughness_image->is_compressed()) { + roughness_image->decompress(); } } - if (base_material.is_valid()) { - mr["metallicFactor"] = base_material->get_metallic(); - mr["roughnessFactor"] = base_material->get_roughness(); - bool has_roughness = base_material->get_texture(BaseMaterial3D::TEXTURE_ROUGHNESS).is_valid() && base_material->get_texture(BaseMaterial3D::TEXTURE_ROUGHNESS)->get_image().is_valid(); - bool has_ao = base_material->get_feature(BaseMaterial3D::FEATURE_AMBIENT_OCCLUSION) && base_material->get_texture(BaseMaterial3D::TEXTURE_AMBIENT_OCCLUSION).is_valid(); - bool has_metalness = base_material->get_texture(BaseMaterial3D::TEXTURE_METALLIC).is_valid() && base_material->get_texture(BaseMaterial3D::TEXTURE_METALLIC)->get_image().is_valid(); - if (has_ao || has_roughness || has_metalness) { - Dictionary mrt; - Ref<Texture2D> roughness_texture = base_material->get_texture(BaseMaterial3D::TEXTURE_ROUGHNESS); - BaseMaterial3D::TextureChannel roughness_channel = base_material->get_roughness_texture_channel(); - Ref<Texture2D> metallic_texture = base_material->get_texture(BaseMaterial3D::TEXTURE_METALLIC); - BaseMaterial3D::TextureChannel metalness_channel = base_material->get_metallic_texture_channel(); - Ref<Texture2D> ao_texture = base_material->get_texture(BaseMaterial3D::TEXTURE_AMBIENT_OCCLUSION); - BaseMaterial3D::TextureChannel ao_channel = base_material->get_ao_texture_channel(); - Ref<ImageTexture> orm_texture; - orm_texture.instantiate(); - Ref<Image> orm_image; - orm_image.instantiate(); - int32_t height = 0; - int32_t width = 0; - Ref<Image> ao_image; + Ref<Image> metallness_image; + if (has_metalness) { + height = metallic_texture->get_height(); + width = metallic_texture->get_width(); + metallness_image = metallic_texture->get_image(); + Ref<ImageTexture> img_tex = metallness_image; + if (img_tex.is_valid()) { + metallness_image = img_tex->get_image(); + } + if (metallness_image->is_compressed()) { + metallness_image->decompress(); + } + } + Ref<Texture2D> albedo_texture = base_material->get_texture(BaseMaterial3D::TEXTURE_ALBEDO); + if (albedo_texture.is_valid() && albedo_texture->get_image().is_valid()) { + height = albedo_texture->get_height(); + width = albedo_texture->get_width(); + } + orm_image->initialize_data(width, height, false, Image::FORMAT_RGBA8); + if (ao_image.is_valid() && ao_image->get_size() != Vector2(width, height)) { + ao_image->resize(width, height, Image::INTERPOLATE_LANCZOS); + } + if (roughness_image.is_valid() && roughness_image->get_size() != Vector2(width, height)) { + roughness_image->resize(width, height, Image::INTERPOLATE_LANCZOS); + } + if (metallness_image.is_valid() && metallness_image->get_size() != Vector2(width, height)) { + metallness_image->resize(width, height, Image::INTERPOLATE_LANCZOS); + } + for (int32_t h = 0; h < height; h++) { + for (int32_t w = 0; w < width; w++) { + Color c = Color(1.0f, 1.0f, 1.0f); if (has_ao) { - height = ao_texture->get_height(); - width = ao_texture->get_width(); - ao_image = ao_texture->get_image(); - Ref<ImageTexture> img_tex = ao_image; - if (img_tex.is_valid()) { - ao_image = img_tex->get_image(); - } - if (ao_image->is_compressed()) { - ao_image->decompress(); + if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_RED == ao_channel) { + c.r = ao_image->get_pixel(w, h).r; + } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_GREEN == ao_channel) { + c.r = ao_image->get_pixel(w, h).g; + } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_BLUE == ao_channel) { + c.r = ao_image->get_pixel(w, h).b; + } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_ALPHA == ao_channel) { + c.r = ao_image->get_pixel(w, h).a; } } - Ref<Image> roughness_image; if (has_roughness) { - height = roughness_texture->get_height(); - width = roughness_texture->get_width(); - roughness_image = roughness_texture->get_image(); - Ref<ImageTexture> img_tex = roughness_image; - if (img_tex.is_valid()) { - roughness_image = img_tex->get_image(); - } - if (roughness_image->is_compressed()) { - roughness_image->decompress(); + if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_RED == roughness_channel) { + c.g = roughness_image->get_pixel(w, h).r; + } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_GREEN == roughness_channel) { + c.g = roughness_image->get_pixel(w, h).g; + } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_BLUE == roughness_channel) { + c.g = roughness_image->get_pixel(w, h).b; + } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_ALPHA == roughness_channel) { + c.g = roughness_image->get_pixel(w, h).a; } } - Ref<Image> metallness_image; if (has_metalness) { - height = metallic_texture->get_height(); - width = metallic_texture->get_width(); - metallness_image = metallic_texture->get_image(); - Ref<ImageTexture> img_tex = metallness_image; - if (img_tex.is_valid()) { - metallness_image = img_tex->get_image(); - } - if (metallness_image->is_compressed()) { - metallness_image->decompress(); + if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_RED == metalness_channel) { + c.b = metallness_image->get_pixel(w, h).r; + } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_GREEN == metalness_channel) { + c.b = metallness_image->get_pixel(w, h).g; + } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_BLUE == metalness_channel) { + c.b = metallness_image->get_pixel(w, h).b; + } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_ALPHA == metalness_channel) { + c.b = metallness_image->get_pixel(w, h).a; } } - Ref<Texture2D> albedo_texture = base_material->get_texture(BaseMaterial3D::TEXTURE_ALBEDO); - if (albedo_texture.is_valid() && albedo_texture->get_image().is_valid()) { - height = albedo_texture->get_height(); - width = albedo_texture->get_width(); - } - orm_image->initialize_data(width, height, false, Image::FORMAT_RGBA8); - if (ao_image.is_valid() && ao_image->get_size() != Vector2(width, height)) { - ao_image->resize(width, height, Image::INTERPOLATE_LANCZOS); - } - if (roughness_image.is_valid() && roughness_image->get_size() != Vector2(width, height)) { - roughness_image->resize(width, height, Image::INTERPOLATE_LANCZOS); - } - if (metallness_image.is_valid() && metallness_image->get_size() != Vector2(width, height)) { - metallness_image->resize(width, height, Image::INTERPOLATE_LANCZOS); - } - for (int32_t h = 0; h < height; h++) { - for (int32_t w = 0; w < width; w++) { - Color c = Color(1.0f, 1.0f, 1.0f); - if (has_ao) { - if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_RED == ao_channel) { - c.r = ao_image->get_pixel(w, h).r; - } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_GREEN == ao_channel) { - c.r = ao_image->get_pixel(w, h).g; - } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_BLUE == ao_channel) { - c.r = ao_image->get_pixel(w, h).b; - } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_ALPHA == ao_channel) { - c.r = ao_image->get_pixel(w, h).a; - } - } - if (has_roughness) { - if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_RED == roughness_channel) { - c.g = roughness_image->get_pixel(w, h).r; - } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_GREEN == roughness_channel) { - c.g = roughness_image->get_pixel(w, h).g; - } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_BLUE == roughness_channel) { - c.g = roughness_image->get_pixel(w, h).b; - } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_ALPHA == roughness_channel) { - c.g = roughness_image->get_pixel(w, h).a; - } - } - if (has_metalness) { - if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_RED == metalness_channel) { - c.b = metallness_image->get_pixel(w, h).r; - } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_GREEN == metalness_channel) { - c.b = metallness_image->get_pixel(w, h).g; - } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_BLUE == metalness_channel) { - c.b = metallness_image->get_pixel(w, h).b; - } else if (BaseMaterial3D::TextureChannel::TEXTURE_CHANNEL_ALPHA == metalness_channel) { - c.b = metallness_image->get_pixel(w, h).a; - } - } - orm_image->set_pixel(w, h, c); - } - } - orm_image->generate_mipmaps(); - orm_texture->set_image(orm_image); - GLTFTextureIndex orm_texture_index = -1; - if (has_ao || has_roughness || has_metalness) { - orm_texture->set_name(material->get_name() + "_orm"); - orm_texture_index = _set_texture(state, orm_texture, base_material->get_texture_filter(), base_material->get_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT)); - } - if (has_ao) { - Dictionary occt; - occt["index"] = orm_texture_index; - d["occlusionTexture"] = occt; - } - if (has_roughness || has_metalness) { - mrt["index"] = orm_texture_index; - Dictionary extensions = _serialize_texture_transform_uv1(material); - if (!extensions.is_empty()) { - mrt["extensions"] = extensions; - state->use_khr_texture_transform = true; - } - mr["metallicRoughnessTexture"] = mrt; - } + orm_image->set_pixel(w, h, c); } } - d["pbrMetallicRoughness"] = mr; + orm_image->generate_mipmaps(); + orm_texture->set_image(orm_image); + GLTFTextureIndex orm_texture_index = -1; + if (has_ao || has_roughness || has_metalness) { + orm_texture->set_name(material->get_name() + "_orm"); + orm_texture_index = _set_texture(p_state, orm_texture, base_material->get_texture_filter(), base_material->get_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT)); + } + if (has_ao) { + Dictionary occt; + occt["index"] = orm_texture_index; + d["occlusionTexture"] = occt; + } + if (has_roughness || has_metalness) { + mrt["index"] = orm_texture_index; + Dictionary extensions = _serialize_texture_transform_uv1(material); + if (!extensions.is_empty()) { + mrt["extensions"] = extensions; + p_state->use_khr_texture_transform = true; + } + mr["metallicRoughnessTexture"] = mrt; + } } + + d["pbrMetallicRoughness"] = mr; if (base_material->get_feature(BaseMaterial3D::FEATURE_NORMAL_MAPPING)) { Dictionary nt; Ref<ImageTexture> tex; @@ -3598,7 +3592,7 @@ Error GLTFDocument::_serialize_materials(Ref<GLTFState> state) { GLTFTextureIndex gltf_texture_index = -1; if (tex.is_valid() && tex->get_image().is_valid()) { tex->set_name(material->get_name() + "_normal"); - gltf_texture_index = _set_texture(state, tex, base_material->get_texture_filter(), base_material->get_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT)); + gltf_texture_index = _set_texture(p_state, tex, base_material->get_texture_filter(), base_material->get_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT)); } nt["scale"] = base_material->get_normal_scale(); if (gltf_texture_index != -1) { @@ -3615,13 +3609,14 @@ Error GLTFDocument::_serialize_materials(Ref<GLTFState> state) { arr.push_back(c.b); d["emissiveFactor"] = arr; } + if (base_material->get_feature(BaseMaterial3D::FEATURE_EMISSION)) { Dictionary et; Ref<Texture2D> emission_texture = base_material->get_texture(BaseMaterial3D::TEXTURE_EMISSION); GLTFTextureIndex gltf_texture_index = -1; if (emission_texture.is_valid() && emission_texture->get_image().is_valid()) { emission_texture->set_name(material->get_name() + "_emission"); - gltf_texture_index = _set_texture(state, emission_texture, base_material->get_texture_filter(), base_material->get_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT)); + gltf_texture_index = _set_texture(p_state, emission_texture, base_material->get_texture_filter(), base_material->get_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT)); } if (gltf_texture_index != -1) { @@ -3629,33 +3624,36 @@ Error GLTFDocument::_serialize_materials(Ref<GLTFState> state) { d["emissiveTexture"] = et; } } + const bool ds = base_material->get_cull_mode() == BaseMaterial3D::CULL_DISABLED; if (ds) { d["doubleSided"] = ds; } + if (base_material->get_transparency() == BaseMaterial3D::TRANSPARENCY_ALPHA_SCISSOR) { d["alphaMode"] = "MASK"; d["alphaCutoff"] = base_material->get_alpha_scissor_threshold(); } else if (base_material->get_transparency() != BaseMaterial3D::TRANSPARENCY_DISABLED) { d["alphaMode"] = "BLEND"; } + materials.push_back(d); } if (!materials.size()) { return OK; } - state->json["materials"] = materials; - print_verbose("Total materials: " + itos(state->materials.size())); + p_state->json["materials"] = materials; + print_verbose("Total materials: " + itos(p_state->materials.size())); return OK; } -Error GLTFDocument::_parse_materials(Ref<GLTFState> state) { - if (!state->json.has("materials")) { +Error GLTFDocument::_parse_materials(Ref<GLTFState> p_state) { + if (!p_state->json.has("materials")) { return OK; } - const Array &materials = state->json["materials"]; + const Array &materials = p_state->json["materials"]; for (GLTFMaterialIndex i = 0; i < materials.size(); i++) { const Dictionary &d = materials[i]; @@ -3680,12 +3678,12 @@ Error GLTFDocument::_parse_materials(Ref<GLTFState> state) { if (sgm.has("diffuseTexture")) { const Dictionary &diffuse_texture_dict = sgm["diffuseTexture"]; if (diffuse_texture_dict.has("index")) { - Ref<GLTFTextureSampler> diffuse_sampler = _get_sampler_for_texture(state, diffuse_texture_dict["index"]); + Ref<GLTFTextureSampler> diffuse_sampler = _get_sampler_for_texture(p_state, diffuse_texture_dict["index"]); if (diffuse_sampler.is_valid()) { material->set_texture_filter(diffuse_sampler->get_filter_mode()); material->set_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT, diffuse_sampler->get_wrap_mode()); } - Ref<Texture2D> diffuse_texture = _get_texture(state, diffuse_texture_dict["index"]); + Ref<Texture2D> diffuse_texture = _get_texture(p_state, diffuse_texture_dict["index"]); if (diffuse_texture.is_valid()) { spec_gloss->diffuse_img = diffuse_texture->get_image(); material->set_texture(BaseMaterial3D::TEXTURE_ALBEDO, diffuse_texture); @@ -3713,7 +3711,7 @@ Error GLTFDocument::_parse_materials(Ref<GLTFState> state) { if (sgm.has("specularGlossinessTexture")) { const Dictionary &spec_gloss_texture = sgm["specularGlossinessTexture"]; if (spec_gloss_texture.has("index")) { - const Ref<Texture2D> orig_texture = _get_texture(state, spec_gloss_texture["index"]); + const Ref<Texture2D> orig_texture = _get_texture(p_state, spec_gloss_texture["index"]); if (orig_texture.is_valid()) { spec_gloss->spec_gloss_img = orig_texture->get_image(); } @@ -3733,10 +3731,10 @@ Error GLTFDocument::_parse_materials(Ref<GLTFState> state) { if (mr.has("baseColorTexture")) { const Dictionary &bct = mr["baseColorTexture"]; if (bct.has("index")) { - Ref<GLTFTextureSampler> bct_sampler = _get_sampler_for_texture(state, bct["index"]); + Ref<GLTFTextureSampler> bct_sampler = _get_sampler_for_texture(p_state, bct["index"]); material->set_texture_filter(bct_sampler->get_filter_mode()); material->set_flag(BaseMaterial3D::FLAG_USE_TEXTURE_REPEAT, bct_sampler->get_wrap_mode()); - material->set_texture(BaseMaterial3D::TEXTURE_ALBEDO, _get_texture(state, bct["index"])); + material->set_texture(BaseMaterial3D::TEXTURE_ALBEDO, _get_texture(p_state, bct["index"])); } if (!mr.has("baseColorFactor")) { material->set_albedo(Color(1, 1, 1)); @@ -3759,7 +3757,7 @@ Error GLTFDocument::_parse_materials(Ref<GLTFState> state) { if (mr.has("metallicRoughnessTexture")) { const Dictionary &bct = mr["metallicRoughnessTexture"]; if (bct.has("index")) { - const Ref<Texture2D> t = _get_texture(state, bct["index"]); + const Ref<Texture2D> t = _get_texture(p_state, bct["index"]); material->set_texture(BaseMaterial3D::TEXTURE_METALLIC, t); material->set_metallic_texture_channel(BaseMaterial3D::TEXTURE_CHANNEL_BLUE); material->set_texture(BaseMaterial3D::TEXTURE_ROUGHNESS, t); @@ -3777,7 +3775,7 @@ Error GLTFDocument::_parse_materials(Ref<GLTFState> state) { if (d.has("normalTexture")) { const Dictionary &bct = d["normalTexture"]; if (bct.has("index")) { - material->set_texture(BaseMaterial3D::TEXTURE_NORMAL, _get_texture(state, bct["index"])); + material->set_texture(BaseMaterial3D::TEXTURE_NORMAL, _get_texture(p_state, bct["index"])); material->set_feature(BaseMaterial3D::FEATURE_NORMAL_MAPPING, true); } if (bct.has("scale")) { @@ -3787,7 +3785,7 @@ Error GLTFDocument::_parse_materials(Ref<GLTFState> state) { if (d.has("occlusionTexture")) { const Dictionary &bct = d["occlusionTexture"]; if (bct.has("index")) { - material->set_texture(BaseMaterial3D::TEXTURE_AMBIENT_OCCLUSION, _get_texture(state, bct["index"])); + material->set_texture(BaseMaterial3D::TEXTURE_AMBIENT_OCCLUSION, _get_texture(p_state, bct["index"])); material->set_ao_texture_channel(BaseMaterial3D::TEXTURE_CHANNEL_RED); material->set_feature(BaseMaterial3D::FEATURE_AMBIENT_OCCLUSION, true); } @@ -3805,7 +3803,7 @@ Error GLTFDocument::_parse_materials(Ref<GLTFState> state) { if (d.has("emissiveTexture")) { const Dictionary &bct = d["emissiveTexture"]; if (bct.has("index")) { - material->set_texture(BaseMaterial3D::TEXTURE_EMISSION, _get_texture(state, bct["index"])); + material->set_texture(BaseMaterial3D::TEXTURE_EMISSION, _get_texture(p_state, bct["index"])); material->set_feature(BaseMaterial3D::FEATURE_EMISSION, true); material->set_emission(Color(0, 0, 0)); } @@ -3830,30 +3828,30 @@ Error GLTFDocument::_parse_materials(Ref<GLTFState> state) { } } } - state->materials.push_back(material); + p_state->materials.push_back(material); } - print_verbose("Total materials: " + itos(state->materials.size())); + print_verbose("Total materials: " + itos(p_state->materials.size())); return OK; } -void GLTFDocument::_set_texture_transform_uv1(const Dictionary &d, Ref<BaseMaterial3D> material) { - if (d.has("extensions")) { - const Dictionary &extensions = d["extensions"]; +void GLTFDocument::_set_texture_transform_uv1(const Dictionary &p_dict, Ref<BaseMaterial3D> p_material) { + if (p_dict.has("extensions")) { + const Dictionary &extensions = p_dict["extensions"]; if (extensions.has("KHR_texture_transform")) { - if (material.is_valid()) { + if (p_material.is_valid()) { const Dictionary &texture_transform = extensions["KHR_texture_transform"]; const Array &offset_arr = texture_transform["offset"]; if (offset_arr.size() == 2) { const Vector3 offset_vector3 = Vector3(offset_arr[0], offset_arr[1], 0.0f); - material->set_uv1_offset(offset_vector3); + p_material->set_uv1_offset(offset_vector3); } const Array &scale_arr = texture_transform["scale"]; if (scale_arr.size() == 2) { const Vector3 scale_vector3 = Vector3(scale_arr[0], scale_arr[1], 1.0f); - material->set_uv1_scale(scale_vector3); + p_material->set_uv1_scale(scale_vector3); } } } @@ -3944,13 +3942,13 @@ void GLTFDocument::spec_gloss_to_metal_base_color(const Color &p_specular_factor r_base_color = r_base_color.clamp(); } -GLTFNodeIndex GLTFDocument::_find_highest_node(Ref<GLTFState> state, const Vector<GLTFNodeIndex> &subset) { +GLTFNodeIndex GLTFDocument::_find_highest_node(Ref<GLTFState> p_state, const Vector<GLTFNodeIndex> &p_subset) { int highest = -1; GLTFNodeIndex best_node = -1; - for (int i = 0; i < subset.size(); ++i) { - const GLTFNodeIndex node_i = subset[i]; - const Ref<GLTFNode> node = state->nodes[node_i]; + for (int i = 0; i < p_subset.size(); ++i) { + const GLTFNodeIndex node_i = p_subset[i]; + const Ref<GLTFNode> node = p_state->nodes[node_i]; if (highest == -1 || node->height < highest) { highest = node->height; @@ -3961,38 +3959,38 @@ GLTFNodeIndex GLTFDocument::_find_highest_node(Ref<GLTFState> state, const Vecto return best_node; } -bool GLTFDocument::_capture_nodes_in_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin, const GLTFNodeIndex node_index) { +bool GLTFDocument::_capture_nodes_in_skin(Ref<GLTFState> p_state, Ref<GLTFSkin> p_skin, const GLTFNodeIndex p_node_index) { bool found_joint = false; - for (int i = 0; i < state->nodes[node_index]->children.size(); ++i) { - found_joint |= _capture_nodes_in_skin(state, skin, state->nodes[node_index]->children[i]); + for (int i = 0; i < p_state->nodes[p_node_index]->children.size(); ++i) { + found_joint |= _capture_nodes_in_skin(p_state, p_skin, p_state->nodes[p_node_index]->children[i]); } if (found_joint) { // Mark it if we happen to find another skins joint... - if (state->nodes[node_index]->joint && skin->joints.find(node_index) < 0) { - skin->joints.push_back(node_index); - } else if (skin->non_joints.find(node_index) < 0) { - skin->non_joints.push_back(node_index); + if (p_state->nodes[p_node_index]->joint && p_skin->joints.find(p_node_index) < 0) { + p_skin->joints.push_back(p_node_index); + } else if (p_skin->non_joints.find(p_node_index) < 0) { + p_skin->non_joints.push_back(p_node_index); } } - if (skin->joints.find(node_index) > 0) { + if (p_skin->joints.find(p_node_index) > 0) { return true; } return false; } -void GLTFDocument::_capture_nodes_for_multirooted_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin) { +void GLTFDocument::_capture_nodes_for_multirooted_skin(Ref<GLTFState> p_state, Ref<GLTFSkin> p_skin) { DisjointSet<GLTFNodeIndex> disjoint_set; - for (int i = 0; i < skin->joints.size(); ++i) { - const GLTFNodeIndex node_index = skin->joints[i]; - const GLTFNodeIndex parent = state->nodes[node_index]->parent; + for (int i = 0; i < p_skin->joints.size(); ++i) { + const GLTFNodeIndex node_index = p_skin->joints[i]; + const GLTFNodeIndex parent = p_state->nodes[node_index]->parent; disjoint_set.insert(node_index); - if (skin->joints.find(parent) >= 0) { + if (p_skin->joints.find(parent) >= 0) { disjoint_set.create_union(parent, node_index); } } @@ -4010,8 +4008,8 @@ void GLTFDocument::_capture_nodes_for_multirooted_skin(Ref<GLTFState> state, Ref for (int i = 0; i < roots.size(); ++i) { const GLTFNodeIndex root = roots[i]; - if (maxHeight == -1 || state->nodes[root]->height < maxHeight) { - maxHeight = state->nodes[root]->height; + if (maxHeight == -1 || p_state->nodes[root]->height < maxHeight) { + maxHeight = p_state->nodes[root]->height; } } @@ -4019,13 +4017,13 @@ void GLTFDocument::_capture_nodes_for_multirooted_skin(Ref<GLTFState> state, Ref // This sucks, but 99% of all game engines (not just Godot) would have this same issue. for (int i = 0; i < roots.size(); ++i) { GLTFNodeIndex current_node = roots[i]; - while (state->nodes[current_node]->height > maxHeight) { - GLTFNodeIndex parent = state->nodes[current_node]->parent; + while (p_state->nodes[current_node]->height > maxHeight) { + GLTFNodeIndex parent = p_state->nodes[current_node]->parent; - if (state->nodes[parent]->joint && skin->joints.find(parent) < 0) { - skin->joints.push_back(parent); - } else if (skin->non_joints.find(parent) < 0) { - skin->non_joints.push_back(parent); + if (p_state->nodes[parent]->joint && p_skin->joints.find(parent) < 0) { + p_skin->joints.push_back(parent); + } else if (p_skin->non_joints.find(parent) < 0) { + p_skin->non_joints.push_back(parent); } current_node = parent; @@ -4040,21 +4038,21 @@ void GLTFDocument::_capture_nodes_for_multirooted_skin(Ref<GLTFState> state, Ref do { all_same = true; - const GLTFNodeIndex first_parent = state->nodes[roots[0]]->parent; + const GLTFNodeIndex first_parent = p_state->nodes[roots[0]]->parent; for (int i = 1; i < roots.size(); ++i) { - all_same &= (first_parent == state->nodes[roots[i]]->parent); + all_same &= (first_parent == p_state->nodes[roots[i]]->parent); } if (!all_same) { for (int i = 0; i < roots.size(); ++i) { const GLTFNodeIndex current_node = roots[i]; - const GLTFNodeIndex parent = state->nodes[current_node]->parent; + const GLTFNodeIndex parent = p_state->nodes[current_node]->parent; - if (state->nodes[parent]->joint && skin->joints.find(parent) < 0) { - skin->joints.push_back(parent); - } else if (skin->non_joints.find(parent) < 0) { - skin->non_joints.push_back(parent); + if (p_state->nodes[parent]->joint && p_skin->joints.find(parent) < 0) { + p_skin->joints.push_back(parent); + } else if (p_skin->non_joints.find(parent) < 0) { + p_skin->non_joints.push_back(parent); } roots.write[i] = parent; @@ -4064,19 +4062,19 @@ void GLTFDocument::_capture_nodes_for_multirooted_skin(Ref<GLTFState> state, Ref } while (!all_same); } -Error GLTFDocument::_expand_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin) { - _capture_nodes_for_multirooted_skin(state, skin); +Error GLTFDocument::_expand_skin(Ref<GLTFState> p_state, Ref<GLTFSkin> p_skin) { + _capture_nodes_for_multirooted_skin(p_state, p_skin); // Grab all nodes that lay in between skin joints/nodes DisjointSet<GLTFNodeIndex> disjoint_set; Vector<GLTFNodeIndex> all_skin_nodes; - all_skin_nodes.append_array(skin->joints); - all_skin_nodes.append_array(skin->non_joints); + all_skin_nodes.append_array(p_skin->joints); + all_skin_nodes.append_array(p_skin->non_joints); for (int i = 0; i < all_skin_nodes.size(); ++i) { const GLTFNodeIndex node_index = all_skin_nodes[i]; - const GLTFNodeIndex parent = state->nodes[node_index]->parent; + const GLTFNodeIndex parent = p_state->nodes[node_index]->parent; disjoint_set.insert(node_index); if (all_skin_nodes.find(parent) >= 0) { @@ -4093,7 +4091,7 @@ Error GLTFDocument::_expand_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin) { Vector<GLTFNodeIndex> set; disjoint_set.get_members(set, out_owners[i]); - const GLTFNodeIndex root = _find_highest_node(state, set); + const GLTFNodeIndex root = _find_highest_node(p_state, set); ERR_FAIL_COND_V(root < 0, FAILED); out_roots.push_back(root); } @@ -4101,15 +4099,15 @@ Error GLTFDocument::_expand_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin) { out_roots.sort(); for (int i = 0; i < out_roots.size(); ++i) { - _capture_nodes_in_skin(state, skin, out_roots[i]); + _capture_nodes_in_skin(p_state, p_skin, out_roots[i]); } - skin->roots = out_roots; + p_skin->roots = out_roots; return OK; } -Error GLTFDocument::_verify_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin) { +Error GLTFDocument::_verify_skin(Ref<GLTFState> p_state, Ref<GLTFSkin> p_skin) { // This may seem duplicated from expand_skins, but this is really a sanity check! (so it kinda is) // In case additional interpolating logic is added to the skins, this will help ensure that you // do not cause it to self implode into a fiery blaze @@ -4121,12 +4119,12 @@ Error GLTFDocument::_verify_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin) { DisjointSet<GLTFNodeIndex> disjoint_set; Vector<GLTFNodeIndex> all_skin_nodes; - all_skin_nodes.append_array(skin->joints); - all_skin_nodes.append_array(skin->non_joints); + all_skin_nodes.append_array(p_skin->joints); + all_skin_nodes.append_array(p_skin->non_joints); for (int i = 0; i < all_skin_nodes.size(); ++i) { const GLTFNodeIndex node_index = all_skin_nodes[i]; - const GLTFNodeIndex parent = state->nodes[node_index]->parent; + const GLTFNodeIndex parent = p_state->nodes[node_index]->parent; disjoint_set.insert(node_index); if (all_skin_nodes.find(parent) >= 0) { @@ -4143,7 +4141,7 @@ Error GLTFDocument::_verify_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin) { Vector<GLTFNodeIndex> set; disjoint_set.get_members(set, out_owners[i]); - const GLTFNodeIndex root = _find_highest_node(state, set); + const GLTFNodeIndex root = _find_highest_node(p_state, set); ERR_FAIL_COND_V(root < 0, FAILED); out_roots.push_back(root); } @@ -4153,9 +4151,9 @@ Error GLTFDocument::_verify_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin) { ERR_FAIL_COND_V(out_roots.size() == 0, FAILED); // Make sure the roots are the exact same (they better be) - ERR_FAIL_COND_V(out_roots.size() != skin->roots.size(), FAILED); + ERR_FAIL_COND_V(out_roots.size() != p_skin->roots.size(), FAILED); for (int i = 0; i < out_roots.size(); ++i) { - ERR_FAIL_COND_V(out_roots[i] != skin->roots[i], FAILED); + ERR_FAIL_COND_V(out_roots[i] != p_skin->roots[i], FAILED); } // Single rooted skin? Perfectly ok! @@ -4164,9 +4162,9 @@ Error GLTFDocument::_verify_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin) { } // Make sure all parents of a multi-rooted skin are the SAME - const GLTFNodeIndex parent = state->nodes[out_roots[0]]->parent; + const GLTFNodeIndex parent = p_state->nodes[out_roots[0]]->parent; for (int i = 1; i < out_roots.size(); ++i) { - if (state->nodes[out_roots[i]]->parent != parent) { + if (p_state->nodes[out_roots[i]]->parent != parent) { return FAILED; } } @@ -4174,12 +4172,12 @@ Error GLTFDocument::_verify_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin) { return OK; } -Error GLTFDocument::_parse_skins(Ref<GLTFState> state) { - if (!state->json.has("skins")) { +Error GLTFDocument::_parse_skins(Ref<GLTFState> p_state) { + if (!p_state->json.has("skins")) { return OK; } - const Array &skins = state->json["skins"]; + const Array &skins = p_state->json["skins"]; // Create the base skins, and mark nodes that are joints for (int i = 0; i < skins.size(); i++) { @@ -4193,18 +4191,18 @@ Error GLTFDocument::_parse_skins(Ref<GLTFState> state) { const Array &joints = d["joints"]; if (d.has("inverseBindMatrices")) { - skin->inverse_binds = _decode_accessor_as_xform(state, d["inverseBindMatrices"], false); + skin->inverse_binds = _decode_accessor_as_xform(p_state, d["inverseBindMatrices"], false); ERR_FAIL_COND_V(skin->inverse_binds.size() != joints.size(), ERR_PARSE_ERROR); } for (int j = 0; j < joints.size(); j++) { const GLTFNodeIndex node = joints[j]; - ERR_FAIL_INDEX_V(node, state->nodes.size(), ERR_PARSE_ERROR); + ERR_FAIL_INDEX_V(node, p_state->nodes.size(), ERR_PARSE_ERROR); skin->joints.push_back(node); skin->joints_original.push_back(node); - state->nodes.write[node]->joint = true; + p_state->nodes.write[node]->joint = true; } if (d.has("name") && !String(d["name"]).is_empty()) { @@ -4217,32 +4215,32 @@ Error GLTFDocument::_parse_skins(Ref<GLTFState> state) { skin->skin_root = d["skeleton"]; } - state->skins.push_back(skin); + p_state->skins.push_back(skin); } - for (GLTFSkinIndex i = 0; i < state->skins.size(); ++i) { - Ref<GLTFSkin> skin = state->skins.write[i]; + for (GLTFSkinIndex i = 0; i < p_state->skins.size(); ++i) { + Ref<GLTFSkin> skin = p_state->skins.write[i]; // Expand the skin to capture all the extra non-joints that lie in between the actual joints, // and expand the hierarchy to ensure multi-rooted trees lie on the same height level - ERR_FAIL_COND_V(_expand_skin(state, skin), ERR_PARSE_ERROR); - ERR_FAIL_COND_V(_verify_skin(state, skin), ERR_PARSE_ERROR); + ERR_FAIL_COND_V(_expand_skin(p_state, skin), ERR_PARSE_ERROR); + ERR_FAIL_COND_V(_verify_skin(p_state, skin), ERR_PARSE_ERROR); } - print_verbose("glTF: Total skins: " + itos(state->skins.size())); + print_verbose("glTF: Total skins: " + itos(p_state->skins.size())); return OK; } -Error GLTFDocument::_determine_skeletons(Ref<GLTFState> state) { +Error GLTFDocument::_determine_skeletons(Ref<GLTFState> p_state) { // Using a disjoint set, we are going to potentially combine all skins that are actually branches // of a main skeleton, or treat skins defining the same set of nodes as ONE skeleton. // This is another unclear issue caused by the current glTF specification. DisjointSet<GLTFNodeIndex> skeleton_sets; - for (GLTFSkinIndex skin_i = 0; skin_i < state->skins.size(); ++skin_i) { - const Ref<GLTFSkin> skin = state->skins[skin_i]; + for (GLTFSkinIndex skin_i = 0; skin_i < p_state->skins.size(); ++skin_i) { + const Ref<GLTFSkin> skin = p_state->skins[skin_i]; Vector<GLTFNodeIndex> all_skin_nodes; all_skin_nodes.append_array(skin->joints); @@ -4250,7 +4248,7 @@ Error GLTFDocument::_determine_skeletons(Ref<GLTFState> state) { for (int i = 0; i < all_skin_nodes.size(); ++i) { const GLTFNodeIndex node_index = all_skin_nodes[i]; - const GLTFNodeIndex parent = state->nodes[node_index]->parent; + const GLTFNodeIndex parent = p_state->nodes[node_index]->parent; skeleton_sets.insert(node_index); if (all_skin_nodes.find(parent) >= 0) { @@ -4274,7 +4272,7 @@ Error GLTFDocument::_determine_skeletons(Ref<GLTFState> state) { for (int i = 0; i < groups_representatives.size(); ++i) { Vector<GLTFNodeIndex> group; skeleton_sets.get_members(group, groups_representatives[i]); - highest_group_members.push_back(_find_highest_node(state, group)); + highest_group_members.push_back(_find_highest_node(p_state, group)); groups.push_back(group); } @@ -4286,13 +4284,13 @@ Error GLTFDocument::_determine_skeletons(Ref<GLTFState> state) { const GLTFNodeIndex node_j = highest_group_members[j]; // Even if they are siblings under the root! :) - if (state->nodes[node_i]->parent == state->nodes[node_j]->parent) { + if (p_state->nodes[node_i]->parent == p_state->nodes[node_j]->parent) { skeleton_sets.create_union(node_i, node_j); } } // Attach any parenting going on together (we need to do this n^2 times) - const GLTFNodeIndex node_i_parent = state->nodes[node_i]->parent; + const GLTFNodeIndex node_i_parent = p_state->nodes[node_i]->parent; if (node_i_parent >= 0) { for (int j = 0; j < groups.size() && i != j; ++j) { const Vector<GLTFNodeIndex> &group = groups[j]; @@ -4319,8 +4317,8 @@ Error GLTFDocument::_determine_skeletons(Ref<GLTFState> state) { Vector<GLTFNodeIndex> skeleton_nodes; skeleton_sets.get_members(skeleton_nodes, skeleton_owner); - for (GLTFSkinIndex skin_i = 0; skin_i < state->skins.size(); ++skin_i) { - Ref<GLTFSkin> skin = state->skins.write[skin_i]; + for (GLTFSkinIndex skin_i = 0; skin_i < p_state->skins.size(); ++skin_i) { + Ref<GLTFSkin> skin = p_state->skins.write[skin_i]; // If any of the the skeletons nodes exist in a skin, that skin now maps to the skeleton for (int i = 0; i < skeleton_nodes.size(); ++i) { @@ -4336,37 +4334,37 @@ Error GLTFDocument::_determine_skeletons(Ref<GLTFState> state) { for (int i = 0; i < skeleton_nodes.size(); ++i) { const GLTFNodeIndex node_i = skeleton_nodes[i]; - if (state->nodes[node_i]->joint) { + if (p_state->nodes[node_i]->joint) { skeleton->joints.push_back(node_i); } else { non_joints.push_back(node_i); } } - state->skeletons.push_back(skeleton); + p_state->skeletons.push_back(skeleton); - _reparent_non_joint_skeleton_subtrees(state, state->skeletons.write[skel_i], non_joints); + _reparent_non_joint_skeleton_subtrees(p_state, p_state->skeletons.write[skel_i], non_joints); } - for (GLTFSkeletonIndex skel_i = 0; skel_i < state->skeletons.size(); ++skel_i) { - Ref<GLTFSkeleton> skeleton = state->skeletons.write[skel_i]; + for (GLTFSkeletonIndex skel_i = 0; skel_i < p_state->skeletons.size(); ++skel_i) { + Ref<GLTFSkeleton> skeleton = p_state->skeletons.write[skel_i]; for (int i = 0; i < skeleton->joints.size(); ++i) { const GLTFNodeIndex node_i = skeleton->joints[i]; - Ref<GLTFNode> node = state->nodes[node_i]; + Ref<GLTFNode> node = p_state->nodes[node_i]; ERR_FAIL_COND_V(!node->joint, ERR_PARSE_ERROR); ERR_FAIL_COND_V(node->skeleton >= 0, ERR_PARSE_ERROR); node->skeleton = skel_i; } - ERR_FAIL_COND_V(_determine_skeleton_roots(state, skel_i), ERR_PARSE_ERROR); + ERR_FAIL_COND_V(_determine_skeleton_roots(p_state, skel_i), ERR_PARSE_ERROR); } return OK; } -Error GLTFDocument::_reparent_non_joint_skeleton_subtrees(Ref<GLTFState> state, Ref<GLTFSkeleton> skeleton, const Vector<GLTFNodeIndex> &non_joints) { +Error GLTFDocument::_reparent_non_joint_skeleton_subtrees(Ref<GLTFState> p_state, Ref<GLTFSkeleton> p_skeleton, const Vector<GLTFNodeIndex> &p_non_joints) { DisjointSet<GLTFNodeIndex> subtree_set; // Populate the disjoint set with ONLY non joints that are in the skeleton hierarchy (non_joints vector) @@ -4377,13 +4375,13 @@ Error GLTFDocument::_reparent_non_joint_skeleton_subtrees(Ref<GLTFState> state, // skinD depicted here explains this issue: // https://github.com/KhronosGroup/glTF-Asset-Generator/blob/master/Output/Positive/Animation_Skin - for (int i = 0; i < non_joints.size(); ++i) { - const GLTFNodeIndex node_i = non_joints[i]; + for (int i = 0; i < p_non_joints.size(); ++i) { + const GLTFNodeIndex node_i = p_non_joints[i]; subtree_set.insert(node_i); - const GLTFNodeIndex parent_i = state->nodes[node_i]->parent; - if (parent_i >= 0 && non_joints.find(parent_i) >= 0 && !state->nodes[parent_i]->joint) { + const GLTFNodeIndex parent_i = p_state->nodes[node_i]->parent; + if (parent_i >= 0 && p_non_joints.find(parent_i) >= 0 && !p_state->nodes[parent_i]->joint) { subtree_set.create_union(parent_i, node_i); } } @@ -4400,34 +4398,34 @@ Error GLTFDocument::_reparent_non_joint_skeleton_subtrees(Ref<GLTFState> state, subtree_set.get_members(subtree_nodes, subtree_root); for (int subtree_i = 0; subtree_i < subtree_nodes.size(); ++subtree_i) { - Ref<GLTFNode> node = state->nodes[subtree_nodes[subtree_i]]; + Ref<GLTFNode> node = p_state->nodes[subtree_nodes[subtree_i]]; node->joint = true; // Add the joint to the skeletons joints - skeleton->joints.push_back(subtree_nodes[subtree_i]); + p_skeleton->joints.push_back(subtree_nodes[subtree_i]); } } return OK; } -Error GLTFDocument::_determine_skeleton_roots(Ref<GLTFState> state, const GLTFSkeletonIndex skel_i) { +Error GLTFDocument::_determine_skeleton_roots(Ref<GLTFState> p_state, const GLTFSkeletonIndex p_skel_i) { DisjointSet<GLTFNodeIndex> disjoint_set; - for (GLTFNodeIndex i = 0; i < state->nodes.size(); ++i) { - const Ref<GLTFNode> node = state->nodes[i]; + for (GLTFNodeIndex i = 0; i < p_state->nodes.size(); ++i) { + const Ref<GLTFNode> node = p_state->nodes[i]; - if (node->skeleton != skel_i) { + if (node->skeleton != p_skel_i) { continue; } disjoint_set.insert(i); - if (node->parent >= 0 && state->nodes[node->parent]->skeleton == skel_i) { + if (node->parent >= 0 && p_state->nodes[node->parent]->skeleton == p_skel_i) { disjoint_set.create_union(node->parent, i); } } - Ref<GLTFSkeleton> skeleton = state->skeletons.write[skel_i]; + Ref<GLTFSkeleton> skeleton = p_state->skeletons.write[p_skel_i]; Vector<GLTFNodeIndex> representatives; disjoint_set.get_representatives(representatives); @@ -4437,7 +4435,7 @@ Error GLTFDocument::_determine_skeleton_roots(Ref<GLTFState> state, const GLTFSk for (int i = 0; i < representatives.size(); ++i) { Vector<GLTFNodeIndex> set; disjoint_set.get_members(set, representatives[i]); - const GLTFNodeIndex root = _find_highest_node(state, set); + const GLTFNodeIndex root = _find_highest_node(p_state, set); ERR_FAIL_COND_V(root < 0, FAILED); roots.push_back(root); } @@ -4453,9 +4451,9 @@ Error GLTFDocument::_determine_skeleton_roots(Ref<GLTFState> state, const GLTFSk } // Check that the subtrees have the same parent root - const GLTFNodeIndex parent = state->nodes[roots[0]]->parent; + const GLTFNodeIndex parent = p_state->nodes[roots[0]]->parent; for (int i = 1; i < roots.size(); ++i) { - if (state->nodes[roots[i]]->parent != parent) { + if (p_state->nodes[roots[i]]->parent != parent) { return FAILED; } } @@ -4463,16 +4461,16 @@ Error GLTFDocument::_determine_skeleton_roots(Ref<GLTFState> state, const GLTFSk return OK; } -Error GLTFDocument::_create_skeletons(Ref<GLTFState> state) { - for (GLTFSkeletonIndex skel_i = 0; skel_i < state->skeletons.size(); ++skel_i) { - Ref<GLTFSkeleton> gltf_skeleton = state->skeletons.write[skel_i]; +Error GLTFDocument::_create_skeletons(Ref<GLTFState> p_state) { + for (GLTFSkeletonIndex skel_i = 0; skel_i < p_state->skeletons.size(); ++skel_i) { + Ref<GLTFSkeleton> gltf_skeleton = p_state->skeletons.write[skel_i]; Skeleton3D *skeleton = memnew(Skeleton3D); gltf_skeleton->godot_skeleton = skeleton; - state->skeleton3d_to_gltf_skeleton[skeleton->get_instance_id()] = skel_i; + p_state->skeleton3d_to_gltf_skeleton[skeleton->get_instance_id()] = skel_i; // Make a unique name, no gltf node represents this skeleton - skeleton->set_name(_gen_unique_name(state, "Skeleton3D")); + skeleton->set_name(_gen_unique_name(p_state, "Skeleton3D")); List<GLTFNodeIndex> bones; @@ -4488,14 +4486,14 @@ Error GLTFDocument::_create_skeletons(Ref<GLTFState> state) { const GLTFNodeIndex node_i = bones.front()->get(); bones.pop_front(); - Ref<GLTFNode> node = state->nodes[node_i]; + Ref<GLTFNode> node = p_state->nodes[node_i]; ERR_FAIL_COND_V(node->skeleton != skel_i, FAILED); { // Add all child nodes to the stack (deterministically) Vector<GLTFNodeIndex> child_nodes; for (int i = 0; i < node->children.size(); ++i) { const GLTFNodeIndex child_i = node->children[i]; - if (state->nodes[child_i]->skeleton == skel_i) { + if (p_state->nodes[child_i]->skeleton == skel_i) { child_nodes.push_back(child_i); } } @@ -4513,7 +4511,7 @@ Error GLTFDocument::_create_skeletons(Ref<GLTFState> state) { node->set_name("bone"); } - node->set_name(_gen_unique_bone_name(state, skel_i, node->get_name())); + node->set_name(_gen_unique_bone_name(p_state, skel_i, node->get_name())); skeleton->add_bone(node->get_name()); skeleton->set_bone_rest(bone_index, node->xform); @@ -4521,30 +4519,30 @@ Error GLTFDocument::_create_skeletons(Ref<GLTFState> state) { skeleton->set_bone_pose_rotation(bone_index, node->rotation.normalized()); skeleton->set_bone_pose_scale(bone_index, node->scale); - if (node->parent >= 0 && state->nodes[node->parent]->skeleton == skel_i) { - const int bone_parent = skeleton->find_bone(state->nodes[node->parent]->get_name()); + if (node->parent >= 0 && p_state->nodes[node->parent]->skeleton == skel_i) { + const int bone_parent = skeleton->find_bone(p_state->nodes[node->parent]->get_name()); ERR_FAIL_COND_V(bone_parent < 0, FAILED); - skeleton->set_bone_parent(bone_index, skeleton->find_bone(state->nodes[node->parent]->get_name())); + skeleton->set_bone_parent(bone_index, skeleton->find_bone(p_state->nodes[node->parent]->get_name())); } - state->scene_nodes.insert(node_i, skeleton); + p_state->scene_nodes.insert(node_i, skeleton); } } - ERR_FAIL_COND_V(_map_skin_joints_indices_to_skeleton_bone_indices(state), ERR_PARSE_ERROR); + ERR_FAIL_COND_V(_map_skin_joints_indices_to_skeleton_bone_indices(p_state), ERR_PARSE_ERROR); return OK; } -Error GLTFDocument::_map_skin_joints_indices_to_skeleton_bone_indices(Ref<GLTFState> state) { - for (GLTFSkinIndex skin_i = 0; skin_i < state->skins.size(); ++skin_i) { - Ref<GLTFSkin> skin = state->skins.write[skin_i]; +Error GLTFDocument::_map_skin_joints_indices_to_skeleton_bone_indices(Ref<GLTFState> p_state) { + for (GLTFSkinIndex skin_i = 0; skin_i < p_state->skins.size(); ++skin_i) { + Ref<GLTFSkin> skin = p_state->skins.write[skin_i]; - Ref<GLTFSkeleton> skeleton = state->skeletons[skin->skeleton]; + Ref<GLTFSkeleton> skeleton = p_state->skeletons[skin->skeleton]; for (int joint_index = 0; joint_index < skin->joints_original.size(); ++joint_index) { const GLTFNodeIndex node_i = skin->joints_original[joint_index]; - const Ref<GLTFNode> node = state->nodes[node_i]; + const Ref<GLTFNode> node = p_state->nodes[node_i]; const int bone_index = skeleton->godot_skeleton->find_bone(node->get_name()); ERR_FAIL_COND_V(bone_index < 0, FAILED); @@ -4556,28 +4554,28 @@ Error GLTFDocument::_map_skin_joints_indices_to_skeleton_bone_indices(Ref<GLTFSt return OK; } -Error GLTFDocument::_serialize_skins(Ref<GLTFState> state) { - _remove_duplicate_skins(state); +Error GLTFDocument::_serialize_skins(Ref<GLTFState> p_state) { + _remove_duplicate_skins(p_state); Array json_skins; - for (int skin_i = 0; skin_i < state->skins.size(); skin_i++) { - Ref<GLTFSkin> gltf_skin = state->skins[skin_i]; + for (int skin_i = 0; skin_i < p_state->skins.size(); skin_i++) { + Ref<GLTFSkin> gltf_skin = p_state->skins[skin_i]; Dictionary json_skin; - json_skin["inverseBindMatrices"] = _encode_accessor_as_xform(state, gltf_skin->inverse_binds, false); + json_skin["inverseBindMatrices"] = _encode_accessor_as_xform(p_state, gltf_skin->inverse_binds, false); json_skin["joints"] = gltf_skin->get_joints(); json_skin["name"] = gltf_skin->get_name(); json_skins.push_back(json_skin); } - if (!state->skins.size()) { + if (!p_state->skins.size()) { return OK; } - state->json["skins"] = json_skins; + p_state->json["skins"] = json_skins; return OK; } -Error GLTFDocument::_create_skins(Ref<GLTFState> state) { - for (GLTFSkinIndex skin_i = 0; skin_i < state->skins.size(); ++skin_i) { - Ref<GLTFSkin> gltf_skin = state->skins.write[skin_i]; +Error GLTFDocument::_create_skins(Ref<GLTFState> p_state) { + for (GLTFSkinIndex skin_i = 0; skin_i < p_state->skins.size(); ++skin_i) { + Ref<GLTFSkin> gltf_skin = p_state->skins.write[skin_i]; Ref<Skin> skin; skin.instantiate(); @@ -4587,14 +4585,14 @@ Error GLTFDocument::_create_skins(Ref<GLTFState> state) { for (int joint_i = 0; joint_i < gltf_skin->joints_original.size(); ++joint_i) { GLTFNodeIndex node = gltf_skin->joints_original[joint_i]; - String bone_name = state->nodes[node]->get_name(); + String bone_name = p_state->nodes[node]->get_name(); Transform3D xform; if (has_ibms) { xform = gltf_skin->inverse_binds[joint_i]; } - if (state->use_named_skin_binds) { + if (p_state->use_named_skin_binds) { skin->add_named_bind(bone_name, xform); } else { int32_t bone_i = gltf_skin->joint_i_to_bone_i[joint_i]; @@ -4606,35 +4604,35 @@ Error GLTFDocument::_create_skins(Ref<GLTFState> state) { } // Purge the duplicates! - _remove_duplicate_skins(state); + _remove_duplicate_skins(p_state); // Create unique names now, after removing duplicates - for (GLTFSkinIndex skin_i = 0; skin_i < state->skins.size(); ++skin_i) { - Ref<Skin> skin = state->skins.write[skin_i]->godot_skin; + for (GLTFSkinIndex skin_i = 0; skin_i < p_state->skins.size(); ++skin_i) { + Ref<Skin> skin = p_state->skins.write[skin_i]->godot_skin; if (skin->get_name().is_empty()) { // Make a unique name, no gltf node represents this skin - skin->set_name(_gen_unique_name(state, "Skin")); + skin->set_name(_gen_unique_name(p_state, "Skin")); } } return OK; } -bool GLTFDocument::_skins_are_same(const Ref<Skin> skin_a, const Ref<Skin> skin_b) { - if (skin_a->get_bind_count() != skin_b->get_bind_count()) { +bool GLTFDocument::_skins_are_same(const Ref<Skin> p_skin_a, const Ref<Skin> p_skin_b) { + if (p_skin_a->get_bind_count() != p_skin_b->get_bind_count()) { return false; } - for (int i = 0; i < skin_a->get_bind_count(); ++i) { - if (skin_a->get_bind_bone(i) != skin_b->get_bind_bone(i)) { + for (int i = 0; i < p_skin_a->get_bind_count(); ++i) { + if (p_skin_a->get_bind_bone(i) != p_skin_b->get_bind_bone(i)) { return false; } - if (skin_a->get_bind_name(i) != skin_b->get_bind_name(i)) { + if (p_skin_a->get_bind_name(i) != p_skin_b->get_bind_name(i)) { return false; } - Transform3D a_xform = skin_a->get_bind_pose(i); - Transform3D b_xform = skin_b->get_bind_pose(i); + Transform3D a_xform = p_skin_a->get_bind_pose(i); + Transform3D b_xform = p_skin_b->get_bind_pose(i); if (a_xform != b_xform) { return false; @@ -4644,67 +4642,67 @@ bool GLTFDocument::_skins_are_same(const Ref<Skin> skin_a, const Ref<Skin> skin_ return true; } -void GLTFDocument::_remove_duplicate_skins(Ref<GLTFState> state) { - for (int i = 0; i < state->skins.size(); ++i) { - for (int j = i + 1; j < state->skins.size(); ++j) { - const Ref<Skin> skin_i = state->skins[i]->godot_skin; - const Ref<Skin> skin_j = state->skins[j]->godot_skin; +void GLTFDocument::_remove_duplicate_skins(Ref<GLTFState> p_state) { + for (int i = 0; i < p_state->skins.size(); ++i) { + for (int j = i + 1; j < p_state->skins.size(); ++j) { + const Ref<Skin> skin_i = p_state->skins[i]->godot_skin; + const Ref<Skin> skin_j = p_state->skins[j]->godot_skin; if (_skins_are_same(skin_i, skin_j)) { // replace it and delete the old - state->skins.write[j]->godot_skin = skin_i; + p_state->skins.write[j]->godot_skin = skin_i; } } } } -Error GLTFDocument::_serialize_lights(Ref<GLTFState> state) { - if (state->lights.is_empty()) { +Error GLTFDocument::_serialize_lights(Ref<GLTFState> p_state) { + if (p_state->lights.is_empty()) { return OK; } Array lights; - for (GLTFLightIndex i = 0; i < state->lights.size(); i++) { - lights.push_back(state->lights[i]->to_dictionary()); + for (GLTFLightIndex i = 0; i < p_state->lights.size(); i++) { + lights.push_back(p_state->lights[i]->to_dictionary()); } Dictionary extensions; - if (state->json.has("extensions")) { - extensions = state->json["extensions"]; + if (p_state->json.has("extensions")) { + extensions = p_state->json["extensions"]; } else { - state->json["extensions"] = extensions; + p_state->json["extensions"] = extensions; } Dictionary lights_punctual; extensions["KHR_lights_punctual"] = lights_punctual; lights_punctual["lights"] = lights; - print_verbose("glTF: Total lights: " + itos(state->lights.size())); + print_verbose("glTF: Total lights: " + itos(p_state->lights.size())); return OK; } -Error GLTFDocument::_serialize_cameras(Ref<GLTFState> state) { +Error GLTFDocument::_serialize_cameras(Ref<GLTFState> p_state) { Array cameras; - cameras.resize(state->cameras.size()); - for (GLTFCameraIndex i = 0; i < state->cameras.size(); i++) { - cameras[i] = state->cameras[i]->to_dictionary(); + cameras.resize(p_state->cameras.size()); + for (GLTFCameraIndex i = 0; i < p_state->cameras.size(); i++) { + cameras[i] = p_state->cameras[i]->to_dictionary(); } - if (!state->cameras.size()) { + if (!p_state->cameras.size()) { return OK; } - state->json["cameras"] = cameras; + p_state->json["cameras"] = cameras; - print_verbose("glTF: Total cameras: " + itos(state->cameras.size())); + print_verbose("glTF: Total cameras: " + itos(p_state->cameras.size())); return OK; } -Error GLTFDocument::_parse_lights(Ref<GLTFState> state) { - if (!state->json.has("extensions")) { +Error GLTFDocument::_parse_lights(Ref<GLTFState> p_state) { + if (!p_state->json.has("extensions")) { return OK; } - Dictionary extensions = state->json["extensions"]; + Dictionary extensions = p_state->json["extensions"]; if (!extensions.has("KHR_lights_punctual")) { return OK; } @@ -4720,26 +4718,26 @@ Error GLTFDocument::_parse_lights(Ref<GLTFState> state) { if (light.is_null()) { return Error::ERR_PARSE_ERROR; } - state->lights.push_back(light); + p_state->lights.push_back(light); } - print_verbose("glTF: Total lights: " + itos(state->lights.size())); + print_verbose("glTF: Total lights: " + itos(p_state->lights.size())); return OK; } -Error GLTFDocument::_parse_cameras(Ref<GLTFState> state) { - if (!state->json.has("cameras")) { +Error GLTFDocument::_parse_cameras(Ref<GLTFState> p_state) { + if (!p_state->json.has("cameras")) { return OK; } - const Array cameras = state->json["cameras"]; + const Array cameras = p_state->json["cameras"]; for (GLTFCameraIndex i = 0; i < cameras.size(); i++) { - state->cameras.push_back(GLTFCamera::from_dictionary(cameras[i])); + p_state->cameras.push_back(GLTFCamera::from_dictionary(cameras[i])); } - print_verbose("glTF: Total cameras: " + itos(state->cameras.size())); + print_verbose("glTF: Total cameras: " + itos(p_state->cameras.size())); return OK; } @@ -4759,24 +4757,24 @@ String GLTFDocument::interpolation_to_string(const GLTFAnimation::Interpolation return interp; } -Error GLTFDocument::_serialize_animations(Ref<GLTFState> state) { - if (!state->animation_players.size()) { +Error GLTFDocument::_serialize_animations(Ref<GLTFState> p_state) { + if (!p_state->animation_players.size()) { return OK; } - for (int32_t player_i = 0; player_i < state->animation_players.size(); player_i++) { + for (int32_t player_i = 0; player_i < p_state->animation_players.size(); player_i++) { List<StringName> animation_names; - AnimationPlayer *animation_player = state->animation_players[player_i]; + AnimationPlayer *animation_player = p_state->animation_players[player_i]; animation_player->get_animation_list(&animation_names); if (animation_names.size()) { for (int animation_name_i = 0; animation_name_i < animation_names.size(); animation_name_i++) { - _convert_animation(state, animation_player, animation_names[animation_name_i]); + _convert_animation(p_state, animation_player, animation_names[animation_name_i]); } } } Array animations; - for (GLTFAnimationIndex animation_i = 0; animation_i < state->animations.size(); animation_i++) { + for (GLTFAnimationIndex animation_i = 0; animation_i < p_state->animations.size(); animation_i++) { Dictionary d; - Ref<GLTFAnimation> gltf_animation = state->animations[animation_i]; + Ref<GLTFAnimation> gltf_animation = p_state->animations[animation_i]; if (!gltf_animation->get_tracks().size()) { continue; } @@ -4796,9 +4794,9 @@ Error GLTFDocument::_serialize_animations(Ref<GLTFState> state) { s["interpolation"] = interpolation_to_string(track.position_track.interpolation); Vector<real_t> times = Variant(track.position_track.times); - s["input"] = _encode_accessor_as_floats(state, times, false); + s["input"] = _encode_accessor_as_floats(p_state, times, false); Vector<Vector3> values = Variant(track.position_track.values); - s["output"] = _encode_accessor_as_vec3(state, values, false); + s["output"] = _encode_accessor_as_vec3(p_state, values, false); samplers.push_back(s); @@ -4816,9 +4814,9 @@ Error GLTFDocument::_serialize_animations(Ref<GLTFState> state) { s["interpolation"] = interpolation_to_string(track.rotation_track.interpolation); Vector<real_t> times = Variant(track.rotation_track.times); - s["input"] = _encode_accessor_as_floats(state, times, false); + s["input"] = _encode_accessor_as_floats(p_state, times, false); Vector<Quaternion> values = track.rotation_track.values; - s["output"] = _encode_accessor_as_quaternions(state, values, false); + s["output"] = _encode_accessor_as_quaternions(p_state, values, false); samplers.push_back(s); @@ -4836,9 +4834,9 @@ Error GLTFDocument::_serialize_animations(Ref<GLTFState> state) { s["interpolation"] = interpolation_to_string(track.scale_track.interpolation); Vector<real_t> times = Variant(track.scale_track.times); - s["input"] = _encode_accessor_as_floats(state, times, false); + s["input"] = _encode_accessor_as_floats(p_state, times, false); Vector<Vector3> values = Variant(track.scale_track.values); - s["output"] = _encode_accessor_as_vec3(state, values, false); + s["output"] = _encode_accessor_as_vec3(p_state, values, false); samplers.push_back(s); @@ -4916,8 +4914,8 @@ Error GLTFDocument::_serialize_animations(Ref<GLTFState> state) { } s["interpolation"] = interpolation_to_string(track.weight_tracks[track.weight_tracks.size() - 1].interpolation); - s["input"] = _encode_accessor_as_floats(state, all_track_times, false); - s["output"] = _encode_accessor_as_floats(state, all_track_values, false); + s["input"] = _encode_accessor_as_floats(p_state, all_track_times, false); + s["output"] = _encode_accessor_as_floats(p_state, all_track_values, false); samplers.push_back(s); @@ -4939,19 +4937,19 @@ Error GLTFDocument::_serialize_animations(Ref<GLTFState> state) { if (!animations.size()) { return OK; } - state->json["animations"] = animations; + p_state->json["animations"] = animations; - print_verbose("glTF: Total animations '" + itos(state->animations.size()) + "'."); + print_verbose("glTF: Total animations '" + itos(p_state->animations.size()) + "'."); return OK; } -Error GLTFDocument::_parse_animations(Ref<GLTFState> state) { - if (!state->json.has("animations")) { +Error GLTFDocument::_parse_animations(Ref<GLTFState> p_state) { + if (!p_state->json.has("animations")) { return OK; } - const Array &animations = state->json["animations"]; + const Array &animations = p_state->json["animations"]; for (GLTFAnimationIndex i = 0; i < animations.size(); i++) { const Dictionary &d = animations[i]; @@ -4972,7 +4970,7 @@ Error GLTFDocument::_parse_animations(Ref<GLTFState> state) { if (anim_name_lower.begins_with("loop") || anim_name_lower.ends_with("loop") || anim_name_lower.begins_with("cycle") || anim_name_lower.ends_with("cycle")) { animation->set_loop(true); } - animation->set_name(_gen_unique_animation_name(state, anim_name)); + animation->set_name(_gen_unique_animation_name(p_state, anim_name)); } for (int j = 0; j < channels.size(); j++) { @@ -4993,7 +4991,7 @@ Error GLTFDocument::_parse_animations(Ref<GLTFState> state) { GLTFNodeIndex node = t["node"]; String path = t["path"]; - ERR_FAIL_INDEX_V(node, state->nodes.size(), ERR_PARSE_ERROR); + ERR_FAIL_INDEX_V(node, p_state->nodes.size(), ERR_PARSE_ERROR); GLTFAnimation::Track *track = nullptr; @@ -5028,27 +5026,27 @@ Error GLTFDocument::_parse_animations(Ref<GLTFState> state) { } } - const Vector<float> times = _decode_accessor_as_floats(state, input, false); + const Vector<float> times = _decode_accessor_as_floats(p_state, input, false); if (path == "translation") { - const Vector<Vector3> positions = _decode_accessor_as_vec3(state, output, false); + const Vector<Vector3> positions = _decode_accessor_as_vec3(p_state, output, false); track->position_track.interpolation = interp; track->position_track.times = Variant(times); //convert via variant track->position_track.values = Variant(positions); //convert via variant } else if (path == "rotation") { - const Vector<Quaternion> rotations = _decode_accessor_as_quaternion(state, output, false); + const Vector<Quaternion> rotations = _decode_accessor_as_quaternion(p_state, output, false); track->rotation_track.interpolation = interp; track->rotation_track.times = Variant(times); //convert via variant track->rotation_track.values = rotations; } else if (path == "scale") { - const Vector<Vector3> scales = _decode_accessor_as_vec3(state, output, false); + const Vector<Vector3> scales = _decode_accessor_as_vec3(p_state, output, false); track->scale_track.interpolation = interp; track->scale_track.times = Variant(times); //convert via variant track->scale_track.values = Variant(scales); //convert via variant } else if (path == "weights") { - const Vector<float> weights = _decode_accessor_as_floats(state, output, false); + const Vector<float> weights = _decode_accessor_as_floats(p_state, output, false); - ERR_FAIL_INDEX_V(state->nodes[node]->mesh, state->meshes.size(), ERR_PARSE_ERROR); - Ref<GLTFMesh> mesh = state->meshes[state->nodes[node]->mesh]; + ERR_FAIL_INDEX_V(p_state->nodes[node]->mesh, p_state->meshes.size(), ERR_PARSE_ERROR); + Ref<GLTFMesh> mesh = p_state->meshes[p_state->nodes[node]->mesh]; ERR_CONTINUE(!mesh->get_blend_weights().size()); const int wc = mesh->get_blend_weights().size(); @@ -5076,17 +5074,17 @@ Error GLTFDocument::_parse_animations(Ref<GLTFState> state) { } } - state->animations.push_back(animation); + p_state->animations.push_back(animation); } - print_verbose("glTF: Total animations '" + itos(state->animations.size()) + "'."); + print_verbose("glTF: Total animations '" + itos(p_state->animations.size()) + "'."); return OK; } -void GLTFDocument::_assign_scene_names(Ref<GLTFState> state) { - for (int i = 0; i < state->nodes.size(); i++) { - Ref<GLTFNode> n = state->nodes[i]; +void GLTFDocument::_assign_scene_names(Ref<GLTFState> p_state) { + for (int i = 0; i < p_state->nodes.size(); i++) { + Ref<GLTFNode> n = p_state->nodes[i]; // Any joints get unique names generated when the skeleton is made, unique to the skeleton if (n->skeleton >= 0) { @@ -5095,21 +5093,21 @@ void GLTFDocument::_assign_scene_names(Ref<GLTFState> state) { if (n->get_name().is_empty()) { if (n->mesh >= 0) { - n->set_name(_gen_unique_name(state, "Mesh")); + n->set_name(_gen_unique_name(p_state, "Mesh")); } else if (n->camera >= 0) { - n->set_name(_gen_unique_name(state, "Camera3D")); + n->set_name(_gen_unique_name(p_state, "Camera3D")); } else { - n->set_name(_gen_unique_name(state, "Node")); + n->set_name(_gen_unique_name(p_state, "Node")); } } - n->set_name(_gen_unique_name(state, n->get_name())); + n->set_name(_gen_unique_name(p_state, n->get_name())); } } -BoneAttachment3D *GLTFDocument::_generate_bone_attachment(Ref<GLTFState> state, Skeleton3D *skeleton, const GLTFNodeIndex node_index, const GLTFNodeIndex bone_index) { - Ref<GLTFNode> gltf_node = state->nodes[node_index]; - Ref<GLTFNode> bone_node = state->nodes[bone_index]; +BoneAttachment3D *GLTFDocument::_generate_bone_attachment(Ref<GLTFState> p_state, Skeleton3D *p_skeleton, const GLTFNodeIndex p_node_index, const GLTFNodeIndex p_bone_index) { + Ref<GLTFNode> gltf_node = p_state->nodes[p_node_index]; + Ref<GLTFNode> bone_node = p_state->nodes[p_bone_index]; BoneAttachment3D *bone_attachment = memnew(BoneAttachment3D); print_verbose("glTF: Creating bone attachment for: " + gltf_node->get_name()); @@ -5120,7 +5118,7 @@ BoneAttachment3D *GLTFDocument::_generate_bone_attachment(Ref<GLTFState> state, return bone_attachment; } -GLTFMeshIndex GLTFDocument::_convert_mesh_to_gltf(Ref<GLTFState> state, MeshInstance3D *p_mesh_instance) { +GLTFMeshIndex GLTFDocument::_convert_mesh_to_gltf(Ref<GLTFState> p_state, MeshInstance3D *p_mesh_instance) { ERR_FAIL_NULL_V(p_mesh_instance, -1); if (p_mesh_instance->get_mesh().is_null()) { return -1; @@ -5151,20 +5149,20 @@ GLTFMeshIndex GLTFDocument::_convert_mesh_to_gltf(Ref<GLTFState> state, MeshInst gltf_mesh->set_instance_materials(instance_materials); gltf_mesh->set_mesh(current_mesh); gltf_mesh->set_blend_weights(blend_weights); - GLTFMeshIndex mesh_i = state->meshes.size(); - state->meshes.push_back(gltf_mesh); + GLTFMeshIndex mesh_i = p_state->meshes.size(); + p_state->meshes.push_back(gltf_mesh); return mesh_i; } -ImporterMeshInstance3D *GLTFDocument::_generate_mesh_instance(Ref<GLTFState> state, const GLTFNodeIndex node_index) { - Ref<GLTFNode> gltf_node = state->nodes[node_index]; +ImporterMeshInstance3D *GLTFDocument::_generate_mesh_instance(Ref<GLTFState> p_state, const GLTFNodeIndex p_node_index) { + Ref<GLTFNode> gltf_node = p_state->nodes[p_node_index]; - ERR_FAIL_INDEX_V(gltf_node->mesh, state->meshes.size(), nullptr); + ERR_FAIL_INDEX_V(gltf_node->mesh, p_state->meshes.size(), nullptr); ImporterMeshInstance3D *mi = memnew(ImporterMeshInstance3D); print_verbose("glTF: Creating mesh for: " + gltf_node->get_name()); - Ref<GLTFMesh> mesh = state->meshes.write[gltf_node->mesh]; + Ref<GLTFMesh> mesh = p_state->meshes.write[gltf_node->mesh]; if (mesh.is_null()) { return mi; } @@ -5176,56 +5174,56 @@ ImporterMeshInstance3D *GLTFDocument::_generate_mesh_instance(Ref<GLTFState> sta return mi; } -Light3D *GLTFDocument::_generate_light(Ref<GLTFState> state, const GLTFNodeIndex node_index) { - Ref<GLTFNode> gltf_node = state->nodes[node_index]; +Light3D *GLTFDocument::_generate_light(Ref<GLTFState> p_state, const GLTFNodeIndex p_node_index) { + Ref<GLTFNode> gltf_node = p_state->nodes[p_node_index]; - ERR_FAIL_INDEX_V(gltf_node->light, state->lights.size(), nullptr); + ERR_FAIL_INDEX_V(gltf_node->light, p_state->lights.size(), nullptr); print_verbose("glTF: Creating light for: " + gltf_node->get_name()); - Ref<GLTFLight> l = state->lights[gltf_node->light]; + Ref<GLTFLight> l = p_state->lights[gltf_node->light]; return l->to_node(); } -Camera3D *GLTFDocument::_generate_camera(Ref<GLTFState> state, const GLTFNodeIndex node_index) { - Ref<GLTFNode> gltf_node = state->nodes[node_index]; +Camera3D *GLTFDocument::_generate_camera(Ref<GLTFState> p_state, const GLTFNodeIndex p_node_index) { + Ref<GLTFNode> gltf_node = p_state->nodes[p_node_index]; - ERR_FAIL_INDEX_V(gltf_node->camera, state->cameras.size(), nullptr); + ERR_FAIL_INDEX_V(gltf_node->camera, p_state->cameras.size(), nullptr); print_verbose("glTF: Creating camera for: " + gltf_node->get_name()); - Ref<GLTFCamera> c = state->cameras[gltf_node->camera]; + Ref<GLTFCamera> c = p_state->cameras[gltf_node->camera]; return c->to_node(); } -GLTFCameraIndex GLTFDocument::_convert_camera(Ref<GLTFState> state, Camera3D *p_camera) { +GLTFCameraIndex GLTFDocument::_convert_camera(Ref<GLTFState> p_state, Camera3D *p_camera) { print_verbose("glTF: Converting camera: " + p_camera->get_name()); Ref<GLTFCamera> c = GLTFCamera::from_node(p_camera); - GLTFCameraIndex camera_index = state->cameras.size(); - state->cameras.push_back(c); + GLTFCameraIndex camera_index = p_state->cameras.size(); + p_state->cameras.push_back(c); return camera_index; } -GLTFLightIndex GLTFDocument::_convert_light(Ref<GLTFState> state, Light3D *p_light) { +GLTFLightIndex GLTFDocument::_convert_light(Ref<GLTFState> p_state, Light3D *p_light) { print_verbose("glTF: Converting light: " + p_light->get_name()); Ref<GLTFLight> l = GLTFLight::from_node(p_light); - GLTFLightIndex light_index = state->lights.size(); - state->lights.push_back(l); + GLTFLightIndex light_index = p_state->lights.size(); + p_state->lights.push_back(l); return light_index; } -void GLTFDocument::_convert_spatial(Ref<GLTFState> state, Node3D *p_spatial, Ref<GLTFNode> p_node) { +void GLTFDocument::_convert_spatial(Ref<GLTFState> p_state, Node3D *p_spatial, Ref<GLTFNode> p_node) { Transform3D xform = p_spatial->get_transform(); p_node->scale = xform.basis.get_scale(); p_node->rotation = xform.basis.get_rotation_quaternion(); p_node->position = xform.origin; } -Node3D *GLTFDocument::_generate_spatial(Ref<GLTFState> state, const GLTFNodeIndex node_index) { - Ref<GLTFNode> gltf_node = state->nodes[node_index]; +Node3D *GLTFDocument::_generate_spatial(Ref<GLTFState> p_state, const GLTFNodeIndex p_node_index) { + Ref<GLTFNode> gltf_node = p_state->nodes[p_node_index]; Node3D *spatial = memnew(Node3D); print_verbose("glTF: Converting spatial: " + gltf_node->get_name()); @@ -5233,7 +5231,7 @@ Node3D *GLTFDocument::_generate_spatial(Ref<GLTFState> state, const GLTFNodeInde return spatial; } -void GLTFDocument::_convert_scene_node(Ref<GLTFState> state, Node *p_current, const GLTFNodeIndex p_gltf_parent, const GLTFNodeIndex p_gltf_root) { +void GLTFDocument::_convert_scene_node(Ref<GLTFState> p_state, Node *p_current, const GLTFNodeIndex p_gltf_parent, const GLTFNodeIndex p_gltf_root) { bool retflag = true; _check_visibility(p_current, retflag); if (retflag) { @@ -5241,68 +5239,68 @@ void GLTFDocument::_convert_scene_node(Ref<GLTFState> state, Node *p_current, co } Ref<GLTFNode> gltf_node; gltf_node.instantiate(); - gltf_node->set_name(_gen_unique_name(state, p_current->get_name())); + gltf_node->set_name(_gen_unique_name(p_state, p_current->get_name())); if (cast_to<Node3D>(p_current)) { Node3D *spatial = cast_to<Node3D>(p_current); - _convert_spatial(state, spatial, gltf_node); + _convert_spatial(p_state, spatial, gltf_node); } if (cast_to<MeshInstance3D>(p_current)) { MeshInstance3D *mi = cast_to<MeshInstance3D>(p_current); - _convert_mesh_instance_to_gltf(mi, state, gltf_node); + _convert_mesh_instance_to_gltf(mi, p_state, gltf_node); } else if (cast_to<BoneAttachment3D>(p_current)) { BoneAttachment3D *bone = cast_to<BoneAttachment3D>(p_current); - _convert_bone_attachment_to_gltf(bone, state, p_gltf_parent, p_gltf_root, gltf_node); + _convert_bone_attachment_to_gltf(bone, p_state, p_gltf_parent, p_gltf_root, gltf_node); return; } else if (cast_to<Skeleton3D>(p_current)) { Skeleton3D *skel = cast_to<Skeleton3D>(p_current); - _convert_skeleton_to_gltf(skel, state, p_gltf_parent, p_gltf_root, gltf_node); + _convert_skeleton_to_gltf(skel, p_state, p_gltf_parent, p_gltf_root, gltf_node); // We ignore the Godot Engine node that is the skeleton. return; } else if (cast_to<MultiMeshInstance3D>(p_current)) { MultiMeshInstance3D *multi = cast_to<MultiMeshInstance3D>(p_current); - _convert_multi_mesh_instance_to_gltf(multi, p_gltf_parent, p_gltf_root, gltf_node, state); + _convert_multi_mesh_instance_to_gltf(multi, p_gltf_parent, p_gltf_root, gltf_node, p_state); #ifdef MODULE_CSG_ENABLED } else if (cast_to<CSGShape3D>(p_current)) { CSGShape3D *shape = cast_to<CSGShape3D>(p_current); if (shape->get_parent() && shape->is_root_shape()) { - _convert_csg_shape_to_gltf(shape, p_gltf_parent, gltf_node, state); + _convert_csg_shape_to_gltf(shape, p_gltf_parent, gltf_node, p_state); } #endif // MODULE_CSG_ENABLED #ifdef MODULE_GRIDMAP_ENABLED } else if (cast_to<GridMap>(p_current)) { GridMap *gridmap = Object::cast_to<GridMap>(p_current); - _convert_grid_map_to_gltf(gridmap, p_gltf_parent, p_gltf_root, gltf_node, state); + _convert_grid_map_to_gltf(gridmap, p_gltf_parent, p_gltf_root, gltf_node, p_state); #endif // MODULE_GRIDMAP_ENABLED } else if (cast_to<Camera3D>(p_current)) { Camera3D *camera = Object::cast_to<Camera3D>(p_current); - _convert_camera_to_gltf(camera, state, gltf_node); + _convert_camera_to_gltf(camera, p_state, gltf_node); } else if (cast_to<Light3D>(p_current)) { Light3D *light = Object::cast_to<Light3D>(p_current); - _convert_light_to_gltf(light, state, gltf_node); + _convert_light_to_gltf(light, p_state, gltf_node); } else if (cast_to<AnimationPlayer>(p_current)) { AnimationPlayer *animation_player = Object::cast_to<AnimationPlayer>(p_current); - _convert_animation_player_to_gltf(animation_player, state, p_gltf_parent, p_gltf_root, gltf_node, p_current); + _convert_animation_player_to_gltf(animation_player, p_state, p_gltf_parent, p_gltf_root, gltf_node, p_current); } for (Ref<GLTFDocumentExtension> ext : document_extensions) { ERR_CONTINUE(ext.is_null()); - ext->convert_scene_node(state, gltf_node, p_current); + ext->convert_scene_node(p_state, gltf_node, p_current); } - GLTFNodeIndex current_node_i = state->nodes.size(); + GLTFNodeIndex current_node_i = p_state->nodes.size(); GLTFNodeIndex gltf_root = p_gltf_root; if (gltf_root == -1) { gltf_root = current_node_i; Array scenes; scenes.push_back(gltf_root); - state->json["scene"] = scenes; + p_state->json["scene"] = scenes; } - _create_gltf_node(state, p_current, current_node_i, p_gltf_parent, gltf_root, gltf_node); + _create_gltf_node(p_state, p_current, current_node_i, p_gltf_parent, gltf_root, gltf_node); for (int node_i = 0; node_i < p_current->get_child_count(); node_i++) { - _convert_scene_node(state, p_current->get_child(node_i), current_node_i, gltf_root); + _convert_scene_node(p_state, p_current->get_child(node_i), current_node_i, gltf_root); } } #ifdef MODULE_CSG_ENABLED -void GLTFDocument::_convert_csg_shape_to_gltf(CSGShape3D *p_current, GLTFNodeIndex p_gltf_parent, Ref<GLTFNode> gltf_node, Ref<GLTFState> state) { +void GLTFDocument::_convert_csg_shape_to_gltf(CSGShape3D *p_current, GLTFNodeIndex p_gltf_parent, Ref<GLTFNode> p_gltf_node, Ref<GLTFState> p_state) { CSGShape3D *csg = p_current; csg->call("_update_shape"); Array meshes = csg->get_meshes(); @@ -5334,34 +5332,34 @@ void GLTFDocument::_convert_csg_shape_to_gltf(CSGShape3D *p_current, GLTFNodeInd Ref<GLTFMesh> gltf_mesh; gltf_mesh.instantiate(); gltf_mesh->set_mesh(mesh); - GLTFMeshIndex mesh_i = state->meshes.size(); - state->meshes.push_back(gltf_mesh); - gltf_node->mesh = mesh_i; - gltf_node->xform = csg->get_meshes()[0]; - gltf_node->set_name(_gen_unique_name(state, csg->get_name())); + GLTFMeshIndex mesh_i = p_state->meshes.size(); + p_state->meshes.push_back(gltf_mesh); + p_gltf_node->mesh = mesh_i; + p_gltf_node->xform = csg->get_meshes()[0]; + p_gltf_node->set_name(_gen_unique_name(p_state, csg->get_name())); } #endif // MODULE_CSG_ENABLED -void GLTFDocument::_create_gltf_node(Ref<GLTFState> state, Node *p_scene_parent, GLTFNodeIndex current_node_i, - GLTFNodeIndex p_parent_node_index, GLTFNodeIndex p_root_gltf_node, Ref<GLTFNode> gltf_node) { - state->scene_nodes.insert(current_node_i, p_scene_parent); - state->nodes.push_back(gltf_node); - ERR_FAIL_COND(current_node_i == p_parent_node_index); - state->nodes.write[current_node_i]->parent = p_parent_node_index; +void GLTFDocument::_create_gltf_node(Ref<GLTFState> p_state, Node *p_scene_parent, GLTFNodeIndex p_current_node_i, + GLTFNodeIndex p_parent_node_index, GLTFNodeIndex p_root_gltf_node, Ref<GLTFNode> p_gltf_node) { + p_state->scene_nodes.insert(p_current_node_i, p_scene_parent); + p_state->nodes.push_back(p_gltf_node); + ERR_FAIL_COND(p_current_node_i == p_parent_node_index); + p_state->nodes.write[p_current_node_i]->parent = p_parent_node_index; if (p_parent_node_index == -1) { return; } - state->nodes.write[p_parent_node_index]->children.push_back(current_node_i); + p_state->nodes.write[p_parent_node_index]->children.push_back(p_current_node_i); } -void GLTFDocument::_convert_animation_player_to_gltf(AnimationPlayer *animation_player, Ref<GLTFState> state, GLTFNodeIndex p_gltf_current, GLTFNodeIndex p_gltf_root_index, Ref<GLTFNode> p_gltf_node, Node *p_scene_parent) { - ERR_FAIL_COND(!animation_player); - state->animation_players.push_back(animation_player); - print_verbose(String("glTF: Converting animation player: ") + animation_player->get_name()); +void GLTFDocument::_convert_animation_player_to_gltf(AnimationPlayer *p_animation_player, Ref<GLTFState> p_state, GLTFNodeIndex p_gltf_current, GLTFNodeIndex p_gltf_root_index, Ref<GLTFNode> p_gltf_node, Node *p_scene_parent) { + ERR_FAIL_COND(!p_animation_player); + p_state->animation_players.push_back(p_animation_player); + print_verbose(String("glTF: Converting animation player: ") + p_animation_player->get_name()); } -void GLTFDocument::_check_visibility(Node *p_node, bool &retflag) { - retflag = true; +void GLTFDocument::_check_visibility(Node *p_node, bool &r_retflag) { + r_retflag = true; Node3D *spatial = Object::cast_to<Node3D>(p_node); Node2D *node_2d = Object::cast_to<Node2D>(p_node); if (node_2d && !node_2d->is_visible()) { @@ -5370,32 +5368,32 @@ void GLTFDocument::_check_visibility(Node *p_node, bool &retflag) { if (spatial && !spatial->is_visible()) { return; } - retflag = false; + r_retflag = false; } -void GLTFDocument::_convert_camera_to_gltf(Camera3D *camera, Ref<GLTFState> state, Ref<GLTFNode> gltf_node) { +void GLTFDocument::_convert_camera_to_gltf(Camera3D *camera, Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node) { ERR_FAIL_COND(!camera); - GLTFCameraIndex camera_index = _convert_camera(state, camera); + GLTFCameraIndex camera_index = _convert_camera(p_state, camera); if (camera_index != -1) { - gltf_node->camera = camera_index; + p_gltf_node->camera = camera_index; } } -void GLTFDocument::_convert_light_to_gltf(Light3D *light, Ref<GLTFState> state, Ref<GLTFNode> gltf_node) { +void GLTFDocument::_convert_light_to_gltf(Light3D *light, Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node) { ERR_FAIL_COND(!light); - GLTFLightIndex light_index = _convert_light(state, light); + GLTFLightIndex light_index = _convert_light(p_state, light); if (light_index != -1) { - gltf_node->light = light_index; + p_gltf_node->light = light_index; } } #ifdef MODULE_GRIDMAP_ENABLED -void GLTFDocument::_convert_grid_map_to_gltf(GridMap *p_grid_map, GLTFNodeIndex p_parent_node_index, GLTFNodeIndex p_root_node_index, Ref<GLTFNode> gltf_node, Ref<GLTFState> state) { +void GLTFDocument::_convert_grid_map_to_gltf(GridMap *p_grid_map, GLTFNodeIndex p_parent_node_index, GLTFNodeIndex p_root_node_index, Ref<GLTFNode> p_gltf_node, Ref<GLTFState> p_state) { Array cells = p_grid_map->get_used_cells(); for (int32_t k = 0; k < cells.size(); k++) { GLTFNode *new_gltf_node = memnew(GLTFNode); - gltf_node->children.push_back(state->nodes.size()); - state->nodes.push_back(new_gltf_node); + p_gltf_node->children.push_back(p_state->nodes.size()); + p_state->nodes.push_back(new_gltf_node); Vector3 cell_location = cells[k]; int32_t cell = p_grid_map->get_cell_item( Vector3(cell_location.x, cell_location.y, cell_location.z)); @@ -5411,10 +5409,10 @@ void GLTFDocument::_convert_grid_map_to_gltf(GridMap *p_grid_map, GLTFNodeIndex Ref<GLTFMesh> gltf_mesh; gltf_mesh.instantiate(); gltf_mesh->set_mesh(_mesh_to_importer_mesh(p_grid_map->get_mesh_library()->get_item_mesh(cell))); - new_gltf_node->mesh = state->meshes.size(); - state->meshes.push_back(gltf_mesh); + new_gltf_node->mesh = p_state->meshes.size(); + p_state->meshes.push_back(gltf_mesh); new_gltf_node->xform = cell_xform * p_grid_map->get_transform(); - new_gltf_node->set_name(_gen_unique_name(state, p_grid_map->get_mesh_library()->get_item_name(cell))); + new_gltf_node->set_name(_gen_unique_name(p_state, p_grid_map->get_mesh_library()->get_item_name(cell))); } } #endif // MODULE_GRIDMAP_ENABLED @@ -5423,7 +5421,7 @@ void GLTFDocument::_convert_multi_mesh_instance_to_gltf( MultiMeshInstance3D *p_multi_mesh_instance, GLTFNodeIndex p_parent_node_index, GLTFNodeIndex p_root_node_index, - Ref<GLTFNode> gltf_node, Ref<GLTFState> state) { + Ref<GLTFNode> p_gltf_node, Ref<GLTFState> p_state) { ERR_FAIL_COND(!p_multi_mesh_instance); Ref<MultiMesh> multi_mesh = p_multi_mesh_instance->get_multimesh(); if (multi_mesh.is_null()) { @@ -5459,8 +5457,8 @@ void GLTFDocument::_convert_multi_mesh_instance_to_gltf( blend_arrays, mesh->surface_get_lods(surface_i), mat, material_name, mesh->surface_get_format(surface_i)); } gltf_mesh->set_mesh(importer_mesh); - GLTFMeshIndex mesh_index = state->meshes.size(); - state->meshes.push_back(gltf_mesh); + GLTFMeshIndex mesh_index = p_state->meshes.size(); + p_state->meshes.push_back(gltf_mesh); for (int32_t instance_i = 0; instance_i < multi_mesh->get_instance_count(); instance_i++) { Transform3D transform; @@ -5482,22 +5480,22 @@ void GLTFDocument::_convert_multi_mesh_instance_to_gltf( new_gltf_node.instantiate(); new_gltf_node->mesh = mesh_index; new_gltf_node->xform = transform; - new_gltf_node->set_name(_gen_unique_name(state, p_multi_mesh_instance->get_name())); - gltf_node->children.push_back(state->nodes.size()); - state->nodes.push_back(new_gltf_node); + new_gltf_node->set_name(_gen_unique_name(p_state, p_multi_mesh_instance->get_name())); + p_gltf_node->children.push_back(p_state->nodes.size()); + p_state->nodes.push_back(new_gltf_node); } } -void GLTFDocument::_convert_skeleton_to_gltf(Skeleton3D *p_skeleton3d, Ref<GLTFState> state, GLTFNodeIndex p_parent_node_index, GLTFNodeIndex p_root_node_index, Ref<GLTFNode> gltf_node) { +void GLTFDocument::_convert_skeleton_to_gltf(Skeleton3D *p_skeleton3d, Ref<GLTFState> p_state, GLTFNodeIndex p_parent_node_index, GLTFNodeIndex p_root_node_index, Ref<GLTFNode> p_gltf_node) { Skeleton3D *skeleton = p_skeleton3d; Ref<GLTFSkeleton> gltf_skeleton; gltf_skeleton.instantiate(); - // GLTFSkeleton is only used to hold internal state data. It will not be written to the document. + // GLTFSkeleton is only used to hold internal p_state data. It will not be written to the document. // gltf_skeleton->godot_skeleton = skeleton; - GLTFSkeletonIndex skeleton_i = state->skeletons.size(); - state->skeleton3d_to_gltf_skeleton[skeleton->get_instance_id()] = skeleton_i; - state->skeletons.push_back(gltf_skeleton); + GLTFSkeletonIndex skeleton_i = p_state->skeletons.size(); + p_state->skeleton3d_to_gltf_skeleton[skeleton->get_instance_id()] = skeleton_i; + p_state->skeletons.push_back(gltf_skeleton); BoneId bone_count = skeleton->get_bone_count(); for (BoneId bone_i = 0; bone_i < bone_count; bone_i++) { @@ -5505,15 +5503,15 @@ void GLTFDocument::_convert_skeleton_to_gltf(Skeleton3D *p_skeleton3d, Ref<GLTFS joint_node.instantiate(); // Note that we cannot use _gen_unique_bone_name here, because glTF spec requires all node // names to be unique regardless of whether or not they are used as joints. - joint_node->set_name(_gen_unique_name(state, skeleton->get_bone_name(bone_i))); + joint_node->set_name(_gen_unique_name(p_state, skeleton->get_bone_name(bone_i))); Transform3D xform = skeleton->get_bone_pose(bone_i); joint_node->scale = xform.basis.get_scale(); joint_node->rotation = xform.basis.get_rotation_quaternion(); joint_node->position = xform.origin; joint_node->joint = true; - GLTFNodeIndex current_node_i = state->nodes.size(); - state->scene_nodes.insert(current_node_i, skeleton); - state->nodes.push_back(joint_node); + GLTFNodeIndex current_node_i = p_state->nodes.size(); + p_state->scene_nodes.insert(current_node_i, skeleton); + p_state->nodes.push_back(joint_node); gltf_skeleton->joints.push_back(current_node_i); if (skeleton->get_bone_parent(bone_i) == -1) { @@ -5526,23 +5524,23 @@ void GLTFDocument::_convert_skeleton_to_gltf(Skeleton3D *p_skeleton3d, Ref<GLTFS BoneId parent_bone_id = skeleton->get_bone_parent(bone_i); if (parent_bone_id == -1) { if (p_parent_node_index != -1) { - state->nodes.write[current_node_i]->parent = p_parent_node_index; - state->nodes.write[p_parent_node_index]->children.push_back(current_node_i); + p_state->nodes.write[current_node_i]->parent = p_parent_node_index; + p_state->nodes.write[p_parent_node_index]->children.push_back(current_node_i); } } else { GLTFNodeIndex parent_node_i = gltf_skeleton->godot_bone_node[parent_bone_id]; - state->nodes.write[current_node_i]->parent = parent_node_i; - state->nodes.write[parent_node_i]->children.push_back(current_node_i); + p_state->nodes.write[current_node_i]->parent = parent_node_i; + p_state->nodes.write[parent_node_i]->children.push_back(current_node_i); } } // Remove placeholder skeleton3d node by not creating the gltf node // Skins are per mesh for (int node_i = 0; node_i < skeleton->get_child_count(); node_i++) { - _convert_scene_node(state, skeleton->get_child(node_i), p_parent_node_index, p_root_node_index); + _convert_scene_node(p_state, skeleton->get_child(node_i), p_parent_node_index, p_root_node_index); } } -void GLTFDocument::_convert_bone_attachment_to_gltf(BoneAttachment3D *p_bone_attachment, Ref<GLTFState> state, GLTFNodeIndex p_parent_node_index, GLTFNodeIndex p_root_node_index, Ref<GLTFNode> gltf_node) { +void GLTFDocument::_convert_bone_attachment_to_gltf(BoneAttachment3D *p_bone_attachment, Ref<GLTFState> p_state, GLTFNodeIndex p_parent_node_index, GLTFNodeIndex p_root_node_index, Ref<GLTFNode> p_gltf_node) { Skeleton3D *skeleton; // Note that relative transforms to external skeletons and pose overrides are not supported. if (p_bone_attachment->get_use_external_skeleton()) { @@ -5551,8 +5549,8 @@ void GLTFDocument::_convert_bone_attachment_to_gltf(BoneAttachment3D *p_bone_att skeleton = cast_to<Skeleton3D>(p_bone_attachment->get_parent()); } GLTFSkeletonIndex skel_gltf_i = -1; - if (skeleton != nullptr && state->skeleton3d_to_gltf_skeleton.has(skeleton->get_instance_id())) { - skel_gltf_i = state->skeleton3d_to_gltf_skeleton[skeleton->get_instance_id()]; + if (skeleton != nullptr && p_state->skeleton3d_to_gltf_skeleton.has(skeleton->get_instance_id())) { + skel_gltf_i = p_state->skeleton3d_to_gltf_skeleton[skeleton->get_instance_id()]; } int bone_idx = -1; if (skeleton != nullptr) { @@ -5563,28 +5561,28 @@ void GLTFDocument::_convert_bone_attachment_to_gltf(BoneAttachment3D *p_bone_att } GLTFNodeIndex par_node_index = p_parent_node_index; if (skeleton != nullptr && bone_idx != -1 && skel_gltf_i != -1) { - Ref<GLTFSkeleton> gltf_skeleton = state->skeletons.write[skel_gltf_i]; + Ref<GLTFSkeleton> gltf_skeleton = p_state->skeletons.write[skel_gltf_i]; gltf_skeleton->bone_attachments.push_back(p_bone_attachment); par_node_index = gltf_skeleton->joints[bone_idx]; } for (int node_i = 0; node_i < p_bone_attachment->get_child_count(); node_i++) { - _convert_scene_node(state, p_bone_attachment->get_child(node_i), par_node_index, p_root_node_index); + _convert_scene_node(p_state, p_bone_attachment->get_child(node_i), par_node_index, p_root_node_index); } } -void GLTFDocument::_convert_mesh_instance_to_gltf(MeshInstance3D *p_scene_parent, Ref<GLTFState> state, Ref<GLTFNode> gltf_node) { - GLTFMeshIndex gltf_mesh_index = _convert_mesh_to_gltf(state, p_scene_parent); +void GLTFDocument::_convert_mesh_instance_to_gltf(MeshInstance3D *p_scene_parent, Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node) { + GLTFMeshIndex gltf_mesh_index = _convert_mesh_to_gltf(p_state, p_scene_parent); if (gltf_mesh_index != -1) { - gltf_node->mesh = gltf_mesh_index; + p_gltf_node->mesh = gltf_mesh_index; } } -void GLTFDocument::_generate_scene_node(Ref<GLTFState> state, Node *scene_parent, Node3D *scene_root, const GLTFNodeIndex node_index) { - Ref<GLTFNode> gltf_node = state->nodes[node_index]; +void GLTFDocument::_generate_scene_node(Ref<GLTFState> p_state, Node *scene_parent, Node3D *scene_root, const GLTFNodeIndex node_index) { + Ref<GLTFNode> gltf_node = p_state->nodes[node_index]; if (gltf_node->skeleton >= 0) { - _generate_skeleton_bone_node(state, scene_parent, scene_root, node_index); + _generate_skeleton_bone_node(p_state, scene_parent, scene_root, node_index); return; } @@ -5598,13 +5596,13 @@ void GLTFDocument::_generate_scene_node(Ref<GLTFState> state, Node *scene_parent // skinned meshes must not be placed in a bone attachment. if (non_bone_parented_to_skeleton && gltf_node->skin < 0) { // Bone Attachment - Parent Case - BoneAttachment3D *bone_attachment = _generate_bone_attachment(state, active_skeleton, node_index, gltf_node->parent); + BoneAttachment3D *bone_attachment = _generate_bone_attachment(p_state, active_skeleton, node_index, gltf_node->parent); scene_parent->add_child(bone_attachment, true); bone_attachment->set_owner(scene_root); // There is no gltf_node that represent this, so just directly create a unique name - bone_attachment->set_name(_gen_unique_name(state, "BoneAttachment3D")); + bone_attachment->set_name(_gen_unique_name(p_state, "BoneAttachment3D")); // We change the scene_parent to our bone attachment now. We do not set current_node because we want to make the node // and attach it to the bone_attachment @@ -5613,7 +5611,7 @@ void GLTFDocument::_generate_scene_node(Ref<GLTFState> state, Node *scene_parent // Check if any GLTFDocumentExtension classes want to generate a node for us. for (Ref<GLTFDocumentExtension> ext : document_extensions) { ERR_CONTINUE(ext.is_null()); - current_node = ext->generate_scene_node(state, gltf_node, scene_parent); + current_node = ext->generate_scene_node(p_state, gltf_node, scene_parent); if (current_node) { break; } @@ -5621,13 +5619,13 @@ void GLTFDocument::_generate_scene_node(Ref<GLTFState> state, Node *scene_parent // If none of our GLTFDocumentExtension classes generated us a node, we generate one. if (!current_node) { if (gltf_node->mesh >= 0) { - current_node = _generate_mesh_instance(state, node_index); + current_node = _generate_mesh_instance(p_state, node_index); } else if (gltf_node->camera >= 0) { - current_node = _generate_camera(state, node_index); + current_node = _generate_camera(p_state, node_index); } else if (gltf_node->light >= 0) { - current_node = _generate_light(state, node_index); + current_node = _generate_light(p_state, node_index); } else { - current_node = _generate_spatial(state, node_index); + current_node = _generate_spatial(p_state, node_index); } } // Add the node we generated and set the owner to the scene root. @@ -5640,45 +5638,45 @@ void GLTFDocument::_generate_scene_node(Ref<GLTFState> state, Node *scene_parent current_node->set_transform(gltf_node->xform); current_node->set_name(gltf_node->get_name()); - state->scene_nodes.insert(node_index, current_node); + p_state->scene_nodes.insert(node_index, current_node); for (int i = 0; i < gltf_node->children.size(); ++i) { - _generate_scene_node(state, current_node, scene_root, gltf_node->children[i]); + _generate_scene_node(p_state, current_node, scene_root, gltf_node->children[i]); } } -void GLTFDocument::_generate_skeleton_bone_node(Ref<GLTFState> state, Node *scene_parent, Node3D *scene_root, const GLTFNodeIndex node_index) { - Ref<GLTFNode> gltf_node = state->nodes[node_index]; +void GLTFDocument::_generate_skeleton_bone_node(Ref<GLTFState> p_state, Node *p_scene_parent, Node3D *p_scene_root, const GLTFNodeIndex p_node_index) { + Ref<GLTFNode> gltf_node = p_state->nodes[p_node_index]; Node3D *current_node = nullptr; - Skeleton3D *skeleton = state->skeletons[gltf_node->skeleton]->godot_skeleton; + Skeleton3D *skeleton = p_state->skeletons[gltf_node->skeleton]->godot_skeleton; // In this case, this node is already a bone in skeleton. const bool is_skinned_mesh = (gltf_node->skin >= 0 && gltf_node->mesh >= 0); const bool requires_extra_node = (gltf_node->mesh >= 0 || gltf_node->camera >= 0 || gltf_node->light >= 0); - Skeleton3D *active_skeleton = Object::cast_to<Skeleton3D>(scene_parent); + Skeleton3D *active_skeleton = Object::cast_to<Skeleton3D>(p_scene_parent); if (active_skeleton != skeleton) { if (active_skeleton) { // Bone Attachment - Direct Parented Skeleton Case - BoneAttachment3D *bone_attachment = _generate_bone_attachment(state, active_skeleton, node_index, gltf_node->parent); + BoneAttachment3D *bone_attachment = _generate_bone_attachment(p_state, active_skeleton, p_node_index, gltf_node->parent); - scene_parent->add_child(bone_attachment, true); - bone_attachment->set_owner(scene_root); + p_scene_parent->add_child(bone_attachment, true); + bone_attachment->set_owner(p_scene_root); // There is no gltf_node that represent this, so just directly create a unique name - bone_attachment->set_name(_gen_unique_name(state, "BoneAttachment3D")); + bone_attachment->set_name(_gen_unique_name(p_state, "BoneAttachment3D")); // We change the scene_parent to our bone attachment now. We do not set current_node because we want to make the node // and attach it to the bone_attachment - scene_parent = bone_attachment; - WARN_PRINT(vformat("glTF: Generating scene detected direct parented Skeletons at node %d", node_index)); + p_scene_parent = bone_attachment; + WARN_PRINT(vformat("glTF: Generating scene detected direct parented Skeletons at node %d", p_node_index)); } // Add it to the scene if it has not already been added if (skeleton->get_parent() == nullptr) { - scene_parent->add_child(skeleton, true); - skeleton->set_owner(scene_root); + p_scene_parent->add_child(skeleton, true); + skeleton->set_owner(p_scene_root); } } @@ -5689,22 +5687,22 @@ void GLTFDocument::_generate_skeleton_bone_node(Ref<GLTFState> state, Node *scen // skinned meshes must not be placed in a bone attachment. if (!is_skinned_mesh) { // Bone Attachment - Same Node Case - BoneAttachment3D *bone_attachment = _generate_bone_attachment(state, active_skeleton, node_index, node_index); + BoneAttachment3D *bone_attachment = _generate_bone_attachment(p_state, active_skeleton, p_node_index, p_node_index); - scene_parent->add_child(bone_attachment, true); - bone_attachment->set_owner(scene_root); + p_scene_parent->add_child(bone_attachment, true); + bone_attachment->set_owner(p_scene_root); // There is no gltf_node that represent this, so just directly create a unique name - bone_attachment->set_name(_gen_unique_name(state, "BoneAttachment3D")); + bone_attachment->set_name(_gen_unique_name(p_state, "BoneAttachment3D")); // We change the scene_parent to our bone attachment now. We do not set current_node because we want to make the node // and attach it to the bone_attachment - scene_parent = bone_attachment; + p_scene_parent = bone_attachment; } // Check if any GLTFDocumentExtension classes want to generate a node for us. for (Ref<GLTFDocumentExtension> ext : document_extensions) { ERR_CONTINUE(ext.is_null()); - current_node = ext->generate_scene_node(state, gltf_node, scene_parent); + current_node = ext->generate_scene_node(p_state, gltf_node, p_scene_parent); if (current_node) { break; } @@ -5712,30 +5710,30 @@ void GLTFDocument::_generate_skeleton_bone_node(Ref<GLTFState> state, Node *scen // If none of our GLTFDocumentExtension classes generated us a node, we generate one. if (!current_node) { if (gltf_node->mesh >= 0) { - current_node = _generate_mesh_instance(state, node_index); + current_node = _generate_mesh_instance(p_state, p_node_index); } else if (gltf_node->camera >= 0) { - current_node = _generate_camera(state, node_index); + current_node = _generate_camera(p_state, p_node_index); } else if (gltf_node->light >= 0) { - current_node = _generate_light(state, node_index); + current_node = _generate_light(p_state, p_node_index); } else { - current_node = _generate_spatial(state, node_index); + current_node = _generate_spatial(p_state, p_node_index); } } // Add the node we generated and set the owner to the scene root. - scene_parent->add_child(current_node, true); - if (current_node != scene_root) { + p_scene_parent->add_child(current_node, true); + if (current_node != p_scene_root) { Array args; - args.append(scene_root); + args.append(p_scene_root); current_node->propagate_call(StringName("set_owner"), args); } // Do not set transform here. Transform is already applied to our bone. current_node->set_name(gltf_node->get_name()); } - state->scene_nodes.insert(node_index, current_node); + p_state->scene_nodes.insert(p_node_index, current_node); for (int i = 0; i < gltf_node->children.size(); ++i) { - _generate_scene_node(state, active_skeleton, scene_root, gltf_node->children[i]); + _generate_scene_node(p_state, active_skeleton, p_scene_root, gltf_node->children[i]); } } @@ -5860,13 +5858,13 @@ T GLTFDocument::_interpolate_track(const Vector<real_t> &p_times, const Vector<T ERR_FAIL_V(p_values[0]); } -void GLTFDocument::_import_animation(Ref<GLTFState> state, AnimationPlayer *ap, const GLTFAnimationIndex index, const float bake_fps, const bool trimming) { - Ref<GLTFAnimation> anim = state->animations[index]; +void GLTFDocument::_import_animation(Ref<GLTFState> p_state, AnimationPlayer *p_animation_player, const GLTFAnimationIndex p_index, const float p_bake_fps, const bool p_trimming) { + Ref<GLTFAnimation> anim = p_state->animations[p_index]; String anim_name = anim->get_name(); if (anim_name.is_empty()) { // No node represent these, and they are not in the hierarchy, so just make a unique name - anim_name = _gen_unique_name(state, "Animation"); + anim_name = _gen_unique_name(p_state, "Animation"); } Ref<Animation> animation; @@ -5877,7 +5875,7 @@ void GLTFDocument::_import_animation(Ref<GLTFState> state, AnimationPlayer *ap, animation->set_loop_mode(Animation::LOOP_LINEAR); } - double anim_start = trimming ? INFINITY : 0.0; + double anim_start = p_trimming ? INFINITY : 0.0; double anim_end = 0.0; for (const KeyValue<int, GLTFAnimation::Track> &track_i : anim->get_tracks()) { @@ -5889,26 +5887,26 @@ void GLTFDocument::_import_animation(Ref<GLTFState> state, AnimationPlayer *ap, GLTFNodeIndex node_index = track_i.key; - const Ref<GLTFNode> gltf_node = state->nodes[track_i.key]; + const Ref<GLTFNode> gltf_node = p_state->nodes[track_i.key]; - Node *root = ap->get_parent(); + Node *root = p_animation_player->get_parent(); ERR_FAIL_COND(root == nullptr); - HashMap<GLTFNodeIndex, Node *>::Iterator node_element = state->scene_nodes.find(node_index); + HashMap<GLTFNodeIndex, Node *>::Iterator node_element = p_state->scene_nodes.find(node_index); ERR_CONTINUE_MSG(!node_element, vformat("Unable to find node %d for animation", node_index)); node_path = root->get_path_to(node_element->value); if (gltf_node->skeleton >= 0) { - const Skeleton3D *sk = state->skeletons[gltf_node->skeleton]->godot_skeleton; + const Skeleton3D *sk = p_state->skeletons[gltf_node->skeleton]->godot_skeleton; ERR_FAIL_COND(sk == nullptr); - const String path = ap->get_parent()->get_path_to(sk); + const String path = p_animation_player->get_parent()->get_path_to(sk); const String bone = gltf_node->get_name(); transform_node_path = path + ":" + bone; } else { transform_node_path = node_path; } - if (trimming) { + if (p_trimming) { for (int i = 0; i < track.rotation_track.times.size(); i++) { anim_start = MIN(anim_start, track.rotation_track.times[i]); anim_end = MAX(anim_end, track.rotation_track.times[i]); @@ -5955,7 +5953,7 @@ void GLTFDocument::_import_animation(Ref<GLTFState> state, AnimationPlayer *ap, int scale_idx = -1; if (track.position_track.values.size()) { - Vector3 base_pos = state->nodes[track_i.key]->position; + Vector3 base_pos = p_state->nodes[track_i.key]->position; bool not_default = false; //discard the track if all it contains is default values for (int i = 0; i < track.position_track.times.size(); i++) { Vector3 value = track.position_track.values[track.position_track.interpolation == GLTFAnimation::INTERP_CUBIC_SPLINE ? (1 + i * 3) : i]; @@ -5974,7 +5972,7 @@ void GLTFDocument::_import_animation(Ref<GLTFState> state, AnimationPlayer *ap, } } if (track.rotation_track.values.size()) { - Quaternion base_rot = state->nodes[track_i.key]->rotation.normalized(); + Quaternion base_rot = p_state->nodes[track_i.key]->rotation.normalized(); bool not_default = false; //discard the track if all it contains is default values for (int i = 0; i < track.rotation_track.times.size(); i++) { Quaternion value = track.rotation_track.values[track.rotation_track.interpolation == GLTFAnimation::INTERP_CUBIC_SPLINE ? (1 + i * 3) : i].normalized(); @@ -5992,7 +5990,7 @@ void GLTFDocument::_import_animation(Ref<GLTFState> state, AnimationPlayer *ap, } } if (track.scale_track.values.size()) { - Vector3 base_scale = state->nodes[track_i.key]->scale; + Vector3 base_scale = p_state->nodes[track_i.key]->scale; bool not_default = false; //discard the track if all it contains is default values for (int i = 0; i < track.scale_track.times.size(); i++) { Vector3 value = track.scale_track.values[track.scale_track.interpolation == GLTFAnimation::INTERP_CUBIC_SPLINE ? (1 + i * 3) : i]; @@ -6010,7 +6008,7 @@ void GLTFDocument::_import_animation(Ref<GLTFState> state, AnimationPlayer *ap, } } - const double increment = 1.0 / bake_fps; + const double increment = 1.0 / p_bake_fps; double time = anim_start; Vector3 base_pos; @@ -6018,15 +6016,15 @@ void GLTFDocument::_import_animation(Ref<GLTFState> state, AnimationPlayer *ap, Vector3 base_scale = Vector3(1, 1, 1); if (rotation_idx == -1) { - base_rot = state->nodes[track_i.key]->rotation.normalized(); + base_rot = p_state->nodes[track_i.key]->rotation.normalized(); } if (position_idx == -1) { - base_pos = state->nodes[track_i.key]->position; + base_pos = p_state->nodes[track_i.key]->position; } if (scale_idx == -1) { - base_scale = state->nodes[track_i.key]->scale; + base_scale = p_state->nodes[track_i.key]->scale; } bool last = false; @@ -6062,8 +6060,8 @@ void GLTFDocument::_import_animation(Ref<GLTFState> state, AnimationPlayer *ap, } for (int i = 0; i < track.weight_tracks.size(); i++) { - ERR_CONTINUE(gltf_node->mesh < 0 || gltf_node->mesh >= state->meshes.size()); - Ref<GLTFMesh> mesh = state->meshes[gltf_node->mesh]; + ERR_CONTINUE(gltf_node->mesh < 0 || gltf_node->mesh >= p_state->meshes.size()); + Ref<GLTFMesh> mesh = p_state->meshes[gltf_node->mesh]; ERR_CONTINUE(mesh.is_null()); ERR_CONTINUE(mesh->get_mesh().is_null()); ERR_CONTINUE(mesh->get_mesh()->get_mesh().is_null()); @@ -6086,7 +6084,7 @@ void GLTFDocument::_import_animation(Ref<GLTFState> state, AnimationPlayer *ap, } } else { // CATMULLROMSPLINE or CUBIC_SPLINE have to be baked, apologies. - const double increment = 1.0 / bake_fps; + const double increment = 1.0 / p_bake_fps; double time = 0.0; bool last = false; while (true) { @@ -6108,23 +6106,23 @@ void GLTFDocument::_import_animation(Ref<GLTFState> state, AnimationPlayer *ap, animation->set_length(anim_end - anim_start); Ref<AnimationLibrary> library; - if (!ap->has_animation_library("")) { + if (!p_animation_player->has_animation_library("")) { library.instantiate(); - ap->add_animation_library("", library); + p_animation_player->add_animation_library("", library); } else { - library = ap->get_animation_library(""); + library = p_animation_player->get_animation_library(""); } library->add_animation(anim_name, animation); } -void GLTFDocument::_convert_mesh_instances(Ref<GLTFState> state) { - for (GLTFNodeIndex mi_node_i = 0; mi_node_i < state->nodes.size(); ++mi_node_i) { - Ref<GLTFNode> node = state->nodes[mi_node_i]; +void GLTFDocument::_convert_mesh_instances(Ref<GLTFState> p_state) { + for (GLTFNodeIndex mi_node_i = 0; mi_node_i < p_state->nodes.size(); ++mi_node_i) { + Ref<GLTFNode> node = p_state->nodes[mi_node_i]; if (node->mesh < 0) { continue; } - HashMap<GLTFNodeIndex, Node *>::Iterator mi_element = state->scene_nodes.find(mi_node_i); + HashMap<GLTFNodeIndex, Node *>::Iterator mi_element = p_state->scene_nodes.find(mi_node_i); if (!mi_element) { continue; } @@ -6155,10 +6153,10 @@ void GLTFDocument::_convert_mesh_instances(Ref<GLTFState> state) { if (skel_node != nullptr) { godot_skeleton = cast_to<Skeleton3D>(skel_node); } - if (godot_skeleton != nullptr && state->skeleton3d_to_gltf_skeleton.has(godot_skeleton->get_instance_id())) { + if (godot_skeleton != nullptr && p_state->skeleton3d_to_gltf_skeleton.has(godot_skeleton->get_instance_id())) { // This is a skinned mesh. If the mesh has no ARRAY_WEIGHTS or ARRAY_BONES, it will be invisible. - const GLTFSkeletonIndex skeleton_gltf_i = state->skeleton3d_to_gltf_skeleton[godot_skeleton->get_instance_id()]; - Ref<GLTFSkeleton> gltf_skeleton = state->skeletons[skeleton_gltf_i]; + const GLTFSkeletonIndex skeleton_gltf_i = p_state->skeleton3d_to_gltf_skeleton[godot_skeleton->get_instance_id()]; + Ref<GLTFSkeleton> gltf_skeleton = p_state->skeletons[skeleton_gltf_i]; int bone_cnt = skeleton->get_bone_count(); ERR_FAIL_COND(bone_cnt != gltf_skeleton->joints.size()); @@ -6172,8 +6170,8 @@ void GLTFDocument::_convert_mesh_instances(Ref<GLTFState> state) { if (!gltf_skeleton->roots.is_empty()) { root_gltf_i = gltf_skeleton->roots[0]; } - if (state->skin_and_skeleton3d_to_gltf_skin.has(gltf_skin_key) && state->skin_and_skeleton3d_to_gltf_skin[gltf_skin_key].has(gltf_skel_key)) { - skin_gltf_i = state->skin_and_skeleton3d_to_gltf_skin[gltf_skin_key][gltf_skel_key]; + if (p_state->skin_and_skeleton3d_to_gltf_skin.has(gltf_skin_key) && p_state->skin_and_skeleton3d_to_gltf_skin[gltf_skin_key].has(gltf_skel_key)) { + skin_gltf_i = p_state->skin_and_skeleton3d_to_gltf_skin[gltf_skin_key][gltf_skel_key]; } else { if (skin.is_null()) { // Note that gltf_skin_key should remain null, so these can share a reference. @@ -6210,9 +6208,9 @@ void GLTFDocument::_convert_mesh_instances(Ref<GLTFState> state) { gltf_skin->joint_i_to_bone_i[bind_i] = bone_i; gltf_skin->joint_i_to_name[bind_i] = bind_name; } - skin_gltf_i = state->skins.size(); - state->skins.push_back(gltf_skin); - state->skin_and_skeleton3d_to_gltf_skin[gltf_skin_key][gltf_skel_key] = skin_gltf_i; + skin_gltf_i = p_state->skins.size(); + p_state->skins.push_back(gltf_skin); + p_state->skin_and_skeleton3d_to_gltf_skin[gltf_skin_key][gltf_skel_key] = skin_gltf_i; } node->skin = skin_gltf_i; node->skeleton = skeleton_gltf_i; @@ -6220,14 +6218,14 @@ void GLTFDocument::_convert_mesh_instances(Ref<GLTFState> state) { } } -float GLTFDocument::solve_metallic(float p_dielectric_specular, float diffuse, float specular, float p_one_minus_specular_strength) { - if (specular <= p_dielectric_specular) { +float GLTFDocument::solve_metallic(float p_dielectric_specular, float p_diffuse, float p_specular, float p_one_minus_specular_strength) { + if (p_specular <= p_dielectric_specular) { return 0.0f; } const float a = p_dielectric_specular; - const float b = diffuse * p_one_minus_specular_strength / (1.0f - p_dielectric_specular) + specular - 2.0f * p_dielectric_specular; - const float c = p_dielectric_specular - specular; + const float b = p_diffuse * p_one_minus_specular_strength / (1.0f - p_dielectric_specular) + p_specular - 2.0f * p_dielectric_specular; + const float c = p_dielectric_specular - p_specular; const float D = b * b - 4.0f * a * c; return CLAMP((-b + Math::sqrt(D)) / (2.0f * a), 0.0f, 1.0f); } @@ -6251,21 +6249,21 @@ float GLTFDocument::get_max_component(const Color &p_color) { return MAX(MAX(r, g), b); } -void GLTFDocument::_process_mesh_instances(Ref<GLTFState> state, Node *scene_root) { - for (GLTFNodeIndex node_i = 0; node_i < state->nodes.size(); ++node_i) { - Ref<GLTFNode> node = state->nodes[node_i]; +void GLTFDocument::_process_mesh_instances(Ref<GLTFState> p_state, Node *p_scene_root) { + for (GLTFNodeIndex node_i = 0; node_i < p_state->nodes.size(); ++node_i) { + Ref<GLTFNode> node = p_state->nodes[node_i]; if (node->skin >= 0 && node->mesh >= 0) { const GLTFSkinIndex skin_i = node->skin; - HashMap<GLTFNodeIndex, Node *>::Iterator mi_element = state->scene_nodes.find(node_i); + HashMap<GLTFNodeIndex, Node *>::Iterator mi_element = p_state->scene_nodes.find(node_i); ERR_CONTINUE_MSG(!mi_element, vformat("Unable to find node %d", node_i)); ImporterMeshInstance3D *mi = Object::cast_to<ImporterMeshInstance3D>(mi_element->value); ERR_CONTINUE_MSG(mi == nullptr, vformat("Unable to cast node %d of type %s to ImporterMeshInstance3D", node_i, mi_element->value->get_class_name())); - const GLTFSkeletonIndex skel_i = state->skins.write[node->skin]->skeleton; - Ref<GLTFSkeleton> gltf_skeleton = state->skeletons.write[skel_i]; + const GLTFSkeletonIndex skel_i = p_state->skins.write[node->skin]->skeleton; + Ref<GLTFSkeleton> gltf_skeleton = p_state->skeletons.write[skel_i]; Skeleton3D *skeleton = gltf_skeleton->godot_skeleton; ERR_CONTINUE_MSG(skeleton == nullptr, vformat("Unable to find Skeleton for node %d skin %d", node_i, skin_i)); @@ -6273,14 +6271,14 @@ void GLTFDocument::_process_mesh_instances(Ref<GLTFState> state, Node *scene_roo skeleton->add_child(mi, true); mi->set_owner(skeleton->get_owner()); - mi->set_skin(state->skins.write[skin_i]->godot_skin); + mi->set_skin(p_state->skins.write[skin_i]->godot_skin); mi->set_skeleton_path(mi->get_path_to(skeleton)); mi->set_transform(Transform3D()); } } } -GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> state, GLTFAnimation::Track p_track, Ref<Animation> p_animation, int32_t p_track_i, GLTFNodeIndex p_node_i) { +GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> p_state, GLTFAnimation::Track p_track, Ref<Animation> p_animation, int32_t p_track_i, GLTFNodeIndex p_node_i) { Animation::InterpolationType interpolation = p_animation->track_get_interpolation_type(p_track_i); GLTFAnimation::Interpolation gltf_interpolation = GLTFAnimation::INTERP_LINEAR; @@ -6426,11 +6424,11 @@ GLTFAnimation::Track GLTFDocument::_convert_animation_track(Ref<GLTFState> state return p_track; } -void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap, String p_animation_track_name) { - Ref<Animation> animation = ap->get_animation(p_animation_track_name); +void GLTFDocument::_convert_animation(Ref<GLTFState> p_state, AnimationPlayer *p_animation_player, String p_animation_track_name) { + Ref<Animation> animation = p_animation_player->get_animation(p_animation_track_name); Ref<GLTFAnimation> gltf_animation; gltf_animation.instantiate(); - gltf_animation->set_name(_gen_unique_name(state, p_animation_track_name)); + gltf_animation->set_name(_gen_unique_name(p_state, p_animation_track_name)); for (int32_t track_i = 0; track_i < animation->get_track_count(); track_i++) { if (!animation->track_is_enabled(track_i)) { @@ -6440,8 +6438,8 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap, if (String(orig_track_path).contains(":position")) { const Vector<String> node_suffix = String(orig_track_path).split(":position"); const NodePath path = node_suffix[0]; - const Node *node = ap->get_parent()->get_node_or_null(path); - for (const KeyValue<GLTFNodeIndex, Node *> &position_scene_node_i : state->scene_nodes) { + const Node *node = p_animation_player->get_parent()->get_node_or_null(path); + for (const KeyValue<GLTFNodeIndex, Node *> &position_scene_node_i : p_state->scene_nodes) { if (position_scene_node_i.value == node) { GLTFNodeIndex node_index = position_scene_node_i.key; HashMap<int, GLTFAnimation::Track>::Iterator position_track_i = gltf_animation->get_tracks().find(node_index); @@ -6449,15 +6447,15 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap, if (position_track_i) { track = position_track_i->value; } - track = _convert_animation_track(state, track, animation, track_i, node_index); + track = _convert_animation_track(p_state, track, animation, track_i, node_index); gltf_animation->get_tracks().insert(node_index, track); } } } else if (String(orig_track_path).contains(":rotation_degrees")) { const Vector<String> node_suffix = String(orig_track_path).split(":rotation_degrees"); const NodePath path = node_suffix[0]; - const Node *node = ap->get_parent()->get_node_or_null(path); - for (const KeyValue<GLTFNodeIndex, Node *> &rotation_degree_scene_node_i : state->scene_nodes) { + const Node *node = p_animation_player->get_parent()->get_node_or_null(path); + for (const KeyValue<GLTFNodeIndex, Node *> &rotation_degree_scene_node_i : p_state->scene_nodes) { if (rotation_degree_scene_node_i.value == node) { GLTFNodeIndex node_index = rotation_degree_scene_node_i.key; HashMap<int, GLTFAnimation::Track>::Iterator rotation_degree_track_i = gltf_animation->get_tracks().find(node_index); @@ -6465,15 +6463,15 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap, if (rotation_degree_track_i) { track = rotation_degree_track_i->value; } - track = _convert_animation_track(state, track, animation, track_i, node_index); + track = _convert_animation_track(p_state, track, animation, track_i, node_index); gltf_animation->get_tracks().insert(node_index, track); } } } else if (String(orig_track_path).contains(":scale")) { const Vector<String> node_suffix = String(orig_track_path).split(":scale"); const NodePath path = node_suffix[0]; - const Node *node = ap->get_parent()->get_node_or_null(path); - for (const KeyValue<GLTFNodeIndex, Node *> &scale_scene_node_i : state->scene_nodes) { + const Node *node = p_animation_player->get_parent()->get_node_or_null(path); + for (const KeyValue<GLTFNodeIndex, Node *> &scale_scene_node_i : p_state->scene_nodes) { if (scale_scene_node_i.value == node) { GLTFNodeIndex node_index = scale_scene_node_i.key; HashMap<int, GLTFAnimation::Track>::Iterator scale_track_i = gltf_animation->get_tracks().find(node_index); @@ -6481,18 +6479,18 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap, if (scale_track_i) { track = scale_track_i->value; } - track = _convert_animation_track(state, track, animation, track_i, node_index); + track = _convert_animation_track(p_state, track, animation, track_i, node_index); gltf_animation->get_tracks().insert(node_index, track); } } } else if (String(orig_track_path).contains(":transform")) { const Vector<String> node_suffix = String(orig_track_path).split(":transform"); const NodePath path = node_suffix[0]; - const Node *node = ap->get_parent()->get_node_or_null(path); - for (const KeyValue<GLTFNodeIndex, Node *> &transform_track_i : state->scene_nodes) { + const Node *node = p_animation_player->get_parent()->get_node_or_null(path); + for (const KeyValue<GLTFNodeIndex, Node *> &transform_track_i : p_state->scene_nodes) { if (transform_track_i.value == node) { GLTFAnimation::Track track; - track = _convert_animation_track(state, track, animation, track_i, transform_track_i.key); + track = _convert_animation_track(p_state, track, animation, track_i, transform_track_i.key); gltf_animation->get_tracks().insert(transform_track_i.key, track); } } @@ -6500,12 +6498,12 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap, const Vector<String> node_suffix = String(orig_track_path).split(":"); const NodePath path = node_suffix[0]; const String suffix = node_suffix[1]; - Node *node = ap->get_parent()->get_node_or_null(path); + Node *node = p_animation_player->get_parent()->get_node_or_null(path); MeshInstance3D *mi = cast_to<MeshInstance3D>(node); Ref<Mesh> mesh = mi->get_mesh(); ERR_CONTINUE(mesh.is_null()); int32_t mesh_index = -1; - for (const KeyValue<GLTFNodeIndex, Node *> &mesh_track_i : state->scene_nodes) { + for (const KeyValue<GLTFNodeIndex, Node *> &mesh_track_i : p_state->scene_nodes) { if (mesh_track_i.value == node) { mesh_index = mesh_track_i.key; } @@ -6558,15 +6556,15 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap, const String node = node_suffix[0]; const NodePath node_path = node; const String suffix = node_suffix[1]; - Node *godot_node = ap->get_parent()->get_node_or_null(node_path); + Node *godot_node = p_animation_player->get_parent()->get_node_or_null(node_path); Skeleton3D *skeleton = nullptr; GLTFSkeletonIndex skeleton_gltf_i = -1; - for (GLTFSkeletonIndex skeleton_i = 0; skeleton_i < state->skeletons.size(); skeleton_i++) { - if (state->skeletons[skeleton_i]->godot_skeleton == cast_to<Skeleton3D>(godot_node)) { - skeleton = state->skeletons[skeleton_i]->godot_skeleton; + for (GLTFSkeletonIndex skeleton_i = 0; skeleton_i < p_state->skeletons.size(); skeleton_i++) { + if (p_state->skeletons[skeleton_i]->godot_skeleton == cast_to<Skeleton3D>(godot_node)) { + skeleton = p_state->skeletons[skeleton_i]->godot_skeleton; skeleton_gltf_i = skeleton_i; ERR_CONTINUE(!skeleton); - Ref<GLTFSkeleton> skeleton_gltf = state->skeletons[skeleton_gltf_i]; + Ref<GLTFSkeleton> skeleton_gltf = p_state->skeletons[skeleton_gltf_i]; int32_t bone = skeleton->find_bone(suffix); ERR_CONTINUE(bone == -1); if (!skeleton_gltf->godot_bone_node.has(bone)) { @@ -6578,14 +6576,14 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap, if (property_track_i) { track = property_track_i->value; } - track = _convert_animation_track(state, track, animation, track_i, node_i); + track = _convert_animation_track(p_state, track, animation, track_i, node_i); gltf_animation->get_tracks()[node_i] = track; } } } else if (!String(orig_track_path).contains(":")) { - ERR_CONTINUE(!ap->get_parent()); - Node *godot_node = ap->get_parent()->get_node_or_null(orig_track_path); - for (const KeyValue<GLTFNodeIndex, Node *> &scene_node_i : state->scene_nodes) { + ERR_CONTINUE(!p_animation_player->get_parent()); + Node *godot_node = p_animation_player->get_parent()->get_node_or_null(orig_track_path); + for (const KeyValue<GLTFNodeIndex, Node *> &scene_node_i : p_state->scene_nodes) { if (scene_node_i.value == godot_node) { GLTFNodeIndex node_i = scene_node_i.key; HashMap<int, GLTFAnimation::Track>::Iterator node_track_i = gltf_animation->get_tracks().find(node_i); @@ -6593,7 +6591,7 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap, if (node_track_i) { track = node_track_i->value; } - track = _convert_animation_track(state, track, animation, track_i, node_i); + track = _convert_animation_track(p_state, track, animation, track_i, node_i); gltf_animation->get_tracks()[node_i] = track; break; } @@ -6601,42 +6599,42 @@ void GLTFDocument::_convert_animation(Ref<GLTFState> state, AnimationPlayer *ap, } } if (gltf_animation->get_tracks().size()) { - state->animations.push_back(gltf_animation); + p_state->animations.push_back(gltf_animation); } } -Error GLTFDocument::_parse(Ref<GLTFState> state, String p_path, Ref<FileAccess> f) { +Error GLTFDocument::_parse(Ref<GLTFState> p_state, String p_path, Ref<FileAccess> p_file) { Error err; - if (f.is_null()) { + if (p_file.is_null()) { return FAILED; } - f->seek(0); - uint32_t magic = f->get_32(); + p_file->seek(0); + uint32_t magic = p_file->get_32(); if (magic == 0x46546C67) { //binary file //text file - f->seek(0); - err = _parse_glb(f, state); + p_file->seek(0); + err = _parse_glb(p_file, p_state); if (err != OK) { return err; } } else { - f->seek(0); - String text = f->get_as_utf8_string(); + p_file->seek(0); + String text = p_file->get_as_utf8_string(); JSON json; err = json.parse(text); if (err != OK) { _err_print_error("", "", json.get_error_line(), json.get_error_message().utf8().get_data(), false, ERR_HANDLER_SCRIPT); } ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); - state->json = json.get_data(); + p_state->json = json.get_data(); } - if (!state->json.has("asset")) { + if (!p_state->json.has("asset")) { return ERR_PARSE_ERROR; } - Dictionary asset = state->json["asset"]; + Dictionary asset = p_state->json["asset"]; if (!asset.has("version")) { return ERR_PARSE_ERROR; @@ -6644,19 +6642,19 @@ Error GLTFDocument::_parse(Ref<GLTFState> state, String p_path, Ref<FileAccess> String version = asset["version"]; - state->major_version = version.get_slice(".", 0).to_int(); - state->minor_version = version.get_slice(".", 1).to_int(); + p_state->major_version = version.get_slice(".", 0).to_int(); + p_state->minor_version = version.get_slice(".", 1).to_int(); document_extensions.clear(); for (Ref<GLTFDocumentExtension> ext : all_document_extensions) { ERR_CONTINUE(ext.is_null()); - err = ext->import_preflight(state, state->json["extensionsUsed"]); + err = ext->import_preflight(p_state, p_state->json["extensionsUsed"]); if (err == OK) { document_extensions.push_back(ext); } } - err = _parse_gltf_state(state, p_path); + err = _parse_gltf_state(p_state, p_path); ERR_FAIL_COND_V(err != OK, err); return OK; @@ -6702,30 +6700,30 @@ Dictionary GLTFDocument::_serialize_texture_transform_uv2(Ref<BaseMaterial3D> p_ return _serialize_texture_transform_uv(Vector2(offset.x, offset.y), Vector2(scale.x, scale.y)); } -Error GLTFDocument::_serialize_version(Ref<GLTFState> state) { +Error GLTFDocument::_serialize_version(Ref<GLTFState> p_state) { const String version = "2.0"; - state->major_version = version.get_slice(".", 0).to_int(); - state->minor_version = version.get_slice(".", 1).to_int(); + p_state->major_version = version.get_slice(".", 0).to_int(); + p_state->minor_version = version.get_slice(".", 1).to_int(); Dictionary asset; asset["version"] = version; String hash = String(VERSION_HASH); asset["generator"] = String(VERSION_FULL_NAME) + String("@") + (hash.is_empty() ? String("unknown") : hash); - state->json["asset"] = asset; + p_state->json["asset"] = asset; ERR_FAIL_COND_V(!asset.has("version"), Error::FAILED); - ERR_FAIL_COND_V(!state->json.has("asset"), Error::FAILED); + ERR_FAIL_COND_V(!p_state->json.has("asset"), Error::FAILED); return OK; } -Error GLTFDocument::_serialize_file(Ref<GLTFState> state, const String p_path) { +Error GLTFDocument::_serialize_file(Ref<GLTFState> p_state, const String p_path) { Error err = FAILED; if (p_path.to_lower().ends_with("glb")) { - err = _encode_buffer_glb(state, p_path); + err = _encode_buffer_glb(p_state, p_path); ERR_FAIL_COND_V(err != OK, err); - Ref<FileAccess> f = FileAccess::open(p_path, FileAccess::WRITE, &err); - ERR_FAIL_COND_V(f.is_null(), FAILED); + Ref<FileAccess> file = FileAccess::open(p_path, FileAccess::WRITE, &err); + ERR_FAIL_COND_V(file.is_null(), FAILED); - String json = Variant(state->json).to_json_string(); + String json = Variant(p_state->json).to_json_string(); const uint32_t magic = 0x46546C67; // GLTF const int32_t header_size = 12; @@ -6736,39 +6734,39 @@ Error GLTFDocument::_serialize_file(Ref<GLTFState> state, const String p_path) { const uint32_t text_chunk_type = 0x4E4F534A; //JSON uint32_t binary_data_length = 0; - if (state->buffers.size()) { - binary_data_length = state->buffers[0].size(); + if (p_state->buffers.size()) { + binary_data_length = p_state->buffers[0].size(); } const uint32_t binary_chunk_length = ((binary_data_length + 3) & (~3)); const uint32_t binary_chunk_type = 0x004E4942; //BIN - f->create(FileAccess::ACCESS_RESOURCES); - f->store_32(magic); - f->store_32(state->major_version); // version - f->store_32(header_size + chunk_header_size + text_chunk_length + chunk_header_size + binary_chunk_length); // length - f->store_32(text_chunk_length); - f->store_32(text_chunk_type); - f->store_buffer((uint8_t *)&cs[0], cs.length()); + file->create(FileAccess::ACCESS_RESOURCES); + file->store_32(magic); + file->store_32(p_state->major_version); // version + file->store_32(header_size + chunk_header_size + text_chunk_length + chunk_header_size + binary_chunk_length); // length + file->store_32(text_chunk_length); + file->store_32(text_chunk_type); + file->store_buffer((uint8_t *)&cs[0], cs.length()); for (uint32_t pad_i = text_data_length; pad_i < text_chunk_length; pad_i++) { - f->store_8(' '); + file->store_8(' '); } if (binary_chunk_length) { - f->store_32(binary_chunk_length); - f->store_32(binary_chunk_type); - f->store_buffer(state->buffers[0].ptr(), binary_data_length); + file->store_32(binary_chunk_length); + file->store_32(binary_chunk_type); + file->store_buffer(p_state->buffers[0].ptr(), binary_data_length); } for (uint32_t pad_i = binary_data_length; pad_i < binary_chunk_length; pad_i++) { - f->store_8(0); + file->store_8(0); } } else { - err = _encode_buffer_bins(state, p_path); + err = _encode_buffer_bins(p_state, p_path); ERR_FAIL_COND_V(err != OK, err); - Ref<FileAccess> f = FileAccess::open(p_path, FileAccess::WRITE, &err); - ERR_FAIL_COND_V(f.is_null(), FAILED); + Ref<FileAccess> file = FileAccess::open(p_path, FileAccess::WRITE, &err); + ERR_FAIL_COND_V(file.is_null(), FAILED); - f->create(FileAccess::ACCESS_RESOURCES); - String json = Variant(state->json).to_json_string(); - f->store_string(json); + file->create(FileAccess::ACCESS_RESOURCES); + String json = Variant(p_state->json).to_json_string(); + file->store_string(json); } return err; } @@ -6793,16 +6791,16 @@ void GLTFDocument::_bind_methods() { &GLTFDocument::unregister_gltf_document_extension); } -void GLTFDocument::_build_parent_hierachy(Ref<GLTFState> state) { +void GLTFDocument::_build_parent_hierachy(Ref<GLTFState> p_state) { // build the hierarchy - for (GLTFNodeIndex node_i = 0; node_i < state->nodes.size(); node_i++) { - for (int j = 0; j < state->nodes[node_i]->children.size(); j++) { - GLTFNodeIndex child_i = state->nodes[node_i]->children[j]; - ERR_FAIL_INDEX(child_i, state->nodes.size()); - if (state->nodes.write[child_i]->parent != -1) { + for (GLTFNodeIndex node_i = 0; node_i < p_state->nodes.size(); node_i++) { + for (int j = 0; j < p_state->nodes[node_i]->children.size(); j++) { + GLTFNodeIndex child_i = p_state->nodes[node_i]->children[j]; + ERR_FAIL_INDEX(child_i, p_state->nodes.size()); + if (p_state->nodes.write[child_i]->parent != -1) { continue; } - state->nodes.write[child_i]->parent = node_i; + p_state->nodes.write[child_i]->parent = node_i; } } } @@ -6827,13 +6825,13 @@ void GLTFDocument::unregister_all_gltf_document_extensions() { all_document_extensions.clear(); } -PackedByteArray GLTFDocument::_serialize_glb_buffer(Ref<GLTFState> state, Error *r_err) { - Error err = _encode_buffer_glb(state, ""); +PackedByteArray GLTFDocument::_serialize_glb_buffer(Ref<GLTFState> p_state, Error *r_err) { + Error err = _encode_buffer_glb(p_state, ""); if (r_err) { *r_err = err; } ERR_FAIL_COND_V(err != OK, PackedByteArray()); - String json = Variant(state->json).to_json_string(); + String json = Variant(p_state->json).to_json_string(); const uint32_t magic = 0x46546C67; // GLTF const int32_t header_size = 12; @@ -6847,8 +6845,8 @@ PackedByteArray GLTFDocument::_serialize_glb_buffer(Ref<GLTFState> state, Error const uint32_t text_chunk_type = 0x4E4F534A; //JSON int32_t binary_data_length = 0; - if (state->buffers.size()) { - binary_data_length = state->buffers[0].size(); + if (p_state->buffers.size()) { + binary_data_length = p_state->buffers[0].size(); } const int32_t binary_chunk_length = binary_data_length; const int32_t binary_chunk_type = 0x004E4942; //BIN @@ -6856,7 +6854,7 @@ PackedByteArray GLTFDocument::_serialize_glb_buffer(Ref<GLTFState> state, Error Ref<StreamPeerBuffer> buffer; buffer.instantiate(); buffer->put_32(magic); - buffer->put_32(state->major_version); // version + buffer->put_32(p_state->major_version); // version buffer->put_32(header_size + chunk_header_size + text_chunk_length + chunk_header_size + binary_data_length); // length buffer->put_32(text_chunk_length); buffer->put_32(text_chunk_type); @@ -6864,204 +6862,204 @@ PackedByteArray GLTFDocument::_serialize_glb_buffer(Ref<GLTFState> state, Error if (binary_chunk_length) { buffer->put_32(binary_chunk_length); buffer->put_32(binary_chunk_type); - buffer->put_data(state->buffers[0].ptr(), binary_data_length); + buffer->put_data(p_state->buffers[0].ptr(), binary_data_length); } return buffer->get_data_array(); } -PackedByteArray GLTFDocument::generate_buffer(Ref<GLTFState> state) { - ERR_FAIL_NULL_V(state, PackedByteArray()); - Error err = _serialize(state, ""); +PackedByteArray GLTFDocument::generate_buffer(Ref<GLTFState> p_state) { + ERR_FAIL_NULL_V(p_state, PackedByteArray()); + Error err = _serialize(p_state, ""); ERR_FAIL_COND_V(err != OK, PackedByteArray()); - PackedByteArray bytes = _serialize_glb_buffer(state, &err); + PackedByteArray bytes = _serialize_glb_buffer(p_state, &err); return bytes; } -Error GLTFDocument::write_to_filesystem(Ref<GLTFState> state, const String &p_path) { - ERR_FAIL_NULL_V(state, ERR_INVALID_PARAMETER); - Error err = _serialize(state, p_path); +Error GLTFDocument::write_to_filesystem(Ref<GLTFState> p_state, const String &p_path) { + ERR_FAIL_NULL_V(p_state, ERR_INVALID_PARAMETER); + Error err = _serialize(p_state, p_path); if (err != OK) { return err; } - err = _serialize_file(state, p_path); + err = _serialize_file(p_state, p_path); if (err != OK) { return Error::FAILED; } return OK; } -Node *GLTFDocument::generate_scene(Ref<GLTFState> state, float p_bake_fps, bool p_trimming) { - ERR_FAIL_NULL_V(state, nullptr); - ERR_FAIL_INDEX_V(0, state->root_nodes.size(), nullptr); +Node *GLTFDocument::generate_scene(Ref<GLTFState> p_state, float p_bake_fps, bool p_trimming) { + ERR_FAIL_NULL_V(p_state, nullptr); + ERR_FAIL_INDEX_V(0, p_state->root_nodes.size(), nullptr); Error err = OK; - GLTFNodeIndex gltf_root = state->root_nodes.write[0]; - Node *gltf_root_node = state->get_scene_node(gltf_root); + GLTFNodeIndex gltf_root = p_state->root_nodes.write[0]; + Node *gltf_root_node = p_state->get_scene_node(gltf_root); Node *root = gltf_root_node->get_parent(); ERR_FAIL_NULL_V(root, nullptr); - _process_mesh_instances(state, root); - if (state->get_create_animations() && state->animations.size()) { + _process_mesh_instances(p_state, root); + if (p_state->get_create_animations() && p_state->animations.size()) { AnimationPlayer *ap = memnew(AnimationPlayer); root->add_child(ap, true); ap->set_owner(root); - for (int i = 0; i < state->animations.size(); i++) { - _import_animation(state, ap, i, p_bake_fps, p_trimming); + for (int i = 0; i < p_state->animations.size(); i++) { + _import_animation(p_state, ap, i, p_bake_fps, p_trimming); } } - for (KeyValue<GLTFNodeIndex, Node *> E : state->scene_nodes) { + for (KeyValue<GLTFNodeIndex, Node *> E : p_state->scene_nodes) { ERR_CONTINUE(!E.value); for (Ref<GLTFDocumentExtension> ext : document_extensions) { ERR_CONTINUE(ext.is_null()); - ERR_CONTINUE(!state->json.has("nodes")); - Array nodes = state->json["nodes"]; + ERR_CONTINUE(!p_state->json.has("nodes")); + Array nodes = p_state->json["nodes"]; ERR_CONTINUE(E.key >= nodes.size()); ERR_CONTINUE(E.key < 0); Dictionary node_json = nodes[E.key]; - Ref<GLTFNode> gltf_node = state->nodes[E.key]; - err = ext->import_node(state, gltf_node, node_json, E.value); + Ref<GLTFNode> gltf_node = p_state->nodes[E.key]; + err = ext->import_node(p_state, gltf_node, node_json, E.value); ERR_CONTINUE(err != OK); } } for (Ref<GLTFDocumentExtension> ext : document_extensions) { ERR_CONTINUE(ext.is_null()); - err = ext->import_post(state, root); + err = ext->import_post(p_state, root); ERR_CONTINUE(err != OK); } ERR_FAIL_NULL_V(root, nullptr); return root; } -Error GLTFDocument::append_from_scene(Node *p_node, Ref<GLTFState> state, uint32_t p_flags) { - ERR_FAIL_COND_V(state.is_null(), FAILED); - state->use_named_skin_binds = p_flags & GLTF_IMPORT_USE_NAMED_SKIN_BINDS; - state->discard_meshes_and_materials = p_flags & GLTF_IMPORT_DISCARD_MESHES_AND_MATERIALS; +Error GLTFDocument::append_from_scene(Node *p_node, Ref<GLTFState> p_state, uint32_t p_flags) { + ERR_FAIL_COND_V(p_state.is_null(), FAILED); + p_state->use_named_skin_binds = p_flags & GLTF_IMPORT_USE_NAMED_SKIN_BINDS; + p_state->discard_meshes_and_materials = p_flags & GLTF_IMPORT_DISCARD_MESHES_AND_MATERIALS; document_extensions.clear(); for (Ref<GLTFDocumentExtension> ext : all_document_extensions) { ERR_CONTINUE(ext.is_null()); - Error err = ext->export_preflight(p_node); + Error err = ext->export_preflight(p_state, p_node); if (err == OK) { document_extensions.push_back(ext); } } - _convert_scene_node(state, p_node, -1, -1); - if (!state->buffers.size()) { - state->buffers.push_back(Vector<uint8_t>()); + _convert_scene_node(p_state, p_node, -1, -1); + if (!p_state->buffers.size()) { + p_state->buffers.push_back(Vector<uint8_t>()); } return OK; } -Error GLTFDocument::append_from_buffer(PackedByteArray p_bytes, String p_base_path, Ref<GLTFState> state, uint32_t p_flags) { - ERR_FAIL_COND_V(state.is_null(), FAILED); +Error GLTFDocument::append_from_buffer(PackedByteArray p_bytes, String p_base_path, Ref<GLTFState> p_state, uint32_t p_flags) { + ERR_FAIL_COND_V(p_state.is_null(), FAILED); // TODO Add missing texture and missing .bin file paths to r_missing_deps 2021-09-10 fire Error err = FAILED; - state->use_named_skin_binds = p_flags & GLTF_IMPORT_USE_NAMED_SKIN_BINDS; - state->discard_meshes_and_materials = p_flags & GLTF_IMPORT_DISCARD_MESHES_AND_MATERIALS; + p_state->use_named_skin_binds = p_flags & GLTF_IMPORT_USE_NAMED_SKIN_BINDS; + p_state->discard_meshes_and_materials = p_flags & GLTF_IMPORT_DISCARD_MESHES_AND_MATERIALS; Ref<FileAccessMemory> file_access; file_access.instantiate(); file_access->open_custom(p_bytes.ptr(), p_bytes.size()); - state->base_path = p_base_path.get_base_dir(); - err = _parse(state, state->base_path, file_access); + p_state->base_path = p_base_path.get_base_dir(); + err = _parse(p_state, p_state->base_path, file_access); ERR_FAIL_COND_V(err != OK, err); for (Ref<GLTFDocumentExtension> ext : document_extensions) { ERR_CONTINUE(ext.is_null()); - err = ext->import_post_parse(state); + err = ext->import_post_parse(p_state); ERR_FAIL_COND_V(err != OK, err); } return OK; } -Error GLTFDocument::_parse_gltf_state(Ref<GLTFState> state, const String &p_search_path) { +Error GLTFDocument::_parse_gltf_state(Ref<GLTFState> p_state, const String &p_search_path) { Error err; /* PARSE EXTENSIONS */ - err = _parse_gltf_extensions(state); + err = _parse_gltf_extensions(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* PARSE SCENE */ - err = _parse_scenes(state); + err = _parse_scenes(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* PARSE NODES */ - err = _parse_nodes(state); + err = _parse_nodes(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* PARSE BUFFERS */ - err = _parse_buffers(state, p_search_path); + err = _parse_buffers(p_state, p_search_path); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* PARSE BUFFER VIEWS */ - err = _parse_buffer_views(state); + err = _parse_buffer_views(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* PARSE ACCESSORS */ - err = _parse_accessors(state); + err = _parse_accessors(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); - if (!state->discard_meshes_and_materials) { + if (!p_state->discard_meshes_and_materials) { /* PARSE IMAGES */ - err = _parse_images(state, p_search_path); + err = _parse_images(p_state, p_search_path); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* PARSE TEXTURE SAMPLERS */ - err = _parse_texture_samplers(state); + err = _parse_texture_samplers(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* PARSE TEXTURES */ - err = _parse_textures(state); + err = _parse_textures(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* PARSE TEXTURES */ - err = _parse_materials(state); + err = _parse_materials(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); } /* PARSE SKINS */ - err = _parse_skins(state); + err = _parse_skins(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* DETERMINE SKELETONS */ - err = _determine_skeletons(state); + err = _determine_skeletons(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* CREATE SKELETONS */ - err = _create_skeletons(state); + err = _create_skeletons(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* CREATE SKINS */ - err = _create_skins(state); + err = _create_skins(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* PARSE MESHES (we have enough info now) */ - err = _parse_meshes(state); + err = _parse_meshes(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* PARSE LIGHTS */ - err = _parse_lights(state); + err = _parse_lights(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* PARSE CAMERAS */ - err = _parse_cameras(state); + err = _parse_cameras(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* PARSE ANIMATIONS */ - err = _parse_animations(state); + err = _parse_animations(p_state); ERR_FAIL_COND_V(err != OK, ERR_PARSE_ERROR); /* ASSIGN SCENE NAMES */ - _assign_scene_names(state); + _assign_scene_names(p_state); Node3D *root = memnew(Node3D); - for (int32_t root_i = 0; root_i < state->root_nodes.size(); root_i++) { - _generate_scene_node(state, root, root, state->root_nodes[root_i]); + for (int32_t root_i = 0; root_i < p_state->root_nodes.size(); root_i++) { + _generate_scene_node(p_state, root, root, p_state->root_nodes[root_i]); } return OK; @@ -7076,15 +7074,15 @@ Error GLTFDocument::append_from_file(String p_path, Ref<GLTFState> r_state, uint r_state->use_named_skin_binds = p_flags & GLTF_IMPORT_USE_NAMED_SKIN_BINDS; r_state->discard_meshes_and_materials = p_flags & GLTF_IMPORT_DISCARD_MESHES_AND_MATERIALS; Error err; - Ref<FileAccess> f = FileAccess::open(p_path, FileAccess::READ, &err); + Ref<FileAccess> file = FileAccess::open(p_path, FileAccess::READ, &err); ERR_FAIL_COND_V(err != OK, ERR_FILE_CANT_OPEN); - ERR_FAIL_NULL_V(f, ERR_FILE_CANT_OPEN); + ERR_FAIL_NULL_V(file, ERR_FILE_CANT_OPEN); String base_path = p_base_path; if (base_path.is_empty()) { base_path = p_path.get_base_dir(); } r_state->base_path = base_path; - err = _parse(r_state, base_path, f); + err = _parse(r_state, base_path, file); ERR_FAIL_COND_V(err != OK, err); for (Ref<GLTFDocumentExtension> ext : document_extensions) { ERR_CONTINUE(ext.is_null()); @@ -7094,15 +7092,15 @@ Error GLTFDocument::append_from_file(String p_path, Ref<GLTFState> r_state, uint return OK; } -Error GLTFDocument::_parse_gltf_extensions(Ref<GLTFState> state) { - ERR_FAIL_NULL_V(state, ERR_PARSE_ERROR); - if (state->json.has("extensionsUsed")) { - Vector<String> ext_array = state->json["extensionsUsed"]; - state->extensions_used = ext_array; +Error GLTFDocument::_parse_gltf_extensions(Ref<GLTFState> p_state) { + ERR_FAIL_NULL_V(p_state, ERR_PARSE_ERROR); + if (p_state->json.has("extensionsUsed")) { + Vector<String> ext_array = p_state->json["extensionsUsed"]; + p_state->extensions_used = ext_array; } - if (state->json.has("extensionsRequired")) { - Vector<String> ext_array = state->json["extensionsRequired"]; - state->extensions_required = ext_array; + if (p_state->json.has("extensionsRequired")) { + Vector<String> ext_array = p_state->json["extensionsRequired"]; + p_state->extensions_required = ext_array; } HashSet<String> supported_extensions; supported_extensions.insert("KHR_lights_punctual"); @@ -7116,9 +7114,9 @@ Error GLTFDocument::_parse_gltf_extensions(Ref<GLTFState> state) { } } Error ret = Error::OK; - for (int i = 0; i < state->extensions_required.size(); i++) { - if (!supported_extensions.has(state->extensions_required[i])) { - ERR_PRINT("GLTF: Can't import file '" + state->filename + "', required extension '" + String(state->extensions_required[i]) + "' is not supported. Are you missing a GLTFDocumentExtension plugin?"); + for (int i = 0; i < p_state->extensions_required.size(); i++) { + if (!supported_extensions.has(p_state->extensions_required[i])) { + ERR_PRINT("GLTF: Can't import file '" + p_state->filename + "', required extension '" + String(p_state->extensions_required[i]) + "' is not supported. Are you missing a GLTFDocumentExtension plugin?"); ret = ERR_UNAVAILABLE; } } diff --git a/modules/gltf/gltf_document.h b/modules/gltf/gltf_document.h index 6eb38354a2..6e2d0e2fd4 100644 --- a/modules/gltf/gltf_document.h +++ b/modules/gltf/gltf_document.h @@ -32,13 +32,6 @@ #define GLTF_DOCUMENT_H #include "extensions/gltf_document_extension.h" -#include "structures/gltf_animation.h" - -#include "scene/3d/bone_attachment_3d.h" -#include "scene/3d/importer_mesh_instance_3d.h" -#include "scene/3d/mesh_instance_3d.h" -#include "scene/animation/animation_player.h" -#include "scene/resources/material.h" #include "modules/modules_enabled.gen.h" // For csg, gridmap. @@ -81,199 +74,199 @@ public: static void unregister_all_gltf_document_extensions(); private: - void _build_parent_hierachy(Ref<GLTFState> state); + void _build_parent_hierachy(Ref<GLTFState> p_state); double _filter_number(double p_float); String _get_component_type_name(const uint32_t p_component); - int _get_component_type_size(const int component_type); - Error _parse_scenes(Ref<GLTFState> state); - Error _parse_nodes(Ref<GLTFState> state); + int _get_component_type_size(const int p_component_type); + Error _parse_scenes(Ref<GLTFState> p_state); + Error _parse_nodes(Ref<GLTFState> p_state); String _get_type_name(const GLTFType p_component); String _get_accessor_type_name(const GLTFType p_type); - String _gen_unique_name(Ref<GLTFState> state, const String &p_name); - String _sanitize_animation_name(const String &name); - String _gen_unique_animation_name(Ref<GLTFState> state, const String &p_name); - String _sanitize_bone_name(const String &name); - String _gen_unique_bone_name(Ref<GLTFState> state, - const GLTFSkeletonIndex skel_i, + String _gen_unique_name(Ref<GLTFState> p_state, const String &p_name); + String _sanitize_animation_name(const String &p_name); + String _gen_unique_animation_name(Ref<GLTFState> p_state, const String &p_name); + String _sanitize_bone_name(const String &p_name); + String _gen_unique_bone_name(Ref<GLTFState> p_state, + const GLTFSkeletonIndex p_skel_i, const String &p_name); - GLTFTextureIndex _set_texture(Ref<GLTFState> state, Ref<Texture2D> p_texture, + GLTFTextureIndex _set_texture(Ref<GLTFState> p_state, Ref<Texture2D> p_texture, StandardMaterial3D::TextureFilter p_filter_mode, bool p_repeats); - Ref<Texture2D> _get_texture(Ref<GLTFState> state, + Ref<Texture2D> _get_texture(Ref<GLTFState> p_state, const GLTFTextureIndex p_texture); - GLTFTextureSamplerIndex _set_sampler_for_mode(Ref<GLTFState> state, + GLTFTextureSamplerIndex _set_sampler_for_mode(Ref<GLTFState> p_state, StandardMaterial3D::TextureFilter p_filter_mode, bool p_repeats); - Ref<GLTFTextureSampler> _get_sampler_for_texture(Ref<GLTFState> state, + Ref<GLTFTextureSampler> _get_sampler_for_texture(Ref<GLTFState> p_state, const GLTFTextureIndex p_texture); - Error _parse_json(const String &p_path, Ref<GLTFState> state); - Error _parse_glb(Ref<FileAccess> f, Ref<GLTFState> state); - void _compute_node_heights(Ref<GLTFState> state); - Error _parse_buffers(Ref<GLTFState> state, const String &p_base_path); - Error _parse_buffer_views(Ref<GLTFState> state); + Error _parse_json(const String &p_path, Ref<GLTFState> p_state); + Error _parse_glb(Ref<FileAccess> p_file, Ref<GLTFState> p_state); + void _compute_node_heights(Ref<GLTFState> p_state); + Error _parse_buffers(Ref<GLTFState> p_state, const String &p_base_path); + Error _parse_buffer_views(Ref<GLTFState> p_state); GLTFType _get_type_from_str(const String &p_string); - Error _parse_accessors(Ref<GLTFState> state); - Error _decode_buffer_view(Ref<GLTFState> state, double *dst, + Error _parse_accessors(Ref<GLTFState> p_state); + Error _decode_buffer_view(Ref<GLTFState> p_state, double *p_dst, const GLTFBufferViewIndex p_buffer_view, - const int skip_every, const int skip_bytes, - const int element_size, const int count, - const GLTFType type, const int component_count, - const int component_type, const int component_size, - const bool normalized, const int byte_offset, - const bool for_vertex); - Vector<double> _decode_accessor(Ref<GLTFState> state, + const int p_skip_every, const int p_skip_bytes, + const int p_element_size, const int p_count, + const GLTFType p_type, const int p_component_count, + const int p_component_type, const int p_component_size, + const bool p_normalized, const int p_byte_offset, + const bool p_for_vertex); + Vector<double> _decode_accessor(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex); - Vector<float> _decode_accessor_as_floats(Ref<GLTFState> state, + Vector<float> _decode_accessor_as_floats(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex); - Vector<int> _decode_accessor_as_ints(Ref<GLTFState> state, + Vector<int> _decode_accessor_as_ints(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex); - Vector<Vector2> _decode_accessor_as_vec2(Ref<GLTFState> state, + Vector<Vector2> _decode_accessor_as_vec2(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex); - Vector<Vector3> _decode_accessor_as_vec3(Ref<GLTFState> state, + Vector<Vector3> _decode_accessor_as_vec3(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex); - Vector<Color> _decode_accessor_as_color(Ref<GLTFState> state, + Vector<Color> _decode_accessor_as_color(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex); - Vector<Quaternion> _decode_accessor_as_quaternion(Ref<GLTFState> state, + Vector<Quaternion> _decode_accessor_as_quaternion(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex); - Vector<Transform2D> _decode_accessor_as_xform2d(Ref<GLTFState> state, + Vector<Transform2D> _decode_accessor_as_xform2d(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex); - Vector<Basis> _decode_accessor_as_basis(Ref<GLTFState> state, + Vector<Basis> _decode_accessor_as_basis(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex); - Vector<Transform3D> _decode_accessor_as_xform(Ref<GLTFState> state, + Vector<Transform3D> _decode_accessor_as_xform(Ref<GLTFState> p_state, const GLTFAccessorIndex p_accessor, const bool p_for_vertex); - Error _parse_meshes(Ref<GLTFState> state); - Error _serialize_textures(Ref<GLTFState> state); - Error _serialize_texture_samplers(Ref<GLTFState> state); - Error _serialize_images(Ref<GLTFState> state, const String &p_path); - Error _serialize_lights(Ref<GLTFState> state); - Error _parse_images(Ref<GLTFState> state, const String &p_base_path); - Error _parse_textures(Ref<GLTFState> state); - Error _parse_texture_samplers(Ref<GLTFState> state); - Error _parse_materials(Ref<GLTFState> state); - void _set_texture_transform_uv1(const Dictionary &d, Ref<BaseMaterial3D> material); + Error _parse_meshes(Ref<GLTFState> p_state); + Error _serialize_textures(Ref<GLTFState> p_state); + Error _serialize_texture_samplers(Ref<GLTFState> p_state); + Error _serialize_images(Ref<GLTFState> p_state, const String &p_path); + Error _serialize_lights(Ref<GLTFState> p_state); + Error _parse_images(Ref<GLTFState> p_state, const String &p_base_path); + Error _parse_textures(Ref<GLTFState> p_state); + Error _parse_texture_samplers(Ref<GLTFState> p_state); + Error _parse_materials(Ref<GLTFState> p_state); + void _set_texture_transform_uv1(const Dictionary &d, Ref<BaseMaterial3D> p_material); void spec_gloss_to_rough_metal(Ref<GLTFSpecGloss> r_spec_gloss, Ref<BaseMaterial3D> p_material); static void spec_gloss_to_metal_base_color(const Color &p_specular_factor, const Color &p_diffuse, Color &r_base_color, float &r_metallic); - GLTFNodeIndex _find_highest_node(Ref<GLTFState> state, - const Vector<GLTFNodeIndex> &subset); - bool _capture_nodes_in_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin, - const GLTFNodeIndex node_index); - void _capture_nodes_for_multirooted_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin); - Error _expand_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin); - Error _verify_skin(Ref<GLTFState> state, Ref<GLTFSkin> skin); - Error _parse_skins(Ref<GLTFState> state); - Error _determine_skeletons(Ref<GLTFState> state); + GLTFNodeIndex _find_highest_node(Ref<GLTFState> p_state, + const Vector<GLTFNodeIndex> &p_subset); + bool _capture_nodes_in_skin(Ref<GLTFState> p_state, Ref<GLTFSkin> p_skin, + const GLTFNodeIndex p_node_index); + void _capture_nodes_for_multirooted_skin(Ref<GLTFState> p_state, Ref<GLTFSkin> p_skin); + Error _expand_skin(Ref<GLTFState> p_state, Ref<GLTFSkin> p_skin); + Error _verify_skin(Ref<GLTFState> p_state, Ref<GLTFSkin> p_skin); + Error _parse_skins(Ref<GLTFState> p_state); + Error _determine_skeletons(Ref<GLTFState> p_state); Error _reparent_non_joint_skeleton_subtrees( - Ref<GLTFState> state, Ref<GLTFSkeleton> skeleton, - const Vector<GLTFNodeIndex> &non_joints); - Error _determine_skeleton_roots(Ref<GLTFState> state, - const GLTFSkeletonIndex skel_i); - Error _create_skeletons(Ref<GLTFState> state); - Error _map_skin_joints_indices_to_skeleton_bone_indices(Ref<GLTFState> state); - Error _serialize_skins(Ref<GLTFState> state); - Error _create_skins(Ref<GLTFState> state); - bool _skins_are_same(const Ref<Skin> skin_a, const Ref<Skin> skin_b); - void _remove_duplicate_skins(Ref<GLTFState> state); - Error _serialize_cameras(Ref<GLTFState> state); - Error _parse_cameras(Ref<GLTFState> state); - Error _parse_lights(Ref<GLTFState> state); - Error _parse_animations(Ref<GLTFState> state); - Error _serialize_animations(Ref<GLTFState> state); - BoneAttachment3D *_generate_bone_attachment(Ref<GLTFState> state, - Skeleton3D *skeleton, - const GLTFNodeIndex node_index, - const GLTFNodeIndex bone_index); - ImporterMeshInstance3D *_generate_mesh_instance(Ref<GLTFState> state, const GLTFNodeIndex node_index); - Camera3D *_generate_camera(Ref<GLTFState> state, const GLTFNodeIndex node_index); - Light3D *_generate_light(Ref<GLTFState> state, const GLTFNodeIndex node_index); - Node3D *_generate_spatial(Ref<GLTFState> state, const GLTFNodeIndex node_index); - void _assign_scene_names(Ref<GLTFState> state); + Ref<GLTFState> p_state, Ref<GLTFSkeleton> p_skeleton, + const Vector<GLTFNodeIndex> &p_non_joints); + Error _determine_skeleton_roots(Ref<GLTFState> p_state, + const GLTFSkeletonIndex p_skel_i); + Error _create_skeletons(Ref<GLTFState> p_state); + Error _map_skin_joints_indices_to_skeleton_bone_indices(Ref<GLTFState> p_state); + Error _serialize_skins(Ref<GLTFState> p_state); + Error _create_skins(Ref<GLTFState> p_state); + bool _skins_are_same(const Ref<Skin> p_skin_a, const Ref<Skin> p_skin_b); + void _remove_duplicate_skins(Ref<GLTFState> p_state); + Error _serialize_cameras(Ref<GLTFState> p_state); + Error _parse_cameras(Ref<GLTFState> p_state); + Error _parse_lights(Ref<GLTFState> p_state); + Error _parse_animations(Ref<GLTFState> p_state); + Error _serialize_animations(Ref<GLTFState> p_state); + BoneAttachment3D *_generate_bone_attachment(Ref<GLTFState> p_state, + Skeleton3D *p_skeleton, + const GLTFNodeIndex p_node_index, + const GLTFNodeIndex p_bone_index); + ImporterMeshInstance3D *_generate_mesh_instance(Ref<GLTFState> p_state, const GLTFNodeIndex p_node_index); + Camera3D *_generate_camera(Ref<GLTFState> p_state, const GLTFNodeIndex p_node_index); + Light3D *_generate_light(Ref<GLTFState> p_state, const GLTFNodeIndex p_node_index); + Node3D *_generate_spatial(Ref<GLTFState> p_state, const GLTFNodeIndex p_node_index); + void _assign_scene_names(Ref<GLTFState> p_state); template <class T> T _interpolate_track(const Vector<real_t> &p_times, const Vector<T> &p_values, const float p_time, const GLTFAnimation::Interpolation p_interp); - GLTFAccessorIndex _encode_accessor_as_quaternions(Ref<GLTFState> state, + GLTFAccessorIndex _encode_accessor_as_quaternions(Ref<GLTFState> p_state, const Vector<Quaternion> p_attribs, const bool p_for_vertex); - GLTFAccessorIndex _encode_accessor_as_weights(Ref<GLTFState> state, + GLTFAccessorIndex _encode_accessor_as_weights(Ref<GLTFState> p_state, const Vector<Color> p_attribs, const bool p_for_vertex); - GLTFAccessorIndex _encode_accessor_as_joints(Ref<GLTFState> state, + GLTFAccessorIndex _encode_accessor_as_joints(Ref<GLTFState> p_state, const Vector<Color> p_attribs, const bool p_for_vertex); - GLTFAccessorIndex _encode_accessor_as_floats(Ref<GLTFState> state, + GLTFAccessorIndex _encode_accessor_as_floats(Ref<GLTFState> p_state, const Vector<real_t> p_attribs, const bool p_for_vertex); - GLTFAccessorIndex _encode_accessor_as_vec2(Ref<GLTFState> state, + GLTFAccessorIndex _encode_accessor_as_vec2(Ref<GLTFState> p_state, const Vector<Vector2> p_attribs, const bool p_for_vertex); - void _calc_accessor_vec2_min_max(int i, const int element_count, Vector<double> &type_max, Vector2 attribs, Vector<double> &type_min) { - if (i == 0) { - for (int32_t type_i = 0; type_i < element_count; type_i++) { - type_max.write[type_i] = attribs[(i * element_count) + type_i]; - type_min.write[type_i] = attribs[(i * element_count) + type_i]; + void _calc_accessor_vec2_min_max(int p_i, const int p_element_count, Vector<double> &p_type_max, Vector2 p_attribs, Vector<double> &p_type_min) { + if (p_i == 0) { + for (int32_t type_i = 0; type_i < p_element_count; type_i++) { + p_type_max.write[type_i] = p_attribs[(p_i * p_element_count) + type_i]; + p_type_min.write[type_i] = p_attribs[(p_i * p_element_count) + type_i]; } } - for (int32_t type_i = 0; type_i < element_count; type_i++) { - type_max.write[type_i] = MAX(attribs[(i * element_count) + type_i], type_max[type_i]); - type_min.write[type_i] = MIN(attribs[(i * element_count) + type_i], type_min[type_i]); - type_max.write[type_i] = _filter_number(type_max.write[type_i]); - type_min.write[type_i] = _filter_number(type_min.write[type_i]); + for (int32_t type_i = 0; type_i < p_element_count; type_i++) { + p_type_max.write[type_i] = MAX(p_attribs[(p_i * p_element_count) + type_i], p_type_max[type_i]); + p_type_min.write[type_i] = MIN(p_attribs[(p_i * p_element_count) + type_i], p_type_min[type_i]); + p_type_max.write[type_i] = _filter_number(p_type_max.write[type_i]); + p_type_min.write[type_i] = _filter_number(p_type_min.write[type_i]); } } - GLTFAccessorIndex _encode_accessor_as_vec3(Ref<GLTFState> state, + GLTFAccessorIndex _encode_accessor_as_vec3(Ref<GLTFState> p_state, const Vector<Vector3> p_attribs, const bool p_for_vertex); - GLTFAccessorIndex _encode_accessor_as_color(Ref<GLTFState> state, + GLTFAccessorIndex _encode_accessor_as_color(Ref<GLTFState> p_state, const Vector<Color> p_attribs, const bool p_for_vertex); void _calc_accessor_min_max(int p_i, const int p_element_count, Vector<double> &p_type_max, Vector<double> p_attribs, Vector<double> &p_type_min); - GLTFAccessorIndex _encode_accessor_as_ints(Ref<GLTFState> state, + GLTFAccessorIndex _encode_accessor_as_ints(Ref<GLTFState> p_state, const Vector<int32_t> p_attribs, const bool p_for_vertex); - GLTFAccessorIndex _encode_accessor_as_xform(Ref<GLTFState> state, + GLTFAccessorIndex _encode_accessor_as_xform(Ref<GLTFState> p_state, const Vector<Transform3D> p_attribs, const bool p_for_vertex); - Error _encode_buffer_view(Ref<GLTFState> state, const double *src, - const int count, const GLTFType type, - const int component_type, const bool normalized, - const int byte_offset, const bool for_vertex, + Error _encode_buffer_view(Ref<GLTFState> p_state, const double *p_src, + const int p_count, const GLTFType p_type, + const int p_component_type, const bool p_normalized, + const int p_byte_offset, const bool p_for_vertex, GLTFBufferViewIndex &r_accessor); - Error _encode_accessors(Ref<GLTFState> state); - Error _encode_buffer_views(Ref<GLTFState> state); - Error _serialize_materials(Ref<GLTFState> state); - Error _serialize_meshes(Ref<GLTFState> state); - Error _serialize_nodes(Ref<GLTFState> state); - Error _serialize_scenes(Ref<GLTFState> state); + Error _encode_accessors(Ref<GLTFState> p_state); + Error _encode_buffer_views(Ref<GLTFState> p_state); + Error _serialize_materials(Ref<GLTFState> p_state); + Error _serialize_meshes(Ref<GLTFState> p_state); + Error _serialize_nodes(Ref<GLTFState> p_state); + Error _serialize_scenes(Ref<GLTFState> p_state); String interpolation_to_string(const GLTFAnimation::Interpolation p_interp); - GLTFAnimation::Track _convert_animation_track(Ref<GLTFState> state, + GLTFAnimation::Track _convert_animation_track(Ref<GLTFState> p_state, GLTFAnimation::Track p_track, Ref<Animation> p_animation, int32_t p_track_i, GLTFNodeIndex p_node_i); - Error _encode_buffer_bins(Ref<GLTFState> state, const String &p_path); - Error _encode_buffer_glb(Ref<GLTFState> state, const String &p_path); - PackedByteArray _serialize_glb_buffer(Ref<GLTFState> state, Error *r_err); + Error _encode_buffer_bins(Ref<GLTFState> p_state, const String &p_path); + Error _encode_buffer_glb(Ref<GLTFState> p_state, const String &p_path); + PackedByteArray _serialize_glb_buffer(Ref<GLTFState> p_state, Error *r_err); Dictionary _serialize_texture_transform_uv1(Ref<BaseMaterial3D> p_material); Dictionary _serialize_texture_transform_uv2(Ref<BaseMaterial3D> p_material); - Error _serialize_version(Ref<GLTFState> state); - Error _serialize_file(Ref<GLTFState> state, const String p_path); - Error _serialize_gltf_extensions(Ref<GLTFState> state) const; + Error _serialize_version(Ref<GLTFState> p_state); + Error _serialize_file(Ref<GLTFState> p_state, const String p_path); + Error _serialize_gltf_extensions(Ref<GLTFState> p_state) const; public: // https://www.itu.int/rec/R-REC-BT.601 @@ -285,8 +278,8 @@ public: private: // https://github.com/microsoft/glTF-SDK/blob/master/GLTFSDK/Source/PBRUtils.cpp#L9 // https://bghgary.github.io/glTF/convert-between-workflows-bjs/js/babylon.pbrUtilities.js - static float solve_metallic(float p_dielectric_specular, float diffuse, - float specular, + static float solve_metallic(float p_dielectric_specular, float p_diffuse, + float p_specular, float p_one_minus_specular_strength); static float get_perceived_brightness(const Color p_color); static float get_max_component(const Color &p_color); @@ -297,78 +290,78 @@ public: Error append_from_scene(Node *p_node, Ref<GLTFState> r_state, uint32_t p_flags = 0); public: - Node *generate_scene(Ref<GLTFState> state, float p_bake_fps = 30.0f, bool p_trimming = false); - PackedByteArray generate_buffer(Ref<GLTFState> state); - Error write_to_filesystem(Ref<GLTFState> state, const String &p_path); + Node *generate_scene(Ref<GLTFState> p_state, float p_bake_fps = 30.0f, bool p_trimming = false); + PackedByteArray generate_buffer(Ref<GLTFState> p_state); + Error write_to_filesystem(Ref<GLTFState> p_state, const String &p_path); public: - Error _parse_gltf_state(Ref<GLTFState> state, const String &p_search_path); - Error _parse_gltf_extensions(Ref<GLTFState> state); - void _process_mesh_instances(Ref<GLTFState> state, Node *scene_root); - void _generate_scene_node(Ref<GLTFState> state, Node *scene_parent, - Node3D *scene_root, - const GLTFNodeIndex node_index); - void _generate_skeleton_bone_node(Ref<GLTFState> state, Node *scene_parent, Node3D *scene_root, const GLTFNodeIndex node_index); - void _import_animation(Ref<GLTFState> state, AnimationPlayer *ap, - const GLTFAnimationIndex index, const float bake_fps, const bool trimming); - void _convert_mesh_instances(Ref<GLTFState> state); - GLTFCameraIndex _convert_camera(Ref<GLTFState> state, Camera3D *p_camera); - void _convert_light_to_gltf(Light3D *light, Ref<GLTFState> state, Ref<GLTFNode> gltf_node); - GLTFLightIndex _convert_light(Ref<GLTFState> state, Light3D *p_light); - void _convert_spatial(Ref<GLTFState> state, Node3D *p_spatial, Ref<GLTFNode> p_node); - void _convert_scene_node(Ref<GLTFState> state, Node *p_current, + Error _parse_gltf_state(Ref<GLTFState> p_state, const String &p_search_path); + Error _parse_gltf_extensions(Ref<GLTFState> p_state); + void _process_mesh_instances(Ref<GLTFState> p_state, Node *p_scene_root); + void _generate_scene_node(Ref<GLTFState> p_state, Node *p_scene_parent, + Node3D *p_scene_root, + const GLTFNodeIndex p_node_index); + void _generate_skeleton_bone_node(Ref<GLTFState> p_state, Node *p_scene_parent, Node3D *p_scene_root, const GLTFNodeIndex p_node_index); + void _import_animation(Ref<GLTFState> p_state, AnimationPlayer *p_animation_player, + const GLTFAnimationIndex p_index, const float p_bake_fps, const bool p_trimming); + void _convert_mesh_instances(Ref<GLTFState> p_state); + GLTFCameraIndex _convert_camera(Ref<GLTFState> p_state, Camera3D *p_camera); + void _convert_light_to_gltf(Light3D *p_light, Ref<GLTFState> p_state, Ref<GLTFNode> p_gltf_node); + GLTFLightIndex _convert_light(Ref<GLTFState> p_state, Light3D *p_light); + void _convert_spatial(Ref<GLTFState> p_state, Node3D *p_spatial, Ref<GLTFNode> p_node); + void _convert_scene_node(Ref<GLTFState> p_state, Node *p_current, const GLTFNodeIndex p_gltf_current, const GLTFNodeIndex p_gltf_root); #ifdef MODULE_CSG_ENABLED - void _convert_csg_shape_to_gltf(CSGShape3D *p_current, GLTFNodeIndex p_gltf_parent, Ref<GLTFNode> gltf_node, Ref<GLTFState> state); + void _convert_csg_shape_to_gltf(CSGShape3D *p_current, GLTFNodeIndex p_gltf_parent, Ref<GLTFNode> p_gltf_node, Ref<GLTFState> p_state); #endif // MODULE_CSG_ENABLED - void _create_gltf_node(Ref<GLTFState> state, + void _create_gltf_node(Ref<GLTFState> p_state, Node *p_scene_parent, - GLTFNodeIndex current_node_i, + GLTFNodeIndex p_current_node_i, GLTFNodeIndex p_parent_node_index, GLTFNodeIndex p_root_gltf_node, - Ref<GLTFNode> gltf_node); + Ref<GLTFNode> p_gltf_node); void _convert_animation_player_to_gltf( - AnimationPlayer *animation_player, Ref<GLTFState> state, + AnimationPlayer *p_animation_player, Ref<GLTFState> p_state, GLTFNodeIndex p_gltf_current, GLTFNodeIndex p_gltf_root_index, Ref<GLTFNode> p_gltf_node, Node *p_scene_parent); - void _check_visibility(Node *p_node, bool &retflag); - void _convert_camera_to_gltf(Camera3D *camera, Ref<GLTFState> state, - Ref<GLTFNode> gltf_node); + void _check_visibility(Node *p_node, bool &r_retflag); + void _convert_camera_to_gltf(Camera3D *p_camera, Ref<GLTFState> p_state, + Ref<GLTFNode> p_gltf_node); #ifdef MODULE_GRIDMAP_ENABLED void _convert_grid_map_to_gltf( GridMap *p_grid_map, GLTFNodeIndex p_parent_node_index, GLTFNodeIndex p_root_node_index, - Ref<GLTFNode> gltf_node, Ref<GLTFState> state); + Ref<GLTFNode> p_gltf_node, Ref<GLTFState> p_state); #endif // MODULE_GRIDMAP_ENABLED void _convert_multi_mesh_instance_to_gltf( MultiMeshInstance3D *p_multi_mesh_instance, GLTFNodeIndex p_parent_node_index, GLTFNodeIndex p_root_node_index, - Ref<GLTFNode> gltf_node, Ref<GLTFState> state); + Ref<GLTFNode> p_gltf_node, Ref<GLTFState> p_state); void _convert_skeleton_to_gltf( - Skeleton3D *p_scene_parent, Ref<GLTFState> state, + Skeleton3D *p_scene_parent, Ref<GLTFState> p_state, GLTFNodeIndex p_parent_node_index, GLTFNodeIndex p_root_node_index, - Ref<GLTFNode> gltf_node); + Ref<GLTFNode> p_gltf_node); void _convert_bone_attachment_to_gltf(BoneAttachment3D *p_bone_attachment, - Ref<GLTFState> state, + Ref<GLTFState> p_state, GLTFNodeIndex p_parent_node_index, GLTFNodeIndex p_root_node_index, - Ref<GLTFNode> gltf_node); + Ref<GLTFNode> p_gltf_node); void _convert_mesh_instance_to_gltf(MeshInstance3D *p_mesh_instance, - Ref<GLTFState> state, - Ref<GLTFNode> gltf_node); - GLTFMeshIndex _convert_mesh_to_gltf(Ref<GLTFState> state, + Ref<GLTFState> p_state, + Ref<GLTFNode> p_gltf_node); + GLTFMeshIndex _convert_mesh_to_gltf(Ref<GLTFState> p_state, MeshInstance3D *p_mesh_instance); - void _convert_animation(Ref<GLTFState> state, AnimationPlayer *ap, + void _convert_animation(Ref<GLTFState> p_state, AnimationPlayer *p_animation_player, String p_animation_track_name); - Error _serialize(Ref<GLTFState> state, const String &p_path); - Error _parse(Ref<GLTFState> state, String p_path, Ref<FileAccess> f); + Error _serialize(Ref<GLTFState> p_state, const String &p_path); + Error _parse(Ref<GLTFState> p_state, String p_path, Ref<FileAccess> p_file); }; #endif // GLTF_DOCUMENT_H diff --git a/modules/gltf/gltf_state.cpp b/modules/gltf/gltf_state.cpp index 6654c9e5d2..9f6cb20935 100644 --- a/modules/gltf/gltf_state.cpp +++ b/modules/gltf/gltf_state.cpp @@ -30,6 +30,8 @@ #include "gltf_state.h" +#include "gltf_template_convert.h" + void GLTFState::_bind_methods() { ClassDB::bind_method(D_METHOD("add_used_extension", "extension_name", "required"), &GLTFState::add_used_extension); ClassDB::bind_method(D_METHOD("get_json"), &GLTFState::get_json); diff --git a/modules/gltf/gltf_state.h b/modules/gltf/gltf_state.h index 1c20520b22..e264da69e0 100644 --- a/modules/gltf/gltf_state.h +++ b/modules/gltf/gltf_state.h @@ -32,7 +32,6 @@ #define GLTF_STATE_H #include "extensions/gltf_light.h" -#include "gltf_template_convert.h" #include "structures/gltf_accessor.h" #include "structures/gltf_animation.h" #include "structures/gltf_buffer_view.h" @@ -44,10 +43,6 @@ #include "structures/gltf_texture.h" #include "structures/gltf_texture_sampler.h" -#include "core/templates/rb_map.h" -#include "scene/animation/animation_player.h" -#include "scene/resources/texture.h" - class GLTFState : public Resource { GDCLASS(GLTFState, Resource); friend class GLTFDocument; @@ -194,21 +189,6 @@ public: Variant get_additional_data(const StringName &p_extension_name); void set_additional_data(const StringName &p_extension_name, Variant p_additional_data); - - //void set_scene_nodes(RBMap<GLTFNodeIndex, Node *> p_scene_nodes) { - // this->scene_nodes = p_scene_nodes; - //} - - //void set_animation_players(Vector<AnimationPlayer *> p_animation_players) { - // this->animation_players = p_animation_players; - //} - - //RBMap<Ref<Material>, GLTFMaterialIndex> get_material_cache() { - // return this->material_cache; - //} - //void set_material_cache(RBMap<Ref<Material>, GLTFMaterialIndex> p_material_cache) { - // this->material_cache = p_material_cache; - //} }; #endif // GLTF_STATE_H diff --git a/modules/gltf/register_types.cpp b/modules/gltf/register_types.cpp index a7abf256ce..2322e13ae2 100644 --- a/modules/gltf/register_types.cpp +++ b/modules/gltf/register_types.cpp @@ -30,23 +30,9 @@ #include "register_types.h" -#ifndef _3D_DISABLED - #include "extensions/gltf_document_extension_convert_importer_mesh.h" -#include "extensions/gltf_light.h" #include "extensions/gltf_spec_gloss.h" #include "gltf_document.h" -#include "gltf_state.h" -#include "structures/gltf_accessor.h" -#include "structures/gltf_animation.h" -#include "structures/gltf_buffer_view.h" -#include "structures/gltf_camera.h" -#include "structures/gltf_mesh.h" -#include "structures/gltf_node.h" -#include "structures/gltf_skeleton.h" -#include "structures/gltf_skin.h" -#include "structures/gltf_texture.h" -#include "structures/gltf_texture_sampler.h" #ifdef TOOLS_ENABLED #include "core/config/project_settings.h" @@ -94,16 +80,13 @@ static void _editor_init() { EditorSettings::get_singleton()->add_property_hint(PropertyInfo(Variant::STRING, "filesystem/import/fbx/fbx2gltf_path", PROPERTY_HINT_GLOBAL_FILE)); if (fbx_enabled) { - Ref<DirAccess> da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); - if (fbx2gltf_path.is_empty()) { - WARN_PRINT("FBX file import is enabled in the project settings, but no FBX2glTF path is configured in the editor settings. FBX files will not be imported."); - } else if (!da->file_exists(fbx2gltf_path)) { - WARN_PRINT("FBX file import is enabled, but the FBX2glTF path doesn't point to an accessible file. FBX files will not be imported."); - } else { - Ref<EditorSceneFormatImporterFBX> importer; - importer.instantiate(); - ResourceImporterScene::add_importer(importer); - } + Ref<EditorSceneFormatImporterFBX> importer; + importer.instantiate(); + ResourceImporterScene::get_scene_singleton()->add_importer(importer); + + Ref<EditorFileSystemImportFormatSupportQueryFBX> fbx_import_query; + fbx_import_query.instantiate(); + EditorFileSystem::get_singleton()->add_import_format_support_query(fbx_import_query); } } #endif // TOOLS_ENABLED @@ -172,5 +155,3 @@ void uninitialize_gltf_module(ModuleInitializationLevel p_level) { } GLTFDocument::unregister_all_gltf_document_extensions(); } - -#endif // _3D_DISABLED diff --git a/modules/gltf/structures/gltf_accessor.h b/modules/gltf/structures/gltf_accessor.h index bfb71d57fe..8e4bb2d3f9 100644 --- a/modules/gltf/structures/gltf_accessor.h +++ b/modules/gltf/structures/gltf_accessor.h @@ -31,9 +31,8 @@ #ifndef GLTF_ACCESSOR_H #define GLTF_ACCESSOR_H -#include "core/io/resource.h" - #include "../gltf_defines.h" +#include "core/io/resource.h" struct GLTFAccessor : public Resource { GDCLASS(GLTFAccessor, Resource); diff --git a/modules/gltf/structures/gltf_animation.h b/modules/gltf/structures/gltf_animation.h index 3777f579f6..fc535631bb 100644 --- a/modules/gltf/structures/gltf_animation.h +++ b/modules/gltf/structures/gltf_animation.h @@ -31,7 +31,7 @@ #ifndef GLTF_ANIMATION_H #define GLTF_ANIMATION_H -#include "core/io/resource.h" +#include "scene/animation/animation_player.h" class GLTFAnimation : public Resource { GDCLASS(GLTFAnimation, Resource); diff --git a/modules/gltf/structures/gltf_camera.cpp b/modules/gltf/structures/gltf_camera.cpp index 212b9b80c8..7a5ab2763c 100644 --- a/modules/gltf/structures/gltf_camera.cpp +++ b/modules/gltf/structures/gltf_camera.cpp @@ -30,6 +30,8 @@ #include "gltf_camera.h" +#include "scene/3d/camera_3d.h" + void GLTFCamera::_bind_methods() { ClassDB::bind_static_method("GLTFCamera", D_METHOD("from_node", "camera_node"), &GLTFCamera::from_node); ClassDB::bind_method(D_METHOD("to_node"), &GLTFCamera::to_node); diff --git a/modules/gltf/structures/gltf_camera.h b/modules/gltf/structures/gltf_camera.h index 50ae10e17a..5e8a1da5f7 100644 --- a/modules/gltf/structures/gltf_camera.h +++ b/modules/gltf/structures/gltf_camera.h @@ -32,7 +32,8 @@ #define GLTF_CAMERA_H #include "core/io/resource.h" -#include "scene/3d/camera_3d.h" + +class Camera3D; // Reference and test file: // https://github.com/KhronosGroup/glTF-Tutorials/blob/master/gltfTutorial/gltfTutorial_015_SimpleCameras.md @@ -64,7 +65,7 @@ public: real_t get_depth_near() const { return depth_near; } void set_depth_near(real_t p_val) { depth_near = p_val; } - static Ref<GLTFCamera> from_node(const Camera3D *p_light); + static Ref<GLTFCamera> from_node(const Camera3D *p_camera); Camera3D *to_node() const; static Ref<GLTFCamera> from_dictionary(const Dictionary p_dictionary); diff --git a/modules/gltf/structures/gltf_mesh.h b/modules/gltf/structures/gltf_mesh.h index 2fa37fd727..92722ce75c 100644 --- a/modules/gltf/structures/gltf_mesh.h +++ b/modules/gltf/structures/gltf_mesh.h @@ -31,10 +31,8 @@ #ifndef GLTF_MESH_H #define GLTF_MESH_H -#include "core/io/resource.h" -#include "scene/3d/importer_mesh_instance_3d.h" +#include "../gltf_defines.h" #include "scene/resources/importer_mesh.h" -#include "scene/resources/mesh.h" class GLTFMesh : public Resource { GDCLASS(GLTFMesh, Resource); diff --git a/modules/gltf/structures/gltf_texture_sampler.h b/modules/gltf/structures/gltf_texture_sampler.h index 3fad31bbee..7bb7cd62e3 100644 --- a/modules/gltf/structures/gltf_texture_sampler.h +++ b/modules/gltf/structures/gltf_texture_sampler.h @@ -31,7 +31,6 @@ #ifndef GLTF_TEXTURE_SAMPLER_H #define GLTF_TEXTURE_SAMPLER_H -#include "core/io/resource.h" #include "scene/resources/material.h" class GLTFTextureSampler : public Resource { diff --git a/modules/gridmap/doc_classes/GridMap.xml b/modules/gridmap/doc_classes/GridMap.xml index bd5c938364..e0fc4e2697 100644 --- a/modules/gridmap/doc_classes/GridMap.xml +++ b/modules/gridmap/doc_classes/GridMap.xml @@ -89,13 +89,6 @@ Returns an array of [Transform3D] and [Mesh] references corresponding to the non-empty cells in the grid. The transforms are specified in local space. </description> </method> - <method name="get_navigation_layer_value" qualifiers="const"> - <return type="bool" /> - <param index="0" name="layer_number" type="int" /> - <description> - Returns whether or not the specified layer of the [member navigation_layers] bitmask is enabled, given a [code]layer_number[/code] between 1 and 32. - </description> - </method> <method name="get_navigation_map" qualifiers="const"> <return type="RID" /> <description> @@ -179,14 +172,6 @@ Based on [code]value[/code], enables or disables the specified layer in the [member collision_mask], given a [code]layer_number[/code] between 1 and 32. </description> </method> - <method name="set_navigation_layer_value"> - <return type="void" /> - <param index="0" name="layer_number" type="int" /> - <param index="1" name="value" type="bool" /> - <description> - Based on [code]value[/code], enables or disables the specified layer in the [member navigation_layers] bitmask, given a [code]layer_number[/code] between 1 and 32. - </description> - </method> <method name="set_navigation_map"> <return type="void" /> <param index="0" name="navigation_map" type="RID" /> @@ -197,7 +182,7 @@ </methods> <members> <member name="bake_navigation" type="bool" setter="set_bake_navigation" getter="is_baking_navigation" default="false"> - If [code]true[/code], this GridMap bakes a navigation region. + If [code]true[/code], this GridMap creates a navigation region for each cell that uses a [member mesh_library] item with a navigation mesh. The created navigation region will use the navigation layers bitmask assigned to the [MeshLibrary]'s item. </member> <member name="cell_center_x" type="bool" setter="set_center_x" getter="get_center_x" default="true"> If [code]true[/code], grid items are centered on the X axis. @@ -226,12 +211,12 @@ <member name="collision_mask" type="int" setter="set_collision_mask" getter="get_collision_mask" default="1"> The physics layers this GridMap detects collisions in. See [url=$DOCS_URL/tutorials/physics/physics_introduction.html#collision-layers-and-masks]Collision layers and masks[/url] in the documentation for more information. </member> + <member name="collision_priority" type="float" setter="set_collision_priority" getter="get_collision_priority" default="1.0"> + The priority used to solve colliding when occurring penetration. The higher the priority is, the lower the penetration into the object will be. This can for example be used to prevent the player from breaking through the boundaries of a level. + </member> <member name="mesh_library" type="MeshLibrary" setter="set_mesh_library" getter="get_mesh_library"> The assigned [MeshLibrary]. </member> - <member name="navigation_layers" type="int" setter="set_navigation_layers" getter="get_navigation_layers" default="1"> - A bitmask determining all navigation layers the GridMap generated navigation regions belong to. These navigation layers can be checked upon when requesting a path with [method NavigationServer3D.map_get_path]. - </member> <member name="physics_material" type="PhysicsMaterial" setter="set_physics_material" getter="get_physics_material"> Overrides the default friction and bounce physics properties for the whole [GridMap]. </member> diff --git a/modules/gridmap/grid_map.cpp b/modules/gridmap/grid_map.cpp index de50e9ea1e..e396d77d86 100644 --- a/modules/gridmap/grid_map.cpp +++ b/modules/gridmap/grid_map.cpp @@ -74,7 +74,7 @@ bool GridMap::_set(const StringName &p_name, const Variant &p_value) { bm.mesh = meshes[i]; ERR_CONTINUE(!bm.mesh.is_valid()); bm.instance = RS::get_singleton()->instance_create(); - RS::get_singleton()->get_singleton()->instance_set_base(bm.instance, bm.mesh->get_rid()); + RS::get_singleton()->instance_set_base(bm.instance, bm.mesh->get_rid()); RS::get_singleton()->instance_attach_object_instance_id(bm.instance, get_instance_id()); if (is_inside_tree()) { RS::get_singleton()->instance_set_scenario(bm.instance, get_world_3d()->get_scenario()); @@ -138,7 +138,7 @@ void GridMap::_get_property_list(List<PropertyInfo> *p_list) const { void GridMap::set_collision_layer(uint32_t p_layer) { collision_layer = p_layer; - _reset_physic_bodies_collision_filters(); + _update_physics_bodies_collision_properties(); } uint32_t GridMap::get_collision_layer() const { @@ -147,7 +147,7 @@ uint32_t GridMap::get_collision_layer() const { void GridMap::set_collision_mask(uint32_t p_mask) { collision_mask = p_mask; - _reset_physic_bodies_collision_filters(); + _update_physics_bodies_collision_properties(); } uint32_t GridMap::get_collision_mask() const { @@ -184,6 +184,15 @@ void GridMap::set_collision_mask_value(int p_layer_number, bool p_value) { set_collision_mask(mask); } +void GridMap::set_collision_priority(real_t p_priority) { + collision_priority = p_priority; + _update_physics_bodies_collision_properties(); +} + +real_t GridMap::get_collision_priority() const { + return collision_priority; +} + void GridMap::set_physics_material(Ref<PhysicsMaterial> p_material) { physics_material = p_material; _recreate_octant_data(); @@ -230,7 +239,7 @@ void GridMap::set_navigation_map(RID p_navigation_map) { map_override = p_navigation_map; for (const KeyValue<OctantKey, Octant *> &E : octant_map) { Octant &g = *octant_map[E.key]; - for (KeyValue<IndexKey, Octant::NavMesh> &F : g.navmesh_ids) { + for (KeyValue<IndexKey, Octant::NavigationCell> &F : g.navigation_cell_ids) { if (F.value.region.is_valid()) { NavigationServer3D::get_singleton()->region_set_map(F.value.region, map_override); } @@ -247,33 +256,6 @@ RID GridMap::get_navigation_map() const { return RID(); } -void GridMap::set_navigation_layers(uint32_t p_navigation_layers) { - navigation_layers = p_navigation_layers; - _recreate_octant_data(); -} - -uint32_t GridMap::get_navigation_layers() const { - return navigation_layers; -} - -void GridMap::set_navigation_layer_value(int p_layer_number, bool p_value) { - ERR_FAIL_COND_MSG(p_layer_number < 1, "Navigation layer number must be between 1 and 32 inclusive."); - ERR_FAIL_COND_MSG(p_layer_number > 32, "Navigation layer number must be between 1 and 32 inclusive."); - uint32_t _navigation_layers = get_navigation_layers(); - if (p_value) { - _navigation_layers |= 1 << (p_layer_number - 1); - } else { - _navigation_layers &= ~(1 << (p_layer_number - 1)); - } - set_navigation_layers(_navigation_layers); -} - -bool GridMap::get_navigation_layer_value(int p_layer_number) const { - ERR_FAIL_COND_V_MSG(p_layer_number < 1, false, "Navigation layer number must be between 1 and 32 inclusive."); - ERR_FAIL_COND_V_MSG(p_layer_number > 32, false, "Navigation layer number must be between 1 and 32 inclusive."); - return get_navigation_layers() & (1 << (p_layer_number - 1)); -} - void GridMap::set_mesh_library(const Ref<MeshLibrary> &p_mesh_library) { if (!mesh_library.is_null()) { mesh_library->unregister_owner(this); @@ -385,6 +367,7 @@ void GridMap::set_cell_item(const Vector3i &p_position, int p_item, int p_rot) { PhysicsServer3D::get_singleton()->body_attach_object_instance_id(g->static_body, get_instance_id()); PhysicsServer3D::get_singleton()->body_set_collision_layer(g->static_body, collision_layer); PhysicsServer3D::get_singleton()->body_set_collision_mask(g->static_body, collision_mask); + PhysicsServer3D::get_singleton()->body_set_collision_priority(g->static_body, collision_priority); if (physics_material.is_valid()) { PhysicsServer3D::get_singleton()->body_set_param(g->static_body, PhysicsServer3D::BODY_PARAM_FRICTION, physics_material->get_friction()); PhysicsServer3D::get_singleton()->body_set_param(g->static_body, PhysicsServer3D::BODY_PARAM_BOUNCE, physics_material->get_bounce()); @@ -542,13 +525,13 @@ void GridMap::_octant_transform(const OctantKey &p_key) { } // update transform for NavigationServer regions and navigation debugmesh instances - for (const KeyValue<IndexKey, Octant::NavMesh> &E : g.navmesh_ids) { + for (const KeyValue<IndexKey, Octant::NavigationCell> &E : g.navigation_cell_ids) { if (bake_navigation) { if (E.value.region.is_valid()) { NavigationServer3D::get_singleton()->region_set_transform(E.value.region, get_global_transform() * E.value.xform); } - if (E.value.navmesh_debug_instance.is_valid()) { - RS::get_singleton()->instance_set_transform(E.value.navmesh_debug_instance, get_global_transform() * E.value.xform); + if (E.value.navigation_mesh_debug_instance.is_valid()) { + RS::get_singleton()->instance_set_transform(E.value.navigation_mesh_debug_instance, get_global_transform() * E.value.xform); } } } @@ -574,13 +557,13 @@ bool GridMap::_octant_update(const OctantKey &p_key) { } //erase navigation - for (const KeyValue<IndexKey, Octant::NavMesh> &E : g.navmesh_ids) { + for (const KeyValue<IndexKey, Octant::NavigationCell> &E : g.navigation_cell_ids) { NavigationServer3D::get_singleton()->free(E.value.region); - if (E.value.navmesh_debug_instance.is_valid()) { - RS::get_singleton()->free(E.value.navmesh_debug_instance); + if (E.value.navigation_mesh_debug_instance.is_valid()) { + RS::get_singleton()->free(E.value.navigation_mesh_debug_instance); } } - g.navmesh_ids.clear(); + g.navigation_cell_ids.clear(); //erase multimeshes @@ -648,16 +631,18 @@ bool GridMap::_octant_update(const OctantKey &p_key) { } } - // add the item's navmesh at given xform to GridMap's Navigation ancestor - Ref<NavigationMesh> navmesh = mesh_library->get_item_navmesh(c.item); - if (navmesh.is_valid()) { - Octant::NavMesh nm; - nm.xform = xform * mesh_library->get_item_navmesh_transform(c.item); + // add the item's navigation_mesh at given xform to GridMap's Navigation ancestor + Ref<NavigationMesh> navigation_mesh = mesh_library->get_item_navigation_mesh(c.item); + if (navigation_mesh.is_valid()) { + Octant::NavigationCell nm; + nm.xform = xform * mesh_library->get_item_navigation_mesh_transform(c.item); + nm.navigation_layers = mesh_library->get_item_navigation_layers(c.item); if (bake_navigation) { RID region = NavigationServer3D::get_singleton()->region_create(); - NavigationServer3D::get_singleton()->region_set_navigation_layers(region, navigation_layers); - NavigationServer3D::get_singleton()->region_set_navmesh(region, navmesh); + NavigationServer3D::get_singleton()->region_set_owner_id(region, get_instance_id()); + NavigationServer3D::get_singleton()->region_set_navigation_layers(region, nm.navigation_layers); + NavigationServer3D::get_singleton()->region_set_navigation_mesh(region, navigation_mesh); NavigationServer3D::get_singleton()->region_set_transform(region, get_global_transform() * nm.xform); if (is_inside_tree()) { if (map_override.is_valid()) { @@ -672,19 +657,19 @@ bool GridMap::_octant_update(const OctantKey &p_key) { // add navigation debugmesh visual instances if debug is enabled SceneTree *st = SceneTree::get_singleton(); if (st && st->is_debugging_navigation_hint()) { - if (!nm.navmesh_debug_instance.is_valid()) { - RID navmesh_debug_rid = navmesh->get_debug_mesh()->get_rid(); - nm.navmesh_debug_instance = RS::get_singleton()->instance_create(); - RS::get_singleton()->instance_set_base(nm.navmesh_debug_instance, navmesh_debug_rid); + if (!nm.navigation_mesh_debug_instance.is_valid()) { + RID navigation_mesh_debug_rid = navigation_mesh->get_debug_mesh()->get_rid(); + nm.navigation_mesh_debug_instance = RS::get_singleton()->instance_create(); + RS::get_singleton()->instance_set_base(nm.navigation_mesh_debug_instance, navigation_mesh_debug_rid); } if (is_inside_tree()) { - RS::get_singleton()->instance_set_scenario(nm.navmesh_debug_instance, get_world_3d()->get_scenario()); - RS::get_singleton()->instance_set_transform(nm.navmesh_debug_instance, get_global_transform() * nm.xform); + RS::get_singleton()->instance_set_scenario(nm.navigation_mesh_debug_instance, get_world_3d()->get_scenario()); + RS::get_singleton()->instance_set_transform(nm.navigation_mesh_debug_instance, get_global_transform() * nm.xform); } } #endif // DEBUG_ENABLED } - g.navmesh_ids[E] = nm; + g.navigation_cell_ids[E] = nm; } } @@ -750,10 +735,11 @@ bool GridMap::_octant_update(const OctantKey &p_key) { return false; } -void GridMap::_reset_physic_bodies_collision_filters() { +void GridMap::_update_physics_bodies_collision_properties() { for (const KeyValue<OctantKey, Octant *> &E : octant_map) { PhysicsServer3D::get_singleton()->body_set_collision_layer(E.value->static_body, collision_layer); PhysicsServer3D::get_singleton()->body_set_collision_mask(E.value->static_body, collision_mask); + PhysicsServer3D::get_singleton()->body_set_collision_priority(E.value->static_body, collision_priority); } } @@ -774,13 +760,14 @@ void GridMap::_octant_enter_world(const OctantKey &p_key) { } if (bake_navigation && mesh_library.is_valid()) { - for (KeyValue<IndexKey, Octant::NavMesh> &F : g.navmesh_ids) { + for (KeyValue<IndexKey, Octant::NavigationCell> &F : g.navigation_cell_ids) { if (cell_map.has(F.key) && F.value.region.is_valid() == false) { - Ref<NavigationMesh> nm = mesh_library->get_item_navmesh(cell_map[F.key].item); - if (nm.is_valid()) { + Ref<NavigationMesh> navigation_mesh = mesh_library->get_item_navigation_mesh(cell_map[F.key].item); + if (navigation_mesh.is_valid()) { RID region = NavigationServer3D::get_singleton()->region_create(); - NavigationServer3D::get_singleton()->region_set_navigation_layers(region, navigation_layers); - NavigationServer3D::get_singleton()->region_set_navmesh(region, nm); + NavigationServer3D::get_singleton()->region_set_owner_id(region, get_instance_id()); + NavigationServer3D::get_singleton()->region_set_navigation_layers(region, F.value.navigation_layers); + NavigationServer3D::get_singleton()->region_set_navigation_mesh(region, navigation_mesh); NavigationServer3D::get_singleton()->region_set_transform(region, get_global_transform() * F.value.xform); if (map_override.is_valid()) { NavigationServer3D::get_singleton()->region_set_map(region, map_override); @@ -822,14 +809,14 @@ void GridMap::_octant_exit_world(const OctantKey &p_key) { RS::get_singleton()->instance_set_scenario(g.multimesh_instances[i].instance, RID()); } - for (KeyValue<IndexKey, Octant::NavMesh> &F : g.navmesh_ids) { + for (KeyValue<IndexKey, Octant::NavigationCell> &F : g.navigation_cell_ids) { if (F.value.region.is_valid()) { NavigationServer3D::get_singleton()->free(F.value.region); F.value.region = RID(); } - if (F.value.navmesh_debug_instance.is_valid()) { - RS::get_singleton()->free(F.value.navmesh_debug_instance); - F.value.navmesh_debug_instance = RID(); + if (F.value.navigation_mesh_debug_instance.is_valid()) { + RS::get_singleton()->free(F.value.navigation_mesh_debug_instance); + F.value.navigation_mesh_debug_instance = RID(); } } @@ -860,15 +847,15 @@ void GridMap::_octant_clean_up(const OctantKey &p_key) { PhysicsServer3D::get_singleton()->free(g.static_body); // Erase navigation - for (const KeyValue<IndexKey, Octant::NavMesh> &E : g.navmesh_ids) { + for (const KeyValue<IndexKey, Octant::NavigationCell> &E : g.navigation_cell_ids) { if (E.value.region.is_valid()) { NavigationServer3D::get_singleton()->free(E.value.region); } - if (E.value.navmesh_debug_instance.is_valid()) { - RS::get_singleton()->free(E.value.navmesh_debug_instance); + if (E.value.navigation_mesh_debug_instance.is_valid()) { + RS::get_singleton()->free(E.value.navigation_mesh_debug_instance); } } - g.navmesh_ids.clear(); + g.navigation_cell_ids.clear(); #ifdef DEBUG_ENABLED if (bake_navigation) { @@ -1045,6 +1032,9 @@ void GridMap::_bind_methods() { ClassDB::bind_method(D_METHOD("set_collision_layer_value", "layer_number", "value"), &GridMap::set_collision_layer_value); ClassDB::bind_method(D_METHOD("get_collision_layer_value", "layer_number"), &GridMap::get_collision_layer_value); + ClassDB::bind_method(D_METHOD("set_collision_priority", "priority"), &GridMap::set_collision_priority); + ClassDB::bind_method(D_METHOD("get_collision_priority"), &GridMap::get_collision_priority); + ClassDB::bind_method(D_METHOD("set_physics_material", "material"), &GridMap::set_physics_material); ClassDB::bind_method(D_METHOD("get_physics_material"), &GridMap::get_physics_material); @@ -1054,12 +1044,6 @@ void GridMap::_bind_methods() { ClassDB::bind_method(D_METHOD("set_navigation_map", "navigation_map"), &GridMap::set_navigation_map); ClassDB::bind_method(D_METHOD("get_navigation_map"), &GridMap::get_navigation_map); - ClassDB::bind_method(D_METHOD("set_navigation_layers", "layers"), &GridMap::set_navigation_layers); - ClassDB::bind_method(D_METHOD("get_navigation_layers"), &GridMap::get_navigation_layers); - - ClassDB::bind_method(D_METHOD("set_navigation_layer_value", "layer_number", "value"), &GridMap::set_navigation_layer_value); - ClassDB::bind_method(D_METHOD("get_navigation_layer_value", "layer_number"), &GridMap::get_navigation_layer_value); - ClassDB::bind_method(D_METHOD("set_mesh_library", "mesh_library"), &GridMap::set_mesh_library); ClassDB::bind_method(D_METHOD("get_mesh_library"), &GridMap::get_mesh_library); @@ -1116,9 +1100,9 @@ void GridMap::_bind_methods() { ADD_GROUP("Collision", "collision_"); ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_layer", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_layer", "get_collision_layer"); ADD_PROPERTY(PropertyInfo(Variant::INT, "collision_mask", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_mask", "get_collision_mask"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "collision_priority"), "set_collision_priority", "get_collision_priority"); ADD_GROUP("Navigation", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "bake_navigation"), "set_bake_navigation", "is_baking_navigation"); - ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_3D_NAVIGATION), "set_navigation_layers", "get_navigation_layers"); BIND_CONSTANT(INVALID_CELL_ITEM); @@ -1279,7 +1263,7 @@ void GridMap::make_baked_meshes(bool p_gen_lightmap_uv, float p_lightmap_uv_texe BakedMesh bm; bm.mesh = mesh; bm.instance = RS::get_singleton()->instance_create(); - RS::get_singleton()->get_singleton()->instance_set_base(bm.instance, bm.mesh->get_rid()); + RS::get_singleton()->instance_set_base(bm.instance, bm.mesh->get_rid()); RS::get_singleton()->instance_attach_object_instance_id(bm.instance, get_instance_id()); if (is_inside_tree()) { RS::get_singleton()->instance_set_scenario(bm.instance, get_world_3d()->get_scenario()); @@ -1388,7 +1372,7 @@ void GridMap::_update_octant_navigation_debug_edge_connections_mesh(const Octant Vector<Vector3> vertex_array; - for (KeyValue<IndexKey, Octant::NavMesh> &F : g.navmesh_ids) { + for (KeyValue<IndexKey, Octant::NavigationCell> &F : g.navigation_cell_ids) { if (cell_map.has(F.key) && F.value.region.is_valid()) { int connections_count = NavigationServer3D::get_singleton()->region_get_connections_count(F.value.region); if (connections_count == 0) { diff --git a/modules/gridmap/grid_map.h b/modules/gridmap/grid_map.h index 6a53457d25..2a9f34bdda 100644 --- a/modules/gridmap/grid_map.h +++ b/modules/gridmap/grid_map.h @@ -95,10 +95,11 @@ class GridMap : public Node3D { * A GridMap can have multiple Octants. */ struct Octant { - struct NavMesh { + struct NavigationCell { RID region; Transform3D xform; - RID navmesh_debug_instance; + RID navigation_mesh_debug_instance; + uint32_t navigation_layers = 1; }; struct MultimeshInstance { @@ -124,7 +125,7 @@ class GridMap : public Node3D { bool dirty = false; RID static_body; - HashMap<IndexKey, NavMesh> navmesh_ids; + HashMap<IndexKey, NavigationCell> navigation_cell_ids; }; union OctantKey { @@ -150,6 +151,7 @@ class GridMap : public Node3D { uint32_t collision_layer = 1; uint32_t collision_mask = 1; + real_t collision_priority = 1.0; Ref<PhysicsMaterial> physics_material; bool bake_navigation = false; RID map_override; @@ -185,7 +187,7 @@ class GridMap : public Node3D { return Vector3(p_key.x, p_key.y, p_key.z) * cell_size * octant_size; } - void _reset_physic_bodies_collision_filters(); + void _update_physics_bodies_collision_properties(); void _octant_enter_world(const OctantKey &p_key); void _octant_exit_world(const OctantKey &p_key); bool _octant_update(const OctantKey &p_key); @@ -240,6 +242,9 @@ public: void set_collision_mask_value(int p_layer_number, bool p_value); bool get_collision_mask_value(int p_layer_number) const; + void set_collision_priority(real_t p_priority); + real_t get_collision_priority() const; + void set_physics_material(Ref<PhysicsMaterial> p_material); Ref<PhysicsMaterial> get_physics_material() const; @@ -251,12 +256,6 @@ public: void set_navigation_map(RID p_navigation_map); RID get_navigation_map() const; - void set_navigation_layers(uint32_t p_navigation_layers); - uint32_t get_navigation_layers() const; - - void set_navigation_layer_value(int p_layer_number, bool p_value); - bool get_navigation_layer_value(int p_layer_number) const; - void set_mesh_library(const Ref<MeshLibrary> &p_mesh_library); Ref<MeshLibrary> get_mesh_library() const; diff --git a/modules/mono/README.md b/modules/mono/README.md index 366777cfc1..74b4531dfb 100644 --- a/modules/mono/README.md +++ b/modules/mono/README.md @@ -46,10 +46,10 @@ C# solutions during development to avoid mistakes. # Double Precision Support (REAL_T_IS_DOUBLE) -Follow the above instructions but build Godot with the float=64 argument to scons +Follow the above instructions but build Godot with the precision=double argument to scons -When building the NuGet packages, specify `--float=64` - for example: +When building the NuGet packages, specify `--precision=double` - for example: ```sh ./modules/mono/build_scripts/build_assemblies.py --godot-output-dir ./bin \ - --push-nupkgs-local ~/MyLocalNugetSource --float=64 + --push-nupkgs-local ~/MyLocalNugetSource --precision=double ``` diff --git a/modules/mono/build_scripts/build_assemblies.py b/modules/mono/build_scripts/build_assemblies.py index 7343af0b39..0b91cda9b8 100755 --- a/modules/mono/build_scripts/build_assemblies.py +++ b/modules/mono/build_scripts/build_assemblies.py @@ -193,7 +193,7 @@ def run_msbuild(tools: ToolsLocation, sln: str, msbuild_args: Optional[List[str] return subprocess.call(args, env=msbuild_env) -def build_godot_api(msbuild_tool, module_dir, output_dir, push_nupkgs_local, float_size): +def build_godot_api(msbuild_tool, module_dir, output_dir, push_nupkgs_local, precision): target_filenames = [ "GodotSharp.dll", "GodotSharp.pdb", @@ -214,7 +214,7 @@ def build_godot_api(msbuild_tool, module_dir, output_dir, push_nupkgs_local, flo args = ["/restore", "/t:Build", "/p:Configuration=" + build_config, "/p:NoWarn=1591"] if push_nupkgs_local: args += ["/p:ClearNuGetLocalCache=true", "/p:PushNuGetToLocalSource=" + push_nupkgs_local] - if float_size == "64": + if precision == "double": args += ["/p:GodotFloat64=true"] sln = os.path.join(module_dir, "glue/GodotSharp/GodotSharp.sln") @@ -303,12 +303,12 @@ def generate_sdk_package_versions(): f.close() -def build_all(msbuild_tool, module_dir, output_dir, godot_platform, dev_debug, push_nupkgs_local, float_size): +def build_all(msbuild_tool, module_dir, output_dir, godot_platform, dev_debug, push_nupkgs_local, precision): # Generate SdkPackageVersions.props generate_sdk_package_versions() # Godot API - exit_code = build_godot_api(msbuild_tool, module_dir, output_dir, push_nupkgs_local, float_size) + exit_code = build_godot_api(msbuild_tool, module_dir, output_dir, push_nupkgs_local, precision) if exit_code != 0: return exit_code @@ -319,7 +319,7 @@ def build_all(msbuild_tool, module_dir, output_dir, godot_platform, dev_debug, p ) if push_nupkgs_local: args += ["/p:ClearNuGetLocalCache=true", "/p:PushNuGetToLocalSource=" + push_nupkgs_local] - if float_size == "64": + if precision == "double": args += ["/p:GodotFloat64=true"] exit_code = run_msbuild(msbuild_tool, sln=sln, msbuild_args=args) if exit_code != 0: @@ -329,7 +329,7 @@ def build_all(msbuild_tool, module_dir, output_dir, godot_platform, dev_debug, p args = ["/restore", "/t:Build", "/p:Configuration=Release"] if push_nupkgs_local: args += ["/p:ClearNuGetLocalCache=true", "/p:PushNuGetToLocalSource=" + push_nupkgs_local] - if float_size == "64": + if precision == "double": args += ["/p:GodotFloat64=true"] sln = os.path.join(module_dir, "editor/Godot.NET.Sdk/Godot.NET.Sdk.sln") exit_code = run_msbuild(msbuild_tool, sln=sln, msbuild_args=args) @@ -354,7 +354,9 @@ def main(): parser.add_argument("--godot-platform", type=str, default="") parser.add_argument("--mono-prefix", type=str, default="") parser.add_argument("--push-nupkgs-local", type=str, default="") - parser.add_argument("--float", type=str, default="32", choices=["32", "64"], help="Floating-point precision") + parser.add_argument( + "--precision", type=str, default="single", choices=["single", "double"], help="Floating-point precision level" + ) args = parser.parse_args() @@ -378,7 +380,7 @@ def main(): args.godot_platform, args.dev_debug, push_nupkgs_local, - args.float, + args.precision, ) sys.exit(exit_code) diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp index 137fd61a25..eca53c4831 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -73,7 +73,7 @@ static bool _create_project_solution_if_needed() { CSharpLanguage *CSharpLanguage::singleton = nullptr; -GDNativeInstanceBindingCallbacks CSharpLanguage::_instance_binding_callbacks = { +GDExtensionInstanceBindingCallbacks CSharpLanguage::_instance_binding_callbacks = { &_instance_binding_create_callback, &_instance_binding_free_callback, &_instance_binding_reference_callback @@ -1293,7 +1293,7 @@ void CSharpLanguage::_instance_binding_free_callback(void *, void *, void *p_bin } } -GDNativeBool CSharpLanguage::_instance_binding_reference_callback(void *p_token, void *p_binding, GDNativeBool p_reference) { +GDExtensionBool CSharpLanguage::_instance_binding_reference_callback(void *p_token, void *p_binding, GDExtensionBool p_reference) { CRASH_COND(!p_binding); CSharpScriptBinding &script_binding = ((RBMap<Object *, CSharpScriptBinding>::Element *)p_binding)->get(); @@ -2202,7 +2202,7 @@ void CSharpScript::reload_registered_script(Ref<CSharpScript> p_script) { void CSharpScript::update_script_class_info(Ref<CSharpScript> p_script) { bool tool = false; - // TODO: Use GDNative godot_dictionary + // TODO: Use GDExtension godot_dictionary Array methods_array; methods_array.~Array(); Dictionary rpc_functions_dict; @@ -2292,7 +2292,7 @@ bool CSharpScript::can_instantiate() const { // For tool scripts, this will never fire if the class is not found. That's because we // don't know if it's a tool script if we can't find the class to access the attributes. if (extra_cond && !valid) { - ERR_FAIL_V_MSG(false, "Cannot instance script because the associated class could not be found. Script: '" + get_path() + "'."); + ERR_FAIL_V_MSG(false, "Cannot instance script because the associated class could not be found. Script: '" + get_path() + "'. Make sure the script exists and contains a class definition with a name that matches the filename of the script exactly (it's case-sensitive)."); } return valid && extra_cond; diff --git a/modules/mono/csharp_script.h b/modules/mono/csharp_script.h index e5e53acb07..68d374d262 100644 --- a/modules/mono/csharp_script.h +++ b/modules/mono/csharp_script.h @@ -352,9 +352,9 @@ class CSharpLanguage : public ScriptLanguage { static void *_instance_binding_create_callback(void *p_token, void *p_instance); static void _instance_binding_free_callback(void *p_token, void *p_instance, void *p_binding); - static GDNativeBool _instance_binding_reference_callback(void *p_token, void *p_binding, GDNativeBool p_reference); + static GDExtensionBool _instance_binding_reference_callback(void *p_token, void *p_binding, GDExtensionBool p_reference); - static GDNativeInstanceBindingCallbacks _instance_binding_callbacks; + static GDExtensionInstanceBindingCallbacks _instance_binding_callbacks; public: static void *get_instance_binding(Object *p_object); diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/ExportedFields.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/ExportedFields.cs index 9a46b7d164..ccaba4d727 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/ExportedFields.cs +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/ExportedFields.cs @@ -45,7 +45,7 @@ namespace Godot.SourceGenerators.Sample [Export] private Color field_Color = Colors.Aquamarine; [Export] private Plane field_Plane = Plane.PlaneXZ; [Export] private Callable field_Callable = new Callable(Engine.GetMainLoop(), "_process"); - [Export] private SignalInfo field_SignalInfo = new SignalInfo(Engine.GetMainLoop(), "property_list_changed"); + [Export] private Signal field_Signal = new Signal(Engine.GetMainLoop(), "property_list_changed"); // Enums [SuppressMessage("ReSharper", "UnusedMember.Local")] diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/ExportedProperties.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/ExportedProperties.cs index eb83833b40..5afaeb736f 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/ExportedProperties.cs +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators.Sample/ExportedProperties.cs @@ -91,7 +91,7 @@ namespace Godot.SourceGenerators.Sample } } - // Lamda Property + // Lambda Property private String _lamdaProperty_String = "LamdaProperty_String"; [Export] public String LamdaProperty_String @@ -133,7 +133,7 @@ namespace Godot.SourceGenerators.Sample [Export] private Color property_Color { get; set; } = Colors.Aquamarine; [Export] private Plane property_Plane { get; set; } = Plane.PlaneXZ; [Export] private Callable property_Callable { get; set; } = new Callable(Engine.GetMainLoop(), "_process"); - [Export] private SignalInfo property_SignalInfo { get; set; } = new SignalInfo(Engine.GetMainLoop(), "property_list_changed"); + [Export] private Signal property_Signal { get; set; } = new Signal(Engine.GetMainLoop(), "property_list_changed"); // Enums [SuppressMessage("ReSharper", "UnusedMember.Local")] diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/GodotEnums.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/GodotEnums.cs index 88c0e71155..7f1231dbcb 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/GodotEnums.cs +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/GodotEnums.cs @@ -114,22 +114,21 @@ namespace Godot.SourceGenerators RestartIfChanged = 2048, ScriptVariable = 4096, StoreIfNull = 8192, - AnimateAsTrigger = 16384, - UpdateAllIfModified = 32768, - ScriptDefaultValue = 65536, - ClassIsEnum = 131072, - NilIsVariant = 262144, - Internal = 524288, - DoNotShareOnDuplicate = 1048576, - HighEndGfx = 2097152, - NodePathFromSceneRoot = 4194304, - ResourceNotPersistent = 8388608, - KeyingIncrements = 16777216, - DeferredSetResource = 33554432, - EditorInstantiateObject = 67108864, - EditorBasicSetting = 134217728, - ReadOnly = 268435456, - Array = 536870912, + UpdateAllIfModified = 16384, + ScriptDefaultValue = 32768, + ClassIsEnum = 65536, + NilIsVariant = 131072, + Internal = 262144, + DoNotShareOnDuplicate = 524288, + HighEndGfx = 1048576, + NodePathFromSceneRoot = 2097152, + ResourceNotPersistent = 4194304, + KeyingIncrements = 8388608, + DeferredSetResource = 16777216, + EditorInstantiateObject = 33554432, + EditorBasicSetting = 67108864, + ReadOnly = 134217728, + Array = 268435456, Default = 6, DefaultIntl = 38, NoEditor = 2 diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalType.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalType.cs index 15f5803bf0..ee1374d0b9 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalType.cs +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalType.cs @@ -37,7 +37,7 @@ namespace Godot.SourceGenerators Color, Plane, Callable, - SignalInfo, + Signal, // Enums Enum, diff --git a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalUtils.cs b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalUtils.cs index 5b3f677f87..8b2f96036b 100644 --- a/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalUtils.cs +++ b/modules/mono/editor/Godot.NET.Sdk/Godot.SourceGenerators/MarshalUtils.cs @@ -56,7 +56,7 @@ namespace Godot.SourceGenerators MarshalType.Color => VariantType.Color, MarshalType.Plane => VariantType.Plane, MarshalType.Callable => VariantType.Callable, - MarshalType.SignalInfo => VariantType.Signal, + MarshalType.Signal => VariantType.Signal, MarshalType.Enum => VariantType.Int, MarshalType.ByteArray => VariantType.PackedByteArray, MarshalType.Int32Array => VariantType.PackedInt32Array, @@ -147,7 +147,7 @@ namespace Godot.SourceGenerators { Name: "Plane" } => MarshalType.Plane, { Name: "RID" } => MarshalType.RID, { Name: "Callable" } => MarshalType.Callable, - { Name: "SignalInfo" } => MarshalType.SignalInfo, + { Name: "Signal" } => MarshalType.Signal, { Name: "Variant" } => MarshalType.Variant, _ => null }; @@ -304,7 +304,12 @@ namespace Godot.SourceGenerators { return marshalType switch { - // For generic Godot collections, VariantUtils.ConvertTo<T> is slower, so we need this special case + // We need a special case for GodotObjectOrDerived[], because it's not supported by VariantUtils.ConvertTo<T> + MarshalType.GodotObjectOrDerivedArray => + source.Append(VariantUtils, ".ConvertToSystemArrayOfGodotObject<", + ((IArrayTypeSymbol)typeSymbol).ElementType.FullQualifiedNameIncludeGlobal(), ">(", + inputExpr, ")"), + // We need a special case for generic Godot collections and GodotObjectOrDerived[], because VariantUtils.ConvertTo<T> is slower MarshalType.GodotGenericDictionary => source.Append(VariantUtils, ".ConvertToDictionaryObject<", ((INamedTypeSymbol)typeSymbol).TypeArguments[0].FullQualifiedNameIncludeGlobal(), ", ", @@ -324,7 +329,10 @@ namespace Godot.SourceGenerators { return marshalType switch { - // For generic Godot collections, VariantUtils.CreateFrom<T> is slower, so we need this special case + // We need a special case for GodotObjectOrDerived[], because it's not supported by VariantUtils.CreateFrom<T> + MarshalType.GodotObjectOrDerivedArray => + source.Append(VariantUtils, ".CreateFromSystemArrayOfGodotObject(", inputExpr, ")"), + // We need a special case for generic Godot collections and GodotObjectOrDerived[], because VariantUtils.CreateFrom<T> is slower MarshalType.GodotGenericDictionary => source.Append(VariantUtils, ".CreateFromDictionary(", inputExpr, ")"), MarshalType.GodotGenericArray => @@ -339,7 +347,11 @@ namespace Godot.SourceGenerators { return marshalType switch { - // For generic Godot collections, Variant.As<T> is slower, so we need this special case + // We need a special case for GodotObjectOrDerived[], because it's not supported by Variant.As<T> + MarshalType.GodotObjectOrDerivedArray => + source.Append(inputExpr, ".AsGodotObjectArray<", + ((IArrayTypeSymbol)typeSymbol).ElementType.FullQualifiedNameIncludeGlobal(), ">()"), + // We need a special case for generic Godot collections and GodotObjectOrDerived[], because Variant.As<T> is slower MarshalType.GodotGenericDictionary => source.Append(inputExpr, ".AsGodotDictionary<", ((INamedTypeSymbol)typeSymbol).TypeArguments[0].FullQualifiedNameIncludeGlobal(), ", ", @@ -357,7 +369,10 @@ namespace Godot.SourceGenerators { return marshalType switch { - // For generic Godot collections, Variant.From<T> is slower, so we need this special case + // We need a special case for GodotObjectOrDerived[], because it's not supported by Variant.From<T> + MarshalType.GodotObjectOrDerivedArray => + source.Append("global::Godot.Variant.CreateFrom(", inputExpr, ")"), + // We need a special case for generic Godot collections, because Variant.From<T> is slower MarshalType.GodotGenericDictionary or MarshalType.GodotGenericArray => source.Append("global::Godot.Variant.CreateFrom(", inputExpr, ")"), _ => source.Append("global::Godot.Variant.From<", diff --git a/modules/mono/editor/bindings_generator.cpp b/modules/mono/editor/bindings_generator.cpp index 9f0bc3fbe3..6559cbf75d 100644 --- a/modules/mono/editor/bindings_generator.cpp +++ b/modules/mono/editor/bindings_generator.cpp @@ -2489,9 +2489,12 @@ Error BindingsGenerator::_generate_cs_native_calls(const InternalCall &p_icall, if (!ret_void) { if (return_type->cname != name_cache.type_Variant) { + // Usually the return value takes ownership, but in this case the variant is only used + // for conversion to another return type. As such, the local variable takes ownership. r_output << "using godot_variant " << C_LOCAL_VARARG_RET " = "; } else { - r_output << "using godot_variant " << C_LOCAL_RET " = "; + // Variant's [c_out] takes ownership of the variant value + r_output << "godot_variant " << C_LOCAL_RET " = "; } } @@ -3651,7 +3654,7 @@ void BindingsGenerator::_populate_builtin_type_interfaces() { itype.cs_type = itype.proxy_name; itype.cs_in_expr = "%0"; itype.c_in = "%5using %0 %1_in = " C_METHOD_MANAGED_TO_SIGNAL "(in %1);\n"; - itype.c_out = "%5return " C_METHOD_MANAGED_FROM_SIGNAL "(&%1);\n"; + itype.c_out = "%5return " C_METHOD_MANAGED_FROM_SIGNAL "(in %1);\n"; itype.c_arg_in = "&%s_in"; itype.c_type = "godot_signal"; itype.c_type_in = "in " + itype.cs_type; diff --git a/modules/mono/glue/GodotSharp/GodotSharp.sln.DotSettings b/modules/mono/glue/GodotSharp/GodotSharp.sln.DotSettings index ba65b61e95..65f33e43a8 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp.sln.DotSettings +++ b/modules/mono/glue/GodotSharp/GodotSharp.sln.DotSettings @@ -1,7 +1,7 @@ <wpf:ResourceDictionary xml:space="preserve" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:s="clr-namespace:System;assembly=mscorlib" xmlns:ss="urn:shemas-jetbrains-com:settings-storage-xaml" xmlns:wpf="http://schemas.microsoft.com/winfx/2006/xaml/presentation"> <s:String x:Key="/Default/CodeStyle/Naming/CSharpNaming/Abbreviations/=GC/@EntryIndexedValue">GC</s:String> <s:Boolean x:Key="/Default/UserDictionary/Words/=alcs/@EntryIndexedValue">True</s:Boolean> - <s:Boolean x:Key="/Default/UserDictionary/Words/=gdnative/@EntryIndexedValue">True</s:Boolean> + <s:Boolean x:Key="/Default/UserDictionary/Words/=gdextension/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=godotsharp/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=icall/@EntryIndexedValue">True</s:Boolean> <s:Boolean x:Key="/Default/UserDictionary/Words/=quat/@EntryIndexedValue">True</s:Boolean> diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/AssemblyHasScriptsAttribute.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/AssemblyHasScriptsAttribute.cs index b7d633517a..acdae83d2e 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/AssemblyHasScriptsAttribute.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/AssemblyHasScriptsAttribute.cs @@ -1,20 +1,32 @@ using System; +using System.Diagnostics.CodeAnalysis; #nullable enable namespace Godot { /// <summary> - /// An attribute that determines if an assembly has scripts. If so, what types of scripts the assembly has. + /// Attribute that determines that the assembly contains Godot scripts and, optionally, the + /// collection of types that implement scripts; otherwise, retrieving the types requires lookup. /// </summary> [AttributeUsage(AttributeTargets.Assembly)] public class AssemblyHasScriptsAttribute : Attribute { + /// <summary> + /// If the Godot scripts contained in the assembly require lookup + /// and can't rely on <see cref="ScriptTypes"/>. + /// </summary> + [MemberNotNullWhen(false, nameof(ScriptTypes))] public bool RequiresLookup { get; } + + /// <summary> + /// The collection of types that implement a Godot script. + /// </summary> public Type[]? ScriptTypes { get; } /// <summary> - /// Constructs a new AssemblyHasScriptsAttribute instance. + /// Constructs a new AssemblyHasScriptsAttribute instance + /// that requires lookup to get the Godot scripts. /// </summary> public AssemblyHasScriptsAttribute() { @@ -23,9 +35,10 @@ namespace Godot } /// <summary> - /// Constructs a new AssemblyHasScriptsAttribute instance. + /// Constructs a new AssemblyHasScriptsAttribute instance + /// that includes the Godot script types and requires no lookup. /// </summary> - /// <param name="scriptTypes">The specified type(s) of scripts.</param> + /// <param name="scriptTypes">The collection of types that implement a Godot script.</param> public AssemblyHasScriptsAttribute(Type[] scriptTypes) { RequiresLookup = false; diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportAttribute.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportAttribute.cs index 3d204bdf9f..a48d79091f 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportAttribute.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportAttribute.cs @@ -3,23 +3,30 @@ using System; namespace Godot { /// <summary> - /// An attribute used to export objects. + /// Exports the annotated member as a property of the Godot Object. /// </summary> [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] public sealed class ExportAttribute : Attribute { - private PropertyHint hint; - private string hintString; + /// <summary> + /// Optional hint that determines how the property should be handled by the editor. + /// </summary> + public PropertyHint Hint { get; } + + /// <summary> + /// Optional string that can contain additional metadata for the <see cref="Hint"/>. + /// </summary> + public string HintString { get; } /// <summary> /// Constructs a new ExportAttribute Instance. /// </summary> - /// <param name="hint">A hint to the exported object.</param> - /// <param name="hintString">A string representing the exported object.</param> + /// <param name="hint">The hint for the exported property.</param> + /// <param name="hintString">A string that may contain additional metadata for the hint.</param> public ExportAttribute(PropertyHint hint = PropertyHint.None, string hintString = "") { - this.hint = hint; - this.hintString = hintString; + Hint = hint; + HintString = hintString; } } } diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportCategoryAttribute.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportCategoryAttribute.cs index 101e56f8d3..2ae55acd3e 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportCategoryAttribute.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportCategoryAttribute.cs @@ -8,7 +8,10 @@ namespace Godot [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] public sealed class ExportCategoryAttribute : Attribute { - private string name; + /// <summary> + /// Name of the category. + /// </summary> + public string Name { get; } /// <summary> /// Define a new category for the following exported properties. @@ -16,7 +19,7 @@ namespace Godot /// <param name="name">The name of the category.</param> public ExportCategoryAttribute(string name) { - this.name = name; + Name = name; } } } diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportGroupAttribute.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportGroupAttribute.cs index 3bd532cec1..82bd446640 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportGroupAttribute.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportGroupAttribute.cs @@ -1,5 +1,7 @@ using System; +#nullable enable + namespace Godot { /// <summary> @@ -8,8 +10,15 @@ namespace Godot [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] public sealed class ExportGroupAttribute : Attribute { - private string name; - private string prefix; + /// <summary> + /// Name of the group. + /// </summary> + public string Name { get; } + + /// <summary> + /// If provided, the prefix that all properties must have to be considered part of the group. + /// </summary> + public string? Prefix { get; } /// <summary> /// Define a new group for the following exported properties. @@ -18,8 +27,8 @@ namespace Godot /// <param name="prefix">If provided, the group would make group to only consider properties that have this prefix.</param> public ExportGroupAttribute(string name, string prefix = "") { - this.name = name; - this.prefix = prefix; + Name = name; + Prefix = prefix; } } } diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportSubgroupAttribute.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportSubgroupAttribute.cs index 2ae6eb0b68..3282b466f6 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportSubgroupAttribute.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ExportSubgroupAttribute.cs @@ -1,5 +1,7 @@ using System; +#nullable enable + namespace Godot { /// <summary> @@ -8,8 +10,15 @@ namespace Godot [AttributeUsage(AttributeTargets.Field | AttributeTargets.Property)] public sealed class ExportSubgroupAttribute : Attribute { - private string name; - private string prefix; + /// <summary> + /// Name of the subgroup. + /// </summary> + public string Name { get; } + + /// <summary> + /// If provided, the prefix that all properties must have to be considered part of the subgroup. + /// </summary> + public string? Prefix { get; } /// <summary> /// Define a new subgroup for the following exported properties. This helps to organize properties in the Inspector dock. @@ -18,8 +27,8 @@ namespace Godot /// <param name="prefix">If provided, the subgroup would make group to only consider properties that have this prefix.</param> public ExportSubgroupAttribute(string name, string prefix = "") { - this.name = name; - this.prefix = prefix; + Name = name; + Prefix = prefix; } } } diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/RPCAttribute.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/RPCAttribute.cs index fb37838ffa..afee926464 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/RPCAttribute.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/RPCAttribute.cs @@ -19,17 +19,17 @@ namespace Godot /// <summary> /// If the method will also be called locally; otherwise, it is only called remotely. /// </summary> - public bool CallLocal { get; set; } = false; + public bool CallLocal { get; init; } = false; /// <summary> /// Transfer mode for the annotated method. /// </summary> - public MultiplayerPeer.TransferModeEnum TransferMode { get; set; } = MultiplayerPeer.TransferModeEnum.Reliable; + public MultiplayerPeer.TransferModeEnum TransferMode { get; init; } = MultiplayerPeer.TransferModeEnum.Reliable; /// <summary> /// Transfer channel for the annotated mode. /// </summary> - public int TransferChannel { get; set; } = 0; + public int TransferChannel { get; init; } = 0; /// <summary> /// Constructs a <see cref="RPCAttribute"/> instance. diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ScriptPathAttribute.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ScriptPathAttribute.cs index 2c8a53ae1c..f05bcdac38 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ScriptPathAttribute.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Attributes/ScriptPathAttribute.cs @@ -8,6 +8,9 @@ namespace Godot [AttributeUsage(AttributeTargets.Class, AllowMultiple = true)] public class ScriptPathAttribute : Attribute { + /// <summary> + /// File path to the script. + /// </summary> public string Path { get; } /// <summary> diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs index f49023555b..4075a878d2 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Color.cs @@ -1,5 +1,6 @@ using System; using System.Runtime.InteropServices; +using Godot.NativeInterop; namespace Godot { @@ -187,6 +188,19 @@ namespace Godot } /// <summary> + /// Returns the light intensity of the color, as a value between 0.0 and 1.0 (inclusive). + /// This is useful when determining light or dark color. Colors with a luminance smaller + /// than 0.5 can be generally considered dark. + /// Note: <see cref="Luminance"/> relies on the color being in the linear color space to + /// return an accurate relative luminance value. If the color is in the sRGB color space + /// use <see cref="SrgbToLinear"/> to convert it to the linear color space first. + /// </summary> + public readonly float Luminance + { + get { return 0.2126f * r + 0.7152f * g + 0.0722f * b; } + } + + /// <summary> /// Access color components using their index. /// </summary> /// <value> @@ -363,6 +377,35 @@ namespace Godot } /// <summary> + /// Returns the color converted to the sRGB color space. + /// This method assumes the original color is in the linear color space. + /// See also <see cref="SrgbToLinear"/> which performs the opposite operation. + /// </summary> + /// <returns>The sRGB color.</returns> + public readonly Color LinearToSrgb() + { + return new Color( + r < 0.0031308f ? 12.92f * r : (1.0f + 0.055f) * (float)Mathf.Pow(r, 1.0f / 2.4f) - 0.055f, + g < 0.0031308f ? 12.92f * g : (1.0f + 0.055f) * (float)Mathf.Pow(g, 1.0f / 2.4f) - 0.055f, + b < 0.0031308f ? 12.92f * b : (1.0f + 0.055f) * (float)Mathf.Pow(b, 1.0f / 2.4f) - 0.055f, a); + } + + /// <summary> + /// Returns the color converted to linear color space. + /// This method assumes the original color already is in sRGB color space. + /// See also <see cref="LinearToSrgb"/> which performs the opposite operation. + /// </summary> + /// <returns>The color in linear color space.</returns> + public readonly Color SrgbToLinear() + { + return new Color( + r < 0.04045f ? r * (1.0f / 12.92f) : (float)Mathf.Pow((r + 0.055f) * (float)(1.0 / (1.0 + 0.055)), 2.4f), + g < 0.04045f ? g * (1.0f / 12.92f) : (float)Mathf.Pow((g + 0.055f) * (float)(1.0 / (1.0 + 0.055)), 2.4f), + b < 0.04045f ? b * (1.0f / 12.92f) : (float)Mathf.Pow((b + 0.055f) * (float)(1.0 / (1.0 + 0.055)), 2.4f), + a); + } + + /// <summary> /// Returns the color converted to an unsigned 32-bit integer in ABGR /// format (each byte represents a color channel). /// ABGR is the reversed version of the default format. @@ -565,6 +608,10 @@ namespace Godot /// <see cref="Colors"/> constants. /// </summary> /// <param name="code">The HTML color code or color name to construct from.</param> + /// <exception cref="ArgumentOutOfRangeException"> + /// A color cannot be inferred from the given <paramref name="code"/>. + /// It was invalid HTML and a color with that name was not found. + /// </exception> public Color(string code) { if (HtmlIsValid(code)) @@ -597,7 +644,7 @@ namespace Godot /// <exception name="ArgumentOutOfRangeException"> /// <paramref name="rgba"/> color code is invalid. /// </exception> - private static Color FromHTML(ReadOnlySpan<char> rgba) + public static Color FromHTML(ReadOnlySpan<char> rgba) { Color c; if (rgba.Length == 0) @@ -705,28 +752,59 @@ namespace Godot /// the constants defined in <see cref="Colors"/>. /// </summary> /// <param name="name">The name of the color.</param> + /// <exception cref="ArgumentOutOfRangeException"> + /// A color with the given name is not found. + /// </exception> /// <returns>The constructed color.</returns> private static Color Named(string name) { + if (!FindNamedColor(name, out Color color)) + { + throw new ArgumentOutOfRangeException($"Invalid Color Name: {name}"); + } + + return color; + } + + /// <summary> + /// Returns a color according to the standardized name, with the + /// specified alpha value. Supported color names are the same as + /// the constants defined in <see cref="Colors"/>. + /// If a color with the given name is not found, it returns + /// <paramref name="default"/>. + /// </summary> + /// <param name="name">The name of the color.</param> + /// <param name="default"> + /// The default color to return when a color with the given name + /// is not found. + /// </param> + /// <returns>The constructed color.</returns> + private static Color Named(string name, Color @default) + { + if (!FindNamedColor(name, out Color color)) + { + return @default; + } + + return color; + } + + private static bool FindNamedColor(string name, out Color color) + { name = name.Replace(" ", string.Empty); name = name.Replace("-", string.Empty); name = name.Replace("_", string.Empty); name = name.Replace("'", string.Empty); name = name.Replace(".", string.Empty); - name = name.ToUpper(); - - if (!Colors.namedColors.ContainsKey(name)) - { - throw new ArgumentOutOfRangeException($"Invalid Color Name: {name}"); - } + name = name.ToUpperInvariant(); - return Colors.namedColors[name]; + return Colors.namedColors.TryGetValue(name, out color); } /// <summary> - /// Constructs a color from an HSV profile, with values on the - /// range of 0 to 1. This is equivalent to using each of - /// the <c>h</c>/<c>s</c>/<c>v</c> properties, but much more efficient. + /// Constructs a color from an HSV profile. The <paramref name="hue"/>, + /// <paramref name="saturation"/>, and <paramref name="value"/> are typically + /// between 0.0 and 1.0. /// </summary> /// <param name="hue">The HSV hue, typically on the range of 0 to 1.</param> /// <param name="saturation">The HSV saturation, typically on the range of 0 to 1.</param> @@ -841,13 +919,78 @@ namespace Godot return ParseCol4(str, index) * 16 + ParseCol4(str, index + 1); } + /// <summary> + /// Constructs a color from an OK HSL profile. The <paramref name="hue"/>, + /// <paramref name="saturation"/>, and <paramref name="lightness"/> are typically + /// between 0.0 and 1.0. + /// </summary> + /// <param name="hue">The OK HSL hue, typically on the range of 0 to 1.</param> + /// <param name="saturation">The OK HSL saturation, typically on the range of 0 to 1.</param> + /// <param name="lightness">The OK HSL lightness, typically on the range of 0 to 1.</param> + /// <param name="alpha">The alpha (transparency) value, typically on the range of 0 to 1.</param> + /// <returns>The constructed color.</returns> + public static Color FromOkHsl(float hue, float saturation, float lightness, float alpha = 1.0f) + { + return NativeFuncs.godotsharp_color_from_ok_hsl(hue, saturation, lightness, alpha); + } + + /// <summary> + /// Encodes a <see cref="Color"/> from a RGBE9995 format integer. + /// See <see cref="Image.Format.Rgbe9995"/>. + /// </summary> + /// <param name="rgbe">The RGBE9995 encoded color.</param> + /// <returns>The constructed color.</returns> + public static Color FromRgbe9995(uint rgbe) + { + float r = rgbe & 0x1ff; + float g = (rgbe >> 9) & 0x1ff; + float b = (rgbe >> 18) & 0x1ff; + float e = rgbe >> 27; + float m = (float)Mathf.Pow(2.0f, e - 15.0f - 9.0f); + + float rd = r * m; + float gd = g * m; + float bd = b * m; + + return new Color(rd, gd, bd, 1.0f); + } + + /// <summary> + /// Constructs a color from the given string, which can be either an HTML color + /// code or a named color. Returns <paramref name="default"/> if the color cannot + /// be inferred from the string. Supported color names are the same as the + /// <see cref="Colors"/> constants. + /// </summary> + /// <param name="str">The HTML color code or color name.</param> + /// <param name="default">The fallback color to return if the color cannot be inferred.</param> + /// <returns>The constructed color.</returns> + public static Color FromString(string str, Color @default) + { + if (HtmlIsValid(str)) + { + return FromHTML(str); + } + else + { + return Named(str, @default); + } + } + private static string ToHex32(float val) { byte b = (byte)Mathf.RoundToInt(Mathf.Clamp(val * 255, 0, 255)); return b.HexEncode(); } - internal static bool HtmlIsValid(ReadOnlySpan<char> color) + /// <summary> + /// Returns <see langword="true"/> if <paramref name="color"/> is a valid HTML hexadecimal + /// color string. The string must be a hexadecimal value (case-insensitive) of either 3, + /// 4, 6 or 8 digits, and may be prefixed by a hash sign (<c>#</c>). This method is + /// identical to <see cref="StringExtensions.IsValidHtmlColor(string)"/>. + /// </summary> + /// <param name="color">The HTML hexadecimal color string.</param> + /// <returns>Whether or not the string was a valid HTML hexadecimal color string.</returns> + public static bool HtmlIsValid(ReadOnlySpan<char> color) { if (color.IsEmpty) { diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/DelegateUtils.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/DelegateUtils.cs index a3cfecfaa6..d94fbff331 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/DelegateUtils.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/DelegateUtils.cs @@ -613,8 +613,8 @@ namespace Godot return VariantUtils.CreateFrom(plane); case Callable callable: return VariantUtils.CreateFrom(callable); - case SignalInfo signalInfo: - return VariantUtils.CreateFrom(signalInfo); + case Signal signal: + return VariantUtils.CreateFrom(signal); case string @string: return VariantUtils.CreateFrom(@string); case byte[] byteArray: @@ -705,7 +705,7 @@ namespace Godot [typeof(Color)] = (in godot_variant variant) => VariantUtils.ConvertTo<Color>(variant), [typeof(Plane)] = (in godot_variant variant) => VariantUtils.ConvertTo<Plane>(variant), [typeof(Callable)] = (in godot_variant variant) => VariantUtils.ConvertTo<Callable>(variant), - [typeof(SignalInfo)] = (in godot_variant variant) => VariantUtils.ConvertTo<SignalInfo>(variant), + [typeof(Signal)] = (in godot_variant variant) => VariantUtils.ConvertTo<Signal>(variant), [typeof(string)] = (in godot_variant variant) => VariantUtils.ConvertTo<string>(variant), [typeof(byte[])] = (in godot_variant variant) => VariantUtils.ConvertTo<byte[]>(variant), [typeof(int[])] = (in godot_variant variant) => VariantUtils.ConvertTo<int[]>(variant), @@ -739,6 +739,26 @@ namespace Godot if (typeof(Godot.Object).IsAssignableFrom(type)) return Convert.ChangeType(VariantUtils.ConvertTo<Godot.Object>(variant), type); + if (typeof(Godot.Object[]).IsAssignableFrom(type)) + { + static Godot.Object[] ConvertToSystemArrayOfGodotObject(in godot_array nativeArray, Type type) + { + var array = Collections.Array.CreateTakingOwnershipOfDisposableValue( + NativeFuncs.godotsharp_array_new_copy(nativeArray)); + + int length = array.Count; + var ret = (Godot.Object[])Activator.CreateInstance(type, length)!; + + for (int i = 0; i < length; i++) + ret[i] = array[i].AsGodotObject(); + + return ret; + } + + using var godotArray = NativeFuncs.godotsharp_variant_as_array(variant); + return Convert.ChangeType(ConvertToSystemArrayOfGodotObject(godotArray, type), type); + } + if (type.IsEnum) { var enumUnderlyingType = type.GetEnumUnderlyingType(); diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/Marshaling.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/Marshaling.cs index 6176093bc1..0d9a698af0 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/Marshaling.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/Marshaling.cs @@ -99,7 +99,7 @@ namespace Godot.NativeInterop if (type == typeof(Callable)) return Variant.Type.Callable; - if (type == typeof(SignalInfo)) + if (type == typeof(Signal)) return Variant.Type.Signal; if (type.IsEnum) @@ -288,9 +288,9 @@ namespace Godot.NativeInterop return new Callable(); } - // SignalInfo + // Signal - public static godot_signal ConvertSignalToNative(in SignalInfo p_managed_signal) + public static godot_signal ConvertSignalToNative(in Signal p_managed_signal) { ulong ownerId = p_managed_signal.Owner.GetInstanceId(); godot_string_name name; @@ -308,12 +308,12 @@ namespace Godot.NativeInterop return new godot_signal(name, ownerId); } - public static SignalInfo ConvertSignalToManaged(in godot_signal p_signal) + public static Signal ConvertSignalToManaged(in godot_signal p_signal) { var owner = GD.InstanceFromId(p_signal.ObjectId); var name = StringName.CreateTakingOwnershipOfDisposableValue( NativeFuncs.godotsharp_string_name_new_copy(p_signal.Name)); - return new SignalInfo(owner, name); + return new Signal(owner, name); } // Array @@ -333,22 +333,6 @@ namespace Godot.NativeInterop return ret; } - // TODO: This needs reflection. Look for an alternative. - internal static Godot.Object[] ConvertNativeGodotArrayToSystemArrayOfGodotObjectType(in godot_array p_array, - Type type) - { - var array = Collections.Array.CreateTakingOwnershipOfDisposableValue( - NativeFuncs.godotsharp_array_new_copy(p_array)); - - int length = array.Count; - var ret = (Godot.Object[])Activator.CreateInstance(type, length)!; - - for (int i = 0; i < length; i++) - ret[i] = array[i].AsGodotObject(); - - return ret; - } - internal static StringName[] ConvertNativeGodotArrayToSystemArrayOfStringName(in godot_array p_array) { var array = Collections.Array.CreateTakingOwnershipOfDisposableValue( diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/NativeFuncs.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/NativeFuncs.cs index c7deb6423b..57488bd586 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/NativeFuncs.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/NativeFuncs.cs @@ -153,6 +153,8 @@ namespace Godot.NativeInterop internal static partial void godotsharp_callable_call_deferred(in godot_callable p_callable, godot_variant** p_args, int p_arg_count); + internal static partial Color godotsharp_color_from_ok_hsl(float p_h, float p_s, float p_l, float p_alpha); + // GDNative functions // gdnative.h diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/VariantUtils.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/VariantUtils.cs index ba8e7a6c65..6a4717f2c3 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/VariantUtils.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/VariantUtils.cs @@ -102,7 +102,7 @@ namespace Godot.NativeInterop => new() { Type = Variant.Type.Signal, Signal = from }; [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static godot_variant CreateFromSignalInfo(SignalInfo from) + public static godot_variant CreateFromSignal(Signal from) => CreateFromSignalTakingOwnershipOfDisposableValue( Marshaling.ConvertSignalToNative(from)); @@ -486,7 +486,7 @@ namespace Godot.NativeInterop => NativeFuncs.godotsharp_variant_as_signal(p_var); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static SignalInfo ConvertToSignalInfo(in godot_variant p_var) + public static Signal ConvertToSignalManaged(in godot_variant p_var) => Marshaling.ConvertSignalToManaged(ConvertToSignal(p_var)); public static godot_array ConvertToArray(in godot_variant p_var) @@ -594,12 +594,5 @@ namespace Godot.NativeInterop using var godotArray = NativeFuncs.godotsharp_variant_as_array(p_var); return Marshaling.ConvertNativeGodotArrayToSystemArrayOfGodotObjectType<T>(godotArray); } - - // ReSharper disable once RedundantNameQualifier - public static Godot.Object[] ConvertToSystemArrayOfGodotObject(in godot_variant p_var, Type type) - { - using var godotArray = NativeFuncs.godotsharp_variant_as_array(p_var); - return Marshaling.ConvertNativeGodotArrayToSystemArrayOfGodotObjectType(godotArray, type); - } } } diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/VariantUtils.generic.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/VariantUtils.generic.cs index 80ef2a1ea1..ebfc713ee4 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/VariantUtils.generic.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/VariantUtils.generic.cs @@ -92,6 +92,9 @@ public partial class VariantUtils if (typeof(T) == typeof(Transform2D)) return CreateFromTransform2D(UnsafeAs<Transform2D>(from)); + if (typeof(T) == typeof(Projection)) + return CreateFromProjection(UnsafeAs<Projection>(from)); + if (typeof(T) == typeof(Vector3)) return CreateFromVector3(UnsafeAs<Vector3>(from)); @@ -125,8 +128,8 @@ public partial class VariantUtils if (typeof(T) == typeof(Callable)) return CreateFromCallable(UnsafeAs<Callable>(from)); - if (typeof(T) == typeof(SignalInfo)) - return CreateFromSignalInfo(UnsafeAs<SignalInfo>(from)); + if (typeof(T) == typeof(Signal)) + return CreateFromSignal(UnsafeAs<Signal>(from)); if (typeof(T) == typeof(string)) return CreateFromString(UnsafeAs<string>(from)); @@ -293,6 +296,9 @@ public partial class VariantUtils if (typeof(T) == typeof(Transform3D)) return UnsafeAsT(ConvertToTransform3D(variant)); + if (typeof(T) == typeof(Projection)) + return UnsafeAsT(ConvertToProjection(variant)); + if (typeof(T) == typeof(Vector4)) return UnsafeAsT(ConvertToVector4(variant)); @@ -311,8 +317,8 @@ public partial class VariantUtils if (typeof(T) == typeof(Callable)) return UnsafeAsT(ConvertToCallableManaged(variant)); - if (typeof(T) == typeof(SignalInfo)) - return UnsafeAsT(ConvertToSignalInfo(variant)); + if (typeof(T) == typeof(Signal)) + return UnsafeAsT(ConvertToSignalManaged(variant)); if (typeof(T) == typeof(string)) return UnsafeAsT(ConvertToStringObject(variant)); diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Projection.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Projection.cs index 8b1b73fcc3..fd37f8d9e8 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Projection.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Projection.cs @@ -652,7 +652,7 @@ namespace Godot /// added to the first and second values of the final column respectively. /// </summary> /// <param name="offset">The offset to apply to the projection.</param> - /// <returns>The offseted projection.</returns> + /// <returns>The offsetted projection.</returns> public readonly Projection JitterOffseted(Vector2 offset) { Projection proj = this; diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/SignalInfo.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Signal.cs index 3f50df0a0d..f9b8f06603 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/SignalInfo.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Signal.cs @@ -3,7 +3,7 @@ namespace Godot /// <summary> /// Represents a signal defined in an object. /// </summary> - public readonly struct SignalInfo + public readonly struct Signal : IAwaitable<Variant[]> { private readonly Object _owner; private readonly StringName _signalName; @@ -18,15 +18,20 @@ namespace Godot public StringName Name => _signalName; /// <summary> - /// Creates a new <see cref="SignalInfo"/> with the name <paramref name="name"/> + /// Creates a new <see cref="Signal"/> with the name <paramref name="name"/> /// in the specified <paramref name="owner"/>. /// </summary> /// <param name="owner">Object that contains the signal.</param> /// <param name="name">Name of the signal.</param> - public SignalInfo(Object owner, StringName name) + public Signal(Object owner, StringName name) { _owner = owner; _signalName = name; } + + public IAwaiter<Variant[]> GetAwaiter() + { + return new SignalAwaiter(_owner, _signalName, _owner); + } } } diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/Variant.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/Variant.cs index 49a363cef2..c4c53a39f9 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/Core/Variant.cs +++ b/modules/mono/glue/GodotSharp/GodotSharp/Core/Variant.cs @@ -137,7 +137,7 @@ public partial struct Variant : IDisposable Type.Rid => AsRID(), Type.Object => AsGodotObject(), Type.Callable => AsCallable(), - Type.Signal => AsSignalInfo(), + Type.Signal => AsSignal(), Type.Dictionary => AsGodotDictionary(), Type.Array => AsGodotArray(), Type.PackedByteArray => AsByteArray(), @@ -283,8 +283,8 @@ public partial struct Variant : IDisposable VariantUtils.ConvertToCallableManaged((godot_variant)NativeVar); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public SignalInfo AsSignalInfo() => - VariantUtils.ConvertToSignalInfo((godot_variant)NativeVar); + public Signal AsSignal() => + VariantUtils.ConvertToSignalManaged((godot_variant)NativeVar); [MethodImpl(MethodImplOptions.AggressiveInlining)] public byte[] AsByteArray() => @@ -464,7 +464,7 @@ public partial struct Variant : IDisposable public static explicit operator Callable(Variant from) => from.AsCallable(); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static explicit operator SignalInfo(Variant from) => from.AsSignalInfo(); + public static explicit operator Signal(Variant from) => from.AsSignal(); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static explicit operator byte[](Variant from) => from.AsByteArray(); @@ -614,7 +614,7 @@ public partial struct Variant : IDisposable public static Variant CreateFrom(Callable from) => from; [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static Variant CreateFrom(SignalInfo from) => from; + public static Variant CreateFrom(Signal from) => from; [MethodImpl(MethodImplOptions.AggressiveInlining)] public static Variant CreateFrom(Span<byte> from) => from; @@ -804,8 +804,8 @@ public partial struct Variant : IDisposable CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromCallable(from)); [MethodImpl(MethodImplOptions.AggressiveInlining)] - public static implicit operator Variant(SignalInfo from) => - CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromSignalInfo(from)); + public static implicit operator Variant(Signal from) => + CreateTakingOwnershipOfDisposableValue(VariantUtils.CreateFromSignal(from)); [MethodImpl(MethodImplOptions.AggressiveInlining)] public static implicit operator Variant(byte[] from) => diff --git a/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj b/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj index 503e5abe37..644212c74d 100644 --- a/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj +++ b/modules/mono/glue/GodotSharp/GodotSharp/GodotSharp.csproj @@ -116,7 +116,7 @@ <Compile Include="Core\NativeInterop\NativeFuncs.cs" /> <Compile Include="Core\NativeInterop\InteropStructs.cs" /> <Compile Include="Core\NativeInterop\Marshaling.cs" /> - <Compile Include="Core\SignalInfo.cs" /> + <Compile Include="Core\Signal.cs" /> <Compile Include="Core\SignalAwaiter.cs" /> <Compile Include="Core\StringExtensions.cs" /> <Compile Include="Core\StringName.cs" /> diff --git a/modules/mono/glue/runtime_interop.cpp b/modules/mono/glue/runtime_interop.cpp index 338e5a0147..a3280a0739 100644 --- a/modules/mono/glue/runtime_interop.cpp +++ b/modules/mono/glue/runtime_interop.cpp @@ -514,6 +514,13 @@ void godotsharp_callable_call_deferred(Callable *p_callable, const Variant **p_a p_callable->call_deferredp(p_args, p_arg_count); } +godot_color godotsharp_color_from_ok_hsl(float p_h, float p_s, float p_l, float p_alpha) { + godot_color ret; + Color *dest = (Color *)&ret; + memnew_placement(dest, Color(Color::from_ok_hsl(p_h, p_s, p_l, p_alpha))); + return ret; +} + // GDNative functions // gdnative.h @@ -1345,6 +1352,7 @@ static const void *unmanaged_callbacks[]{ (void *)godotsharp_callable_get_data_for_marshalling, (void *)godotsharp_callable_call, (void *)godotsharp_callable_call_deferred, + (void *)godotsharp_color_from_ok_hsl, (void *)godotsharp_method_bind_ptrcall, (void *)godotsharp_method_bind_call, (void *)godotsharp_variant_new_string_name, diff --git a/modules/multiplayer/doc_classes/MultiplayerSynchronizer.xml b/modules/multiplayer/doc_classes/MultiplayerSynchronizer.xml index 7ed6255a62..af7c345f15 100644 --- a/modules/multiplayer/doc_classes/MultiplayerSynchronizer.xml +++ b/modules/multiplayer/doc_classes/MultiplayerSynchronizer.xml @@ -17,7 +17,7 @@ <param index="0" name="filter" type="Callable" /> <description> Adds a peer visibility filter for this synchronizer. - [code]filter[/code] should take a peer id [int] and return a [bool]. + [code]filter[/code] should take a peer ID [int] and return a [bool]. </description> </method> <method name="get_visibility_for" qualifiers="const"> diff --git a/modules/multiplayer/scene_rpc_interface.cpp b/modules/multiplayer/scene_rpc_interface.cpp index dbf2b3751e..a7e29dfcc7 100644 --- a/modules/multiplayer/scene_rpc_interface.cpp +++ b/modules/multiplayer/scene_rpc_interface.cpp @@ -82,7 +82,7 @@ void SceneRPCInterface::_parse_rpc_config(const Variant &p_config, bool p_for_no Array names = config.keys(); names.sort(); // Ensure ID order for (int i = 0; i < names.size(); i++) { - ERR_CONTINUE(names[i].get_type() != Variant::STRING); + ERR_CONTINUE(names[i].get_type() != Variant::STRING && names[i].get_type() != Variant::STRING_NAME); String name = names[i].operator String(); ERR_CONTINUE(config[name].get_type() != Variant::DICTIONARY); ERR_CONTINUE(!config[name].operator Dictionary().has("rpc_mode")); diff --git a/modules/navigation/godot_navigation_server.cpp b/modules/navigation/godot_navigation_server.cpp index 8ca73a3adb..58a0982425 100644 --- a/modules/navigation/godot_navigation_server.cpp +++ b/modules/navigation/godot_navigation_server.cpp @@ -36,6 +36,8 @@ #include "navigation_mesh_generator.h" #endif +using namespace NavigationUtilities; + /// Creates a struct for each function and a function that once called creates /// an instance of that struct with the submitted parameters. /// Then, that struct is stored in an array; the `sync` function consume that array. @@ -228,7 +230,7 @@ Vector<Vector3> GodotNavigationServer::map_get_path(RID p_map, Vector3 p_origin, const NavMap *map = map_owner.get_or_null(p_map); ERR_FAIL_COND_V(map == nullptr, Vector<Vector3>()); - return map->get_path(p_origin, p_destination, p_optimize, p_navigation_layers); + return map->get_path(p_origin, p_destination, p_optimize, p_navigation_layers, nullptr, nullptr, nullptr); } Vector3 GodotNavigationServer::map_get_closest_point_to_segment(RID p_map, const Vector3 &p_from, const Vector3 &p_to, const bool p_use_collision) const { @@ -383,6 +385,20 @@ real_t GodotNavigationServer::region_get_travel_cost(RID p_region) const { return region->get_travel_cost(); } +COMMAND_2(region_set_owner_id, RID, p_region, ObjectID, p_owner_id) { + NavRegion *region = region_owner.get_or_null(p_region); + ERR_FAIL_COND(region == nullptr); + + region->set_owner_id(p_owner_id); +} + +ObjectID GodotNavigationServer::region_get_owner_id(RID p_region) const { + const NavRegion *region = region_owner.get_or_null(p_region); + ERR_FAIL_COND_V(region == nullptr, ObjectID()); + + return region->get_owner_id(); +} + bool GodotNavigationServer::region_owns_point(RID p_region, const Vector3 &p_point) const { const NavRegion *region = region_owner.get_or_null(p_region); ERR_FAIL_COND_V(region == nullptr, false); @@ -407,20 +423,20 @@ uint32_t GodotNavigationServer::region_get_navigation_layers(RID p_region) const return region->get_navigation_layers(); } -COMMAND_2(region_set_navmesh, RID, p_region, Ref<NavigationMesh>, p_nav_mesh) { +COMMAND_2(region_set_navigation_mesh, RID, p_region, Ref<NavigationMesh>, p_navigation_mesh) { NavRegion *region = region_owner.get_or_null(p_region); ERR_FAIL_COND(region == nullptr); - region->set_mesh(p_nav_mesh); + region->set_mesh(p_navigation_mesh); } -void GodotNavigationServer::region_bake_navmesh(Ref<NavigationMesh> r_mesh, Node *p_node) const { - ERR_FAIL_COND(r_mesh.is_null()); - ERR_FAIL_COND(p_node == nullptr); +void GodotNavigationServer::region_bake_navigation_mesh(Ref<NavigationMesh> p_navigation_mesh, Node *p_root_node) const { + ERR_FAIL_COND(p_navigation_mesh.is_null()); + ERR_FAIL_COND(p_root_node == nullptr); #ifndef _3D_DISABLED - NavigationMeshGenerator::get_singleton()->clear(r_mesh); - NavigationMeshGenerator::get_singleton()->bake(r_mesh, p_node); + NavigationMeshGenerator::get_singleton()->clear(p_navigation_mesh); + NavigationMeshGenerator::get_singleton()->bake(p_navigation_mesh, p_root_node); #endif } @@ -570,6 +586,20 @@ real_t GodotNavigationServer::link_get_travel_cost(const RID p_link) const { return link->get_travel_cost(); } +COMMAND_2(link_set_owner_id, RID, p_link, ObjectID, p_owner_id) { + NavLink *link = link_owner.get_or_null(p_link); + ERR_FAIL_COND(link == nullptr); + + link->set_owner_id(p_owner_id); +} + +ObjectID GodotNavigationServer::link_get_owner_id(RID p_link) const { + const NavLink *link = link_owner.get_or_null(p_link); + ERR_FAIL_COND_V(link == nullptr, ObjectID()); + + return link->get_owner_id(); +} + RID GodotNavigationServer::agent_create() const { GodotNavigationServer *mut_this = const_cast<GodotNavigationServer *>(this); MutexLock lock(mut_this->operations_mutex); @@ -676,14 +706,14 @@ bool GodotNavigationServer::agent_is_map_changed(RID p_agent) const { return agent->is_map_changed(); } -COMMAND_4(agent_set_callback, RID, p_agent, Object *, p_receiver, StringName, p_method, Variant, p_udata) { +COMMAND_4(agent_set_callback, RID, p_agent, ObjectID, p_object_id, StringName, p_method, Variant, p_udata) { RvoAgent *agent = agent_owner.get_or_null(p_agent); ERR_FAIL_COND(agent == nullptr); - agent->set_callback(p_receiver == nullptr ? ObjectID() : p_receiver->get_instance_id(), p_method, p_udata); + agent->set_callback(p_object_id, p_method, p_udata); if (agent->get_map()) { - if (p_receiver == nullptr) { + if (p_object_id == ObjectID()) { agent->get_map()->remove_agent_as_controlled(agent); } else { agent->get_map()->set_agent_as_controlled(agent); @@ -810,20 +840,34 @@ void GodotNavigationServer::process(real_t p_delta_time) { } } -NavigationUtilities::PathQueryResult GodotNavigationServer::_query_path(const NavigationUtilities::PathQueryParameters &p_parameters) const { - NavigationUtilities::PathQueryResult r_query_result; +PathQueryResult GodotNavigationServer::_query_path(const PathQueryParameters &p_parameters) const { + PathQueryResult r_query_result; const NavMap *map = map_owner.get_or_null(p_parameters.map); ERR_FAIL_COND_V(map == nullptr, r_query_result); // run the pathfinding - if (p_parameters.pathfinding_algorithm == NavigationUtilities::PathfindingAlgorithm::PATHFINDING_ALGORITHM_ASTAR) { + if (p_parameters.pathfinding_algorithm == PathfindingAlgorithm::PATHFINDING_ALGORITHM_ASTAR) { // while postprocessing is still part of map.get_path() need to check and route it here for the correct "optimize" post-processing - if (p_parameters.path_postprocessing == NavigationUtilities::PathPostProcessing::PATH_POSTPROCESSING_CORRIDORFUNNEL) { - r_query_result.path = map->get_path(p_parameters.start_position, p_parameters.target_position, true, p_parameters.navigation_layers); - } else if (p_parameters.path_postprocessing == NavigationUtilities::PathPostProcessing::PATH_POSTPROCESSING_EDGECENTERED) { - r_query_result.path = map->get_path(p_parameters.start_position, p_parameters.target_position, false, p_parameters.navigation_layers); + if (p_parameters.path_postprocessing == PathPostProcessing::PATH_POSTPROCESSING_CORRIDORFUNNEL) { + r_query_result.path = map->get_path( + p_parameters.start_position, + p_parameters.target_position, + true, + p_parameters.navigation_layers, + p_parameters.metadata_flags.has_flag(PathMetadataFlags::PATH_INCLUDE_TYPES) ? &r_query_result.path_types : nullptr, + p_parameters.metadata_flags.has_flag(PathMetadataFlags::PATH_INCLUDE_RIDS) ? &r_query_result.path_rids : nullptr, + p_parameters.metadata_flags.has_flag(PathMetadataFlags::PATH_INCLUDE_OWNERS) ? &r_query_result.path_owner_ids : nullptr); + } else if (p_parameters.path_postprocessing == PathPostProcessing::PATH_POSTPROCESSING_EDGECENTERED) { + r_query_result.path = map->get_path( + p_parameters.start_position, + p_parameters.target_position, + false, + p_parameters.navigation_layers, + p_parameters.metadata_flags.has_flag(PathMetadataFlags::PATH_INCLUDE_TYPES) ? &r_query_result.path_types : nullptr, + p_parameters.metadata_flags.has_flag(PathMetadataFlags::PATH_INCLUDE_RIDS) ? &r_query_result.path_rids : nullptr, + p_parameters.metadata_flags.has_flag(PathMetadataFlags::PATH_INCLUDE_OWNERS) ? &r_query_result.path_owner_ids : nullptr); } } else { return r_query_result; diff --git a/modules/navigation/godot_navigation_server.h b/modules/navigation/godot_navigation_server.h index ab5e722d35..6f39420c67 100644 --- a/modules/navigation/godot_navigation_server.h +++ b/modules/navigation/godot_navigation_server.h @@ -125,6 +125,9 @@ public: COMMAND_2(region_set_travel_cost, RID, p_region, real_t, p_travel_cost); virtual real_t region_get_travel_cost(RID p_region) const override; + COMMAND_2(region_set_owner_id, RID, p_region, ObjectID, p_owner_id); + virtual ObjectID region_get_owner_id(RID p_region) const override; + virtual bool region_owns_point(RID p_region, const Vector3 &p_point) const override; COMMAND_2(region_set_map, RID, p_region, RID, p_map); @@ -132,8 +135,8 @@ public: COMMAND_2(region_set_navigation_layers, RID, p_region, uint32_t, p_navigation_layers); virtual uint32_t region_get_navigation_layers(RID p_region) const override; COMMAND_2(region_set_transform, RID, p_region, Transform3D, p_transform); - COMMAND_2(region_set_navmesh, RID, p_region, Ref<NavigationMesh>, p_nav_mesh); - virtual void region_bake_navmesh(Ref<NavigationMesh> r_mesh, Node *p_node) const override; + COMMAND_2(region_set_navigation_mesh, RID, p_region, Ref<NavigationMesh>, p_navigation_mesh); + virtual void region_bake_navigation_mesh(Ref<NavigationMesh> p_navigation_mesh, Node *p_root_node) const override; virtual int region_get_connections_count(RID p_region) const override; virtual Vector3 region_get_connection_pathway_start(RID p_region, int p_connection_id) const override; virtual Vector3 region_get_connection_pathway_end(RID p_region, int p_connection_id) const override; @@ -153,6 +156,8 @@ public: virtual real_t link_get_enter_cost(RID p_link) const override; COMMAND_2(link_set_travel_cost, RID, p_link, real_t, p_travel_cost); virtual real_t link_get_travel_cost(RID p_link) const override; + COMMAND_2(link_set_owner_id, RID, p_link, ObjectID, p_owner_id); + virtual ObjectID link_get_owner_id(RID p_link) const override; virtual RID agent_create() const override; COMMAND_2(agent_set_map, RID, p_agent, RID, p_map); @@ -167,7 +172,7 @@ public: COMMAND_2(agent_set_position, RID, p_agent, Vector3, p_position); COMMAND_2(agent_set_ignore_y, RID, p_agent, bool, p_ignore); virtual bool agent_is_map_changed(RID p_agent) const override; - COMMAND_4_DEF(agent_set_callback, RID, p_agent, Object *, p_receiver, StringName, p_method, Variant, p_udata, Variant()); + COMMAND_4_DEF(agent_set_callback, RID, p_agent, ObjectID, p_object_id, StringName, p_method, Variant, p_udata, Variant()); COMMAND_1(free, RID, p_object); diff --git a/modules/navigation/nav_base.h b/modules/navigation/nav_base.h index 6dfaaf9af4..a3ab77301b 100644 --- a/modules/navigation/nav_base.h +++ b/modules/navigation/nav_base.h @@ -33,6 +33,7 @@ #include "nav_rid.h" #include "nav_utils.h" +#include "servers/navigation/navigation_utilities.h" class NavMap; @@ -41,8 +42,12 @@ protected: uint32_t navigation_layers = 1; float enter_cost = 0.0; float travel_cost = 1.0; + ObjectID owner_id; + NavigationUtilities::PathSegmentType type; public: + NavigationUtilities::PathSegmentType get_type() const { return type; } + void set_navigation_layers(uint32_t p_navigation_layers) { navigation_layers = p_navigation_layers; } uint32_t get_navigation_layers() const { return navigation_layers; } @@ -51,6 +56,9 @@ public: void set_travel_cost(float p_travel_cost) { travel_cost = MAX(p_travel_cost, 0.0); } float get_travel_cost() const { return travel_cost; } + + void set_owner_id(ObjectID p_owner_id) { owner_id = p_owner_id; } + ObjectID get_owner_id() const { return owner_id; } }; #endif // NAV_BASE_H diff --git a/modules/navigation/nav_link.h b/modules/navigation/nav_link.h index 8f51a63951..e9c69286f9 100644 --- a/modules/navigation/nav_link.h +++ b/modules/navigation/nav_link.h @@ -43,6 +43,10 @@ class NavLink : public NavBase { bool link_dirty = true; public: + NavLink() { + type = NavigationUtilities::PathSegmentType::PATH_SEGMENT_TYPE_LINK; + } + void set_map(NavMap *p_map); NavMap *get_map() const { return map; diff --git a/modules/navigation/nav_map.cpp b/modules/navigation/nav_map.cpp index 83862e1e34..8d58c9335d 100644 --- a/modules/navigation/nav_map.cpp +++ b/modules/navigation/nav_map.cpp @@ -38,6 +38,18 @@ #define THREE_POINTS_CROSS_PRODUCT(m_a, m_b, m_c) (((m_c) - (m_a)).cross((m_b) - (m_a))) +// Helper macro +#define APPEND_METADATA(poly) \ + if (r_path_types) { \ + r_path_types->push_back(poly->owner->get_type()); \ + } \ + if (r_path_rids) { \ + r_path_rids->push_back(poly->owner->get_self()); \ + } \ + if (r_path_owners) { \ + r_path_owners->push_back(poly->owner->get_owner_id()); \ + } + void NavMap::set_up(Vector3 p_up) { up = p_up; regenerate_polygons = true; @@ -71,7 +83,18 @@ gd::PointKey NavMap::get_point_key(const Vector3 &p_pos) const { return p; } -Vector<Vector3> NavMap::get_path(Vector3 p_origin, Vector3 p_destination, bool p_optimize, uint32_t p_navigation_layers) const { +Vector<Vector3> NavMap::get_path(Vector3 p_origin, Vector3 p_destination, bool p_optimize, uint32_t p_navigation_layers, Vector<int32_t> *r_path_types, TypedArray<RID> *r_path_rids, Vector<int64_t> *r_path_owners) const { + // Clear metadata outputs. + if (r_path_types) { + r_path_types->clear(); + } + if (r_path_rids) { + r_path_rids->clear(); + } + if (r_path_owners) { + r_path_owners->clear(); + } + // Find the start poly and the end poly on this map. const gd::Polygon *begin_poly = nullptr; const gd::Polygon *end_poly = nullptr; @@ -115,6 +138,24 @@ Vector<Vector3> NavMap::get_path(Vector3 p_origin, Vector3 p_destination, bool p return Vector<Vector3>(); } if (begin_poly == end_poly) { + if (r_path_types) { + r_path_types->resize(2); + r_path_types->write[0] = begin_poly->owner->get_type(); + r_path_types->write[1] = end_poly->owner->get_type(); + } + + if (r_path_rids) { + r_path_rids->resize(2); + (*r_path_rids)[0] = begin_poly->owner->get_self(); + (*r_path_rids)[1] = end_poly->owner->get_self(); + } + + if (r_path_owners) { + r_path_owners->resize(2); + r_path_owners->write[0] = begin_poly->owner->get_owner_id(); + r_path_owners->write[1] = end_poly->owner->get_owner_id(); + } + Vector<Vector3> path; path.resize(2); path.write[0] = begin_point; @@ -296,6 +337,7 @@ Vector<Vector3> NavMap::get_path(Vector3 p_origin, Vector3 p_destination, bool p gd::NavigationPoly *p = apex_poly; path.push_back(end_point); + APPEND_METADATA(end_poly); while (p) { // Set left and right points of the pathway between polygons. @@ -312,7 +354,7 @@ Vector<Vector3> NavMap::get_path(Vector3 p_origin, Vector3 p_destination, bool p left_poly = p; left_portal = left; } else { - clip_path(navigation_polys, path, apex_poly, right_portal, right_poly); + clip_path(navigation_polys, path, apex_poly, right_portal, right_poly, r_path_types, r_path_rids, r_path_owners); apex_point = right_portal; p = right_poly; @@ -320,7 +362,9 @@ Vector<Vector3> NavMap::get_path(Vector3 p_origin, Vector3 p_destination, bool p apex_poly = p; left_portal = apex_point; right_portal = apex_point; + path.push_back(apex_point); + APPEND_METADATA(apex_poly->poly); skip = true; } } @@ -331,7 +375,7 @@ Vector<Vector3> NavMap::get_path(Vector3 p_origin, Vector3 p_destination, bool p right_poly = p; right_portal = right; } else { - clip_path(navigation_polys, path, apex_poly, left_portal, left_poly); + clip_path(navigation_polys, path, apex_poly, left_portal, left_poly, r_path_types, r_path_rids, r_path_owners); apex_point = left_portal; p = left_poly; @@ -339,7 +383,9 @@ Vector<Vector3> NavMap::get_path(Vector3 p_origin, Vector3 p_destination, bool p apex_poly = p; right_portal = apex_point; left_portal = apex_point; + path.push_back(apex_point); + APPEND_METADATA(apex_poly->poly); } } @@ -355,12 +401,23 @@ Vector<Vector3> NavMap::get_path(Vector3 p_origin, Vector3 p_destination, bool p // If the last point is not the begin point, add it to the list. if (path[path.size() - 1] != begin_point) { path.push_back(begin_point); + APPEND_METADATA(begin_poly); } path.reverse(); + if (r_path_types) { + r_path_types->reverse(); + } + if (r_path_rids) { + r_path_rids->reverse(); + } + if (r_path_owners) { + r_path_owners->reverse(); + } } else { path.push_back(end_point); + APPEND_METADATA(end_poly); // Add mid points int np_id = least_cost_id; @@ -369,18 +426,37 @@ Vector<Vector3> NavMap::get_path(Vector3 p_origin, Vector3 p_destination, bool p int prev = navigation_polys[np_id].back_navigation_edge; int prev_n = (navigation_polys[np_id].back_navigation_edge + 1) % navigation_polys[np_id].poly->points.size(); Vector3 point = (navigation_polys[np_id].poly->points[prev].pos + navigation_polys[np_id].poly->points[prev_n].pos) * 0.5; + path.push_back(point); + APPEND_METADATA(navigation_polys[np_id].poly); } else { path.push_back(navigation_polys[np_id].entry); + APPEND_METADATA(navigation_polys[np_id].poly); } np_id = navigation_polys[np_id].back_navigation_poly_id; } path.push_back(begin_point); + APPEND_METADATA(begin_poly); + path.reverse(); + if (r_path_types) { + r_path_types->reverse(); + } + if (r_path_rids) { + r_path_rids->reverse(); + } + if (r_path_owners) { + r_path_owners->reverse(); + } } + // Ensure post conditions (path arrays MUST match in size). + CRASH_COND(r_path_types && path.size() != r_path_types->size()); + CRASH_COND(r_path_rids && path.size() != r_path_rids->size()); + CRASH_COND(r_path_owners && path.size() != r_path_owners->size()); + return path; } @@ -837,7 +913,7 @@ void NavMap::dispatch_callbacks() { } } -void NavMap::clip_path(const LocalVector<gd::NavigationPoly> &p_navigation_polys, Vector<Vector3> &path, const gd::NavigationPoly *from_poly, const Vector3 &p_to_point, const gd::NavigationPoly *p_to_poly) const { +void NavMap::clip_path(const LocalVector<gd::NavigationPoly> &p_navigation_polys, Vector<Vector3> &path, const gd::NavigationPoly *from_poly, const Vector3 &p_to_point, const gd::NavigationPoly *p_to_poly, Vector<int32_t> *r_path_types, TypedArray<RID> *r_path_rids, Vector<int64_t> *r_path_owners) const { Vector3 from = path[path.size() - 1]; if (from.is_equal_approx(p_to_point)) { @@ -863,6 +939,7 @@ void NavMap::clip_path(const LocalVector<gd::NavigationPoly> &p_navigation_polys if (cut_plane.intersects_segment(pathway_start, pathway_end, &inters)) { if (!inters.is_equal_approx(p_to_point) && !inters.is_equal_approx(path[path.size() - 1])) { path.push_back(inters); + APPEND_METADATA(from_poly->poly); } } } diff --git a/modules/navigation/nav_map.h b/modules/navigation/nav_map.h index a3da9fa727..3be13133d2 100644 --- a/modules/navigation/nav_map.h +++ b/modules/navigation/nav_map.h @@ -115,7 +115,7 @@ public: gd::PointKey get_point_key(const Vector3 &p_pos) const; - Vector<Vector3> get_path(Vector3 p_origin, Vector3 p_destination, bool p_optimize, uint32_t p_navigation_layers = 1) const; + Vector<Vector3> get_path(Vector3 p_origin, Vector3 p_destination, bool p_optimize, uint32_t p_navigation_layers, Vector<int32_t> *r_path_types, TypedArray<RID> *r_path_rids, Vector<int64_t> *r_path_owners) const; Vector3 get_closest_point_to_segment(const Vector3 &p_from, const Vector3 &p_to, const bool p_use_collision) const; Vector3 get_closest_point(const Vector3 &p_point) const; Vector3 get_closest_point_normal(const Vector3 &p_point) const; @@ -154,7 +154,7 @@ public: private: void compute_single_step(uint32_t index, RvoAgent **agent); - void clip_path(const LocalVector<gd::NavigationPoly> &p_navigation_polys, Vector<Vector3> &path, const gd::NavigationPoly *from_poly, const Vector3 &p_to_point, const gd::NavigationPoly *p_to_poly) const; + void clip_path(const LocalVector<gd::NavigationPoly> &p_navigation_polys, Vector<Vector3> &path, const gd::NavigationPoly *from_poly, const Vector3 &p_to_point, const gd::NavigationPoly *p_to_poly, Vector<int32_t> *r_path_types, TypedArray<RID> *r_path_rids, Vector<int64_t> *r_path_owners) const; }; #endif // NAV_MAP_H diff --git a/modules/navigation/nav_region.h b/modules/navigation/nav_region.h index 8d2b5aa9eb..3ef3ef5748 100644 --- a/modules/navigation/nav_region.h +++ b/modules/navigation/nav_region.h @@ -48,7 +48,9 @@ class NavRegion : public NavBase { LocalVector<gd::Polygon> polygons; public: - NavRegion() {} + NavRegion() { + type = NavigationUtilities::PathSegmentType::PATH_SEGMENT_TYPE_REGION; + } void scratch_polygons() { polygons_dirty = true; diff --git a/modules/navigation/navigation_mesh_generator.cpp b/modules/navigation/navigation_mesh_generator.cpp index f0d3e329ce..62db6ff4e9 100644 --- a/modules/navigation/navigation_mesh_generator.cpp +++ b/modules/navigation/navigation_mesh_generator.cpp @@ -470,14 +470,14 @@ void NavigationMeshGenerator::_parse_geometry(const Transform3D &p_navmesh_trans } } -void NavigationMeshGenerator::_convert_detail_mesh_to_native_navigation_mesh(const rcPolyMeshDetail *p_detail_mesh, Ref<NavigationMesh> p_nav_mesh) { +void NavigationMeshGenerator::_convert_detail_mesh_to_native_navigation_mesh(const rcPolyMeshDetail *p_detail_mesh, Ref<NavigationMesh> p_navigation_mesh) { Vector<Vector3> nav_vertices; for (int i = 0; i < p_detail_mesh->nverts; i++) { const float *v = &p_detail_mesh->verts[i * 3]; nav_vertices.push_back(Vector3(v[0], v[1], v[2])); } - p_nav_mesh->set_vertices(nav_vertices); + p_navigation_mesh->set_vertices(nav_vertices); for (int i = 0; i < p_detail_mesh->nmeshes; i++) { const unsigned int *m = &p_detail_mesh->meshes[i * 4]; @@ -492,13 +492,13 @@ void NavigationMeshGenerator::_convert_detail_mesh_to_native_navigation_mesh(con nav_indices.write[0] = ((int)(bverts + tris[j * 4 + 0])); nav_indices.write[1] = ((int)(bverts + tris[j * 4 + 2])); nav_indices.write[2] = ((int)(bverts + tris[j * 4 + 1])); - p_nav_mesh->add_polygon(nav_indices); + p_navigation_mesh->add_polygon(nav_indices); } } } void NavigationMeshGenerator::_build_recast_navigation_mesh( - Ref<NavigationMesh> p_nav_mesh, + Ref<NavigationMesh> p_navigation_mesh, #ifdef TOOLS_ENABLED EditorProgress *ep, #endif @@ -528,42 +528,42 @@ void NavigationMeshGenerator::_build_recast_navigation_mesh( rcConfig cfg; memset(&cfg, 0, sizeof(cfg)); - cfg.cs = p_nav_mesh->get_cell_size(); - cfg.ch = p_nav_mesh->get_cell_height(); - cfg.walkableSlopeAngle = p_nav_mesh->get_agent_max_slope(); - cfg.walkableHeight = (int)Math::ceil(p_nav_mesh->get_agent_height() / cfg.ch); - cfg.walkableClimb = (int)Math::floor(p_nav_mesh->get_agent_max_climb() / cfg.ch); - cfg.walkableRadius = (int)Math::ceil(p_nav_mesh->get_agent_radius() / cfg.cs); - cfg.maxEdgeLen = (int)(p_nav_mesh->get_edge_max_length() / p_nav_mesh->get_cell_size()); - cfg.maxSimplificationError = p_nav_mesh->get_edge_max_error(); - cfg.minRegionArea = (int)(p_nav_mesh->get_region_min_size() * p_nav_mesh->get_region_min_size()); - cfg.mergeRegionArea = (int)(p_nav_mesh->get_region_merge_size() * p_nav_mesh->get_region_merge_size()); - cfg.maxVertsPerPoly = (int)p_nav_mesh->get_verts_per_poly(); - cfg.detailSampleDist = MAX(p_nav_mesh->get_cell_size() * p_nav_mesh->get_detail_sample_distance(), 0.1f); - cfg.detailSampleMaxError = p_nav_mesh->get_cell_height() * p_nav_mesh->get_detail_sample_max_error(); - - if (!Math::is_equal_approx((float)cfg.walkableHeight * cfg.ch, p_nav_mesh->get_agent_height())) { + cfg.cs = p_navigation_mesh->get_cell_size(); + cfg.ch = p_navigation_mesh->get_cell_height(); + cfg.walkableSlopeAngle = p_navigation_mesh->get_agent_max_slope(); + cfg.walkableHeight = (int)Math::ceil(p_navigation_mesh->get_agent_height() / cfg.ch); + cfg.walkableClimb = (int)Math::floor(p_navigation_mesh->get_agent_max_climb() / cfg.ch); + cfg.walkableRadius = (int)Math::ceil(p_navigation_mesh->get_agent_radius() / cfg.cs); + cfg.maxEdgeLen = (int)(p_navigation_mesh->get_edge_max_length() / p_navigation_mesh->get_cell_size()); + cfg.maxSimplificationError = p_navigation_mesh->get_edge_max_error(); + cfg.minRegionArea = (int)(p_navigation_mesh->get_region_min_size() * p_navigation_mesh->get_region_min_size()); + cfg.mergeRegionArea = (int)(p_navigation_mesh->get_region_merge_size() * p_navigation_mesh->get_region_merge_size()); + cfg.maxVertsPerPoly = (int)p_navigation_mesh->get_vertices_per_polygon(); + cfg.detailSampleDist = MAX(p_navigation_mesh->get_cell_size() * p_navigation_mesh->get_detail_sample_distance(), 0.1f); + cfg.detailSampleMaxError = p_navigation_mesh->get_cell_height() * p_navigation_mesh->get_detail_sample_max_error(); + + if (!Math::is_equal_approx((float)cfg.walkableHeight * cfg.ch, p_navigation_mesh->get_agent_height())) { WARN_PRINT("Property agent_height is ceiled to cell_height voxel units and loses precision."); } - if (!Math::is_equal_approx((float)cfg.walkableClimb * cfg.ch, p_nav_mesh->get_agent_max_climb())) { + if (!Math::is_equal_approx((float)cfg.walkableClimb * cfg.ch, p_navigation_mesh->get_agent_max_climb())) { WARN_PRINT("Property agent_max_climb is floored to cell_height voxel units and loses precision."); } - if (!Math::is_equal_approx((float)cfg.walkableRadius * cfg.cs, p_nav_mesh->get_agent_radius())) { + if (!Math::is_equal_approx((float)cfg.walkableRadius * cfg.cs, p_navigation_mesh->get_agent_radius())) { WARN_PRINT("Property agent_radius is ceiled to cell_size voxel units and loses precision."); } - if (!Math::is_equal_approx((float)cfg.maxEdgeLen * cfg.cs, p_nav_mesh->get_edge_max_length())) { + if (!Math::is_equal_approx((float)cfg.maxEdgeLen * cfg.cs, p_navigation_mesh->get_edge_max_length())) { WARN_PRINT("Property edge_max_length is rounded to cell_size voxel units and loses precision."); } - if (!Math::is_equal_approx((float)cfg.minRegionArea, p_nav_mesh->get_region_min_size() * p_nav_mesh->get_region_min_size())) { + if (!Math::is_equal_approx((float)cfg.minRegionArea, p_navigation_mesh->get_region_min_size() * p_navigation_mesh->get_region_min_size())) { WARN_PRINT("Property region_min_size is converted to int and loses precision."); } - if (!Math::is_equal_approx((float)cfg.mergeRegionArea, p_nav_mesh->get_region_merge_size() * p_nav_mesh->get_region_merge_size())) { + if (!Math::is_equal_approx((float)cfg.mergeRegionArea, p_navigation_mesh->get_region_merge_size() * p_navigation_mesh->get_region_merge_size())) { WARN_PRINT("Property region_merge_size is converted to int and loses precision."); } - if (!Math::is_equal_approx((float)cfg.maxVertsPerPoly, p_nav_mesh->get_verts_per_poly())) { - WARN_PRINT("Property verts_per_poly is converted to int and loses precision."); + if (!Math::is_equal_approx((float)cfg.maxVertsPerPoly, p_navigation_mesh->get_vertices_per_polygon())) { + WARN_PRINT("Property vertices_per_polygon is converted to int and loses precision."); } - if (p_nav_mesh->get_cell_size() * p_nav_mesh->get_detail_sample_distance() < 0.1f) { + if (p_navigation_mesh->get_cell_size() * p_navigation_mesh->get_detail_sample_distance() < 0.1f) { WARN_PRINT("Property detail_sample_distance is clamped to 0.1 world units as the resulting value from multiplying with cell_size is too low."); } @@ -574,9 +574,9 @@ void NavigationMeshGenerator::_build_recast_navigation_mesh( cfg.bmax[1] = bmax[1]; cfg.bmax[2] = bmax[2]; - AABB baking_aabb = p_nav_mesh->get_filter_baking_aabb(); + AABB baking_aabb = p_navigation_mesh->get_filter_baking_aabb(); if (baking_aabb.has_volume()) { - Vector3 baking_aabb_offset = p_nav_mesh->get_filter_baking_aabb_offset(); + Vector3 baking_aabb_offset = p_navigation_mesh->get_filter_baking_aabb_offset(); cfg.bmin[0] = baking_aabb.position[0] + baking_aabb_offset.x; cfg.bmin[1] = baking_aabb.position[1] + baking_aabb_offset.y; cfg.bmin[2] = baking_aabb.position[2] + baking_aabb_offset.z; @@ -627,13 +627,13 @@ void NavigationMeshGenerator::_build_recast_navigation_mesh( ERR_FAIL_COND(!rcRasterizeTriangles(&ctx, verts, nverts, tris, tri_areas.ptr(), ntris, *hf, cfg.walkableClimb)); } - if (p_nav_mesh->get_filter_low_hanging_obstacles()) { + if (p_navigation_mesh->get_filter_low_hanging_obstacles()) { rcFilterLowHangingWalkableObstacles(&ctx, cfg.walkableClimb, *hf); } - if (p_nav_mesh->get_filter_ledge_spans()) { + if (p_navigation_mesh->get_filter_ledge_spans()) { rcFilterLedgeSpans(&ctx, cfg.walkableHeight, cfg.walkableClimb, *hf); } - if (p_nav_mesh->get_filter_walkable_low_height_spans()) { + if (p_navigation_mesh->get_filter_walkable_low_height_spans()) { rcFilterWalkableLowHeightSpans(&ctx, cfg.walkableHeight, *hf); } @@ -665,10 +665,10 @@ void NavigationMeshGenerator::_build_recast_navigation_mesh( } #endif - if (p_nav_mesh->get_sample_partition_type() == NavigationMesh::SAMPLE_PARTITION_WATERSHED) { + if (p_navigation_mesh->get_sample_partition_type() == NavigationMesh::SAMPLE_PARTITION_WATERSHED) { ERR_FAIL_COND(!rcBuildDistanceField(&ctx, *chf)); ERR_FAIL_COND(!rcBuildRegions(&ctx, *chf, 0, cfg.minRegionArea, cfg.mergeRegionArea)); - } else if (p_nav_mesh->get_sample_partition_type() == NavigationMesh::SAMPLE_PARTITION_MONOTONE) { + } else if (p_navigation_mesh->get_sample_partition_type() == NavigationMesh::SAMPLE_PARTITION_MONOTONE) { ERR_FAIL_COND(!rcBuildRegionsMonotone(&ctx, *chf, 0, cfg.minRegionArea, cfg.mergeRegionArea)); } else { ERR_FAIL_COND(!rcBuildLayerRegions(&ctx, *chf, 0, cfg.minRegionArea)); @@ -710,7 +710,7 @@ void NavigationMeshGenerator::_build_recast_navigation_mesh( } #endif - _convert_detail_mesh_to_native_navigation_mesh(detail_mesh, p_nav_mesh); + _convert_detail_mesh_to_native_navigation_mesh(detail_mesh, p_navigation_mesh); rcFreePolyMesh(poly_mesh); poly_mesh = nullptr; @@ -729,8 +729,8 @@ NavigationMeshGenerator::NavigationMeshGenerator() { NavigationMeshGenerator::~NavigationMeshGenerator() { } -void NavigationMeshGenerator::bake(Ref<NavigationMesh> p_nav_mesh, Node *p_node) { - ERR_FAIL_COND_MSG(!p_nav_mesh.is_valid(), "Invalid navigation mesh."); +void NavigationMeshGenerator::bake(Ref<NavigationMesh> p_navigation_mesh, Node *p_root_node) { + ERR_FAIL_COND_MSG(!p_navigation_mesh.is_valid(), "Invalid navigation mesh."); #ifdef TOOLS_ENABLED EditorProgress *ep(nullptr); @@ -755,17 +755,17 @@ void NavigationMeshGenerator::bake(Ref<NavigationMesh> p_nav_mesh, Node *p_node) List<Node *> parse_nodes; - if (p_nav_mesh->get_source_geometry_mode() == NavigationMesh::SOURCE_GEOMETRY_NAVMESH_CHILDREN) { - parse_nodes.push_back(p_node); + if (p_navigation_mesh->get_source_geometry_mode() == NavigationMesh::SOURCE_GEOMETRY_ROOT_NODE_CHILDREN) { + parse_nodes.push_back(p_root_node); } else { - p_node->get_tree()->get_nodes_in_group(p_nav_mesh->get_source_group_name(), &parse_nodes); + p_root_node->get_tree()->get_nodes_in_group(p_navigation_mesh->get_source_group_name(), &parse_nodes); } - Transform3D navmesh_xform = Object::cast_to<Node3D>(p_node)->get_global_transform().affine_inverse(); + Transform3D navmesh_xform = Object::cast_to<Node3D>(p_root_node)->get_global_transform().affine_inverse(); for (Node *E : parse_nodes) { - NavigationMesh::ParsedGeometryType geometry_type = p_nav_mesh->get_parsed_geometry_type(); - uint32_t collision_mask = p_nav_mesh->get_collision_mask(); - bool recurse_children = p_nav_mesh->get_source_geometry_mode() != NavigationMesh::SOURCE_GEOMETRY_GROUPS_EXPLICIT; + NavigationMesh::ParsedGeometryType geometry_type = p_navigation_mesh->get_parsed_geometry_type(); + uint32_t collision_mask = p_navigation_mesh->get_collision_mask(); + bool recurse_children = p_navigation_mesh->get_source_geometry_mode() != NavigationMesh::SOURCE_GEOMETRY_GROUPS_EXPLICIT; _parse_geometry(navmesh_xform, E, vertices, indices, geometry_type, collision_mask, recurse_children); } @@ -777,7 +777,7 @@ void NavigationMeshGenerator::bake(Ref<NavigationMesh> p_nav_mesh, Node *p_node) rcPolyMeshDetail *detail_mesh = nullptr; _build_recast_navigation_mesh( - p_nav_mesh, + p_navigation_mesh, #ifdef TOOLS_ENABLED ep, #endif @@ -816,16 +816,16 @@ void NavigationMeshGenerator::bake(Ref<NavigationMesh> p_nav_mesh, Node *p_node) #endif } -void NavigationMeshGenerator::clear(Ref<NavigationMesh> p_nav_mesh) { - if (p_nav_mesh.is_valid()) { - p_nav_mesh->clear_polygons(); - p_nav_mesh->set_vertices(Vector<Vector3>()); +void NavigationMeshGenerator::clear(Ref<NavigationMesh> p_navigation_mesh) { + if (p_navigation_mesh.is_valid()) { + p_navigation_mesh->clear_polygons(); + p_navigation_mesh->set_vertices(Vector<Vector3>()); } } void NavigationMeshGenerator::_bind_methods() { - ClassDB::bind_method(D_METHOD("bake", "nav_mesh", "root_node"), &NavigationMeshGenerator::bake); - ClassDB::bind_method(D_METHOD("clear", "nav_mesh"), &NavigationMeshGenerator::clear); + ClassDB::bind_method(D_METHOD("bake", "navigation_mesh", "root_node"), &NavigationMeshGenerator::bake); + ClassDB::bind_method(D_METHOD("clear", "navigation_mesh"), &NavigationMeshGenerator::clear); } #endif diff --git a/modules/navigation/navigation_mesh_generator.h b/modules/navigation/navigation_mesh_generator.h index 8cc1531b53..f6bf39d714 100644 --- a/modules/navigation/navigation_mesh_generator.h +++ b/modules/navigation/navigation_mesh_generator.h @@ -55,9 +55,9 @@ protected: static void _add_faces(const PackedVector3Array &p_faces, const Transform3D &p_xform, Vector<float> &p_vertices, Vector<int> &p_indices); static void _parse_geometry(const Transform3D &p_navmesh_transform, Node *p_node, Vector<float> &p_vertices, Vector<int> &p_indices, NavigationMesh::ParsedGeometryType p_generate_from, uint32_t p_collision_mask, bool p_recurse_children); - static void _convert_detail_mesh_to_native_navigation_mesh(const rcPolyMeshDetail *p_detail_mesh, Ref<NavigationMesh> p_nav_mesh); + static void _convert_detail_mesh_to_native_navigation_mesh(const rcPolyMeshDetail *p_detail_mesh, Ref<NavigationMesh> p_navigation_mesh); static void _build_recast_navigation_mesh( - Ref<NavigationMesh> p_nav_mesh, + Ref<NavigationMesh> p_navigation_mesh, #ifdef TOOLS_ENABLED EditorProgress *ep, #endif @@ -75,8 +75,8 @@ public: NavigationMeshGenerator(); ~NavigationMeshGenerator(); - void bake(Ref<NavigationMesh> p_nav_mesh, Node *p_node); - void clear(Ref<NavigationMesh> p_nav_mesh); + void bake(Ref<NavigationMesh> p_navigation_mesh, Node *p_root_node); + void clear(Ref<NavigationMesh> p_navigation_mesh); }; #endif diff --git a/modules/openxr/action_map/openxr_action.cpp b/modules/openxr/action_map/openxr_action.cpp index 7e02f0374d..634f653376 100644 --- a/modules/openxr/action_map/openxr_action.cpp +++ b/modules/openxr/action_map/openxr_action.cpp @@ -75,6 +75,7 @@ String OpenXRAction::get_name_with_set() const { void OpenXRAction::set_localized_name(const String p_localized_name) { localized_name = p_localized_name; + emit_changed(); } String OpenXRAction::get_localized_name() const { @@ -83,6 +84,7 @@ String OpenXRAction::get_localized_name() const { void OpenXRAction::set_action_type(const OpenXRAction::ActionType p_action_type) { action_type = p_action_type; + emit_changed(); } OpenXRAction::ActionType OpenXRAction::get_action_type() const { @@ -91,6 +93,7 @@ OpenXRAction::ActionType OpenXRAction::get_action_type() const { void OpenXRAction::set_toplevel_paths(const PackedStringArray p_toplevel_paths) { toplevel_paths = p_toplevel_paths; + emit_changed(); } PackedStringArray OpenXRAction::get_toplevel_paths() const { @@ -100,15 +103,18 @@ PackedStringArray OpenXRAction::get_toplevel_paths() const { void OpenXRAction::add_toplevel_path(const String p_toplevel_path) { if (!toplevel_paths.has(p_toplevel_path)) { toplevel_paths.push_back(p_toplevel_path); + emit_changed(); } } void OpenXRAction::rem_toplevel_path(const String p_toplevel_path) { if (toplevel_paths.has(p_toplevel_path)) { toplevel_paths.erase(p_toplevel_path); + emit_changed(); } } void OpenXRAction::parse_toplevel_paths(const String p_toplevel_paths) { toplevel_paths = p_toplevel_paths.split(",", false); + emit_changed(); } diff --git a/modules/openxr/action_map/openxr_action_map.cpp b/modules/openxr/action_map/openxr_action_map.cpp index 123f860ce9..226bfa18ba 100644 --- a/modules/openxr/action_map/openxr_action_map.cpp +++ b/modules/openxr/action_map/openxr_action_map.cpp @@ -95,6 +95,7 @@ void OpenXRActionMap::add_action_set(Ref<OpenXRActionSet> p_action_set) { if (action_sets.find(p_action_set) == -1) { action_sets.push_back(p_action_set); + emit_changed(); } } @@ -102,6 +103,7 @@ void OpenXRActionMap::remove_action_set(Ref<OpenXRActionSet> p_action_set) { int idx = action_sets.find(p_action_set); if (idx != -1) { action_sets.remove_at(idx); + emit_changed(); } } @@ -146,6 +148,7 @@ void OpenXRActionMap::add_interaction_profile(Ref<OpenXRInteractionProfile> p_in if (interaction_profiles.find(p_interaction_profile) == -1) { interaction_profiles.push_back(p_interaction_profile); + emit_changed(); } } @@ -153,6 +156,7 @@ void OpenXRActionMap::remove_interaction_profile(Ref<OpenXRInteractionProfile> p int idx = interaction_profiles.find(p_interaction_profile); if (idx != -1) { interaction_profiles.remove_at(idx); + emit_changed(); } } @@ -489,30 +493,34 @@ Ref<OpenXRAction> OpenXRActionMap::get_action(const String p_path) const { return Ref<OpenXRAction>(); } -void OpenXRActionMap::remove_action(const String p_path) { +void OpenXRActionMap::remove_action(const String p_path, bool p_remove_interaction_profiles) { Ref<OpenXRAction> action = get_action(p_path); if (action.is_valid()) { + for (int i = 0; i < interaction_profiles.size(); i++) { + Ref<OpenXRInteractionProfile> interaction_profile = interaction_profiles[i]; + + if (p_remove_interaction_profiles) { + // Remove any bindings for this action + interaction_profile->remove_binding_for_action(action); + } else { + ERR_FAIL_COND(interaction_profile->has_binding_for_action(action)); + } + } + OpenXRActionSet *action_set = action->get_action_set(); if (action_set != nullptr) { // Remove the action from this action set action_set->remove_action(action); } - - for (int i = 0; i < interaction_profiles.size(); i++) { - Ref<OpenXRInteractionProfile> interaction_profile = interaction_profiles[i]; - - // Remove any bindings for this action - interaction_profile->remove_binding_for_action(action); - } } } -PackedStringArray OpenXRActionMap::get_top_level_paths(Ref<OpenXRAction> p_action) { +PackedStringArray OpenXRActionMap::get_top_level_paths(const Ref<OpenXRAction> p_action) { PackedStringArray arr; for (int i = 0; i < interaction_profiles.size(); i++) { Ref<OpenXRInteractionProfile> ip = interaction_profiles[i]; - const OpenXRDefs::InteractionProfile *profile = OpenXRDefs::get_profile(ip->get_interaction_profile_path()); + const OpenXRInteractionProfileMetaData::InteractionProfile *profile = OpenXRInteractionProfileMetaData::get_singleton()->get_profile(ip->get_interaction_profile_path()); if (profile != nullptr) { for (int j = 0; j < ip->get_binding_count(); j++) { @@ -521,9 +529,9 @@ PackedStringArray OpenXRActionMap::get_top_level_paths(Ref<OpenXRAction> p_actio PackedStringArray paths = binding->get_paths(); for (int k = 0; k < paths.size(); k++) { - const OpenXRDefs::IOPath *io_path = profile->get_io_path(paths[k]); + const OpenXRInteractionProfileMetaData::IOPath *io_path = profile->get_io_path(paths[k]); if (io_path != nullptr) { - String top_path = String(io_path->top_level_path->openxr_path); + String top_path = io_path->top_level_path; if (!arr.has(top_path)) { arr.push_back(top_path); @@ -535,7 +543,7 @@ PackedStringArray OpenXRActionMap::get_top_level_paths(Ref<OpenXRAction> p_actio } } - print_line("Toplevel paths for", p_action->get_name_with_set(), "are", arr); + // print_line("Toplevel paths for", p_action->get_name_with_set(), "are", arr); return arr; } diff --git a/modules/openxr/action_map/openxr_action_map.h b/modules/openxr/action_map/openxr_action_map.h index 8659cd3942..43a4d741f4 100644 --- a/modules/openxr/action_map/openxr_action_map.h +++ b/modules/openxr/action_map/openxr_action_map.h @@ -71,8 +71,8 @@ public: // Helper functions for editor Ref<OpenXRAction> get_action(const String p_path) const; // Retrieve an action using <action name>/<action> as our parameter - void remove_action(const String p_path); // Remove action from action set, also removes it from interaction profiles - PackedStringArray get_top_level_paths(Ref<OpenXRAction> p_action); // Determines the top level paths based on where an action is bound in interaction profiles + void remove_action(const String p_path, bool p_remove_interaction_profiles = false); // Remove action from action set, also removes it from interaction profiles + PackedStringArray get_top_level_paths(const Ref<OpenXRAction> p_action); // Determines the top level paths based on where an action is bound in interaction profiles // TODO add validation to display in the interface that checks if we have action sets with the same name or if we have interaction profiles for the same path diff --git a/modules/openxr/action_map/openxr_action_set.cpp b/modules/openxr/action_map/openxr_action_set.cpp index be45218300..f46ac4a5ce 100644 --- a/modules/openxr/action_map/openxr_action_set.cpp +++ b/modules/openxr/action_map/openxr_action_set.cpp @@ -62,6 +62,7 @@ Ref<OpenXRActionSet> OpenXRActionSet::new_action_set(const char *p_name, const c void OpenXRActionSet::set_localized_name(const String p_localized_name) { localized_name = p_localized_name; + emit_changed(); } String OpenXRActionSet::get_localized_name() const { @@ -70,6 +71,7 @@ String OpenXRActionSet::get_localized_name() const { void OpenXRActionSet::set_priority(const int p_priority) { priority = p_priority; + emit_changed(); } int OpenXRActionSet::get_priority() const { @@ -82,11 +84,16 @@ int OpenXRActionSet::get_action_count() const { void OpenXRActionSet::clear_actions() { // Actions held within our action set should be released and destroyed but just in case they are still used some where else + if (actions.size() == 0) { + return; + } + for (int i = 0; i < actions.size(); i++) { Ref<OpenXRAction> action = actions[i]; action->action_set = nullptr; } actions.clear(); + emit_changed(); } void OpenXRActionSet::set_actions(Array p_actions) { @@ -125,6 +132,7 @@ void OpenXRActionSet::add_action(Ref<OpenXRAction> p_action) { p_action->action_set = this; actions.push_back(p_action); + emit_changed(); } } @@ -135,6 +143,8 @@ void OpenXRActionSet::remove_action(Ref<OpenXRAction> p_action) { ERR_FAIL_COND_MSG(p_action->action_set != this, "Removing action that belongs to this action set but had incorrect action set pointer."); // this should never happen! p_action->action_set = nullptr; + + emit_changed(); } } diff --git a/modules/openxr/action_map/openxr_defs.cpp b/modules/openxr/action_map/openxr_defs.cpp deleted file mode 100644 index 59ce829f1b..0000000000 --- a/modules/openxr/action_map/openxr_defs.cpp +++ /dev/null @@ -1,671 +0,0 @@ -/*************************************************************************/ -/* openxr_defs.cpp */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#include "openxr_defs.h" - -// Our top level paths to which devices can be bound -OpenXRDefs::TopLevelPath OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_TOP_LEVEL_PATH_MAX] = { - // Core OpenXR paths - { "Left hand controller", "/user/hand/left" }, - { "Right hand controller", "/user/hand/right" }, - { "Head", "/user/head" }, - { "Gamepad", "/user/gamepad" }, - { "Treadmill", "/user/treadmill" }, - - // Specific to HTC tracker extension - // { "Handheld object tracker", "/user/vive_tracker_htcx/role/handheld_object" }, - { "Left foot tracker", "/user/vive_tracker_htcx/role/left_foot" }, - { "Right foot tracker", "/user/vive_tracker_htcx/role/right_foot" }, - { "Left shoulder tracker", "/user/vive_tracker_htcx/role/left_shoulder" }, - { "Right shoulder tracker", "/user/vive_tracker_htcx/role/right_shoulder" }, - { "Left elbow tracker", "/user/vive_tracker_htcx/role/left_elbow" }, - { "Right elbow tracker", "/user/vive_tracker_htcx/role/right_elbow" }, - { "Left knee tracker", "/user/vive_tracker_htcx/role/left_knee" }, - { "Right knee tracker", "/user/vive_tracker_htcx/role/right_knee" }, - { "Waist tracker", "/user/vive_tracker_htcx/role/waist" }, - { "Chest tracker", "/user/vive_tracker_htcx/role/chest" }, - { "Camera tracker", "/user/vive_tracker_htcx/role/camera" }, - { "Keyboard tracker", "/user/vive_tracker_htcx/role/keyboard" }, - -}; - -// Fallback Khronos simple controller -OpenXRDefs::IOPath OpenXRDefs::simple_io_paths[] = { - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Select click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/select/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Select click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/select/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, -}; - -// Original HTC Vive wands -OpenXRDefs::IOPath OpenXRDefs::vive_io_paths[] = { - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "System click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/system/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "System click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/system/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, -}; - -// Microsoft motion controller (original WMR controllers) -OpenXRDefs::IOPath OpenXRDefs::motion_io_paths[] = { - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Thumbstick", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Thumbstick click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Thumbstick click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, -}; - -// HP MR controller (newer G2 controllers) -OpenXRDefs::IOPath OpenXRDefs::hpmr_io_paths[] = { - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "X click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/x/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Y click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/y/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "A click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/a/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "B click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/b/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Squeeze", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/squeeze/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Squeeze", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/squeeze/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - - { "Thumbstick", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Thumbstick click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Thumbstick click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, -}; - -// Meta touch controller (original touch controllers, Quest 1 and Quest 2 controllers) -OpenXRDefs::IOPath OpenXRDefs::touch_io_paths[] = { - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "System click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/system/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "X click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/x/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "X touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/x/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Y click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/y/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Y touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/y/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "A click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/a/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "A touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/a/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "B click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/b/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "B touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/b/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Squeeze", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/squeeze/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Squeeze", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/squeeze/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - - { "Thumbstick", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Thumbstick click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Thumbstick click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, -}; - -// Valve index controller -OpenXRDefs::IOPath OpenXRDefs::index_io_paths[] = { - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - - { "System click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/system/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "System click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/system/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "A click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/a/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "A touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/a/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "A click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/a/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "A touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/a/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "B click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/b/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "B touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/b/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "B click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/b/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "B touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/b/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Squeeze", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/squeeze/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Squeeze", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/squeeze/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - - { "Thumbstick", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Thumbstick click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Thumbstick click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad force", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad/force", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad force", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad/force", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, -}; - -// Samsung odyssey controller -OpenXRDefs::IOPath OpenXRDefs::odyssey_io_paths[] = { - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Thumbstick", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Thumbstick click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Thumbstick click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, -}; - -// Vive Cosmos controller -OpenXRDefs::IOPath OpenXRDefs::vive_cosmos_paths[] = { - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "System click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/system/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "X click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/x/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Y click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/y/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "A click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/a/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "B click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/b/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Shoulder click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/right/input/shoulder/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Shoulder click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/shoulder/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Thumbstick", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Thumbstick click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Thumbstick click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, -}; - -// Vive Focus 3 controller -OpenXRDefs::IOPath OpenXRDefs::vive_focus3_paths[] = { - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "System click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/system/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "X click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/x/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Y click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/y/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "A click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/a/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "B click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/b/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/touch ", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/squeeze/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/squeeze/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Thumbstick", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Thumbstick click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/thumbstick/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Thumbstick click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Thumbstick touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbstick/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Thumbrest touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/thumbrest/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, -}; - -// Huawei controller -OpenXRDefs::IOPath OpenXRDefs::huawei_controller_paths[] = { - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Aim pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/aim/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Palm pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/palm_ext/pose", OpenXRAction::OPENXR_ACTION_POSE }, - - { "Home click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/home/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Home click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/home/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Back click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/back/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Back click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/back/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Volume up click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/volume_up/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Volume up click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/volume_up/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Volume down click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/volume_down/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Volume down click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/volume_down/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_LEFT_HAND], "/user/hand/left/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_RIGHT_HAND], "/user/hand/right/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, -}; - -// HTC Vive tracker -// Interestingly enough trackers don't have buttons or inputs, yet these are defined in the spec. -// I think this can be supported through attachments on the trackers. -OpenXRDefs::IOPath OpenXRDefs::vive_tracker_controller_paths[] = { - // { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Menu click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/menu/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - // { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - { "Trigger", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/trigger/value", OpenXRAction::OPENXR_ACTION_FLOAT }, - - // { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trigger click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/trigger/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - // { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Squeeze click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/squeeze/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - // { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - { "Trackpad", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/trackpad", OpenXRAction::OPENXR_ACTION_VECTOR2 }, - - // { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad click", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/trackpad/click", OpenXRAction::OPENXR_ACTION_BOOL }, - - // { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - { "Trackpad touch", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/trackpad/touch", OpenXRAction::OPENXR_ACTION_BOOL }, - - // { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - { "Grip pose", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/input/grip/pose", OpenXRAction::OPENXR_ACTION_POSE }, - - // { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_HANDHELD_TRACKER], "/user/vive_tracker_htcx/role/handheld_object/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/left_foot/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_FOOT_TRACKER], "/user/vive_tracker_htcx/role/right_foot/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/left_shoulder/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_SHOULDER_TRACKER], "/user/vive_tracker_htcx/role/right_shoulder/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/left_elbow/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_ELBOW_TRACKER], "/user/vive_tracker_htcx/role/right_elbow/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_LEFT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/left_knee/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_RIGHT_KNEE_TRACKER], "/user/vive_tracker_htcx/role/right_knee/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_WAIST_TRACKER], "/user/vive_tracker_htcx/role/waist/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CHEST_TRACKER], "/user/vive_tracker_htcx/role/chest/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_CAMERA_TRACKER], "/user/vive_tracker_htcx/role/camera/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, - { "Haptic output", &OpenXRDefs::available_top_level_paths[OpenXRDefs::OPENXR_HTC_KEYBOARD_TRACKER], "/user/vive_tracker_htcx/role/keyboard/output/haptic", OpenXRAction::OPENXR_ACTION_HAPTIC }, -}; - -OpenXRDefs::InteractionProfile OpenXRDefs::available_interaction_profiles[] = { - { - "Simple controller", // display_name - "/interaction_profiles/khr/simple_controller", // openxr_path - simple_io_paths, // io_paths - sizeof(simple_io_paths) / sizeof(OpenXRDefs::IOPath) // io_path_count - }, - { - "HTC Vive wand", // display_name - "/interaction_profiles/htc/vive_controller", // openxr_path - vive_io_paths, // io_paths - sizeof(vive_io_paths) / sizeof(OpenXRDefs::IOPath) // io_path_count - }, - { - "MS Motion controller", // display_name - "/interaction_profiles/microsoft/motion_controller", // openxr_path - motion_io_paths, // io_paths - sizeof(motion_io_paths) / sizeof(OpenXRDefs::IOPath) // io_path_count - }, - { - "HPMR controller", // display_name - "/interaction_profiles/hp/mixed_reality_controller", // openxr_path - hpmr_io_paths, // io_paths - sizeof(hpmr_io_paths) / sizeof(OpenXRDefs::IOPath) // io_path_count - }, - { - "Touch controller", // display_name - "/interaction_profiles/oculus/touch_controller", // openxr_path - touch_io_paths, // io_paths - sizeof(touch_io_paths) / sizeof(OpenXRDefs::IOPath) // io_path_count - }, - { - "Index controller", // display_name - "/interaction_profiles/valve/index_controller", // openxr_path - index_io_paths, // io_paths - sizeof(index_io_paths) / sizeof(OpenXRDefs::IOPath) // io_path_count - }, - { - "Samsung Odyssey controller", // display_name - "/interaction_profiles/samsung/odyssey_controller", // openxr_path - odyssey_io_paths, // io_paths - sizeof(odyssey_io_paths) / sizeof(OpenXRDefs::IOPath) // io_path_count - }, - { - "Vive Cosmos controller", // display_name - "/interaction_profiles/htc/vive_cosmos_controller", // openxr_path - vive_cosmos_paths, // io_paths - sizeof(vive_cosmos_paths) / sizeof(OpenXRDefs::IOPath) // io_path_count - }, - { - "Vive Focus 3 controller", // display_name - "/interaction_profiles/htc/vive_focus3_controller", // openxr_path - vive_focus3_paths, // io_paths - sizeof(vive_focus3_paths) / sizeof(OpenXRDefs::IOPath) // io_path_count - }, - { - "Huawei controller", // display_name - "/interaction_profiles/huawei/controller", // openxr_path - huawei_controller_paths, // io_paths - sizeof(huawei_controller_paths) / sizeof(OpenXRDefs::IOPath) // io_path_count - }, - - { - "HTC Vive tracker", // display_name - "/interaction_profiles/htc/vive_tracker_htcx", // openxr_path - vive_tracker_controller_paths, // io_paths - sizeof(vive_tracker_controller_paths) / sizeof(OpenXRDefs::IOPath) // io_path_count - }, -}; - -int OpenXRDefs::available_interaction_profile_count = sizeof(OpenXRDefs::available_interaction_profiles) / sizeof(OpenXRDefs::InteractionProfile); - -const OpenXRDefs::TopLevelPath *OpenXRDefs::get_top_level_path(const String p_top_level_path) { - for (int i = 0; i < OPENXR_TOP_LEVEL_PATH_MAX; i++) { - if (available_top_level_paths[i].openxr_path == p_top_level_path) { - return &OpenXRDefs::available_top_level_paths[i]; - } - } - - return nullptr; -} - -const OpenXRDefs::InteractionProfile *OpenXRDefs::get_profile(const String p_interaction_profile_path) { - for (int i = 0; i < available_interaction_profile_count; i++) { - if (available_interaction_profiles[i].openxr_path == p_interaction_profile_path) { - return &available_interaction_profiles[i]; - } - } - - return nullptr; -} - -const OpenXRDefs::IOPath *OpenXRDefs::InteractionProfile::get_io_path(const String p_io_path) const { - for (int i = 0; i < available_interaction_profiles[i].io_path_count; i++) { - if (io_paths[i].openxr_path == p_io_path) { - return &io_paths[i]; - } - } - - return nullptr; -} - -const OpenXRDefs::IOPath *OpenXRDefs::get_io_path(const String p_interaction_profile_path, const String p_io_path) { - const OpenXRDefs::InteractionProfile *profile = OpenXRDefs::get_profile(p_interaction_profile_path); - if (profile != nullptr) { - return profile->get_io_path(p_io_path); - } - - return nullptr; -} - -PackedStringArray OpenXRDefs::get_interaction_profile_paths() { - PackedStringArray arr; - - for (int i = 0; i < available_interaction_profile_count; i++) { - arr.push_back(available_interaction_profiles[i].openxr_path); - } - - return arr; -} diff --git a/modules/openxr/action_map/openxr_defs.h b/modules/openxr/action_map/openxr_defs.h deleted file mode 100644 index 446e6eb9c6..0000000000 --- a/modules/openxr/action_map/openxr_defs.h +++ /dev/null @@ -1,124 +0,0 @@ -/*************************************************************************/ -/* openxr_defs.h */ -/*************************************************************************/ -/* This file is part of: */ -/* GODOT ENGINE */ -/* https://godotengine.org */ -/*************************************************************************/ -/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ -/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ -/* */ -/* Permission is hereby granted, free of charge, to any person obtaining */ -/* a copy of this software and associated documentation files (the */ -/* "Software"), to deal in the Software without restriction, including */ -/* without limitation the rights to use, copy, modify, merge, publish, */ -/* distribute, sublicense, and/or sell copies of the Software, and to */ -/* permit persons to whom the Software is furnished to do so, subject to */ -/* the following conditions: */ -/* */ -/* The above copyright notice and this permission notice shall be */ -/* included in all copies or substantial portions of the Software. */ -/* */ -/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ -/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ -/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ -/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ -/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ -/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ -/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ -/*************************************************************************/ - -#ifndef OPENXR_DEFS_H -#define OPENXR_DEFS_H - -#include "openxr_action.h" - -/////////////////////////////////////////////////////////////////////////// -// Stores available interaction profiles -// -// OpenXR defines and hardcodes all the supported input devices and their -// paths as part of the OpenXR spec. When support for new devices is -// introduced this often starts life as extensions that need to be enabled -// until they are adopted into the core. As there is no interface to -// enumerate the possibly paths, and that any OpenXR runtime would likely -// limit such enumeration to those input devices supported by that runtime -// there is no other option than to hardcode this. -// -// Note on action type that automatic conversions between boolean and float -// are supported but otherwise action types should match between action and -// input/output paths. - -class OpenXRDefs { -public: - enum TOP_LEVEL_PATH { - // Core OpenXR toplevel paths - OPENXR_LEFT_HAND, - OPENXR_RIGHT_HAND, - OPENXR_HEAD, - OPENXR_GAMEPAD, - OPENXR_TREADMILL, - - // HTC tracker extension toplevel paths - // OPENXR_HTC_HANDHELD_TRACKER, - OPENXR_HTC_LEFT_FOOT_TRACKER, - OPENXR_HTC_RIGHT_FOOT_TRACKER, - OPENXR_HTC_LEFT_SHOULDER_TRACKER, - OPENXR_HTC_RIGHT_SHOULDER_TRACKER, - OPENXR_HTC_LEFT_ELBOW_TRACKER, - OPENXR_HTC_RIGHT_ELBOW_TRACKER, - OPENXR_HTC_LEFT_KNEE_TRACKER, - OPENXR_HTC_RIGHT_KNEE_TRACKER, - OPENXR_HTC_WAIST_TRACKER, - OPENXR_HTC_CHEST_TRACKER, - OPENXR_HTC_CAMERA_TRACKER, - OPENXR_HTC_KEYBOARD_TRACKER, - - OPENXR_TOP_LEVEL_PATH_MAX - }; - - struct TopLevelPath { - const char *display_name; // User friendly display name (i.e. Left controller) - const char *openxr_path; // Path in OpenXR (i.e. /user/hand/left) - }; - - struct IOPath { - const char *display_name; // User friendly display name (i.e. Grip pose (left controller)) - const TopLevelPath *top_level_path; // Top level path identifying the usage of the device in relation to this input/output - const char *openxr_path; // Path in OpenXR (i.e. /user/hand/left/input/grip/pose) - const OpenXRAction::ActionType action_type; // Type of input/output - }; - - struct InteractionProfile { - const char *display_name; // User friendly display name (i.e. Simple controller) - const char *openxr_path; // Path in OpenXR (i.e. /interaction_profiles/khr/simple_controller) - const IOPath *io_paths; // Inputs and outputs for this device - const int io_path_count; // Number of inputs and outputs for this device - - const IOPath *get_io_path(const String p_io_path) const; - }; - -private: - static TopLevelPath available_top_level_paths[OPENXR_TOP_LEVEL_PATH_MAX]; - static IOPath simple_io_paths[]; - static IOPath vive_io_paths[]; - static IOPath motion_io_paths[]; - static IOPath hpmr_io_paths[]; - static IOPath touch_io_paths[]; - static IOPath index_io_paths[]; - static IOPath odyssey_io_paths[]; - static IOPath vive_cosmos_paths[]; - static IOPath vive_focus3_paths[]; - static IOPath huawei_controller_paths[]; - static IOPath vive_tracker_controller_paths[]; - static InteractionProfile available_interaction_profiles[]; - static int available_interaction_profile_count; - -public: - static const TopLevelPath *get_top_level_path(const String p_top_level_path); - static const InteractionProfile *get_profile(const String p_interaction_profile_path); - static const IOPath *get_io_path(const String p_interaction_profile_path, const String p_io_path); - - static PackedStringArray get_interaction_profile_paths(); -}; - -#endif // OPENXR_DEFS_H diff --git a/modules/openxr/action_map/openxr_interaction_profile.cpp b/modules/openxr/action_map/openxr_interaction_profile.cpp index abb714c3bb..8bb657a2db 100644 --- a/modules/openxr/action_map/openxr_interaction_profile.cpp +++ b/modules/openxr/action_map/openxr_interaction_profile.cpp @@ -58,6 +58,7 @@ Ref<OpenXRIPBinding> OpenXRIPBinding::new_binding(const Ref<OpenXRAction> p_acti void OpenXRIPBinding::set_action(const Ref<OpenXRAction> p_action) { action = p_action; + emit_changed(); } Ref<OpenXRAction> OpenXRIPBinding::get_action() const { @@ -70,6 +71,7 @@ int OpenXRIPBinding::get_path_count() const { void OpenXRIPBinding::set_paths(const PackedStringArray p_paths) { paths = p_paths; + emit_changed(); } PackedStringArray OpenXRIPBinding::get_paths() const { @@ -78,6 +80,7 @@ PackedStringArray OpenXRIPBinding::get_paths() const { void OpenXRIPBinding::parse_paths(const String p_paths) { paths = p_paths.split(",", false); + emit_changed(); } bool OpenXRIPBinding::has_path(const String p_path) const { @@ -87,12 +90,14 @@ bool OpenXRIPBinding::has_path(const String p_path) const { void OpenXRIPBinding::add_path(const String p_path) { if (!paths.has(p_path)) { paths.push_back(p_path); + emit_changed(); } } void OpenXRIPBinding::remove_path(const String p_path) { if (paths.has(p_path)) { paths.erase(p_path); + emit_changed(); } } @@ -122,6 +127,7 @@ Ref<OpenXRInteractionProfile> OpenXRInteractionProfile::new_profile(const char * void OpenXRInteractionProfile::set_interaction_profile_path(const String p_input_profile_path) { interaction_profile_path = p_input_profile_path; + emit_changed(); } String OpenXRInteractionProfile::get_interaction_profile_path() const { @@ -139,9 +145,10 @@ Ref<OpenXRIPBinding> OpenXRInteractionProfile::get_binding(int p_index) const { } void OpenXRInteractionProfile::set_bindings(Array p_bindings) { - bindings = p_bindings; - // TODO add check here that our bindings don't contain duplicate actions + + bindings = p_bindings; + emit_changed(); } Array OpenXRInteractionProfile::get_bindings() const { @@ -166,6 +173,7 @@ void OpenXRInteractionProfile::add_binding(Ref<OpenXRIPBinding> p_binding) { ERR_FAIL_COND_MSG(get_binding_for_action(p_binding->get_action()).is_valid(), "There is already a binding for this action in this interaction profile"); bindings.push_back(p_binding); + emit_changed(); } } @@ -173,6 +181,7 @@ void OpenXRInteractionProfile::remove_binding(Ref<OpenXRIPBinding> p_binding) { int idx = bindings.find(p_binding); if (idx != -1) { bindings.remove_at(idx); + emit_changed(); } } @@ -192,6 +201,17 @@ void OpenXRInteractionProfile::remove_binding_for_action(const Ref<OpenXRAction> } } +bool OpenXRInteractionProfile::has_binding_for_action(const Ref<OpenXRAction> p_action) { + for (int i = bindings.size() - 1; i >= 0; i--) { + Ref<OpenXRIPBinding> binding = bindings[i]; + if (binding->get_action() == p_action) { + return true; + } + } + + return false; +} + OpenXRInteractionProfile::~OpenXRInteractionProfile() { bindings.clear(); } diff --git a/modules/openxr/action_map/openxr_interaction_profile.h b/modules/openxr/action_map/openxr_interaction_profile.h index c77fd490bb..c7db77870e 100644 --- a/modules/openxr/action_map/openxr_interaction_profile.h +++ b/modules/openxr/action_map/openxr_interaction_profile.h @@ -34,7 +34,7 @@ #include "core/io/resource.h" #include "openxr_action.h" -#include "openxr_defs.h" +#include "openxr_interaction_profile_meta_data.h" class OpenXRIPBinding : public Resource { GDCLASS(OpenXRIPBinding, Resource); @@ -94,6 +94,7 @@ public: void add_new_binding(const Ref<OpenXRAction> p_action, const char *p_paths); // Create a new binding for this profile void remove_binding_for_action(const Ref<OpenXRAction> p_action); // Remove all bindings for this action + bool has_binding_for_action(const Ref<OpenXRAction> p_action); // Returns true if we have a binding for this action ~OpenXRInteractionProfile(); }; diff --git a/modules/openxr/action_map/openxr_interaction_profile_meta_data.cpp b/modules/openxr/action_map/openxr_interaction_profile_meta_data.cpp new file mode 100644 index 0000000000..db4062b196 --- /dev/null +++ b/modules/openxr/action_map/openxr_interaction_profile_meta_data.cpp @@ -0,0 +1,713 @@ +/*************************************************************************/ +/* openxr_interaction_profile_meta_data.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "openxr_interaction_profile_meta_data.h" + +#include <openxr/openxr.h> + +OpenXRInteractionProfileMetaData *OpenXRInteractionProfileMetaData::singleton = nullptr; + +OpenXRInteractionProfileMetaData::OpenXRInteractionProfileMetaData() { + singleton = this; + + _register_core_metadata(); +} + +OpenXRInteractionProfileMetaData::~OpenXRInteractionProfileMetaData() { + singleton = nullptr; +} + +void OpenXRInteractionProfileMetaData::_bind_methods() { + ClassDB::bind_method(D_METHOD("register_top_level_path", "display_name", "openxr_path", "openxr_extension_name"), &OpenXRInteractionProfileMetaData::register_top_level_path); + ClassDB::bind_method(D_METHOD("register_interaction_profile", "display_name", "openxr_path", "openxr_extension_name"), &OpenXRInteractionProfileMetaData::register_interaction_profile); + ClassDB::bind_method(D_METHOD("register_io_path", "interaction_profile", "display_name", "toplevel_path", "openxr_path", "openxr_extension_name", "action_type"), &OpenXRInteractionProfileMetaData::register_io_path); +} + +void OpenXRInteractionProfileMetaData::register_top_level_path(const String &p_display_name, const String &p_openxr_path, const String &p_openxr_extension_name) { + ERR_FAIL_COND_MSG(has_top_level_path(p_openxr_path), p_openxr_path + " had already been registered"); + + TopLevelPath new_toplevel_path = { + p_display_name, + p_openxr_path, + p_openxr_extension_name + }; + + top_level_paths.push_back(new_toplevel_path); +} + +void OpenXRInteractionProfileMetaData::register_interaction_profile(const String &p_display_name, const String &p_openxr_path, const String &p_openxr_extension_name) { + ERR_FAIL_COND_MSG(has_interaction_profile(p_openxr_path), p_openxr_path + " has already been registered"); + + InteractionProfile new_profile; + new_profile.display_name = p_display_name; + new_profile.openxr_path = p_openxr_path; + new_profile.openxr_extension_name = p_openxr_extension_name; + + interaction_profiles.push_back(new_profile); +} + +void OpenXRInteractionProfileMetaData::register_io_path(const String &p_interaction_profile, const String &p_display_name, const String &p_toplevel_path, const String &p_openxr_path, const String &p_openxr_extension_name, OpenXRAction::ActionType p_action_type) { + ERR_FAIL_COND_MSG(!has_interaction_profile(p_interaction_profile), "Unknown interaction profile " + p_interaction_profile); + ERR_FAIL_COND_MSG(!has_top_level_path(p_toplevel_path), "Unknown top level path " + p_toplevel_path); + + for (int i = 0; i < interaction_profiles.size(); i++) { + if (interaction_profiles[i].openxr_path == p_interaction_profile) { + ERR_FAIL_COND_MSG(interaction_profiles[i].has_io_path(p_openxr_path), p_interaction_profile + " already has io path " + p_openxr_path + " registered!"); + + IOPath new_io_path = { + p_display_name, + p_toplevel_path, + p_openxr_path, + p_openxr_extension_name, + p_action_type + }; + + interaction_profiles.ptrw()[i].io_paths.push_back(new_io_path); + } + } +} + +bool OpenXRInteractionProfileMetaData::has_top_level_path(const String p_openxr_path) const { + for (int i = 0; i < top_level_paths.size(); i++) { + if (top_level_paths[i].openxr_path == p_openxr_path) { + return true; + } + } + + return false; +} + +String OpenXRInteractionProfileMetaData::get_top_level_name(const String p_openxr_path) const { + for (int i = 0; i < top_level_paths.size(); i++) { + if (top_level_paths[i].openxr_path == p_openxr_path) { + return top_level_paths[i].display_name; + } + } + + return String(); +} + +String OpenXRInteractionProfileMetaData::get_top_level_extension(const String p_openxr_path) const { + for (int i = 0; i < top_level_paths.size(); i++) { + if (top_level_paths[i].openxr_path == p_openxr_path) { + return top_level_paths[i].openxr_extension_name; + } + } + + return XR_PATH_UNSUPPORTED_NAME; +} + +bool OpenXRInteractionProfileMetaData::has_interaction_profile(const String p_openxr_path) const { + for (int i = 0; i < interaction_profiles.size(); i++) { + if (interaction_profiles[i].openxr_path == p_openxr_path) { + return true; + } + } + + return false; +} + +String OpenXRInteractionProfileMetaData::get_interaction_profile_extension(const String p_openxr_path) const { + for (int i = 0; i < interaction_profiles.size(); i++) { + if (interaction_profiles[i].openxr_path == p_openxr_path) { + return interaction_profiles[i].openxr_extension_name; + } + } + + return XR_PATH_UNSUPPORTED_NAME; +} + +const OpenXRInteractionProfileMetaData::InteractionProfile *OpenXRInteractionProfileMetaData::get_profile(const String p_openxr_path) const { + for (int i = 0; i < interaction_profiles.size(); i++) { + if (interaction_profiles[i].openxr_path == p_openxr_path) { + return &interaction_profiles[i]; + } + } + + return nullptr; +} + +bool OpenXRInteractionProfileMetaData::InteractionProfile::has_io_path(const String p_io_path) const { + for (int i = 0; i < io_paths.size(); i++) { + if (io_paths[i].openxr_path == p_io_path) { + return true; + } + } + + return false; +} + +const OpenXRInteractionProfileMetaData::IOPath *OpenXRInteractionProfileMetaData::InteractionProfile::get_io_path(const String p_io_path) const { + for (int i = 0; i < io_paths.size(); i++) { + if (io_paths[i].openxr_path == p_io_path) { + return &io_paths[i]; + } + } + + return nullptr; +} + +const OpenXRInteractionProfileMetaData::IOPath *OpenXRInteractionProfileMetaData::get_io_path(const String p_interaction_profile, const String p_io_path) const { + const OpenXRInteractionProfileMetaData::InteractionProfile *profile = get_profile(p_interaction_profile); + if (profile != nullptr) { + return profile->get_io_path(p_io_path); + } + + return nullptr; +} + +PackedStringArray OpenXRInteractionProfileMetaData::get_interaction_profile_paths() const { + PackedStringArray arr; + + for (int i = 0; i < interaction_profiles.size(); i++) { + arr.push_back(interaction_profiles[i].openxr_path); + } + + return arr; +} + +void OpenXRInteractionProfileMetaData::_register_core_metadata() { + // Note, currently we add definitions that belong in extensions. + // Extensions are registered when our OpenXRAPI is instantiated + // however this does not happen in the editor. + // We are changing this in another PR, once that is accepted we + // can make the changes to move code into extensions where needed. + + // Note that we'll make an exception for XR_EXT_palm_pose, which is used everywhere + + // Our core toplevel paths + register_top_level_path("Left hand controller", "/user/hand/left", ""); + register_top_level_path("Right hand controller", "/user/hand/right", ""); + register_top_level_path("Head", "/user/head", ""); + register_top_level_path("Gamepad", "/user/gamepad", ""); + register_top_level_path("Treadmill", "/user/treadmill", ""); + + // TODO move this into OpenXRHTCViveTrackerExtension once this is supported. + // register_top_level_path("Handheld object tracker", "/user/vive_tracker_htcx/role/handheld_object", XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME); + register_top_level_path("Left foot tracker", "/user/vive_tracker_htcx/role/left_foot", XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME); + register_top_level_path("Right foot tracker", "/user/vive_tracker_htcx/role/right_foot", XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME); + register_top_level_path("Left shoulder tracker", "/user/vive_tracker_htcx/role/left_shoulder", XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME); + register_top_level_path("Right shoulder tracker", "/user/vive_tracker_htcx/role/right_shoulder", XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME); + register_top_level_path("Left elbow tracker", "/user/vive_tracker_htcx/role/left_elbow", XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME); + register_top_level_path("Right elbow tracker", "/user/vive_tracker_htcx/role/right_elbow", XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME); + register_top_level_path("Left knee tracker", "/user/vive_tracker_htcx/role/left_knee", XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME); + register_top_level_path("Right knee tracker", "/user/vive_tracker_htcx/role/right_knee", XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME); + register_top_level_path("Waist tracker", "/user/vive_tracker_htcx/role/waist", XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME); + register_top_level_path("Chest tracker", "/user/vive_tracker_htcx/role/chest", XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME); + register_top_level_path("Camera tracker", "/user/vive_tracker_htcx/role/camera", XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME); + register_top_level_path("Keyboard tracker", "/user/vive_tracker_htcx/role/keyboard", XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME); + + // Fallback Khronos simple controller + register_interaction_profile("Simple controller", "/interaction_profiles/khr/simple_controller", ""); + register_io_path("/interaction_profiles/khr/simple_controller", "Grip pose", "/user/hand/left", "/user/hand/left/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/khr/simple_controller", "Grip pose", "/user/hand/right", "/user/hand/right/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/khr/simple_controller", "Aim pose", "/user/hand/left", "/user/hand/left/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/khr/simple_controller", "Aim pose", "/user/hand/right", "/user/hand/right/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/khr/simple_controller", "Palm pose", "/user/hand/left", "/user/hand/left/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/khr/simple_controller", "Palm pose", "/user/hand/right", "/user/hand/right/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + + register_io_path("/interaction_profiles/khr/simple_controller", "Menu click", "/user/hand/left", "/user/hand/left/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/khr/simple_controller", "Menu click", "/user/hand/right", "/user/hand/right/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/khr/simple_controller", "Select click", "/user/hand/left", "/user/hand/left/input/select/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/khr/simple_controller", "Select click", "/user/hand/right", "/user/hand/right/input/select/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/khr/simple_controller", "Haptic output", "/user/hand/left", "/user/hand/left/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/khr/simple_controller", "Haptic output", "/user/hand/right", "/user/hand/right/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + + // Original HTC Vive wands + register_interaction_profile("HTC Vive wand", "/interaction_profiles/htc/vive_controller", ""); + register_io_path("/interaction_profiles/htc/vive_controller", "Grip pose", "/user/hand/left", "/user/hand/left/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_controller", "Grip pose", "/user/hand/right", "/user/hand/right/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_controller", "Aim pose", "/user/hand/left", "/user/hand/left/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_controller", "Aim pose", "/user/hand/right", "/user/hand/right/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_controller", "Palm pose", "/user/hand/left", "/user/hand/left/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_controller", "Palm pose", "/user/hand/right", "/user/hand/right/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + + register_io_path("/interaction_profiles/htc/vive_controller", "Menu click", "/user/hand/left", "/user/hand/left/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_controller", "Menu click", "/user/hand/right", "/user/hand/right/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_controller", "System click", "/user/hand/left", "/user/hand/left/input/system/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_controller", "System click", "/user/hand/right", "/user/hand/right/input/system/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_controller", "Trigger", "/user/hand/left", "/user/hand/left/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_controller", "Trigger click", "/user/hand/left", "/user/hand/left/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_controller", "Trigger", "/user/hand/right", "/user/hand/right/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_controller", "Trigger click", "/user/hand/right", "/user/hand/right/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_controller", "Squeeze click", "/user/hand/left", "/user/hand/left/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_controller", "Squeeze click", "/user/hand/right", "/user/hand/right/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_controller", "Trackpad", "/user/hand/left", "/user/hand/left/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_controller", "Trackpad click", "/user/hand/left", "/user/hand/left/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_controller", "Trackpad touch", "/user/hand/left", "/user/hand/left/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_controller", "Trackpad", "/user/hand/right", "/user/hand/right/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_controller", "Trackpad click", "/user/hand/right", "/user/hand/right/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_controller", "Trackpad touch", "/user/hand/right", "/user/hand/right/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_controller", "Haptic output", "/user/hand/left", "/user/hand/left/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_controller", "Haptic output", "/user/hand/right", "/user/hand/right/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + + // Microsoft motion controller (original WMR controllers) + register_interaction_profile("MS Motion controller", "/interaction_profiles/microsoft/motion_controller", ""); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Grip pose", "/user/hand/left", "/user/hand/left/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Grip pose", "/user/hand/right", "/user/hand/right/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Aim pose", "/user/hand/left", "/user/hand/left/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Aim pose", "/user/hand/right", "/user/hand/right/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Palm pose", "/user/hand/left", "/user/hand/left/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Palm pose", "/user/hand/right", "/user/hand/right/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + + register_io_path("/interaction_profiles/microsoft/motion_controller", "Menu click", "/user/hand/left", "/user/hand/left/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Menu click", "/user/hand/right", "/user/hand/right/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/microsoft/motion_controller", "Trigger", "/user/hand/left", "/user/hand/left/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Trigger click", "/user/hand/left", "/user/hand/left/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Trigger", "/user/hand/right", "/user/hand/right/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Trigger click", "/user/hand/right", "/user/hand/right/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/microsoft/motion_controller", "Squeeze click", "/user/hand/left", "/user/hand/left/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Squeeze click", "/user/hand/right", "/user/hand/right/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/microsoft/motion_controller", "Thumbstick", "/user/hand/left", "/user/hand/left/input/thumbstick", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Thumbstick click", "/user/hand/left", "/user/hand/left/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Thumbstick", "/user/hand/right", "/user/hand/right/input/thumbstick", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Thumbstick click", "/user/hand/right", "/user/hand/right/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/microsoft/motion_controller", "Trackpad", "/user/hand/left", "/user/hand/left/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Trackpad click", "/user/hand/left", "/user/hand/left/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Trackpad touch", "/user/hand/left", "/user/hand/left/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Trackpad", "/user/hand/right", "/user/hand/right/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Trackpad click", "/user/hand/right", "/user/hand/right/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Trackpad touch", "/user/hand/right", "/user/hand/right/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/microsoft/motion_controller", "Haptic output", "/user/hand/left", "/user/hand/left/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/microsoft/motion_controller", "Haptic output", "/user/hand/right", "/user/hand/right/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + + // Meta touch controller (original touch controllers, Quest 1 and Quest 2 controllers) + register_interaction_profile("Touch controller", "/interaction_profiles/oculus/touch_controller", ""); + register_io_path("/interaction_profiles/oculus/touch_controller", "Grip pose", "/user/hand/left", "/user/hand/left/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/oculus/touch_controller", "Grip pose", "/user/hand/right", "/user/hand/right/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/oculus/touch_controller", "Aim pose", "/user/hand/left", "/user/hand/left/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/oculus/touch_controller", "Aim pose", "/user/hand/right", "/user/hand/right/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/oculus/touch_controller", "Palm pose", "/user/hand/left", "/user/hand/left/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/oculus/touch_controller", "Palm pose", "/user/hand/right", "/user/hand/right/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + + register_io_path("/interaction_profiles/oculus/touch_controller", "Menu click", "/user/hand/left", "/user/hand/left/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/oculus/touch_controller", "System click", "/user/hand/right", "/user/hand/right/input/system/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/oculus/touch_controller", "X click", "/user/hand/left", "/user/hand/left/input/x/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/oculus/touch_controller", "X touch", "/user/hand/left", "/user/hand/left/input/x/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/oculus/touch_controller", "Y click", "/user/hand/left", "/user/hand/left/input/y/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/oculus/touch_controller", "Y touch", "/user/hand/left", "/user/hand/left/input/y/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/oculus/touch_controller", "A click", "/user/hand/right", "/user/hand/right/input/a/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/oculus/touch_controller", "A touch", "/user/hand/right", "/user/hand/right/input/a/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/oculus/touch_controller", "B click", "/user/hand/right", "/user/hand/right/input/b/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/oculus/touch_controller", "B touch", "/user/hand/right", "/user/hand/right/input/b/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/oculus/touch_controller", "Trigger", "/user/hand/left", "/user/hand/left/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/oculus/touch_controller", "Trigger touch", "/user/hand/left", "/user/hand/left/input/trigger/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/oculus/touch_controller", "Trigger", "/user/hand/right", "/user/hand/right/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/oculus/touch_controller", "Trigger touch", "/user/hand/right", "/user/hand/right/input/trigger/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/oculus/touch_controller", "Squeeze", "/user/hand/left", "/user/hand/left/input/squeeze/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/oculus/touch_controller", "Squeeze", "/user/hand/right", "/user/hand/right/input/squeeze/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + + register_io_path("/interaction_profiles/oculus/touch_controller", "Thumbstick", "/user/hand/left", "/user/hand/left/input/thumbstick", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/oculus/touch_controller", "Thumbstick click", "/user/hand/left", "/user/hand/left/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/oculus/touch_controller", "Thumbstick touch", "/user/hand/left", "/user/hand/left/input/thumbstick/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/oculus/touch_controller", "Thumbstick", "/user/hand/right", "/user/hand/right/input/thumbstick", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/oculus/touch_controller", "Thumbstick click", "/user/hand/right", "/user/hand/right/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/oculus/touch_controller", "Thumbstick touch", "/user/hand/right", "/user/hand/right/input/thumbstick/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/oculus/touch_controller", "Haptic output", "/user/hand/left", "/user/hand/left/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/oculus/touch_controller", "Haptic output", "/user/hand/right", "/user/hand/right/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + + // Valve Index controller + register_interaction_profile("Index controller", "/interaction_profiles/valve/index_controller", ""); + register_io_path("/interaction_profiles/valve/index_controller", "Grip pose", "/user/hand/left", "/user/hand/left/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/valve/index_controller", "Grip pose", "/user/hand/right", "/user/hand/right/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/valve/index_controller", "Aim pose", "/user/hand/left", "/user/hand/left/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/valve/index_controller", "Aim pose", "/user/hand/right", "/user/hand/right/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/valve/index_controller", "Palm pose", "/user/hand/left", "/user/hand/left/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/valve/index_controller", "Palm pose", "/user/hand/right", "/user/hand/right/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + + register_io_path("/interaction_profiles/valve/index_controller", "System click", "/user/hand/left", "/user/hand/left/input/system/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "System click", "/user/hand/right", "/user/hand/right/input/system/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/valve/index_controller", "A click", "/user/hand/left", "/user/hand/left/input/a/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "A touch", "/user/hand/left", "/user/hand/left/input/a/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "A click", "/user/hand/right", "/user/hand/right/input/a/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "A touch", "/user/hand/right", "/user/hand/right/input/a/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "B click", "/user/hand/left", "/user/hand/left/input/b/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "B touch", "/user/hand/left", "/user/hand/left/input/b/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "B click", "/user/hand/right", "/user/hand/right/input/b/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "B touch", "/user/hand/right", "/user/hand/right/input/b/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/valve/index_controller", "Trigger", "/user/hand/left", "/user/hand/left/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/valve/index_controller", "Trigger click", "/user/hand/left", "/user/hand/left/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "Trigger touch", "/user/hand/left", "/user/hand/left/input/trigger/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "Trigger", "/user/hand/right", "/user/hand/right/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/valve/index_controller", "Trigger click", "/user/hand/right", "/user/hand/right/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "Trigger touch", "/user/hand/right", "/user/hand/right/input/trigger/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/valve/index_controller", "Squeeze", "/user/hand/left", "/user/hand/left/input/squeeze/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/valve/index_controller", "Squeeze", "/user/hand/right", "/user/hand/right/input/squeeze/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + + register_io_path("/interaction_profiles/valve/index_controller", "Thumbstick", "/user/hand/left", "/user/hand/left/input/thumbstick", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/valve/index_controller", "Thumbstick click", "/user/hand/left", "/user/hand/left/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "Thumbstick touch", "/user/hand/left", "/user/hand/left/input/thumbstick/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "Thumbstick", "/user/hand/right", "/user/hand/right/input/thumbstick", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/valve/index_controller", "Thumbstick click", "/user/hand/right", "/user/hand/right/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "Thumbstick touch", "/user/hand/right", "/user/hand/right/input/thumbstick/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/valve/index_controller", "Trackpad", "/user/hand/left", "/user/hand/left/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/valve/index_controller", "Trackpad force", "/user/hand/left", "/user/hand/left/input/trackpad/force", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/valve/index_controller", "Trackpad touch", "/user/hand/left", "/user/hand/left/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/valve/index_controller", "Trackpad", "/user/hand/right", "/user/hand/right/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/valve/index_controller", "Trackpad force", "/user/hand/right", "/user/hand/right/input/trackpad/force", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/valve/index_controller", "Trackpad touch", "/user/hand/right", "/user/hand/right/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/valve/index_controller", "Haptic output", "/user/hand/left", "/user/hand/left/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/valve/index_controller", "Haptic output", "/user/hand/right", "/user/hand/right/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + + // HP MR controller (newer G2 controllers) + // TODO move this into an extension once this is supported. + register_interaction_profile("HPMR controller", "/interaction_profiles/hp/mixed_reality_controller", XR_EXT_HP_MIXED_REALITY_CONTROLLER_EXTENSION_NAME); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Grip pose", "/user/hand/left", "/user/hand/left/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Grip pose", "/user/hand/right", "/user/hand/right/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Aim pose", "/user/hand/left", "/user/hand/left/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Aim pose", "/user/hand/right", "/user/hand/right/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Palm pose", "/user/hand/left", "/user/hand/left/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Palm pose", "/user/hand/right", "/user/hand/right/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Menu click", "/user/hand/left", "/user/hand/left/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Menu click", "/user/hand/right", "/user/hand/right/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "X click", "/user/hand/left", "/user/hand/left/input/x/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Y click", "/user/hand/left", "/user/hand/left/input/y/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "A click", "/user/hand/right", "/user/hand/right/input/a/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "B click", "/user/hand/right", "/user/hand/right/input/b/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Trigger", "/user/hand/left", "/user/hand/left/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Trigger click", "/user/hand/left", "/user/hand/left/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Trigger", "/user/hand/right", "/user/hand/right/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Trigger click", "/user/hand/right", "/user/hand/right/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Squeeze", "/user/hand/left", "/user/hand/left/input/squeeze/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Squeeze", "/user/hand/right", "/user/hand/right/input/squeeze/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Thumbstick", "/user/hand/left", "/user/hand/left/input/thumbstick", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Thumbstick click", "/user/hand/left", "/user/hand/left/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Thumbstick", "/user/hand/right", "/user/hand/right/input/thumbstick", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Thumbstick click", "/user/hand/right", "/user/hand/right/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Haptic output", "/user/hand/left", "/user/hand/left/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/hp/mixed_reality_controller", "Haptic output", "/user/hand/right", "/user/hand/right/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + + // Samsung Odyssey controller + // TODO move this into an extension once this is supported. + register_interaction_profile("Samsung Odyssey controller", "/interaction_profiles/samsung/odyssey_controller", XR_EXT_SAMSUNG_ODYSSEY_CONTROLLER_EXTENSION_NAME); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Grip pose", "/user/hand/left", "/user/hand/left/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Grip pose", "/user/hand/right", "/user/hand/right/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Aim pose", "/user/hand/left", "/user/hand/left/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Aim pose", "/user/hand/right", "/user/hand/right/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Palm pose", "/user/hand/left", "/user/hand/left/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Palm pose", "/user/hand/right", "/user/hand/right/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Menu click", "/user/hand/left", "/user/hand/left/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Menu click", "/user/hand/right", "/user/hand/right/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Trigger", "/user/hand/left", "/user/hand/left/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Trigger click", "/user/hand/left", "/user/hand/left/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Trigger", "/user/hand/right", "/user/hand/right/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Trigger click", "/user/hand/right", "/user/hand/right/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Squeeze click", "/user/hand/left", "/user/hand/left/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Squeeze click", "/user/hand/right", "/user/hand/right/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Thumbstick", "/user/hand/left", "/user/hand/left/input/thumbstick", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Thumbstick click", "/user/hand/left", "/user/hand/left/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Thumbstick", "/user/hand/right", "/user/hand/right/input/thumbstick", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Thumbstick click", "/user/hand/right", "/user/hand/right/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Trackpad", "/user/hand/left", "/user/hand/left/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Trackpad click", "/user/hand/left", "/user/hand/left/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Trackpad touch", "/user/hand/left", "/user/hand/left/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Trackpad", "/user/hand/right", "/user/hand/right/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Trackpad click", "/user/hand/right", "/user/hand/right/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Trackpad touch", "/user/hand/right", "/user/hand/right/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Haptic output", "/user/hand/left", "/user/hand/left/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/samsung/odyssey_controller", "Haptic output", "/user/hand/right", "/user/hand/right/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + + // HTC Vive Cosmos controller + // TODO move this into an extension once this is supported. + register_interaction_profile("Vive Cosmos controller", "/interaction_profiles/htc/vive_cosmos_controller", XR_HTC_VIVE_COSMOS_CONTROLLER_INTERACTION_EXTENSION_NAME); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Grip pose", "/user/hand/left", "/user/hand/left/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Grip pose", "/user/hand/right", "/user/hand/right/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Aim pose", "/user/hand/left", "/user/hand/left/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Aim pose", "/user/hand/right", "/user/hand/right/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Palm pose", "/user/hand/left", "/user/hand/left/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Palm pose", "/user/hand/right", "/user/hand/right/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Menu click", "/user/hand/left", "/user/hand/left/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "System click", "/user/hand/right", "/user/hand/right/input/system/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "X click", "/user/hand/left", "/user/hand/left/input/x/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Y click", "/user/hand/left", "/user/hand/left/input/y/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "A click", "/user/hand/right", "/user/hand/right/input/a/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "B click", "/user/hand/right", "/user/hand/right/input/b/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Shoulder click", "/user/hand/left", "/user/hand/left/input/shoulder/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Shoulder click", "/user/hand/right", "/user/hand/right/input/shoulder/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Trigger", "/user/hand/left", "/user/hand/left/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Trigger click", "/user/hand/left", "/user/hand/left/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Trigger", "/user/hand/right", "/user/hand/right/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Trigger click", "/user/hand/right", "/user/hand/right/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Squeeze click", "/user/hand/left", "/user/hand/left/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Squeeze click", "/user/hand/right", "/user/hand/right/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Thumbstick", "/user/hand/left", "/user/hand/left/input/thumbstick", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Thumbstick click", "/user/hand/left", "/user/hand/left/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Thumbstick touch", "/user/hand/left", "/user/hand/left/input/thumbstick/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Thumbstick", "/user/hand/right", "/user/hand/right/input/thumbstick", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Thumbstick click", "/user/hand/right", "/user/hand/right/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Thumbstick touch", "/user/hand/right", "/user/hand/right/input/thumbstick/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Haptic output", "/user/hand/left", "/user/hand/left/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_cosmos_controller", "Haptic output", "/user/hand/right", "/user/hand/right/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + + // HTC Vive Focus 3 controller + // TODO move this into an extension once this is supported. + register_interaction_profile("Vive Focus 3 controller", "/interaction_profiles/htc/vive_focus3_controller", XR_HTC_VIVE_FOCUS3_CONTROLLER_INTERACTION_EXTENSION_NAME); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Grip pose", "/user/hand/left", "/user/hand/left/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Grip pose", "/user/hand/right", "/user/hand/right/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Aim pose", "/user/hand/left", "/user/hand/left/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Aim pose", "/user/hand/right", "/user/hand/right/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Palm pose", "/user/hand/left", "/user/hand/left/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Palm pose", "/user/hand/right", "/user/hand/right/input/palm_ext/pose", XR_EXT_PALM_POSE_EXTENSION_NAME, OpenXRAction::OPENXR_ACTION_POSE); + + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Menu click", "/user/hand/left", "/user/hand/left/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "System click", "/user/hand/right", "/user/hand/right/input/system/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "X click", "/user/hand/left", "/user/hand/left/input/x/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Y click", "/user/hand/left", "/user/hand/left/input/y/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "A click", "/user/hand/right", "/user/hand/right/input/a/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "B click", "/user/hand/right", "/user/hand/right/input/b/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Trigger", "/user/hand/left", "/user/hand/left/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Trigger click", "/user/hand/left", "/user/hand/left/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Trigger touch", "/user/hand/left", "/user/hand/left/input/trigger/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Trigger", "/user/hand/right", "/user/hand/right/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Trigger click", "/user/hand/right", "/user/hand/right/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Trigger touch", "/user/hand/right", "/user/hand/right/input/trigger/touch ", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Squeeze click", "/user/hand/left", "/user/hand/left/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Squeeze touch", "/user/hand/left", "/user/hand/left/input/squeeze/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Squeeze click", "/user/hand/right", "/user/hand/right/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Squeeze touch", "/user/hand/right", "/user/hand/right/input/squeeze/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Thumbstick", "/user/hand/left", "/user/hand/left/input/thumbstick", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Thumbstick click", "/user/hand/left", "/user/hand/left/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Thumbstick touch", "/user/hand/left", "/user/hand/left/input/thumbstick/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Thumbstick", "/user/hand/right", "/user/hand/right/input/thumbstick", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Thumbstick click", "/user/hand/right", "/user/hand/right/input/thumbstick/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Thumbstick touch", "/user/hand/right", "/user/hand/right/input/thumbstick/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Thumbrest touch", "/user/hand/right", "/user/hand/right/input/thumbrest/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Haptic output", "/user/hand/left", "/user/hand/left/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_focus3_controller", "Haptic output", "/user/hand/right", "/user/hand/right/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + + // Huawei controller + // TODO move this into an extension once this is supported. + register_interaction_profile("Huawei controller", "/interaction_profiles/huawei/controller", XR_HUAWEI_CONTROLLER_INTERACTION_EXTENSION_NAME); + register_io_path("/interaction_profiles/huawei/controller", "Grip pose", "/user/hand/left", "/user/hand/left/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/huawei/controller", "Grip pose", "/user/hand/right", "/user/hand/right/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/huawei/controller", "Aim pose", "/user/hand/left", "/user/hand/left/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/huawei/controller", "Aim pose", "/user/hand/right", "/user/hand/right/input/aim/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/huawei/controller", "Palm pose", "/user/hand/left", "/user/hand/left/input/palm_ext/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/huawei/controller", "Palm pose", "/user/hand/right", "/user/hand/right/input/palm_ext/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + + register_io_path("/interaction_profiles/huawei/controller", "Home click", "/user/hand/left", "/user/hand/left/input/home/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/huawei/controller", "Home click", "/user/hand/right", "/user/hand/right/input/home/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/huawei/controller", "Back click", "/user/hand/left", "/user/hand/left/input/back/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/huawei/controller", "Back click", "/user/hand/right", "/user/hand/right/input/back/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/huawei/controller", "Volume up click", "/user/hand/left", "/user/hand/left/input/volume_up/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/huawei/controller", "Volume up click", "/user/hand/right", "/user/hand/right/input/volume_up/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/huawei/controller", "Volume down click", "/user/hand/left", "/user/hand/left/input/volume_down/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/huawei/controller", "Volume down click", "/user/hand/right", "/user/hand/right/input/volume_down/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/huawei/controller", "Trigger", "/user/hand/left", "/user/hand/left/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/huawei/controller", "Trigger click", "/user/hand/left", "/user/hand/left/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/huawei/controller", "Trigger", "/user/hand/right", "/user/hand/right/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/huawei/controller", "Trigger click", "/user/hand/right", "/user/hand/right/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/huawei/controller", "Trackpad", "/user/hand/left", "/user/hand/left/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/huawei/controller", "Trackpad click", "/user/hand/left", "/user/hand/left/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/huawei/controller", "Trackpad touch", "/user/hand/left", "/user/hand/left/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/huawei/controller", "Trackpad", "/user/hand/right", "/user/hand/right/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/huawei/controller", "Trackpad click", "/user/hand/right", "/user/hand/right/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/huawei/controller", "Trackpad touch", "/user/hand/right", "/user/hand/right/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + register_io_path("/interaction_profiles/huawei/controller", "Haptic output", "/user/hand/left", "/user/hand/left/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/huawei/controller", "Haptic output", "/user/hand/right", "/user/hand/right/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + + // HTC Vive tracker + // Interestingly enough trackers don't have buttons or inputs, yet these are defined in the spec. + // I think this can be supported through attachments on the trackers. + // TODO move this into an extension once this is supported. + register_interaction_profile("HTC Vive tracker", "/interaction_profiles/htc/vive_tracker_htcx", XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Menu click", "/user/vive_tracker_htcx/role/left_foot", "/user/vive_tracker_htcx/role/left_foot/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Menu click", "/user/vive_tracker_htcx/role/right_foot", "/user/vive_tracker_htcx/role/right_foot/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Menu click", "/user/vive_tracker_htcx/role/left_shoulder", "/user/vive_tracker_htcx/role/left_shoulder/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Menu click", "/user/vive_tracker_htcx/role/right_shoulder", "/user/vive_tracker_htcx/role/right_shoulder/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Menu click", "/user/vive_tracker_htcx/role/left_elbow", "/user/vive_tracker_htcx/role/left_elbow/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Menu click", "/user/vive_tracker_htcx/role/right_elbow", "/user/vive_tracker_htcx/role/right_elbow/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Menu click", "/user/vive_tracker_htcx/role/left_knee", "/user/vive_tracker_htcx/role/left_knee/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Menu click", "/user/vive_tracker_htcx/role/right_knee", "/user/vive_tracker_htcx/role/right_knee/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Menu click", "/user/vive_tracker_htcx/role/waist", "/user/vive_tracker_htcx/role/waist/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Menu click", "/user/vive_tracker_htcx/role/chest", "/user/vive_tracker_htcx/role/chest/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Menu click", "/user/vive_tracker_htcx/role/camera", "/user/vive_tracker_htcx/role/camera/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Menu click", "/user/vive_tracker_htcx/role/keyboard", "/user/vive_tracker_htcx/role/keyboard/input/menu/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + // register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger", "/user/vive_tracker_htcx/role/handheld_object", "/user/vive_tracker_htcx/role/handheld_object/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger", "/user/vive_tracker_htcx/role/left_foot", "/user/vive_tracker_htcx/role/left_foot/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger", "/user/vive_tracker_htcx/role/right_foot", "/user/vive_tracker_htcx/role/right_foot/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger", "/user/vive_tracker_htcx/role/left_shoulder", "/user/vive_tracker_htcx/role/left_shoulder/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger", "/user/vive_tracker_htcx/role/right_shoulder", "/user/vive_tracker_htcx/role/right_shoulder/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger", "/user/vive_tracker_htcx/role/left_elbow", "/user/vive_tracker_htcx/role/left_elbow/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger", "/user/vive_tracker_htcx/role/right_elbow", "/user/vive_tracker_htcx/role/right_elbow/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger", "/user/vive_tracker_htcx/role/left_knee", "/user/vive_tracker_htcx/role/left_knee/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger", "/user/vive_tracker_htcx/role/right_knee", "/user/vive_tracker_htcx/role/right_knee/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger", "/user/vive_tracker_htcx/role/waist", "/user/vive_tracker_htcx/role/waist/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger", "/user/vive_tracker_htcx/role/chest", "/user/vive_tracker_htcx/role/chest/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger", "/user/vive_tracker_htcx/role/camera", "/user/vive_tracker_htcx/role/camera/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger", "/user/vive_tracker_htcx/role/keyboard", "/user/vive_tracker_htcx/role/keyboard/input/trigger/value", "", OpenXRAction::OPENXR_ACTION_FLOAT); + + // register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger click", "/user/vive_tracker_htcx/role/handheld_object", "/user/vive_tracker_htcx/role/handheld_object/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger click", "/user/vive_tracker_htcx/role/left_foot", "/user/vive_tracker_htcx/role/left_foot/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger click", "/user/vive_tracker_htcx/role/right_foot", "/user/vive_tracker_htcx/role/right_foot/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger click", "/user/vive_tracker_htcx/role/left_shoulder", "/user/vive_tracker_htcx/role/left_shoulder/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger click", "/user/vive_tracker_htcx/role/right_shoulder", "/user/vive_tracker_htcx/role/right_shoulder/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger click", "/user/vive_tracker_htcx/role/left_elbow", "/user/vive_tracker_htcx/role/left_elbow/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger click", "/user/vive_tracker_htcx/role/right_elbow", "/user/vive_tracker_htcx/role/right_elbow/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger click", "/user/vive_tracker_htcx/role/left_knee", "/user/vive_tracker_htcx/role/left_knee/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger click", "/user/vive_tracker_htcx/role/right_knee", "/user/vive_tracker_htcx/role/right_knee/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger click", "/user/vive_tracker_htcx/role/waist", "/user/vive_tracker_htcx/role/waist/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger click", "/user/vive_tracker_htcx/role/chest", "/user/vive_tracker_htcx/role/chest/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger click", "/user/vive_tracker_htcx/role/camera", "/user/vive_tracker_htcx/role/camera/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trigger click", "/user/vive_tracker_htcx/role/keyboard", "/user/vive_tracker_htcx/role/keyboard/input/trigger/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + // register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Squeeze click", "/user/vive_tracker_htcx/role/handheld_object", "/user/vive_tracker_htcx/role/handheld_object/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Squeeze click", "/user/vive_tracker_htcx/role/left_foot", "/user/vive_tracker_htcx/role/left_foot/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Squeeze click", "/user/vive_tracker_htcx/role/right_foot", "/user/vive_tracker_htcx/role/right_foot/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Squeeze click", "/user/vive_tracker_htcx/role/left_shoulder", "/user/vive_tracker_htcx/role/left_shoulder/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Squeeze click", "/user/vive_tracker_htcx/role/right_shoulder", "/user/vive_tracker_htcx/role/right_shoulder/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Squeeze click", "/user/vive_tracker_htcx/role/left_elbow", "/user/vive_tracker_htcx/role/left_elbow/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Squeeze click", "/user/vive_tracker_htcx/role/right_elbow", "/user/vive_tracker_htcx/role/right_elbow/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Squeeze click", "/user/vive_tracker_htcx/role/left_knee", "/user/vive_tracker_htcx/role/left_knee/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Squeeze click", "/user/vive_tracker_htcx/role/right_knee", "/user/vive_tracker_htcx/role/right_knee/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Squeeze click", "/user/vive_tracker_htcx/role/waist", "/user/vive_tracker_htcx/role/waist/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Squeeze click", "/user/vive_tracker_htcx/role/chest", "/user/vive_tracker_htcx/role/chest/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Squeeze click", "/user/vive_tracker_htcx/role/camera", "/user/vive_tracker_htcx/role/camera/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Squeeze click", "/user/vive_tracker_htcx/role/keyboard", "/user/vive_tracker_htcx/role/keyboard/input/squeeze/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + // register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad", "/user/vive_tracker_htcx/role/handheld_object", "/user/vive_tracker_htcx/role/handheld_object/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad", "/user/vive_tracker_htcx/role/left_foot", "/user/vive_tracker_htcx/role/left_foot/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad", "/user/vive_tracker_htcx/role/right_foot", "/user/vive_tracker_htcx/role/right_foot/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad", "/user/vive_tracker_htcx/role/left_shoulder", "/user/vive_tracker_htcx/role/left_shoulder/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad", "/user/vive_tracker_htcx/role/right_shoulder", "/user/vive_tracker_htcx/role/right_shoulder/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad", "/user/vive_tracker_htcx/role/left_elbow", "/user/vive_tracker_htcx/role/left_elbow/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad", "/user/vive_tracker_htcx/role/right_elbow", "/user/vive_tracker_htcx/role/right_elbow/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad", "/user/vive_tracker_htcx/role/left_knee", "/user/vive_tracker_htcx/role/left_knee/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad", "/user/vive_tracker_htcx/role/right_knee", "/user/vive_tracker_htcx/role/right_knee/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad", "/user/vive_tracker_htcx/role/waist", "/user/vive_tracker_htcx/role/waist/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad", "/user/vive_tracker_htcx/role/chest", "/user/vive_tracker_htcx/role/chest/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad", "/user/vive_tracker_htcx/role/camera", "/user/vive_tracker_htcx/role/camera/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad", "/user/vive_tracker_htcx/role/keyboard", "/user/vive_tracker_htcx/role/keyboard/input/trackpad", "", OpenXRAction::OPENXR_ACTION_VECTOR2); + + // register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad click", "/user/vive_tracker_htcx/role/handheld_object", "/user/vive_tracker_htcx/role/handheld_object/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad click", "/user/vive_tracker_htcx/role/left_foot", "/user/vive_tracker_htcx/role/left_foot/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad click", "/user/vive_tracker_htcx/role/right_foot", "/user/vive_tracker_htcx/role/right_foot/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad click", "/user/vive_tracker_htcx/role/left_shoulder", "/user/vive_tracker_htcx/role/left_shoulder/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad click", "/user/vive_tracker_htcx/role/right_shoulder", "/user/vive_tracker_htcx/role/right_shoulder/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad click", "/user/vive_tracker_htcx/role/left_elbow", "/user/vive_tracker_htcx/role/left_elbow/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad click", "/user/vive_tracker_htcx/role/right_elbow", "/user/vive_tracker_htcx/role/right_elbow/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad click", "/user/vive_tracker_htcx/role/left_knee", "/user/vive_tracker_htcx/role/left_knee/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad click", "/user/vive_tracker_htcx/role/right_knee", "/user/vive_tracker_htcx/role/right_knee/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad click", "/user/vive_tracker_htcx/role/waist", "/user/vive_tracker_htcx/role/waist/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad click", "/user/vive_tracker_htcx/role/chest", "/user/vive_tracker_htcx/role/chest/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad click", "/user/vive_tracker_htcx/role/camera", "/user/vive_tracker_htcx/role/camera/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad click", "/user/vive_tracker_htcx/role/keyboard", "/user/vive_tracker_htcx/role/keyboard/input/trackpad/click", "", OpenXRAction::OPENXR_ACTION_BOOL); + + // register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad touch", "/user/vive_tracker_htcx/role/handheld_object", "/user/vive_tracker_htcx/role/handheld_object/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad touch", "/user/vive_tracker_htcx/role/left_foot", "/user/vive_tracker_htcx/role/left_foot/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad touch", "/user/vive_tracker_htcx/role/right_foot", "/user/vive_tracker_htcx/role/right_foot/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad touch", "/user/vive_tracker_htcx/role/left_shoulder", "/user/vive_tracker_htcx/role/left_shoulder/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad touch", "/user/vive_tracker_htcx/role/right_shoulder", "/user/vive_tracker_htcx/role/right_shoulder/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad touch", "/user/vive_tracker_htcx/role/left_elbow", "/user/vive_tracker_htcx/role/left_elbow/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad touch", "/user/vive_tracker_htcx/role/right_elbow", "/user/vive_tracker_htcx/role/right_elbow/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad touch", "/user/vive_tracker_htcx/role/left_knee", "/user/vive_tracker_htcx/role/left_knee/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad touch", "/user/vive_tracker_htcx/role/right_knee", "/user/vive_tracker_htcx/role/right_knee/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad touch", "/user/vive_tracker_htcx/role/waist", "/user/vive_tracker_htcx/role/waist/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad touch", "/user/vive_tracker_htcx/role/chest", "/user/vive_tracker_htcx/role/chest/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad touch", "/user/vive_tracker_htcx/role/camera", "/user/vive_tracker_htcx/role/camera/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Trackpad touch", "/user/vive_tracker_htcx/role/keyboard", "/user/vive_tracker_htcx/role/keyboard/input/trackpad/touch", "", OpenXRAction::OPENXR_ACTION_BOOL); + + // register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Grip pose", "/user/vive_tracker_htcx/role/handheld_object", "/user/vive_tracker_htcx/role/handheld_object/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Grip pose", "/user/vive_tracker_htcx/role/left_foot", "/user/vive_tracker_htcx/role/left_foot/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Grip pose", "/user/vive_tracker_htcx/role/right_foot", "/user/vive_tracker_htcx/role/right_foot/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Grip pose", "/user/vive_tracker_htcx/role/left_shoulder", "/user/vive_tracker_htcx/role/left_shoulder/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Grip pose", "/user/vive_tracker_htcx/role/right_shoulder", "/user/vive_tracker_htcx/role/right_shoulder/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Grip pose", "/user/vive_tracker_htcx/role/left_elbow", "/user/vive_tracker_htcx/role/left_elbow/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Grip pose", "/user/vive_tracker_htcx/role/right_elbow", "/user/vive_tracker_htcx/role/right_elbow/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Grip pose", "/user/vive_tracker_htcx/role/left_knee", "/user/vive_tracker_htcx/role/left_knee/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Grip pose", "/user/vive_tracker_htcx/role/right_knee", "/user/vive_tracker_htcx/role/right_knee/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Grip pose", "/user/vive_tracker_htcx/role/waist", "/user/vive_tracker_htcx/role/waist/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Grip pose", "/user/vive_tracker_htcx/role/chest", "/user/vive_tracker_htcx/role/chest/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Grip pose", "/user/vive_tracker_htcx/role/camera", "/user/vive_tracker_htcx/role/camera/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Grip pose", "/user/vive_tracker_htcx/role/keyboard", "/user/vive_tracker_htcx/role/keyboard/input/grip/pose", "", OpenXRAction::OPENXR_ACTION_POSE); + + // register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Haptic output", "/user/vive_tracker_htcx/role/handheld_object", "/user/vive_tracker_htcx/role/handheld_object/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Haptic output", "/user/vive_tracker_htcx/role/left_foot", "/user/vive_tracker_htcx/role/left_foot/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Haptic output", "/user/vive_tracker_htcx/role/right_foot", "/user/vive_tracker_htcx/role/right_foot/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Haptic output", "/user/vive_tracker_htcx/role/left_shoulder", "/user/vive_tracker_htcx/role/left_shoulder/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Haptic output", "/user/vive_tracker_htcx/role/right_shoulder", "/user/vive_tracker_htcx/role/right_shoulder/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Haptic output", "/user/vive_tracker_htcx/role/left_elbow", "/user/vive_tracker_htcx/role/left_elbow/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Haptic output", "/user/vive_tracker_htcx/role/right_elbow", "/user/vive_tracker_htcx/role/right_elbow/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Haptic output", "/user/vive_tracker_htcx/role/left_knee", "/user/vive_tracker_htcx/role/left_knee/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Haptic output", "/user/vive_tracker_htcx/role/right_knee", "/user/vive_tracker_htcx/role/right_knee/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Haptic output", "/user/vive_tracker_htcx/role/waist", "/user/vive_tracker_htcx/role/waist/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Haptic output", "/user/vive_tracker_htcx/role/chest", "/user/vive_tracker_htcx/role/chest/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Haptic output", "/user/vive_tracker_htcx/role/camera", "/user/vive_tracker_htcx/role/camera/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); + register_io_path("/interaction_profiles/htc/vive_tracker_htcx", "Haptic output", "/user/vive_tracker_htcx/role/keyboard", "/user/vive_tracker_htcx/role/keyboard/output/haptic", "", OpenXRAction::OPENXR_ACTION_HAPTIC); +} diff --git a/modules/openxr/action_map/openxr_interaction_profile_meta_data.h b/modules/openxr/action_map/openxr_interaction_profile_meta_data.h new file mode 100644 index 0000000000..0ae6454be7 --- /dev/null +++ b/modules/openxr/action_map/openxr_interaction_profile_meta_data.h @@ -0,0 +1,118 @@ +/*************************************************************************/ +/* openxr_interaction_profile_meta_data.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef OPENXR_INTERACTION_PROFILE_META_DATA_H +#define OPENXR_INTERACTION_PROFILE_META_DATA_H + +#include "openxr_action.h" + +/////////////////////////////////////////////////////////////////////////// +// Stores available interaction profile meta data +// +// OpenXR defines and hardcodes all the supported input devices and their +// paths as part of the OpenXR spec. When support for new devices is +// introduced this often starts life as an extension that needs to be enabled +// until it's adopted into the core. As there is no interface to +// enumerate the possibly paths, and that any OpenXR runtime would likely +// limit such enumeration to those input devices supported by that runtime +// there is no other option than to hardcode this. +// +// Note that we need to include paths of our extensions in our action map +// regardless of whether the developers machine supports the extension or +// not. Unsupported paths are filtered out when the action map is submitted +// to the OpenXR runtime. +// +// Note on action type that automatic conversions between boolean and float +// are supported but otherwise action types should match between action and +// input/output paths. + +#include "core/object/object.h" + +#define XR_PATH_UNSUPPORTED_NAME "unsupported" + +class OpenXRInteractionProfileMetaData : public Object { +public: + struct TopLevelPath { + String display_name; // User friendly display name (i.e. Left controller) + String openxr_path; // Path in OpenXR (i.e. /user/hand/left) + String openxr_extension_name; // If set, only available if extension is enabled (i.e. XR_HTCX_vive_tracker_interaction) + }; + + struct IOPath { + String display_name; // User friendly display name (i.e. Grip pose (left controller)) + String top_level_path; // Top level path identifying the usage of the device in relation to this input/output + String openxr_path; // Path in OpenXR (i.e. /user/hand/left/input/grip/pose) + String openxr_extension_name; // If set, only available if extension is enabled (i.e. XR_EXT_palm_pose) + OpenXRAction::ActionType action_type; // Type of input/output + }; + + struct InteractionProfile { + String display_name; // User friendly display name (i.e. Simple controller) + String openxr_path; // Path in OpenXR (i.e. /interaction_profiles/khr/simple_controller) + String openxr_extension_name; // If set, only available if extension is enabled (i.e. XR_HTCX_vive_tracker_interaction) + Vector<IOPath> io_paths; // Inputs and outputs for this device + + bool has_io_path(const String p_io_path) const; + const IOPath *get_io_path(const String p_io_path) const; + }; + +private: + static OpenXRInteractionProfileMetaData *singleton; + + Vector<TopLevelPath> top_level_paths; + Vector<InteractionProfile> interaction_profiles; + + void _register_core_metadata(); + +protected: + static void _bind_methods(); + +public: + static OpenXRInteractionProfileMetaData *get_singleton() { return singleton; } + + OpenXRInteractionProfileMetaData(); + ~OpenXRInteractionProfileMetaData(); + + void register_top_level_path(const String &p_display_name, const String &p_openxr_path, const String &p_openxr_extension_name); + bool has_top_level_path(const String p_openxr_path) const; + String get_top_level_name(const String p_openxr_path) const; + String get_top_level_extension(const String p_openxr_path) const; + + void register_interaction_profile(const String &p_display_name, const String &p_openxr_path, const String &p_openxr_extension_name); + bool has_interaction_profile(const String p_openxr_path) const; + String get_interaction_profile_extension(const String p_openxr_path) const; + const InteractionProfile *get_profile(const String p_openxr_path) const; + PackedStringArray get_interaction_profile_paths() const; + + void register_io_path(const String &p_interaction_profile, const String &p_display_name, const String &p_toplevel_path, const String &p_openxr_path, const String &p_openxr_extension_name, OpenXRAction::ActionType p_action_type); + const IOPath *get_io_path(const String p_interaction_profile, const String p_io_path) const; +}; + +#endif // OPENXR_INTERACTION_PROFILE_META_DATA_H diff --git a/modules/openxr/editor/openxr_action_editor.cpp b/modules/openxr/editor/openxr_action_editor.cpp index 52216fa483..a6c99741d7 100644 --- a/modules/openxr/editor/openxr_action_editor.cpp +++ b/modules/openxr/editor/openxr_action_editor.cpp @@ -29,8 +29,13 @@ /*************************************************************************/ #include "openxr_action_editor.h" +#include "editor/editor_node.h" void OpenXRActionEditor::_bind_methods() { + ClassDB::bind_method(D_METHOD("_do_set_name", "name"), &OpenXRActionEditor::_do_set_name); + ClassDB::bind_method(D_METHOD("_do_set_localized_name", "name"), &OpenXRActionEditor::_do_set_localized_name); + ClassDB::bind_method(D_METHOD("_do_set_action_type", "type"), &OpenXRActionEditor::_do_set_action_type); + ADD_SIGNAL(MethodInfo("remove", PropertyInfo(Variant::OBJECT, "action_editor"))); } @@ -48,24 +53,71 @@ void OpenXRActionEditor::_notification(int p_what) { } void OpenXRActionEditor::_on_action_name_changed(const String p_new_text) { - // TODO validate if entry is allowed - - // If our localized name matches our action name, set this too - if (action->get_name() == action->get_localized_name()) { - action->set_localized_name(p_new_text); - action_localized_name->set_text(p_new_text); + if (action->get_name() != p_new_text) { + undo_redo->create_action(TTR("Rename Action")); + undo_redo->add_do_method(this, "_do_set_name", p_new_text); + undo_redo->add_undo_method(this, "_do_set_name", action->get_name()); + undo_redo->commit_action(false); + + // If our localized name matches our action name, set this too + if (action->get_name() == action->get_localized_name()) { + undo_redo->create_action(TTR("Rename Actions Localized name")); + undo_redo->add_do_method(this, "_do_set_localized_name", p_new_text); + undo_redo->add_undo_method(this, "_do_set_localized_name", action->get_localized_name()); + undo_redo->commit_action(false); + + action->set_localized_name(p_new_text); + action_localized_name->set_text(p_new_text); + } + action->set_name(p_new_text); + action->set_edited(true); } +} + +void OpenXRActionEditor::_do_set_name(const String p_new_text) { action->set_name(p_new_text); + action->set_edited(true); + action_name->set_text(p_new_text); } void OpenXRActionEditor::_on_action_localized_name_changed(const String p_new_text) { + if (action->get_localized_name() != p_new_text) { + undo_redo->create_action(TTR("Rename Actions Localized name")); + undo_redo->add_do_method(this, "_do_set_localized_name", p_new_text); + undo_redo->add_undo_method(this, "_do_set_localized_name", action->get_localized_name()); + undo_redo->commit_action(false); + + action->set_localized_name(p_new_text); + action->set_edited(true); + } +} + +void OpenXRActionEditor::_do_set_localized_name(const String p_new_text) { action->set_localized_name(p_new_text); + action->set_edited(true); + action_localized_name->set_text(p_new_text); } void OpenXRActionEditor::_on_item_selected(int p_idx) { ERR_FAIL_INDEX(p_idx, OpenXRAction::OPENXR_ACTION_MAX); - action->set_action_type(OpenXRAction::ActionType(p_idx)); + OpenXRAction::ActionType action_type = OpenXRAction::ActionType(p_idx); + + if (action->get_action_type() != action_type) { + undo_redo->create_action(TTR("Change Action Type")); + undo_redo->add_do_method(this, "_do_set_action_type", action_type); + undo_redo->add_undo_method(this, "_do_set_action_type", action->get_action_type()); + undo_redo->commit_action(false); + + action->set_action_type(action_type); + action->set_edited(true); + } +} + +void OpenXRActionEditor::_do_set_action_type(OpenXRAction::ActionType p_action_type) { + action->set_action_type(p_action_type); + action->set_edited(true); + action_type_button->select(int(action->get_action_type())); } void OpenXRActionEditor::_on_remove_action() { @@ -73,6 +125,7 @@ void OpenXRActionEditor::_on_remove_action() { } OpenXRActionEditor::OpenXRActionEditor(Ref<OpenXRAction> p_action) { + undo_redo = EditorNode::get_undo_redo(); action = p_action; set_h_size_flags(Control::SIZE_EXPAND_FILL); @@ -90,16 +143,16 @@ OpenXRActionEditor::OpenXRActionEditor(Ref<OpenXRAction> p_action) { action_localized_name->connect("text_changed", callable_mp(this, &OpenXRActionEditor::_on_action_localized_name_changed)); add_child(action_localized_name); - action_type = memnew(OptionButton); - action_type->add_item("Bool", OpenXRAction::OPENXR_ACTION_BOOL); - action_type->add_item("Float", OpenXRAction::OPENXR_ACTION_FLOAT); - action_type->add_item("Vector2", OpenXRAction::OPENXR_ACTION_VECTOR2); - action_type->add_item("Pose", OpenXRAction::OPENXR_ACTION_POSE); - action_type->add_item("Haptic", OpenXRAction::OPENXR_ACTION_HAPTIC); - action_type->select(int(action->get_action_type())); - action_type->set_custom_minimum_size(Size2(100.0, 0.0)); - action_type->connect("item_selected", callable_mp(this, &OpenXRActionEditor::_on_item_selected)); - add_child(action_type); + action_type_button = memnew(OptionButton); + action_type_button->add_item("Bool", OpenXRAction::OPENXR_ACTION_BOOL); + action_type_button->add_item("Float", OpenXRAction::OPENXR_ACTION_FLOAT); + action_type_button->add_item("Vector2", OpenXRAction::OPENXR_ACTION_VECTOR2); + action_type_button->add_item("Pose", OpenXRAction::OPENXR_ACTION_POSE); + action_type_button->add_item("Haptic", OpenXRAction::OPENXR_ACTION_HAPTIC); + action_type_button->select(int(action->get_action_type())); + action_type_button->set_custom_minimum_size(Size2(100.0, 0.0)); + action_type_button->connect("item_selected", callable_mp(this, &OpenXRActionEditor::_on_item_selected)); + add_child(action_type_button); // maybe add dropdown to edit our toplevel paths, or do we deduce them from our suggested bindings? diff --git a/modules/openxr/editor/openxr_action_editor.h b/modules/openxr/editor/openxr_action_editor.h index 6cf098cf08..66b7eebaeb 100644 --- a/modules/openxr/editor/openxr_action_editor.h +++ b/modules/openxr/editor/openxr_action_editor.h @@ -32,6 +32,7 @@ #define OPENXR_ACTION_EDITOR_H #include "../action_map/openxr_action.h" +#include "editor/editor_undo_redo_manager.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" #include "scene/gui/line_edit.h" @@ -42,11 +43,12 @@ class OpenXRActionEditor : public HBoxContainer { GDCLASS(OpenXRActionEditor, HBoxContainer); private: + Ref<EditorUndoRedoManager> undo_redo; Ref<OpenXRAction> action; LineEdit *action_name = nullptr; LineEdit *action_localized_name = nullptr; - OptionButton *action_type = nullptr; + OptionButton *action_type_button = nullptr; Button *rem_action = nullptr; void _theme_changed(); @@ -59,6 +61,11 @@ protected: static void _bind_methods(); void _notification(int p_what); + // used for undo/redo + void _do_set_name(const String p_new_text); + void _do_set_localized_name(const String p_new_text); + void _do_set_action_type(OpenXRAction::ActionType p_action_type); + public: Ref<OpenXRAction> get_action() { return action; }; OpenXRActionEditor(Ref<OpenXRAction> p_action); diff --git a/modules/openxr/editor/openxr_action_map_editor.cpp b/modules/openxr/editor/openxr_action_map_editor.cpp index b5223e5903..71fcd3ce7f 100644 --- a/modules/openxr/editor/openxr_action_map_editor.cpp +++ b/modules/openxr/editor/openxr_action_map_editor.cpp @@ -40,14 +40,16 @@ void OpenXRActionMapEditor::_bind_methods() { ClassDB::bind_method("_add_action_set_editor", &OpenXRActionMapEditor::_add_action_set_editor); - ClassDB::bind_method("_update_action_sets", &OpenXRActionMapEditor::_update_action_sets); - ClassDB::bind_method("_add_interaction_profile_editor", &OpenXRActionMapEditor::_add_interaction_profile_editor); - ClassDB::bind_method("_update_interaction_profiles", &OpenXRActionMapEditor::_update_interaction_profiles); ClassDB::bind_method(D_METHOD("_add_action_set", "name"), &OpenXRActionMapEditor::_add_action_set); ClassDB::bind_method(D_METHOD("_set_focus_on_action_set", "action_set"), &OpenXRActionMapEditor::_set_focus_on_action_set); ClassDB::bind_method(D_METHOD("_remove_action_set", "name"), &OpenXRActionMapEditor::_remove_action_set); + + ClassDB::bind_method(D_METHOD("_do_add_action_set_editor", "action_set_editor"), &OpenXRActionMapEditor::_do_add_action_set_editor); + ClassDB::bind_method(D_METHOD("_do_remove_action_set_editor", "action_set_editor"), &OpenXRActionMapEditor::_do_remove_action_set_editor); + ClassDB::bind_method(D_METHOD("_do_add_interaction_profile_editor", "interaction_profile_editor"), &OpenXRActionMapEditor::_do_add_interaction_profile_editor); + ClassDB::bind_method(D_METHOD("_do_remove_interaction_profile_editor", "interaction_profile_editor"), &OpenXRActionMapEditor::_do_remove_interaction_profile_editor); } void OpenXRActionMapEditor::_notification(int p_what) { @@ -55,7 +57,7 @@ void OpenXRActionMapEditor::_notification(int p_what) { case NOTIFICATION_ENTER_TREE: case NOTIFICATION_THEME_CHANGED: { for (int i = 0; i < tabs->get_child_count(); i++) { - Control *tab = static_cast<Control *>(tabs->get_child(i)); + Control *tab = Object::cast_to<Control>(tabs->get_child(i)); if (tab) { tab->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree"))); } @@ -63,8 +65,8 @@ void OpenXRActionMapEditor::_notification(int p_what) { } break; case NOTIFICATION_READY: { - _update_action_sets(); - _update_interaction_profiles(); + _create_action_sets(); + _create_interaction_profiles(); } break; } } @@ -75,18 +77,13 @@ OpenXRActionSetEditor *OpenXRActionMapEditor::_add_action_set_editor(Ref<OpenXRA OpenXRActionSetEditor *action_set_editor = memnew(OpenXRActionSetEditor(action_map, p_action_set)); action_set_editor->connect("remove", callable_mp(this, &OpenXRActionMapEditor::_on_remove_action_set)); action_set_editor->connect("action_removed", callable_mp(this, &OpenXRActionMapEditor::_on_action_removed)); + actionsets_vb->add_child(action_set_editor); return action_set_editor; } -void OpenXRActionMapEditor::_update_action_sets() { - // out with the old... - while (actionsets_vb->get_child_count() > 0) { - memdelete(actionsets_vb->get_child(0)); - } - - // in with the new... +void OpenXRActionMapEditor::_create_action_sets() { if (action_map.is_valid()) { Array action_sets = action_map->get_action_sets(); for (int i = 0; i < action_sets.size(); i++) { @@ -116,22 +113,10 @@ OpenXRInteractionProfileEditorBase *OpenXRActionMapEditor::_add_interaction_prof new_profile_editor->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("Tree"))); tabs->set_tab_button_icon(tabs->get_tab_count() - 1, get_theme_icon(SNAME("close"), SNAME("TabBar"))); - interaction_profiles.push_back(new_profile_editor); - return new_profile_editor; } -void OpenXRActionMapEditor::_update_interaction_profiles() { - // out with the old... - while (interaction_profiles.size() > 0) { - Node *interaction_profile = interaction_profiles[0]; - interaction_profiles.remove_at(0); - - tabs->remove_child(interaction_profile); - interaction_profile->queue_free(); - } - - // in with the new... +void OpenXRActionMapEditor::_create_interaction_profiles() { if (action_map.is_valid()) { Array new_interaction_profiles = action_map->get_interaction_profiles(); for (int i = 0; i < new_interaction_profiles.size(); i++) { @@ -150,9 +135,17 @@ OpenXRActionSetEditor *OpenXRActionMapEditor::_add_action_set(String p_name) { new_action_set->set_name(p_name); new_action_set->set_localized_name(p_name); action_map->add_action_set(new_action_set); + action_map->set_edited(true); // update our editor right away - return _add_action_set_editor(new_action_set); + OpenXRActionSetEditor *action_set_editor = _add_action_set_editor(new_action_set); + + undo_redo->create_action(TTR("Add action set")); + undo_redo->add_do_method(this, "_do_add_action_set_editor", action_set_editor); + undo_redo->add_undo_method(this, "_do_remove_action_set_editor", action_set_editor); + undo_redo->commit_action(false); + + return action_set_editor; } void OpenXRActionMapEditor::_remove_action_set(String p_name) { @@ -160,13 +153,12 @@ void OpenXRActionMapEditor::_remove_action_set(String p_name) { Ref<OpenXRActionSet> action_set = action_map->find_action_set(p_name); ERR_FAIL_COND(action_set.is_null()); - if (action_set->get_action_count() > 0) { - // we should remove these and add to our redo/undo step before calling _remove_action_set - WARN_PRINT("Action set still has associated actions before being removed!"); + for (int i = 0; i < actionsets_vb->get_child_count(); i++) { + OpenXRActionSetEditor *action_set_editor = Object::cast_to<OpenXRActionSetEditor>(actionsets_vb->get_child(i)); + if (action_set_editor && action_set_editor->get_action_set() == action_set) { + _on_remove_action_set(action_set_editor); + } } - - // now we remove it - action_map->remove_action_set(action_set); } void OpenXRActionMapEditor::_on_add_action_set() { @@ -203,14 +195,24 @@ void OpenXRActionMapEditor::_on_remove_action_set(Object *p_action_set_editor) { Ref<OpenXRActionSet> action_set = action_set_editor->get_action_set(); ERR_FAIL_COND(action_set.is_null()); - action_map->remove_action_set(action_set); - actionsets_vb->remove_child(action_set_editor); - action_set_editor->queue_free(); + action_set_editor->remove_all_actions(); + + undo_redo->create_action(TTR("Remove action set")); + undo_redo->add_do_method(this, "_do_remove_action_set_editor", action_set_editor); + undo_redo->add_undo_method(this, "_do_add_action_set_editor", action_set_editor); + undo_redo->commit_action(true); + + action_map->set_edited(true); } -void OpenXRActionMapEditor::_on_action_removed() { - // make sure our interaction profiles are updated - _update_interaction_profiles(); +void OpenXRActionMapEditor::_on_action_removed(Ref<OpenXRAction> p_action) { + for (int i = 0; i < tabs->get_tab_count(); i++) { + // First tab won't be an interaction profile editor, but being thorough.. + OpenXRInteractionProfileEditorBase *interaction_profile_editor = Object::cast_to<OpenXRInteractionProfileEditorBase>(tabs->get_tab_control(i)); + if (interaction_profile_editor) { + interaction_profile_editor->remove_all_bindings_for_action(p_action); + } + } } void OpenXRActionMapEditor::_on_add_interaction_profile() { @@ -232,20 +234,35 @@ void OpenXRActionMapEditor::_on_interaction_profile_selected(const String p_path new_profile.instantiate(); new_profile->set_interaction_profile_path(p_path); action_map->add_interaction_profile(new_profile); + action_map->set_edited(true); - _add_interaction_profile_editor(new_profile); + OpenXRInteractionProfileEditorBase *interaction_profile_editor = _add_interaction_profile_editor(new_profile); + + undo_redo->create_action(TTR("Add interaction profile")); + undo_redo->add_do_method(this, "_do_add_interaction_profile_editor", interaction_profile_editor); + undo_redo->add_undo_method(this, "_do_remove_interaction_profile_editor", interaction_profile_editor); + undo_redo->commit_action(false); tabs->set_current_tab(tabs->get_tab_count() - 1); } void OpenXRActionMapEditor::_load_action_map(const String p_path, bool p_create_new_if_missing) { - action_map = ResourceLoader::load(p_path, "", ResourceFormatLoader::CACHE_MODE_IGNORE); - if (action_map.is_null()) { - if (p_create_new_if_missing) { + Error err = OK; + action_map = ResourceLoader::load(p_path, "", ResourceFormatLoader::CACHE_MODE_IGNORE, &err); + if (err != OK) { + if ((err == ERR_FILE_NOT_FOUND || err == ERR_CANT_OPEN) && p_create_new_if_missing) { action_map.instantiate(); action_map->create_default_action_sets(); + + // Save it immediately + err = ResourceSaver::save(action_map, p_path); + if (err != OK) { + // show warning but continue + EditorNode::get_singleton()->show_warning(vformat(TTR("Error saving file %s: %s"), edited_path, error_names[err])); + } + } else { - EditorNode::get_singleton()->show_warning(TTR("Invalid file, not an OpenXR action map.")); + EditorNode::get_singleton()->show_warning(vformat(TTR("Error loading %s: %s."), edited_path, error_names[err])); edited_path = ""; header_label->set_text(""); @@ -254,55 +271,123 @@ void OpenXRActionMapEditor::_load_action_map(const String p_path, bool p_create_ } edited_path = p_path; - header_label->set_text(TTR("OpenXR Action map:") + " " + p_path.get_file()); + header_label->set_text(TTR("OpenXR Action map:") + " " + edited_path.get_file()); } void OpenXRActionMapEditor::_on_save_action_map() { Error err = ResourceSaver::save(action_map, edited_path); if (err != OK) { - EditorNode::get_singleton()->show_warning(vformat(TTR("Error saving file: %s"), edited_path)); + EditorNode::get_singleton()->show_warning(vformat(TTR("Error saving file %s: %s"), edited_path, error_names[err])); return; } - _update_action_sets(); - _update_interaction_profiles(); + // TODO should clear undo/redo history + + // out with the old + _clear_action_map(); + + _create_action_sets(); + _create_interaction_profiles(); } void OpenXRActionMapEditor::_on_reset_to_default_layout() { + // TODO should clear undo/redo history + + // out with the old + _clear_action_map(); + // create a new one action_map.unref(); action_map.instantiate(); action_map->create_default_action_sets(); + action_map->set_edited(true); - _update_action_sets(); - _update_interaction_profiles(); + _create_action_sets(); + _create_interaction_profiles(); } void OpenXRActionMapEditor::_on_tabs_tab_changed(int p_tab) { } void OpenXRActionMapEditor::_on_tab_button_pressed(int p_tab) { - OpenXRInteractionProfileEditorBase *profile_editor = static_cast<OpenXRInteractionProfileEditorBase *>(tabs->get_tab_control(p_tab)); - ERR_FAIL_NULL(profile_editor); + OpenXRInteractionProfileEditorBase *interaction_profile_editor = Object::cast_to<OpenXRInteractionProfileEditorBase>(tabs->get_tab_control(p_tab)); + ERR_FAIL_NULL(interaction_profile_editor); + + undo_redo->create_action(TTR("Remove interaction profile")); + undo_redo->add_do_method(this, "_do_remove_interaction_profile_editor", interaction_profile_editor); + undo_redo->add_undo_method(this, "_do_add_interaction_profile_editor", interaction_profile_editor); + undo_redo->commit_action(true); + + action_map->set_edited(true); +} + +void OpenXRActionMapEditor::_do_add_action_set_editor(OpenXRActionSetEditor *p_action_set_editor) { + Ref<OpenXRActionSet> action_set = p_action_set_editor->get_action_set(); + ERR_FAIL_COND(action_set.is_null()); + + action_map->add_action_set(action_set); + actionsets_vb->add_child(p_action_set_editor); +} + +void OpenXRActionMapEditor::_do_remove_action_set_editor(OpenXRActionSetEditor *p_action_set_editor) { + Ref<OpenXRActionSet> action_set = p_action_set_editor->get_action_set(); + ERR_FAIL_COND(action_set.is_null()); + + actionsets_vb->remove_child(p_action_set_editor); + action_map->remove_action_set(action_set); +} + +void OpenXRActionMapEditor::_do_add_interaction_profile_editor(OpenXRInteractionProfileEditorBase *p_interaction_profile_editor) { + Ref<OpenXRInteractionProfile> interaction_profile = p_interaction_profile_editor->get_interaction_profile(); + ERR_FAIL_COND(interaction_profile.is_null()); + + action_map->add_interaction_profile(interaction_profile); + tabs->add_child(p_interaction_profile_editor); + tabs->set_tab_button_icon(tabs->get_tab_count() - 1, get_theme_icon(SNAME("close"), SNAME("TabBar"))); + + tabs->set_current_tab(tabs->get_tab_count() - 1); +} - Ref<OpenXRInteractionProfile> interaction_profile = profile_editor->get_interaction_profile(); +void OpenXRActionMapEditor::_do_remove_interaction_profile_editor(OpenXRInteractionProfileEditorBase *p_interaction_profile_editor) { + Ref<OpenXRInteractionProfile> interaction_profile = p_interaction_profile_editor->get_interaction_profile(); ERR_FAIL_COND(interaction_profile.is_null()); + tabs->remove_child(p_interaction_profile_editor); action_map->remove_interaction_profile(interaction_profile); - tabs->remove_child(profile_editor); - profile_editor->queue_free(); } void OpenXRActionMapEditor::open_action_map(String p_path) { EditorNode::get_singleton()->make_bottom_panel_item_visible(this); + // out with the old... + _clear_action_map(); + + // now load in our new action map _load_action_map(p_path); - _update_action_sets(); - _update_interaction_profiles(); + _create_action_sets(); + _create_interaction_profiles(); +} + +void OpenXRActionMapEditor::_clear_action_map() { + while (actionsets_vb->get_child_count() > 0) { + Node *child = actionsets_vb->get_child(0); + actionsets_vb->remove_child(child); + child->queue_free(); + } + + for (int i = tabs->get_tab_count() - 1; i >= 0; --i) { + // First tab won't be an interaction profile editor, but being thorough.. + OpenXRInteractionProfileEditorBase *interaction_profile_editor = Object::cast_to<OpenXRInteractionProfileEditorBase>(tabs->get_tab_control(i)); + if (interaction_profile_editor) { + tabs->remove_child(interaction_profile_editor); + interaction_profile_editor->queue_free(); + } + } } OpenXRActionMapEditor::OpenXRActionMapEditor() { + undo_redo = EditorNode::get_undo_redo(); set_custom_minimum_size(Size2(0.0, 300.0)); top_hb = memnew(HBoxContainer); @@ -364,7 +449,9 @@ OpenXRActionMapEditor::OpenXRActionMapEditor() { select_interaction_profile_dialog->connect("interaction_profile_selected", callable_mp(this, &OpenXRActionMapEditor::_on_interaction_profile_selected)); add_child(select_interaction_profile_dialog); - _load_action_map(GLOBAL_GET("xr/openxr/default_action_map")); + // Our Action map editor is only shown if openxr is enabled in project settings + // So load our action map and if it doesn't exist, create it right away. + _load_action_map(GLOBAL_GET("xr/openxr/default_action_map"), true); } OpenXRActionMapEditor::~OpenXRActionMapEditor() { diff --git a/modules/openxr/editor/openxr_action_map_editor.h b/modules/openxr/editor/openxr_action_map_editor.h index a19bc90f56..2ff6ddf785 100644 --- a/modules/openxr/editor/openxr_action_map_editor.h +++ b/modules/openxr/editor/openxr_action_map_editor.h @@ -37,6 +37,7 @@ #include "../editor/openxr_select_interaction_profile_dialog.h" #include "editor/editor_plugin.h" +#include "editor/editor_undo_redo_manager.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" #include "scene/gui/label.h" @@ -47,9 +48,9 @@ class OpenXRActionMapEditor : public VBoxContainer { GDCLASS(OpenXRActionMapEditor, VBoxContainer); private: + Ref<EditorUndoRedoManager> undo_redo; String edited_path; Ref<OpenXRActionMap> action_map; - Vector<Node *> interaction_profiles; HBoxContainer *top_hb = nullptr; Label *header_label = nullptr; @@ -64,9 +65,9 @@ private: OpenXRSelectInteractionProfileDialog *select_interaction_profile_dialog = nullptr; OpenXRActionSetEditor *_add_action_set_editor(Ref<OpenXRActionSet> p_action_set); - void _update_action_sets(); + void _create_action_sets(); OpenXRInteractionProfileEditorBase *_add_interaction_profile_editor(Ref<OpenXRInteractionProfile> p_interaction_profile); - void _update_interaction_profiles(); + void _create_interaction_profiles(); OpenXRActionSetEditor *_add_action_set(String p_name); void _remove_action_set(String p_name); @@ -74,7 +75,7 @@ private: void _on_add_action_set(); void _set_focus_on_action_set(OpenXRActionSetEditor *p_action_set_editor); void _on_remove_action_set(Object *p_action_set_editor); - void _on_action_removed(); + void _on_action_removed(Ref<OpenXRAction> p_action); void _on_add_interaction_profile(); void _on_interaction_profile_selected(const String p_path); @@ -90,6 +91,14 @@ protected: static void _bind_methods(); void _notification(int p_what); + void _clear_action_map(); + + // used for undo/redo + void _do_add_action_set_editor(OpenXRActionSetEditor *p_action_set_editor); + void _do_remove_action_set_editor(OpenXRActionSetEditor *p_action_set_editor); + void _do_add_interaction_profile_editor(OpenXRInteractionProfileEditorBase *p_interaction_profile_editor); + void _do_remove_interaction_profile_editor(OpenXRInteractionProfileEditorBase *p_interaction_profile_editor); + public: void open_action_map(String p_path); diff --git a/modules/openxr/editor/openxr_action_set_editor.cpp b/modules/openxr/editor/openxr_action_set_editor.cpp index 3869146e8e..7f4da8b312 100644 --- a/modules/openxr/editor/openxr_action_set_editor.cpp +++ b/modules/openxr/editor/openxr_action_set_editor.cpp @@ -29,11 +29,18 @@ /*************************************************************************/ #include "openxr_action_set_editor.h" +#include "editor/editor_node.h" #include "openxr_action_editor.h" void OpenXRActionSetEditor::_bind_methods() { + ClassDB::bind_method(D_METHOD("_do_set_name", "name"), &OpenXRActionSetEditor::_do_set_name); + ClassDB::bind_method(D_METHOD("_do_set_localized_name", "name"), &OpenXRActionSetEditor::_do_set_localized_name); + ClassDB::bind_method(D_METHOD("_do_set_priority", "value"), &OpenXRActionSetEditor::_do_set_priority); + ClassDB::bind_method(D_METHOD("_do_add_action_editor", "action_editor"), &OpenXRActionSetEditor::_do_add_action_editor); + ClassDB::bind_method(D_METHOD("_do_remove_action_editor", "action_editor"), &OpenXRActionSetEditor::_do_remove_action_editor); + ADD_SIGNAL(MethodInfo("remove", PropertyInfo(Variant::OBJECT, "action_set_editor"))); - ADD_SIGNAL(MethodInfo("action_removed")); + ADD_SIGNAL(MethodInfo("action_removed", PropertyInfo(Variant::OBJECT, "action"))); } void OpenXRActionSetEditor::_set_fold_icon() { @@ -68,20 +75,6 @@ OpenXRActionEditor *OpenXRActionSetEditor::_add_action_editor(Ref<OpenXRAction> return action_editor; } -void OpenXRActionSetEditor::_update_actions() { - // out with the old... - while (actions_vb->get_child_count() > 0) { - memdelete(actions_vb->get_child(0)); - } - - // in with the new... - Array actions = action_set->get_actions(); - for (int i = 0; i < actions.size(); i++) { - Ref<OpenXRAction> action = actions[i]; - _add_action_editor(action); - } -} - void OpenXRActionSetEditor::_on_toggle_expand() { is_expanded = !is_expanded; actions_vb->set_visible(is_expanded); @@ -89,24 +82,66 @@ void OpenXRActionSetEditor::_on_toggle_expand() { } void OpenXRActionSetEditor::_on_action_set_name_changed(const String p_new_text) { - // TODO validate if entry is allowed - - // If our localized name matches our action set name, set this too - if (action_set->get_name() == action_set->get_localized_name()) { - action_set->set_localized_name(p_new_text); - action_set_localized_name->set_text(p_new_text); + if (action_set->get_name() != p_new_text) { + undo_redo->create_action(TTR("Rename Action Set")); + undo_redo->add_do_method(this, "_do_set_name", p_new_text); + undo_redo->add_undo_method(this, "_do_set_name", action_set->get_name()); + undo_redo->commit_action(false); + + // If our localized name matches our action set name, set this too + if (action_set->get_name() == action_set->get_localized_name()) { + undo_redo->create_action(TTR("Rename Action Sets Localized name")); + undo_redo->add_do_method(this, "_do_set_localized_name", p_new_text); + undo_redo->add_undo_method(this, "_do_set_localized_name", action_set->get_localized_name()); + undo_redo->commit_action(false); + + action_set->set_localized_name(p_new_text); + action_set_localized_name->set_text(p_new_text); + } + action_set->set_name(p_new_text); + action_set->set_edited(true); } +} + +void OpenXRActionSetEditor::_do_set_name(const String p_new_text) { action_set->set_name(p_new_text); + action_set_name->set_text(p_new_text); } void OpenXRActionSetEditor::_on_action_set_localized_name_changed(const String p_new_text) { + if (action_set->get_localized_name() != p_new_text) { + undo_redo->create_action(TTR("Rename Action Sets Localized name")); + undo_redo->add_do_method(this, "_do_set_localized_name", p_new_text); + undo_redo->add_undo_method(this, "_do_set_localized_name", action_set->get_localized_name()); + undo_redo->commit_action(false); + + action_set->set_localized_name(p_new_text); + action_set->set_edited(true); + } +} + +void OpenXRActionSetEditor::_do_set_localized_name(const String p_new_text) { action_set->set_localized_name(p_new_text); + action_set_localized_name->set_text(p_new_text); } void OpenXRActionSetEditor::_on_action_set_priority_changed(const String p_new_text) { int64_t value = p_new_text.to_int(); - action_set->set_priority(value); + if (action_set->get_priority() != value) { + undo_redo->create_action(TTR("Change Action Sets priority")); + undo_redo->add_do_method(this, "_do_set_priority", value); + undo_redo->add_undo_method(this, "_do_set_priority", action_set->get_priority()); + undo_redo->commit_action(false); + + action_set->set_priority(value); + action_set->set_edited(true); + } +} + +void OpenXRActionSetEditor::_do_set_priority(int64_t p_value) { + action_set->set_priority(p_value); + action_set_priority->set_text(itos(p_value)); } void OpenXRActionSetEditor::_on_add_action() { @@ -116,8 +151,14 @@ void OpenXRActionSetEditor::_on_add_action() { new_action->set_name("New"); new_action->set_localized_name("New"); action_set->add_action(new_action); + action_set->set_edited(true); - _add_action_editor(new_action); + OpenXRActionEditor *action_editor = _add_action_editor(new_action); + + undo_redo->create_action(TTR("Add action")); + undo_redo->add_do_method(this, "_do_add_action_editor", action_editor); + undo_redo->add_undo_method(this, "_do_remove_action_editor", action_editor); + undo_redo->commit_action(false); // TODO handle focus } @@ -133,17 +174,36 @@ void OpenXRActionSetEditor::_on_remove_action(Object *p_action_editor) { Ref<OpenXRAction> action = action_editor->get_action(); ERR_FAIL_COND(action.is_null()); - // TODO add undo/redo action + emit_signal("action_removed", action); + + undo_redo->create_action(TTR("Delete action")); + undo_redo->add_do_method(this, "_do_remove_action_editor", action_editor); + undo_redo->add_undo_method(this, "_do_add_action_editor", action_editor); + undo_redo->commit_action(true); - // TODO find where this action is used by our interaction profiles and remove it there + action_set->set_edited(true); +} - // And remove it.... - action_map->remove_action(action->get_name_with_set()); // remove it from the set and any interaction profile it relates to - actions_vb->remove_child(action_editor); - action_editor->queue_free(); +void OpenXRActionSetEditor::_do_add_action_editor(OpenXRActionEditor *p_action_editor) { + Ref<OpenXRAction> action = p_action_editor->get_action(); + ERR_FAIL_COND(action.is_null()); - // Let action map editor know so we can update our interaction profiles - emit_signal("action_removed"); + action_set->add_action(action); + actions_vb->add_child(p_action_editor); +} + +void OpenXRActionSetEditor::_do_remove_action_editor(OpenXRActionEditor *p_action_editor) { + Ref<OpenXRAction> action = p_action_editor->get_action(); + ERR_FAIL_COND(action.is_null()); + + actions_vb->remove_child(p_action_editor); + action_set->remove_action(action); +} + +void OpenXRActionSetEditor::remove_all_actions() { + for (int i = actions_vb->get_child_count(); i > 0; --i) { + _on_remove_action(actions_vb->get_child(i)); + } } void OpenXRActionSetEditor::set_focus_on_entry() { @@ -152,6 +212,7 @@ void OpenXRActionSetEditor::set_focus_on_entry() { } OpenXRActionSetEditor::OpenXRActionSetEditor(Ref<OpenXRActionMap> p_action_map, Ref<OpenXRActionSet> p_action_set) { + undo_redo = EditorNode::get_undo_redo(); action_map = p_action_map; action_set = p_action_set; @@ -214,5 +275,10 @@ OpenXRActionSetEditor::OpenXRActionSetEditor(Ref<OpenXRActionMap> p_action_map, actions_vb->set_h_size_flags(Control::SIZE_EXPAND_FILL); main_vb->add_child(actions_vb); - _update_actions(); + // Add our existing actions + Array actions = action_set->get_actions(); + for (int i = 0; i < actions.size(); i++) { + Ref<OpenXRAction> action = actions[i]; + _add_action_editor(action); + } } diff --git a/modules/openxr/editor/openxr_action_set_editor.h b/modules/openxr/editor/openxr_action_set_editor.h index d8c85d03dd..7a8dc0dcbf 100644 --- a/modules/openxr/editor/openxr_action_set_editor.h +++ b/modules/openxr/editor/openxr_action_set_editor.h @@ -44,6 +44,7 @@ class OpenXRActionSetEditor : public HBoxContainer { GDCLASS(OpenXRActionSetEditor, HBoxContainer); private: + Ref<EditorUndoRedoManager> undo_redo; Ref<OpenXRActionMap> action_map; Ref<OpenXRActionSet> action_set; @@ -63,7 +64,6 @@ private: void _set_fold_icon(); void _theme_changed(); OpenXRActionEditor *_add_action_editor(Ref<OpenXRAction> p_action); - void _update_actions(); void _on_toggle_expand(); void _on_action_set_name_changed(const String p_new_text); @@ -78,10 +78,19 @@ protected: static void _bind_methods(); void _notification(int p_what); + // used for undo/redo + void _do_set_name(const String p_new_text); + void _do_set_localized_name(const String p_new_text); + void _do_set_priority(int64_t value); + void _do_add_action_editor(OpenXRActionEditor *p_action_editor); + void _do_remove_action_editor(OpenXRActionEditor *p_action_editor); + public: Ref<OpenXRActionSet> get_action_set() { return action_set; }; void set_focus_on_entry(); + void remove_all_actions(); + OpenXRActionSetEditor(Ref<OpenXRActionMap> p_action_map, Ref<OpenXRActionSet> p_action_set); }; diff --git a/modules/openxr/editor/openxr_interaction_profile_editor.cpp b/modules/openxr/editor/openxr_interaction_profile_editor.cpp index e2dc2d1b74..9d8ac76187 100644 --- a/modules/openxr/editor/openxr_interaction_profile_editor.cpp +++ b/modules/openxr/editor/openxr_interaction_profile_editor.cpp @@ -29,6 +29,7 @@ /*************************************************************************/ #include "openxr_interaction_profile_editor.h" +#include "editor/editor_node.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" #include "scene/gui/label.h" @@ -58,6 +59,13 @@ void OpenXRInteractionProfileEditorBase::_notification(int p_what) { } } +void OpenXRInteractionProfileEditorBase::_do_update_interaction_profile() { + if (!is_dirty) { + is_dirty = true; + call_deferred("_update_interaction_profile"); + } +} + void OpenXRInteractionProfileEditorBase::_add_binding(const String p_action, const String p_path) { ERR_FAIL_COND(action_map.is_null()); ERR_FAIL_COND(interaction_profile.is_null()); @@ -71,14 +79,16 @@ void OpenXRInteractionProfileEditorBase::_add_binding(const String p_action, con binding.instantiate(); binding->set_action(action); interaction_profile->add_binding(binding); + interaction_profile->set_edited(true); } binding->add_path(p_path); + binding->set_edited(true); // Update our toplevel paths action->set_toplevel_paths(action_map->get_top_level_paths(action)); - call_deferred("_update_interaction_profile"); + _do_update_interaction_profile(); } void OpenXRInteractionProfileEditorBase::_remove_binding(const String p_action, const String p_path) { @@ -91,25 +101,54 @@ void OpenXRInteractionProfileEditorBase::_remove_binding(const String p_action, Ref<OpenXRIPBinding> binding = interaction_profile->get_binding_for_action(action); if (binding.is_valid()) { binding->remove_path(p_path); + binding->set_edited(true); if (binding->get_path_count() == 0) { interaction_profile->remove_binding(binding); + interaction_profile->set_edited(true); } // Update our toplevel paths action->set_toplevel_paths(action_map->get_top_level_paths(action)); - call_deferred("_update_interaction_profile"); + _do_update_interaction_profile(); + } +} + +void OpenXRInteractionProfileEditorBase::remove_all_bindings_for_action(Ref<OpenXRAction> p_action) { + Ref<OpenXRIPBinding> binding = interaction_profile->get_binding_for_action(p_action); + if (binding.is_valid()) { + String action_name = p_action->get_name_with_set(); + + // for our undo/redo we process all paths + undo_redo->create_action(TTR("Remove action from interaction profile")); + PackedStringArray paths = binding->get_paths(); + for (const String &path : paths) { + undo_redo->add_do_method(this, "_remove_binding", action_name, path); + undo_redo->add_undo_method(this, "_add_binding", action_name, path); + } + undo_redo->commit_action(false); + + // but we take a shortcut here :) + interaction_profile->remove_binding(binding); + interaction_profile->set_edited(true); + + // Update our toplevel paths + p_action->set_toplevel_paths(action_map->get_top_level_paths(p_action)); + + _do_update_interaction_profile(); } } OpenXRInteractionProfileEditorBase::OpenXRInteractionProfileEditorBase(Ref<OpenXRActionMap> p_action_map, Ref<OpenXRInteractionProfile> p_interaction_profile) { + undo_redo = EditorNode::get_undo_redo(); + action_map = p_action_map; interaction_profile = p_interaction_profile; String profile_path = interaction_profile->get_interaction_profile_path(); String profile_name = profile_path; - profile_def = OpenXRDefs::get_profile(profile_path); + profile_def = OpenXRInteractionProfileMetaData::get_singleton()->get_profile(profile_path); if (profile_def != nullptr) { profile_name = profile_def->display_name; } @@ -117,6 +156,9 @@ OpenXRInteractionProfileEditorBase::OpenXRInteractionProfileEditorBase(Ref<OpenX set_name(profile_name); set_h_size_flags(SIZE_EXPAND_FILL); set_v_size_flags(SIZE_EXPAND_FILL); + + // Make sure it is updated when it enters the tree... + is_dirty = true; } /////////////////////////////////////////////////////////////////////////// @@ -128,11 +170,22 @@ void OpenXRInteractionProfileEditor::select_action_for(const String p_io_path) { } void OpenXRInteractionProfileEditor::action_selected(const String p_action) { - _add_binding(p_action, selecting_for_io_path); + undo_redo->create_action(TTR("Add binding")); + undo_redo->add_do_method(this, "_add_binding", p_action, selecting_for_io_path); + undo_redo->add_undo_method(this, "_remove_binding", p_action, selecting_for_io_path); + undo_redo->commit_action(true); + selecting_for_io_path = ""; } -void OpenXRInteractionProfileEditor::_add_io_path(VBoxContainer *p_container, const OpenXRDefs::IOPath *p_io_path) { +void OpenXRInteractionProfileEditor::_on_remove_pressed(const String p_action, const String p_for_io_path) { + undo_redo->create_action(TTR("Remove binding")); + undo_redo->add_do_method(this, "_remove_binding", p_action, p_for_io_path); + undo_redo->add_undo_method(this, "_add_binding", p_action, p_for_io_path); + undo_redo->commit_action(true); +} + +void OpenXRInteractionProfileEditor::_add_io_path(VBoxContainer *p_container, const OpenXRInteractionProfileMetaData::IOPath *p_io_path) { HBoxContainer *path_hb = memnew(HBoxContainer); path_hb->set_h_size_flags(Control::SIZE_EXPAND_FILL); p_container->add_child(path_hb); @@ -196,7 +249,7 @@ void OpenXRInteractionProfileEditor::_add_io_path(VBoxContainer *p_container, co Button *action_rem = memnew(Button); action_rem->set_flat(true); action_rem->set_icon(get_theme_icon(SNAME("Remove"), SNAME("EditorIcons"))); - action_rem->connect("pressed", callable_mp((OpenXRInteractionProfileEditorBase *)this, &OpenXRInteractionProfileEditorBase::_remove_binding).bind(action->get_name_with_set(), String(p_io_path->openxr_path))); + action_rem->connect("pressed", callable_mp((OpenXRInteractionProfileEditor *)this, &OpenXRInteractionProfileEditor::_on_remove_pressed).bind(action->get_name_with_set(), String(p_io_path->openxr_path))); action_hb->add_child(action_rem); } } @@ -206,6 +259,11 @@ void OpenXRInteractionProfileEditor::_add_io_path(VBoxContainer *p_container, co void OpenXRInteractionProfileEditor::_update_interaction_profile() { ERR_FAIL_NULL(profile_def); + if (!is_dirty) { + // no need to update + return; + } + // out with the old... while (main_hb->get_child_count() > 0) { memdelete(main_hb->get_child(0)); @@ -214,9 +272,9 @@ void OpenXRInteractionProfileEditor::_update_interaction_profile() { // in with the new... // Determine toplevel paths - Vector<const OpenXRDefs::TopLevelPath *> top_level_paths; - for (int i = 0; i < profile_def->io_path_count; i++) { - const OpenXRDefs::IOPath *io_path = &profile_def->io_paths[i]; + Vector<String> top_level_paths; + for (int i = 0; i < profile_def->io_paths.size(); i++) { + const OpenXRInteractionProfileMetaData::IOPath *io_path = &profile_def->io_paths[i]; if (!top_level_paths.has(io_path->top_level_path)) { top_level_paths.push_back(io_path->top_level_path); @@ -233,21 +291,24 @@ void OpenXRInteractionProfileEditor::_update_interaction_profile() { panel->add_child(container); Label *label = memnew(Label); - label->set_text(top_level_paths[i]->display_name); + label->set_text(OpenXRInteractionProfileMetaData::get_singleton()->get_top_level_name(top_level_paths[i])); container->add_child(label); - for (int j = 0; j < profile_def->io_path_count; j++) { - const OpenXRDefs::IOPath *io_path = &profile_def->io_paths[j]; + for (int j = 0; j < profile_def->io_paths.size(); j++) { + const OpenXRInteractionProfileMetaData::IOPath *io_path = &profile_def->io_paths[j]; if (io_path->top_level_path == top_level_paths[i]) { _add_io_path(container, io_path); } } } + + // and we've updated it... + is_dirty = false; } void OpenXRInteractionProfileEditor::_theme_changed() { for (int i = 0; i < main_hb->get_child_count(); i++) { - Control *panel = static_cast<Control *>(main_hb->get_child(i)); + Control *panel = Object::cast_to<Control>(main_hb->get_child(i)); if (panel) { panel->add_theme_style_override("panel", get_theme_stylebox(SNAME("panel"), SNAME("TabContainer"))); } @@ -256,14 +317,10 @@ void OpenXRInteractionProfileEditor::_theme_changed() { OpenXRInteractionProfileEditor::OpenXRInteractionProfileEditor(Ref<OpenXRActionMap> p_action_map, Ref<OpenXRInteractionProfile> p_interaction_profile) : OpenXRInteractionProfileEditorBase(p_action_map, p_interaction_profile) { - // TODO background of scrollbox should be darker with our VBoxContainers we're adding in _update_interaction_profile the normal color - main_hb = memnew(HBoxContainer); add_child(main_hb); select_action_dialog = memnew(OpenXRSelectActionDialog(p_action_map)); select_action_dialog->connect("action_selected", callable_mp(this, &OpenXRInteractionProfileEditor::action_selected)); add_child(select_action_dialog); - - _update_interaction_profile(); } diff --git a/modules/openxr/editor/openxr_interaction_profile_editor.h b/modules/openxr/editor/openxr_interaction_profile_editor.h index 20a37a80eb..14af702b94 100644 --- a/modules/openxr/editor/openxr_interaction_profile_editor.h +++ b/modules/openxr/editor/openxr_interaction_profile_editor.h @@ -32,8 +32,9 @@ #define OPENXR_INTERACTION_PROFILE_EDITOR_H #include "../action_map/openxr_action_map.h" -#include "../action_map/openxr_defs.h" #include "../action_map/openxr_interaction_profile.h" +#include "../action_map/openxr_interaction_profile_meta_data.h" +#include "editor/editor_undo_redo_manager.h" #include "scene/gui/scroll_container.h" #include "openxr_select_action_dialog.h" @@ -42,22 +43,29 @@ class OpenXRInteractionProfileEditorBase : public ScrollContainer { GDCLASS(OpenXRInteractionProfileEditorBase, ScrollContainer); protected: + Ref<EditorUndoRedoManager> undo_redo; Ref<OpenXRInteractionProfile> interaction_profile; Ref<OpenXRActionMap> action_map; + bool is_dirty = false; + static void _bind_methods(); void _notification(int p_what); - const OpenXRDefs::InteractionProfile *profile_def = nullptr; + const OpenXRInteractionProfileMetaData::InteractionProfile *profile_def = nullptr; public: Ref<OpenXRInteractionProfile> get_interaction_profile() { return interaction_profile; } virtual void _update_interaction_profile() {} virtual void _theme_changed() {} + + void _do_update_interaction_profile(); void _add_binding(const String p_action, const String p_path); void _remove_binding(const String p_action, const String p_path); + void remove_all_bindings_for_action(Ref<OpenXRAction> p_action); + OpenXRInteractionProfileEditorBase(Ref<OpenXRActionMap> p_action_map, Ref<OpenXRInteractionProfile> p_interaction_profile); }; @@ -69,11 +77,12 @@ private: HBoxContainer *main_hb = nullptr; OpenXRSelectActionDialog *select_action_dialog = nullptr; - void _add_io_path(VBoxContainer *p_container, const OpenXRDefs::IOPath *p_io_path); + void _add_io_path(VBoxContainer *p_container, const OpenXRInteractionProfileMetaData::IOPath *p_io_path); public: void select_action_for(const String p_io_path); void action_selected(const String p_action); + void _on_remove_pressed(const String p_action, const String p_for_io_path); virtual void _update_interaction_profile() override; virtual void _theme_changed() override; diff --git a/modules/openxr/editor/openxr_select_action_dialog.cpp b/modules/openxr/editor/openxr_select_action_dialog.cpp index 5f018291d5..c4b2ef95c5 100644 --- a/modules/openxr/editor/openxr_select_action_dialog.cpp +++ b/modules/openxr/editor/openxr_select_action_dialog.cpp @@ -47,7 +47,7 @@ void OpenXRSelectActionDialog::_notification(int p_what) { void OpenXRSelectActionDialog::_on_select_action(const String p_action) { if (selected_action != "") { NodePath button_path = action_buttons[selected_action]; - Button *button = static_cast<Button *>(get_node(button_path)); + Button *button = Object::cast_to<Button>(get_node(button_path)); if (button != nullptr) { button->set_flat(true); } @@ -57,7 +57,7 @@ void OpenXRSelectActionDialog::_on_select_action(const String p_action) { if (selected_action != "") { NodePath button_path = action_buttons[selected_action]; - Button *button = static_cast<Button *>(get_node(button_path)); + Button *button = Object::cast_to<Button>(get_node(button_path)); if (button != nullptr) { button->set_flat(false); } diff --git a/modules/openxr/editor/openxr_select_interaction_profile_dialog.cpp b/modules/openxr/editor/openxr_select_interaction_profile_dialog.cpp index e92519aec2..b871840cb2 100644 --- a/modules/openxr/editor/openxr_select_interaction_profile_dialog.cpp +++ b/modules/openxr/editor/openxr_select_interaction_profile_dialog.cpp @@ -46,7 +46,7 @@ void OpenXRSelectInteractionProfileDialog::_notification(int p_what) { void OpenXRSelectInteractionProfileDialog::_on_select_interaction_profile(const String p_interaction_profile) { if (selected_interaction_profile != "") { NodePath button_path = ip_buttons[selected_interaction_profile]; - Button *button = static_cast<Button *>(get_node(button_path)); + Button *button = Object::cast_to<Button>(get_node(button_path)); if (button != nullptr) { button->set_flat(true); } @@ -56,7 +56,7 @@ void OpenXRSelectInteractionProfileDialog::_on_select_interaction_profile(const if (selected_interaction_profile != "") { NodePath button_path = ip_buttons[selected_interaction_profile]; - Button *button = static_cast<Button *>(get_node(button_path)); + Button *button = Object::cast_to<Button>(get_node(button_path)); if (button != nullptr) { button->set_flat(false); } @@ -75,13 +75,13 @@ void OpenXRSelectInteractionProfileDialog::open(PackedStringArray p_do_not_inclu ip_buttons.clear(); // in with the new - PackedStringArray interaction_profiles = OpenXRDefs::get_interaction_profile_paths(); + PackedStringArray interaction_profiles = OpenXRInteractionProfileMetaData::get_singleton()->get_interaction_profile_paths(); for (int i = 0; i < interaction_profiles.size(); i++) { String path = interaction_profiles[i]; if (!p_do_not_include.has(path)) { Button *ip_button = memnew(Button); ip_button->set_flat(true); - ip_button->set_text(OpenXRDefs::get_profile(path)->display_name); + ip_button->set_text(OpenXRInteractionProfileMetaData::get_singleton()->get_profile(path)->display_name); ip_button->connect("pressed", callable_mp(this, &OpenXRSelectInteractionProfileDialog::_on_select_interaction_profile).bind(path)); main_vb->add_child(ip_button); diff --git a/modules/openxr/editor/openxr_select_interaction_profile_dialog.h b/modules/openxr/editor/openxr_select_interaction_profile_dialog.h index 54bfe3120a..767326bc46 100644 --- a/modules/openxr/editor/openxr_select_interaction_profile_dialog.h +++ b/modules/openxr/editor/openxr_select_interaction_profile_dialog.h @@ -31,7 +31,7 @@ #ifndef OPENXR_SELECT_INTERACTION_PROFILE_DIALOG_H #define OPENXR_SELECT_INTERACTION_PROFILE_DIALOG_H -#include "../action_map/openxr_defs.h" +#include "../action_map/openxr_interaction_profile_meta_data.h" #include "scene/gui/box_container.h" #include "scene/gui/button.h" #include "scene/gui/dialogs.h" diff --git a/modules/openxr/extensions/openxr_android_extension.cpp b/modules/openxr/extensions/openxr_android_extension.cpp index 753fc5fa89..402a2ee707 100644 --- a/modules/openxr/extensions/openxr_android_extension.cpp +++ b/modules/openxr/extensions/openxr_android_extension.cpp @@ -74,7 +74,7 @@ void OpenXRAndroidExtension::on_before_instance_created() { } // We're keeping the Android create info struct here to avoid including openxr_platform.h in a header, which would break other extensions. -// This is reasonably safe as the struct is only used during intialization and the extension is a singleton. +// This is reasonably safe as the struct is only used during initialization and the extension is a singleton. static XrInstanceCreateInfoAndroidKHR instance_create_info; void *OpenXRAndroidExtension::set_instance_create_info_and_get_next_pointer(void *p_next_pointer) { diff --git a/modules/openxr/extensions/openxr_extension_wrapper.h b/modules/openxr/extensions/openxr_extension_wrapper.h index 77b52ab355..eed969d628 100644 --- a/modules/openxr/extensions/openxr_extension_wrapper.h +++ b/modules/openxr/extensions/openxr_extension_wrapper.h @@ -89,11 +89,6 @@ public: return false; } - // Return false if this extension is responsible for this path but the path is not enabled - virtual bool is_path_supported(const String &p_path) { - return true; - } - OpenXRExtensionWrapper(OpenXRAPI *p_openxr_api) { openxr_api = p_openxr_api; }; virtual ~OpenXRExtensionWrapper() = default; }; diff --git a/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp index 29208efb20..302acf4e30 100644 --- a/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp +++ b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.cpp @@ -65,38 +65,3 @@ bool OpenXRHTCViveTrackerExtension::on_event_polled(const XrEventDataBuffer &eve } break; } } - -bool OpenXRHTCViveTrackerExtension::is_path_supported(const String &p_path) { - if (p_path == "/interaction_profiles/htc/vive_tracker_htcx") { - return available; - } else if (p_path == "/user/vive_tracker_htcx/role/handheld_object") { - return available; - } else if (p_path == "/user/vive_tracker_htcx/role/left_foot") { - return available; - } else if (p_path == "/user/vive_tracker_htcx/role/right_foot") { - return available; - } else if (p_path == "/user/vive_tracker_htcx/role/left_shoulder") { - return available; - } else if (p_path == "/user/vive_tracker_htcx/role/right_shoulder") { - return available; - } else if (p_path == "/user/vive_tracker_htcx/role/left_elbow") { - return available; - } else if (p_path == "/user/vive_tracker_htcx/role/right_elbow") { - return available; - } else if (p_path == "/user/vive_tracker_htcx/role/left_knee") { - return available; - } else if (p_path == "/user/vive_tracker_htcx/role/right_knee") { - return available; - } else if (p_path == "/user/vive_tracker_htcx/role/waist") { - return available; - } else if (p_path == "/user/vive_tracker_htcx/role/chest") { - return available; - } else if (p_path == "/user/vive_tracker_htcx/role/camera") { - return available; - } else if (p_path == "/user/vive_tracker_htcx/role/keyboard") { - return available; - } - - // Not a path under this extensions control, so we return true; - return true; -} diff --git a/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h index ab8e8535f1..376af35e37 100644 --- a/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h +++ b/modules/openxr/extensions/openxr_htc_vive_tracker_extension.h @@ -43,7 +43,6 @@ public: bool is_available(); virtual bool on_event_polled(const XrEventDataBuffer &event) override; - virtual bool is_path_supported(const String &p_path) override; private: static OpenXRHTCViveTrackerExtension *singleton; diff --git a/modules/openxr/extensions/openxr_palm_pose_extension.cpp b/modules/openxr/extensions/openxr_palm_pose_extension.cpp index fd3b8f50fe..8f87aaea7f 100644 --- a/modules/openxr/extensions/openxr_palm_pose_extension.cpp +++ b/modules/openxr/extensions/openxr_palm_pose_extension.cpp @@ -51,16 +51,3 @@ OpenXRPalmPoseExtension::~OpenXRPalmPoseExtension() { bool OpenXRPalmPoseExtension::is_available() { return available; } - -bool OpenXRPalmPoseExtension::is_path_supported(const String &p_path) { - if (p_path == "/user/hand/left/input/palm_ext/pose") { - return available; - } - - if (p_path == "/user/hand/right/input/palm_ext/pose") { - return available; - } - - // Not a path under this extensions control, so we return true; - return true; -} diff --git a/modules/openxr/extensions/openxr_palm_pose_extension.h b/modules/openxr/extensions/openxr_palm_pose_extension.h index a7ef83c5d5..a63c57eb51 100644 --- a/modules/openxr/extensions/openxr_palm_pose_extension.h +++ b/modules/openxr/extensions/openxr_palm_pose_extension.h @@ -42,8 +42,6 @@ public: bool is_available(); - virtual bool is_path_supported(const String &p_path) override; - private: static OpenXRPalmPoseExtension *singleton; diff --git a/modules/openxr/openxr_api.cpp b/modules/openxr/openxr_api.cpp index 71e1d9c351..a075031ac9 100644 --- a/modules/openxr/openxr_api.cpp +++ b/modules/openxr/openxr_api.cpp @@ -208,17 +208,79 @@ bool OpenXRAPI::is_extension_supported(const String &p_extension) const { return false; } -bool OpenXRAPI::is_path_supported(const String &p_path) { - // This checks with extensions whether a path is *unsupported* and returns false if this is so. - // This allows us to filter out paths that are only available if related extensions are supported. - // WARNING: This method will return true for unknown/mistyped paths as we have no way to validate those. +bool OpenXRAPI::is_extension_enabled(const String &p_extension) const { + CharString extension = p_extension.ascii(); - for (OpenXRExtensionWrapper *wrapper : registered_extension_wrappers) { - if (!wrapper->is_path_supported(p_path)) { - return false; + for (int i = 0; i < enabled_extensions.size(); i++) { + if (strcmp(enabled_extensions[i].ptr(), extension.ptr()) == 0) { + return true; } } + return false; +} + +bool OpenXRAPI::is_top_level_path_supported(const String &p_toplevel_path) { + String required_extension = OpenXRInteractionProfileMetaData::get_singleton()->get_top_level_extension(p_toplevel_path); + + // If unsupported is returned we likely have a misspelled interaction profile path in our action map. Always output that as an error. + ERR_FAIL_COND_V_MSG(required_extension == XR_PATH_UNSUPPORTED_NAME, false, "OpenXR: Unsupported interaction profile " + p_toplevel_path); + + if (required_extension == "") { + // no extension needed, core top level are always "supported", they just won't be used if not really supported + return true; + } + + if (!is_extension_enabled(required_extension)) { + // It is very likely we have top level paths for which the extension is not available so don't flood the logs with unnecessary spam. + print_verbose("OpenXR: Top level path " + p_toplevel_path + " requires extension " + required_extension); + return false; + } + + return true; +} + +bool OpenXRAPI::is_interaction_profile_supported(const String &p_ip_path) { + String required_extension = OpenXRInteractionProfileMetaData::get_singleton()->get_interaction_profile_extension(p_ip_path); + + // If unsupported is returned we likely have a misspelled interaction profile path in our action map. Always output that as an error. + ERR_FAIL_COND_V_MSG(required_extension == XR_PATH_UNSUPPORTED_NAME, false, "OpenXR: Unsupported interaction profile " + p_ip_path); + + if (required_extension == "") { + // no extension needed, core interaction profiles are always "supported", they just won't be used if not really supported + return true; + } + + if (!is_extension_enabled(required_extension)) { + // It is very likely we have interaction profiles for which the extension is not available so don't flood the logs with unnecessary spam. + print_verbose("OpenXR: Interaction profile " + p_ip_path + " requires extension " + required_extension); + return false; + } + + return true; +} + +bool OpenXRAPI::interaction_profile_supports_io_path(const String &p_ip_path, const String &p_io_path) { + if (!is_interaction_profile_supported(p_ip_path)) { + return false; + } + + const OpenXRInteractionProfileMetaData::IOPath *io_path = OpenXRInteractionProfileMetaData::get_singleton()->get_io_path(p_ip_path, p_io_path); + + // If the io_path is not part of our meta data we've likely got a misspelled name or a bad action map, report + ERR_FAIL_NULL_V_MSG(io_path, false, "OpenXR: Unsupported io path " + String(p_ip_path) + String(p_io_path)); + + if (io_path->openxr_extension_name == "") { + // no extension needed, core io paths are always "supported", they just won't be used if not really supported + return true; + } + + if (!is_extension_enabled(io_path->openxr_extension_name)) { + // It is very likely we have io paths for which the extension is not available so don't flood the logs with unnecessary spam. + print_verbose("OpenXR: IO path " + String(p_ip_path) + String(p_io_path) + " requires extension " + io_path->openxr_extension_name); + return false; + } + return true; } @@ -283,6 +345,7 @@ bool OpenXRAPI::create_instance() { Vector<const char *> extension_ptrs; for (int i = 0; i < enabled_extensions.size(); i++) { + print_verbose(String("OpenXR: Enabling extension ") + String(enabled_extensions[i])); extension_ptrs.push_back(enabled_extensions[i].get_data()); } @@ -740,9 +803,10 @@ bool OpenXRAPI::create_swapchains() { ERR_FAIL_NULL_V_MSG(projection_views, false, "OpenXR Couldn't allocate memory for projection views"); // We create our depth swapchain if: + // - we've enabled submitting depth buffer // - we support our depth layer extension // - we have our spacewarp extension (not yet implemented) - if (OpenXRCompositionLayerDepthExtension::get_singleton()->is_available()) { + if (submit_depth_buffer && OpenXRCompositionLayerDepthExtension::get_singleton()->is_available()) { // Build a vector with swapchain formats we want to use, from best fit to worst Vector<int64_t> usable_swapchain_formats; int64_t swapchain_format_to_use = 0; @@ -790,7 +854,7 @@ bool OpenXRAPI::create_swapchains() { projection_views[i].subImage.imageRect.extent.width = recommended_size.width; projection_views[i].subImage.imageRect.extent.height = recommended_size.height; - if (OpenXRCompositionLayerDepthExtension::get_singleton()->is_available() && depth_views) { + if (submit_depth_buffer && OpenXRCompositionLayerDepthExtension::get_singleton()->is_available() && depth_views) { projection_views[i].next = &depth_views[i]; depth_views[i].type = XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR; @@ -1066,6 +1130,30 @@ bool OpenXRAPI::on_state_exiting() { return true; } +void OpenXRAPI::set_form_factor(XrFormFactor p_form_factor) { + ERR_FAIL_COND(is_initialized()); + + form_factor = p_form_factor; +} + +void OpenXRAPI::set_view_configuration(XrViewConfigurationType p_view_configuration) { + ERR_FAIL_COND(is_initialized()); + + view_configuration = p_view_configuration; +} + +void OpenXRAPI::set_reference_space(XrReferenceSpaceType p_reference_space) { + ERR_FAIL_COND(is_initialized()); + + reference_space = p_reference_space; +} + +void OpenXRAPI::set_submit_depth_buffer(bool p_submit_depth_buffer) { + ERR_FAIL_COND(is_initialized()); + + submit_depth_buffer = p_submit_depth_buffer; +} + bool OpenXRAPI::is_initialized() { return (instance != XR_NULL_HANDLE); } @@ -1684,7 +1772,7 @@ RID OpenXRAPI::get_color_texture() { } RID OpenXRAPI::get_depth_texture() { - if (swapchains[OPENXR_SWAPCHAIN_DEPTH].image_acquired) { + if (submit_depth_buffer && swapchains[OPENXR_SWAPCHAIN_DEPTH].image_acquired) { return graphics_extension->get_texture(swapchains[OPENXR_SWAPCHAIN_DEPTH].swapchain_graphics_data, swapchains[OPENXR_SWAPCHAIN_DEPTH].image_index); } else { return RID(); @@ -1862,6 +1950,8 @@ OpenXRAPI::OpenXRAPI() { default: break; } + + submit_depth_buffer = GLOBAL_GET("xr/openxr/submit_depth_buffer"); } // reset a few things that can't be done in our class definition @@ -2314,7 +2404,7 @@ XrPath OpenXRAPI::get_interaction_profile_path(RID p_interaction_profile) { } RID OpenXRAPI::interaction_profile_create(const String p_name) { - if (!is_path_supported(p_name)) { + if (!is_interaction_profile_supported(p_name)) { // The extension enabling this path must not be active, we will silently skip this interaction profile return RID(); } @@ -2355,14 +2445,13 @@ void OpenXRAPI::interaction_profile_clear_bindings(RID p_interaction_profile) { } bool OpenXRAPI::interaction_profile_add_binding(RID p_interaction_profile, RID p_action, const String p_path) { - if (!is_path_supported(p_path)) { - // The extension enabling this path must not be active, we will silently skip this binding - return false; - } - InteractionProfile *ip = interaction_profile_owner.get_or_null(p_interaction_profile); ERR_FAIL_NULL_V(ip, false); + if (!interaction_profile_supports_io_path(ip->name, p_path)) { + return false; + } + XrActionSuggestedBinding binding; Action *action = action_owner.get_or_null(p_action); diff --git a/modules/openxr/openxr_api.h b/modules/openxr/openxr_api.h index 5dce749351..806e859da0 100644 --- a/modules/openxr/openxr_api.h +++ b/modules/openxr/openxr_api.h @@ -104,6 +104,7 @@ private: XrViewConfigurationType view_configuration = XR_VIEW_CONFIGURATION_TYPE_PRIMARY_STEREO; XrReferenceSpaceType reference_space = XR_REFERENCE_SPACE_TYPE_STAGE; // XrEnvironmentBlendMode environment_blend_mode = XR_ENVIRONMENT_BLEND_MODE_OPAQUE; + bool submit_depth_buffer = false; // if set to true we submit depth buffers to OpenXR if a suitable extension is enabled. // state XrInstance instance = XR_NULL_HANDLE; @@ -149,6 +150,7 @@ private: bool load_layer_properties(); bool load_supported_extensions(); bool is_extension_supported(const String &p_extension) const; + bool is_extension_enabled(const String &p_extension) const; bool openxr_loader_init(); bool resolve_instance_openxr_symbols(); @@ -300,7 +302,9 @@ public: void parse_velocities(const XrSpaceVelocity &p_velocity, Vector3 &r_linear_velocity, Vector3 &r_angular_velocity); bool xr_result(XrResult result, const char *format, Array args = Array()) const; - bool is_path_supported(const String &p_path); + bool is_top_level_path_supported(const String &p_toplevel_path); + bool is_interaction_profile_supported(const String &p_ip_path); + bool interaction_profile_supports_io_path(const String &p_ip_path, const String &p_io_path); static bool openxr_is_enabled(bool p_check_run_in_editor = true); static OpenXRAPI *get_singleton(); @@ -312,6 +316,18 @@ public: void set_xr_interface(OpenXRInterface *p_xr_interface); void register_extension_wrapper(OpenXRExtensionWrapper *p_extension_wrapper); + void set_form_factor(XrFormFactor p_form_factor); + XrFormFactor get_form_factor() const { return form_factor; } + + void set_view_configuration(XrViewConfigurationType p_view_configuration); + XrViewConfigurationType get_view_configuration() const { return view_configuration; } + + void set_reference_space(XrReferenceSpaceType p_reference_space); + XrReferenceSpaceType get_reference_space() const { return reference_space; } + + void set_submit_depth_buffer(bool p_submit_depth_buffer); + bool get_submit_depth_buffer() const { return submit_depth_buffer; } + bool is_initialized(); bool is_running(); bool initialize(const String &p_rendering_driver); diff --git a/modules/openxr/openxr_interface.cpp b/modules/openxr/openxr_interface.cpp index 77660eb6f0..d6f7cd7b3e 100644 --- a/modules/openxr/openxr_interface.cpp +++ b/modules/openxr/openxr_interface.cpp @@ -45,7 +45,7 @@ void OpenXRInterface::_bind_methods() { // Display refresh rate ClassDB::bind_method(D_METHOD("get_display_refresh_rate"), &OpenXRInterface::get_display_refresh_rate); ClassDB::bind_method(D_METHOD("set_display_refresh_rate", "refresh_rate"), &OpenXRInterface::set_display_refresh_rate); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "display_refresh_rate"), "set_display_refresh_rate", "get_display_refresh_rate"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "display_refresh_rate"), "set_display_refresh_rate", "get_display_refresh_rate"); ClassDB::bind_method(D_METHOD("get_available_display_refresh_rates"), &OpenXRInterface::get_available_display_refresh_rates); } @@ -158,7 +158,7 @@ void OpenXRInterface::_load_action_map() { for (int k = 0; k < toplevel_paths.size(); k++) { // Only check for our tracker if our path is supported. - if (openxr_api->is_path_supported(toplevel_paths[k])) { + if (openxr_api->is_top_level_path_supported(toplevel_paths[k])) { Tracker *tracker = find_tracker(toplevel_paths[k], true); if (tracker) { trackers_for_action.push_back(tracker); @@ -345,7 +345,7 @@ OpenXRInterface::Tracker *OpenXRInterface::find_tracker(const String &p_tracker_ return nullptr; } - ERR_FAIL_COND_V(!openxr_api->is_path_supported(p_tracker_name), nullptr); + ERR_FAIL_COND_V(!openxr_api->is_top_level_path_supported(p_tracker_name), nullptr); // Create our RID RID tracker_rid = openxr_api->tracker_create(p_tracker_name); diff --git a/modules/openxr/register_types.cpp b/modules/openxr/register_types.cpp index 5694fffe39..0835bbd642 100644 --- a/modules/openxr/register_types.cpp +++ b/modules/openxr/register_types.cpp @@ -37,9 +37,14 @@ #include "action_map/openxr_action_map.h" #include "action_map/openxr_action_set.h" #include "action_map/openxr_interaction_profile.h" +#include "action_map/openxr_interaction_profile_meta_data.h" #include "scene/openxr_hand.h" +static OpenXRAPI *openxr_api = nullptr; +static OpenXRInteractionProfileMetaData *openxr_interaction_profile_meta_data = nullptr; +static Ref<OpenXRInterface> openxr_interface; + #ifdef TOOLS_ENABLED #include "editor/editor_node.h" @@ -49,6 +54,12 @@ static void _editor_init() { if (OpenXRAPI::openxr_is_enabled(false)) { // Only add our OpenXR action map editor if OpenXR is enabled for our project + if (openxr_interaction_profile_meta_data == nullptr) { + // If we didn't initialize our actionmap meta data at startup, we initialise it now. + openxr_interaction_profile_meta_data = memnew(OpenXRInteractionProfileMetaData); + ERR_FAIL_NULL(openxr_interaction_profile_meta_data); + } + OpenXREditorPlugin *openxr_plugin = memnew(OpenXREditorPlugin()); EditorNode::get_singleton()->add_editor_plugin(openxr_plugin); } @@ -56,14 +67,13 @@ static void _editor_init() { #endif -static OpenXRAPI *openxr_api = nullptr; -static Ref<OpenXRInterface> openxr_interface; - void initialize_openxr_module(ModuleInitializationLevel p_level) { if (p_level == MODULE_INITIALIZATION_LEVEL_SERVERS) { // For now we create our openxr device here. If we merge it with openxr_interface we'll create that here soon. if (OpenXRAPI::openxr_is_enabled()) { + openxr_interaction_profile_meta_data = memnew(OpenXRInteractionProfileMetaData); + ERR_FAIL_NULL(openxr_interaction_profile_meta_data); openxr_api = memnew(OpenXRAPI); ERR_FAIL_NULL(openxr_api); @@ -81,6 +91,7 @@ void initialize_openxr_module(ModuleInitializationLevel p_level) { GDREGISTER_CLASS(OpenXRAction); GDREGISTER_CLASS(OpenXRActionSet); GDREGISTER_CLASS(OpenXRActionMap); + GDREGISTER_CLASS(OpenXRInteractionProfileMetaData); GDREGISTER_CLASS(OpenXRIPBinding); GDREGISTER_CLASS(OpenXRInteractionProfile); @@ -131,4 +142,9 @@ void uninitialize_openxr_module(ModuleInitializationLevel p_level) { memdelete(openxr_api); openxr_api = nullptr; } + + if (openxr_interaction_profile_meta_data) { + memdelete(openxr_interaction_profile_meta_data); + openxr_interaction_profile_meta_data = nullptr; + } } diff --git a/modules/raycast/SCsub b/modules/raycast/SCsub index 51d75d45b0..37c8a95905 100644 --- a/modules/raycast/SCsub +++ b/modules/raycast/SCsub @@ -68,10 +68,10 @@ if env["builtin_embree"]: if not env.msvc: if env["arch"] in ["x86_64", "x86_32"]: - env_raycast.Append(CPPFLAGS=["-msse2", "-mxsave"]) + env_raycast.Append(CCFLAGS=["-msse2", "-mxsave"]) if env["platform"] == "windows": - env_raycast.Append(CPPFLAGS=["-mstackrealign"]) + env_raycast.Append(CCFLAGS=["-mstackrealign"]) if env["platform"] == "windows": if env.msvc: @@ -92,11 +92,15 @@ if env["builtin_embree"]: env_thirdparty.Append(CPPDEFINES=["__SSE2__", "__SSE__"]) if env["platform"] == "web": - env_thirdparty.Append(CPPFLAGS=["-msimd128"]) + env_thirdparty.Append(CXXFLAGS=["-msimd128"]) if not env.msvc: + # Flags synced with upstream gnu.cmake. + if env["arch"] == "arm64" and env["platform"] == "linuxbsd": + env_thirdparty.Append(CXXFLAGS=["-flax-vector-conversions"]) + env_thirdparty.Append( - CPPFLAGS=[ + CXXFLAGS=[ "-fno-strict-overflow", "-fno-delete-null-pointer-checks", "-fwrapv", diff --git a/modules/raycast/config.py b/modules/raycast/config.py index f4243f01c5..26329d813a 100644 --- a/modules/raycast/config.py +++ b/modules/raycast/config.py @@ -1,13 +1,11 @@ def can_build(env, platform): # Supported architectures depend on the Embree library. - # No ARM32 support planned. - if env["arch"] == "arm32": - return False + if env["arch"] in ["x86_64", "arm64", "wasm32"]: + return True # x86_32 only seems supported on Windows for now. - if env["arch"] == "x86_32" and platform != "windows": - return False - # The rest works, even wasm32! - return True + if env["arch"] == "x86_32" and platform == "windows": + return True + return False def configure(env): diff --git a/modules/regex/regex.cpp b/modules/regex/regex.cpp index c808211d68..6f02d20c25 100644 --- a/modules/regex/regex.cpp +++ b/modules/regex/regex.cpp @@ -50,8 +50,7 @@ int RegExMatch::_find(const Variant &p_name) const { return -1; } return i; - - } else if (p_name.get_type() == Variant::STRING) { + } else if (p_name.get_type() == Variant::STRING || p_name.get_type() == Variant::STRING_NAME) { HashMap<String, int>::ConstIterator found = names.find((String)p_name); if (found) { return found->value; diff --git a/modules/register_module_types.h b/modules/register_module_types.h index cfd1b355d4..706e641735 100644 --- a/modules/register_module_types.h +++ b/modules/register_module_types.h @@ -31,13 +31,13 @@ #ifndef REGISTER_MODULE_TYPES_H #define REGISTER_MODULE_TYPES_H -#include "core/extension/gdnative_interface.h" +#include "core/extension/gdextension_interface.h" enum ModuleInitializationLevel { - MODULE_INITIALIZATION_LEVEL_CORE = GDNATIVE_INITIALIZATION_CORE, - MODULE_INITIALIZATION_LEVEL_SERVERS = GDNATIVE_INITIALIZATION_SERVERS, - MODULE_INITIALIZATION_LEVEL_SCENE = GDNATIVE_INITIALIZATION_SCENE, - MODULE_INITIALIZATION_LEVEL_EDITOR = GDNATIVE_INITIALIZATION_EDITOR + MODULE_INITIALIZATION_LEVEL_CORE = GDEXTENSION_INITIALIZATION_CORE, + MODULE_INITIALIZATION_LEVEL_SERVERS = GDEXTENSION_INITIALIZATION_SERVERS, + MODULE_INITIALIZATION_LEVEL_SCENE = GDEXTENSION_INITIALIZATION_SCENE, + MODULE_INITIALIZATION_LEVEL_EDITOR = GDEXTENSION_INITIALIZATION_EDITOR }; void initialize_modules(ModuleInitializationLevel p_level); diff --git a/modules/svg/image_loader_svg.cpp b/modules/svg/image_loader_svg.cpp index 2dba4916a0..b194e7cb3f 100644 --- a/modules/svg/image_loader_svg.cpp +++ b/modules/svg/image_loader_svg.cpp @@ -67,19 +67,12 @@ void ImageLoaderSVG::_replace_color_property(const HashMap<Color, Color> &p_colo } } -Error ImageLoaderSVG::create_image_from_string(Ref<Image> p_image, String p_string, float p_scale, bool p_upsample, const HashMap<Color, Color> &p_color_map) { +Error ImageLoaderSVG::create_image_from_utf8_buffer(Ref<Image> p_image, const PackedByteArray &p_buffer, float p_scale, bool p_upsample) { ERR_FAIL_COND_V_MSG(Math::is_zero_approx(p_scale), ERR_INVALID_PARAMETER, "ImageLoaderSVG: Can't load SVG with a scale of 0."); - if (p_color_map.size()) { - _replace_color_property(p_color_map, "stop-color=\"", p_string); - _replace_color_property(p_color_map, "fill=\"", p_string); - _replace_color_property(p_color_map, "stroke=\"", p_string); - } - std::unique_ptr<tvg::Picture> picture = tvg::Picture::gen(); - PackedByteArray bytes = p_string.to_utf8_buffer(); - tvg::Result result = picture->load((const char *)bytes.ptr(), bytes.size(), "svg", true); + tvg::Result result = picture->load((const char *)p_buffer.ptr(), p_buffer.size(), "svg", true); if (result != tvg::Result::Success) { return ERR_INVALID_DATA; } @@ -149,6 +142,18 @@ Error ImageLoaderSVG::create_image_from_string(Ref<Image> p_image, String p_stri return OK; } +Error ImageLoaderSVG::create_image_from_string(Ref<Image> p_image, String p_string, float p_scale, bool p_upsample, const HashMap<Color, Color> &p_color_map) { + if (p_color_map.size()) { + _replace_color_property(p_color_map, "stop-color=\"", p_string); + _replace_color_property(p_color_map, "fill=\"", p_string); + _replace_color_property(p_color_map, "stroke=\"", p_string); + } + + PackedByteArray bytes = p_string.to_utf8_buffer(); + + return create_image_from_utf8_buffer(p_image, bytes, p_scale, p_upsample); +} + void ImageLoaderSVG::get_recognized_extensions(List<String> *p_extensions) const { p_extensions->push_back("svg"); } diff --git a/modules/svg/image_loader_svg.h b/modules/svg/image_loader_svg.h index 84511f1708..d955a04f1e 100644 --- a/modules/svg/image_loader_svg.h +++ b/modules/svg/image_loader_svg.h @@ -41,6 +41,7 @@ class ImageLoaderSVG : public ImageFormatLoader { public: static void set_forced_color_map(const HashMap<Color, Color> &p_color_map); + Error create_image_from_utf8_buffer(Ref<Image> p_image, const PackedByteArray &p_buffer, float p_scale, bool p_upsample); Error create_image_from_string(Ref<Image> p_image, String p_string, float p_scale, bool p_upsample, const HashMap<Color, Color> &p_color_map); virtual Error load_image(Ref<Image> p_image, Ref<FileAccess> p_fileaccess, BitField<ImageFormatLoader::LoaderFlags> p_flags, float p_scale) override; diff --git a/modules/text_server_adv/SCsub b/modules/text_server_adv/SCsub index 3c7a89b705..4a9c7b3567 100644 --- a/modules/text_server_adv/SCsub +++ b/modules/text_server_adv/SCsub @@ -223,9 +223,6 @@ if env["builtin_graphite"] and freetype_enabled and env["graphite"]: ] ) - if env.msvc: # Not our business to fix. - env_graphite.Append(CCFLAGS=["-D_SILENCE_ALL_CXX17_DEPRECATION_WARNINGS"]) - lib = env_graphite.add_library("graphite_builtin", thirdparty_sources) thirdparty_obj += lib diff --git a/modules/text_server_adv/register_types.cpp b/modules/text_server_adv/register_types.cpp index 6a26584506..64373e9f2b 100644 --- a/modules/text_server_adv/register_types.cpp +++ b/modules/text_server_adv/register_types.cpp @@ -62,7 +62,7 @@ using namespace godot; extern "C" { -GDNativeBool GDN_EXPORT textserver_advanced_init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) { +GDExtensionBool GDN_EXPORT textserver_advanced_init(const GDExtensionInterface *p_interface, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) { GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization); init_obj.register_initializer(&initialize_text_server_adv_module); diff --git a/modules/text_server_adv/text_server_adv.cpp b/modules/text_server_adv/text_server_adv.cpp index 27fab88956..f3e7ae9b83 100644 --- a/modules/text_server_adv/text_server_adv.cpp +++ b/modules/text_server_adv/text_server_adv.cpp @@ -2151,10 +2151,7 @@ void TextServerAdvanced::_font_set_allow_system_fallback(const RID &p_font_rid, ERR_FAIL_COND(!fd); MutexLock lock(fd->mutex); - if (fd->allow_system_fallback != p_allow_system_fallback) { - _font_clear_cache(fd); - fd->allow_system_fallback = p_allow_system_fallback; - } + fd->allow_system_fallback = p_allow_system_fallback; } bool TextServerAdvanced::_font_is_allow_system_fallback(const RID &p_font_rid) const { @@ -3299,7 +3296,7 @@ void TextServerAdvanced::_font_draw_glyph(const RID &p_font_rid, const RID &p_ca Point2 cpos = p_pos; cpos += gl.rect.position * (double)p_size / (double)fd->msdf_source_size; Size2 csize = gl.rect.size * (double)p_size / (double)fd->msdf_source_size; - RenderingServer::get_singleton()->canvas_item_add_msdf_texture_rect_region(p_canvas, Rect2(cpos, csize), texture, gl.uv_rect, modulate, 0, fd->msdf_range); + RenderingServer::get_singleton()->canvas_item_add_msdf_texture_rect_region(p_canvas, Rect2(cpos, csize), texture, gl.uv_rect, modulate, 0, fd->msdf_range, (double)p_size / (double)fd->msdf_source_size); } else { double scale = _font_get_scale(p_font_rid, p_size); Point2 cpos = p_pos; @@ -3391,7 +3388,7 @@ void TextServerAdvanced::_font_draw_glyph_outline(const RID &p_font_rid, const R Point2 cpos = p_pos; cpos += gl.rect.position * (double)p_size / (double)fd->msdf_source_size; Size2 csize = gl.rect.size * (double)p_size / (double)fd->msdf_source_size; - RenderingServer::get_singleton()->canvas_item_add_msdf_texture_rect_region(p_canvas, Rect2(cpos, csize), texture, gl.uv_rect, modulate, p_outline_size * 2, fd->msdf_range); + RenderingServer::get_singleton()->canvas_item_add_msdf_texture_rect_region(p_canvas, Rect2(cpos, csize), texture, gl.uv_rect, modulate, p_outline_size, fd->msdf_range, (double)p_size / (double)fd->msdf_source_size); } else { Point2 cpos = p_pos; double scale = _font_get_scale(p_font_rid, p_size); @@ -3918,7 +3915,7 @@ bool TextServerAdvanced::_shaped_text_add_string(const RID &p_shaped, const Stri return true; } -bool TextServerAdvanced::_shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length) { +bool TextServerAdvanced::_shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length, float p_baseline) { _THREAD_SAFE_METHOD_ ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -3938,6 +3935,7 @@ bool TextServerAdvanced::_shaped_text_add_object(const RID &p_shaped, const Vari obj.inline_align = p_inline_align; obj.rect.size = p_size; obj.pos = span.start; + obj.baseline = p_baseline; sd->spans.push_back(span); sd->text = sd->text + String::chr(0xfffc).repeat(p_length); @@ -3948,7 +3946,7 @@ bool TextServerAdvanced::_shaped_text_add_object(const RID &p_shaped, const Vari return true; } -bool TextServerAdvanced::_shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align) { +bool TextServerAdvanced::_shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, float p_baseline) { ShapedTextDataAdvanced *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -3956,6 +3954,7 @@ bool TextServerAdvanced::_shaped_text_resize_object(const RID &p_shaped, const V ERR_FAIL_COND_V(!sd->objects.has(p_key), false); sd->objects[p_key].rect.size = p_size; sd->objects[p_key].inline_align = p_inline_align; + sd->objects[p_key].baseline = p_baseline; if (sd->valid) { // Recalc string metrics. sd->ascent = 0; @@ -4042,6 +4041,9 @@ void TextServerAdvanced::_realign(ShapedTextDataAdvanced *p_sd) const { case INLINE_ALIGNMENT_CENTER_TO: { E.value.rect.position.y -= E.value.rect.size.y / 2; } break; + case INLINE_ALIGNMENT_BASELINE_TO: { + E.value.rect.position.y -= E.value.baseline; + } break; case INLINE_ALIGNMENT_TOP_TO: { // NOP } break; @@ -4070,6 +4072,9 @@ void TextServerAdvanced::_realign(ShapedTextDataAdvanced *p_sd) const { case INLINE_ALIGNMENT_CENTER_TO: { E.value.rect.position.x -= E.value.rect.size.x / 2; } break; + case INLINE_ALIGNMENT_BASELINE_TO: { + E.value.rect.position.x -= E.value.baseline; + } break; case INLINE_ALIGNMENT_TOP_TO: { // NOP } break; @@ -6199,6 +6204,9 @@ String TextServerAdvanced::_strip_diacritics(const String &p_string) const { } String TextServerAdvanced::_string_to_upper(const String &p_string, const String &p_language) const { + if (p_string.is_empty()) { + return p_string; + } const String lang = (p_language.is_empty()) ? TranslationServer::get_singleton()->get_tool_locale() : p_language; // Convert to UTF-16. @@ -6218,6 +6226,9 @@ String TextServerAdvanced::_string_to_upper(const String &p_string, const String } String TextServerAdvanced::_string_to_lower(const String &p_string, const String &p_language) const { + if (p_string.is_empty()) { + return p_string; + } const String lang = (p_language.is_empty()) ? TranslationServer::get_singleton()->get_tool_locale() : p_language; // Convert to UTF-16. Char16String utf16 = p_string.utf16(); @@ -6235,7 +6246,7 @@ String TextServerAdvanced::_string_to_lower(const String &p_string, const String return String::utf16(lower.ptr(), len); } -PackedInt32Array TextServerAdvanced::_string_get_word_breaks(const String &p_string, const String &p_language) const { +PackedInt32Array TextServerAdvanced::_string_get_word_breaks(const String &p_string, const String &p_language, int p_chars_per_line) const { const String lang = (p_language.is_empty()) ? TranslationServer::get_singleton()->get_tool_locale() : p_language; // Convert to UTF-16. Char16String utf16 = p_string.utf16(); @@ -6243,15 +6254,7 @@ PackedInt32Array TextServerAdvanced::_string_get_word_breaks(const String &p_str HashSet<int> breaks; UErrorCode err = U_ZERO_ERROR; UBreakIterator *bi = ubrk_open(UBRK_LINE, lang.ascii().get_data(), (const UChar *)utf16.get_data(), utf16.length(), &err); - if (U_FAILURE(err)) { - // No data loaded - use fallback. - for (int i = 0; i < p_string.length(); i++) { - char32_t c = p_string[i]; - if (is_whitespace(c) || is_linebreak(c)) { - breaks.insert(i); - } - } - } else { + if (U_SUCCESS(err)) { while (ubrk_next(bi) != UBRK_DONE) { int pos = _convert_pos(p_string, utf16, ubrk_current(bi)) - 1; if (pos != p_string.length() - 1) { @@ -6262,24 +6265,80 @@ PackedInt32Array TextServerAdvanced::_string_get_word_breaks(const String &p_str ubrk_close(bi); PackedInt32Array ret; + + int line_start = 0; + int line_end = 0; // End of last word on current line. + int word_start = 0; // -1 if no word encountered. Leading spaces are part of a word. + int word_length = 0; + for (int i = 0; i < p_string.length(); i++) { - char32_t c = p_string[i]; - if (c == 0xfffc) { - continue; - } - if (u_ispunct(c) && c != 0x005F) { - ret.push_back(i); - continue; - } - if (is_underscore(c)) { - ret.push_back(i); - continue; - } - if (breaks.has(i)) { + const char32_t c = p_string[i]; + + if (is_linebreak(c)) { + // Force newline. + ret.push_back(line_start); ret.push_back(i); + line_start = i + 1; + line_end = line_start; + word_start = line_start; + word_length = 0; + } else if (c == 0xfffc) { continue; + } else if ((u_ispunct(c) && c != 0x005F) || is_underscore(c) || c == '\t' || is_whitespace(c)) { + // A whitespace ends current word. + if (word_length > 0) { + line_end = i - 1; + word_start = -1; + word_length = 0; + } + } else if (breaks.has(i)) { + // End current word, no space. + if (word_length > 0) { + line_end = i; + word_start = i + 1; + word_length = 0; + } + if (p_chars_per_line <= 0) { + ret.push_back(line_start); + ret.push_back(line_end + 1); + line_start = word_start; + line_end = line_start; + } + } else { + if (word_start == -1) { + word_start = i; + if (p_chars_per_line <= 0) { + ret.push_back(line_start); + ret.push_back(line_end + 1); + line_start = word_start; + line_end = line_start; + } + } + word_length += 1; + + if (p_chars_per_line > 0) { + if (word_length > p_chars_per_line) { + // Word too long: wrap before current character. + ret.push_back(line_start); + ret.push_back(i); + line_start = i; + line_end = i; + word_start = i; + word_length = 1; + } else if (i - line_start + 1 > p_chars_per_line) { + // Line too long: wrap after the last word. + ret.push_back(line_start); + ret.push_back(line_end + 1); + line_start = word_start; + line_end = line_start; + } + } } } + if (line_start < p_string.length()) { + ret.push_back(line_start); + ret.push_back(p_string.length()); + } return ret; } diff --git a/modules/text_server_adv/text_server_adv.h b/modules/text_server_adv/text_server_adv.h index 5e6d2cc2c0..59f44cf142 100644 --- a/modules/text_server_adv/text_server_adv.h +++ b/modules/text_server_adv/text_server_adv.h @@ -467,6 +467,7 @@ class TextServerAdvanced : public TextServerExtension { int pos = 0; InlineAlignment inline_align = INLINE_ALIGNMENT_CENTER; Rect2 rect; + float baseline = 0; }; HashMap<Variant, EmbeddedObject, VariantHasher, VariantComparator> objects; @@ -868,8 +869,8 @@ public: MODBIND2RC(int64_t, shaped_text_get_spacing, const RID &, SpacingType); MODBIND7R(bool, shaped_text_add_string, const RID &, const String &, const TypedArray<RID> &, int64_t, const Dictionary &, const String &, const Variant &); - MODBIND5R(bool, shaped_text_add_object, const RID &, const Variant &, const Size2 &, InlineAlignment, int64_t); - MODBIND4R(bool, shaped_text_resize_object, const RID &, const Variant &, const Size2 &, InlineAlignment); + MODBIND6R(bool, shaped_text_add_object, const RID &, const Variant &, const Size2 &, InlineAlignment, int64_t, float); + MODBIND5R(bool, shaped_text_resize_object, const RID &, const Variant &, const Size2 &, InlineAlignment, float); MODBIND1RC(int64_t, shaped_get_span_count, const RID &); MODBIND2RC(Variant, shaped_get_span_meta, const RID &, int64_t); @@ -914,7 +915,7 @@ public: MODBIND2RC(String, parse_number, const String &, const String &); MODBIND1RC(String, percent_sign, const String &); - MODBIND2RC(PackedInt32Array, string_get_word_breaks, const String &, const String &); + MODBIND3RC(PackedInt32Array, string_get_word_breaks, const String &, const String &, int); MODBIND2RC(int64_t, is_confusable, const String &, const PackedStringArray &); MODBIND1RC(bool, spoof_check, const String &); diff --git a/modules/text_server_fb/register_types.cpp b/modules/text_server_fb/register_types.cpp index fa7b87fc17..98a8f466b3 100644 --- a/modules/text_server_fb/register_types.cpp +++ b/modules/text_server_fb/register_types.cpp @@ -62,7 +62,7 @@ using namespace godot; extern "C" { -GDNativeBool GDN_EXPORT textserver_fallback_init(const GDNativeInterface *p_interface, const GDNativeExtensionClassLibraryPtr p_library, GDNativeInitialization *r_initialization) { +GDExtensionBool GDN_EXPORT textserver_fallback_init(const GDExtensionInterface *p_interface, const GDExtensionClassLibraryPtr p_library, GDExtensionInitialization *r_initialization) { GDExtensionBinding::InitObject init_obj(p_interface, p_library, r_initialization); init_obj.register_initializer(&initialize_text_server_fb_module); diff --git a/modules/text_server_fb/text_server_fb.cpp b/modules/text_server_fb/text_server_fb.cpp index 9133c277bb..ea7b7a271b 100644 --- a/modules/text_server_fb/text_server_fb.cpp +++ b/modules/text_server_fb/text_server_fb.cpp @@ -1246,10 +1246,7 @@ void TextServerFallback::_font_set_allow_system_fallback(const RID &p_font_rid, ERR_FAIL_COND(!fd); MutexLock lock(fd->mutex); - if (fd->allow_system_fallback != p_allow_system_fallback) { - _font_clear_cache(fd); - fd->allow_system_fallback = p_allow_system_fallback; - } + fd->allow_system_fallback = p_allow_system_fallback; } bool TextServerFallback::_font_is_allow_system_fallback(const RID &p_font_rid) const { @@ -2362,7 +2359,7 @@ void TextServerFallback::_font_draw_glyph(const RID &p_font_rid, const RID &p_ca Point2 cpos = p_pos; cpos += gl.rect.position * (double)p_size / (double)fd->msdf_source_size; Size2 csize = gl.rect.size * (double)p_size / (double)fd->msdf_source_size; - RenderingServer::get_singleton()->canvas_item_add_msdf_texture_rect_region(p_canvas, Rect2(cpos, csize), texture, gl.uv_rect, modulate, 0, fd->msdf_range); + RenderingServer::get_singleton()->canvas_item_add_msdf_texture_rect_region(p_canvas, Rect2(cpos, csize), texture, gl.uv_rect, modulate, 0, fd->msdf_range, (double)p_size / (double)fd->msdf_source_size); } else { Point2 cpos = p_pos; double scale = _font_get_scale(p_font_rid, p_size); @@ -2454,7 +2451,7 @@ void TextServerFallback::_font_draw_glyph_outline(const RID &p_font_rid, const R Point2 cpos = p_pos; cpos += gl.rect.position * (double)p_size / (double)fd->msdf_source_size; Size2 csize = gl.rect.size * (double)p_size / (double)fd->msdf_source_size; - RenderingServer::get_singleton()->canvas_item_add_msdf_texture_rect_region(p_canvas, Rect2(cpos, csize), texture, gl.uv_rect, modulate, p_outline_size * 2, fd->msdf_range); + RenderingServer::get_singleton()->canvas_item_add_msdf_texture_rect_region(p_canvas, Rect2(cpos, csize), texture, gl.uv_rect, modulate, p_outline_size, fd->msdf_range, (double)p_size / (double)fd->msdf_source_size); } else { Point2 cpos = p_pos; double scale = _font_get_scale(p_font_rid, p_size); @@ -2920,7 +2917,7 @@ bool TextServerFallback::_shaped_text_add_string(const RID &p_shaped, const Stri return true; } -bool TextServerFallback::_shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length) { +bool TextServerFallback::_shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length, float p_baseline) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -2941,6 +2938,7 @@ bool TextServerFallback::_shaped_text_add_object(const RID &p_shaped, const Vari obj.inline_align = p_inline_align; obj.rect.size = p_size; obj.pos = span.start; + obj.baseline = p_baseline; sd->spans.push_back(span); sd->text = sd->text + String::chr(0xfffc).repeat(p_length); @@ -2951,7 +2949,7 @@ bool TextServerFallback::_shaped_text_add_object(const RID &p_shaped, const Vari return true; } -bool TextServerFallback::_shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align) { +bool TextServerFallback::_shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, float p_baseline) { ShapedTextDataFallback *sd = shaped_owner.get_or_null(p_shaped); ERR_FAIL_COND_V(!sd, false); @@ -2959,6 +2957,7 @@ bool TextServerFallback::_shaped_text_resize_object(const RID &p_shaped, const V ERR_FAIL_COND_V(!sd->objects.has(p_key), false); sd->objects[p_key].rect.size = p_size; sd->objects[p_key].inline_align = p_inline_align; + sd->objects[p_key].baseline = p_baseline; if (sd->valid) { // Recalc string metrics. sd->ascent = 0; @@ -3045,6 +3044,9 @@ void TextServerFallback::_realign(ShapedTextDataFallback *p_sd) const { case INLINE_ALIGNMENT_CENTER_TO: { E.value.rect.position.y -= E.value.rect.size.y / 2; } break; + case INLINE_ALIGNMENT_BASELINE_TO: { + E.value.rect.position.y -= E.value.baseline; + } break; case INLINE_ALIGNMENT_TOP_TO: { // NOP } break; @@ -3073,6 +3075,9 @@ void TextServerFallback::_realign(ShapedTextDataFallback *p_sd) const { case INLINE_ALIGNMENT_CENTER_TO: { E.value.rect.position.x -= E.value.rect.size.x / 2; } break; + case INLINE_ALIGNMENT_BASELINE_TO: { + E.value.rect.position.x -= E.value.baseline; + } break; case INLINE_ALIGNMENT_TOP_TO: { // NOP } break; @@ -4094,26 +4099,69 @@ String TextServerFallback::_string_to_lower(const String &p_string, const String return lower; } -PackedInt32Array TextServerFallback::_string_get_word_breaks(const String &p_string, const String &p_language) const { +PackedInt32Array TextServerFallback::_string_get_word_breaks(const String &p_string, const String &p_language, int p_chars_per_line) const { PackedInt32Array ret; + + int line_start = 0; + int line_end = 0; // End of last word on current line. + int word_start = 0; // -1 if no word encountered. Leading spaces are part of a word. + int word_length = 0; + for (int i = 0; i < p_string.length(); i++) { - char32_t c = p_string[i]; - if (c == 0xfffc) { - continue; - } - if (is_punct(c) && c != 0x005F) { - ret.push_back(i); - continue; - } - if (is_underscore(c)) { - ret.push_back(i); - continue; - } - if (is_whitespace(c) || is_linebreak(c)) { + const char32_t c = p_string[i]; + + if (is_linebreak(c)) { + // Force newline. + ret.push_back(line_start); ret.push_back(i); + line_start = i + 1; + line_end = line_start; + word_start = line_start; + word_length = 0; + } else if (c == 0xfffc) { continue; + } else if ((is_punct(c) && c != 0x005F) || is_underscore(c) || c == '\t' || is_whitespace(c)) { + // A whitespace ends current word. + if (word_length > 0) { + line_end = i - 1; + word_start = -1; + word_length = 0; + } + } else { + if (word_start == -1) { + word_start = i; + if (p_chars_per_line <= 0) { + ret.push_back(line_start); + ret.push_back(line_end + 1); + line_start = word_start; + line_end = line_start; + } + } + word_length += 1; + + if (p_chars_per_line > 0) { + if (word_length > p_chars_per_line) { + // Word too long: wrap before current character. + ret.push_back(line_start); + ret.push_back(i); + line_start = i; + line_end = i; + word_start = i; + word_length = 1; + } else if (i - line_start + 1 > p_chars_per_line) { + // Line too long: wrap after the last word. + ret.push_back(line_start); + ret.push_back(line_end + 1); + line_start = word_start; + line_end = line_start; + } + } } } + if (line_start < p_string.length()) { + ret.push_back(line_start); + ret.push_back(p_string.length()); + } return ret; } diff --git a/modules/text_server_fb/text_server_fb.h b/modules/text_server_fb/text_server_fb.h index f8a05f9433..49e89214ec 100644 --- a/modules/text_server_fb/text_server_fb.h +++ b/modules/text_server_fb/text_server_fb.h @@ -417,6 +417,7 @@ class TextServerFallback : public TextServerExtension { int pos = 0; InlineAlignment inline_align = INLINE_ALIGNMENT_CENTER; Rect2 rect; + float baseline = 0; }; HashMap<Variant, EmbeddedObject, VariantHasher, VariantComparator> objects; @@ -743,8 +744,8 @@ public: MODBIND2RC(int64_t, shaped_text_get_spacing, const RID &, SpacingType); MODBIND7R(bool, shaped_text_add_string, const RID &, const String &, const TypedArray<RID> &, int64_t, const Dictionary &, const String &, const Variant &); - MODBIND5R(bool, shaped_text_add_object, const RID &, const Variant &, const Size2 &, InlineAlignment, int64_t); - MODBIND4R(bool, shaped_text_resize_object, const RID &, const Variant &, const Size2 &, InlineAlignment); + MODBIND6R(bool, shaped_text_add_object, const RID &, const Variant &, const Size2 &, InlineAlignment, int64_t, float); + MODBIND5R(bool, shaped_text_resize_object, const RID &, const Variant &, const Size2 &, InlineAlignment, float); MODBIND1RC(int64_t, shaped_get_span_count, const RID &); MODBIND2RC(Variant, shaped_get_span_meta, const RID &, int64_t); @@ -785,7 +786,7 @@ public: MODBIND1RC(double, shaped_text_get_underline_position, const RID &); MODBIND1RC(double, shaped_text_get_underline_thickness, const RID &); - MODBIND2RC(PackedInt32Array, string_get_word_breaks, const String &, const String &); + MODBIND3RC(PackedInt32Array, string_get_word_breaks, const String &, const String &, int); MODBIND2RC(String, string_to_upper, const String &, const String &); MODBIND2RC(String, string_to_lower, const String &, const String &); diff --git a/modules/webrtc/doc_classes/WebRTCDataChannel.xml b/modules/webrtc/doc_classes/WebRTCDataChannel.xml index a9ba8a23de..a186631ca8 100644 --- a/modules/webrtc/doc_classes/WebRTCDataChannel.xml +++ b/modules/webrtc/doc_classes/WebRTCDataChannel.xml @@ -22,8 +22,8 @@ <method name="get_id" qualifiers="const"> <return type="int" /> <description> - Returns the id assigned to this channel during creation (or auto-assigned during negotiation). - If the channel is not negotiated out-of-band the id will only be available after the connection is established (will return [code]65535[/code] until then). + Returns the ID assigned to this channel during creation (or auto-assigned during negotiation). + If the channel is not negotiated out-of-band the ID will only be available after the connection is established (will return [code]65535[/code] until then). </description> </method> <method name="get_label" qualifiers="const"> diff --git a/modules/webrtc/webrtc_data_channel_extension.h b/modules/webrtc/webrtc_data_channel_extension.h index 467163ed93..92bd9619ef 100644 --- a/modules/webrtc/webrtc_data_channel_extension.h +++ b/modules/webrtc/webrtc_data_channel_extension.h @@ -70,8 +70,8 @@ public: virtual Error put_packet(const uint8_t *p_buffer, int p_buffer_size) override; /** GDExtension **/ - GDVIRTUAL2R(Error, _get_packet, GDNativeConstPtr<const uint8_t *>, GDNativePtr<int>); - GDVIRTUAL2R(Error, _put_packet, GDNativeConstPtr<const uint8_t>, int); + GDVIRTUAL2R(Error, _get_packet, GDExtensionConstPtr<const uint8_t *>, GDExtensionPtr<int>); + GDVIRTUAL2R(Error, _put_packet, GDExtensionConstPtr<const uint8_t>, int); WebRTCDataChannelExtension() {} }; diff --git a/platform/android/display_server_android.cpp b/platform/android/display_server_android.cpp index 937b929d62..9c796a8c07 100644 --- a/platform/android/display_server_android.cpp +++ b/platform/android/display_server_android.cpp @@ -221,7 +221,7 @@ float DisplayServerAndroid::screen_get_refresh_rate(int p_screen) const { return godot_io_java->get_screen_refresh_rate(SCREEN_REFRESH_RATE_FALLBACK); } -bool DisplayServerAndroid::screen_is_touchscreen(int p_screen) const { +bool DisplayServerAndroid::is_touchscreen_available() const { return true; } @@ -366,6 +366,10 @@ Point2i DisplayServerAndroid::window_get_position(DisplayServer::WindowID p_wind return Point2i(); } +Point2i DisplayServerAndroid::window_get_position_with_decorations(DisplayServer::WindowID p_window) const { + return Point2i(); +} + void DisplayServerAndroid::window_set_position(const Point2i &p_position, DisplayServer::WindowID p_window) { // Not supported on Android. } @@ -398,7 +402,7 @@ Size2i DisplayServerAndroid::window_get_size(DisplayServer::WindowID p_window) c return OS_Android::get_singleton()->get_display_size(); } -Size2i DisplayServerAndroid::window_get_real_size(DisplayServer::WindowID p_window) const { +Size2i DisplayServerAndroid::window_get_size_with_decorations(DisplayServer::WindowID p_window) const { return OS_Android::get_singleton()->get_display_size(); } diff --git a/platform/android/display_server_android.h b/platform/android/display_server_android.h index c7f4d8046f..9ed07ca971 100644 --- a/platform/android/display_server_android.h +++ b/platform/android/display_server_android.h @@ -121,7 +121,7 @@ public: virtual int screen_get_dpi(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; virtual float screen_get_scale(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; virtual float screen_get_refresh_rate(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; - virtual bool screen_is_touchscreen(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; + virtual bool is_touchscreen_available() const override; virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect = Rect2(), VirtualKeyboardType p_type = KEYBOARD_TYPE_DEFAULT, int p_max_length = -1, int p_cursor_start = -1, int p_cursor_end = -1) override; virtual void virtual_keyboard_hide() override; @@ -150,6 +150,7 @@ public: virtual void window_set_current_screen(int p_screen, WindowID p_window = MAIN_WINDOW_ID) override; virtual Point2i window_get_position(WindowID p_window = MAIN_WINDOW_ID) const override; + virtual Point2i window_get_position_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override; virtual void window_set_position(const Point2i &p_position, WindowID p_window = MAIN_WINDOW_ID) override; virtual void window_set_transient(WindowID p_window, WindowID p_parent) override; @@ -162,7 +163,7 @@ public: virtual void window_set_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID) override; virtual Size2i window_get_size(WindowID p_window = MAIN_WINDOW_ID) const override; - virtual Size2i window_get_real_size(WindowID p_window = MAIN_WINDOW_ID) const override; + virtual Size2i window_get_size_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override; virtual void window_set_mode(WindowMode p_mode, WindowID p_window = MAIN_WINDOW_ID) override; virtual WindowMode window_get_mode(WindowID p_window = MAIN_WINDOW_ID) const override; diff --git a/platform/android/export/export_plugin.cpp b/platform/android/export/export_plugin.cpp index 795a542ed5..3cea8e5c0c 100644 --- a/platform/android/export/export_plugin.cpp +++ b/platform/android/export/export_plugin.cpp @@ -205,7 +205,7 @@ static const char *LEGACY_BUILD_SPLASH_IMAGE_EXPORT_PATH = "res/drawable-nodpi-v static const char *SPLASH_BG_COLOR_PATH = "res/drawable-nodpi/splash_bg_color.png"; static const char *LEGACY_BUILD_SPLASH_BG_COLOR_PATH = "res/drawable-nodpi-v4/splash_bg_color.png"; static const char *SPLASH_CONFIG_PATH = "res://android/build/res/drawable/splash_drawable.xml"; -static const char *GDNATIVE_LIBS_PATH = "res://android/build/libs/gdnativelibs.json"; +static const char *GDEXTENSION_LIBS_PATH = "res://android/build/libs/gdextensionlibs.json"; static const int icon_densities_count = 6; static const char *launcher_icon_option = PNAME("launcher_icons/main_192x192"); @@ -2509,7 +2509,7 @@ void EditorExportPlatformAndroid::_clear_assets_directory() { void EditorExportPlatformAndroid::_remove_copied_libs() { print_verbose("Removing previously installed libraries..."); Error error; - String libs_json = FileAccess::get_file_as_string(GDNATIVE_LIBS_PATH, &error); + String libs_json = FileAccess::get_file_as_string(GDEXTENSION_LIBS_PATH, &error); if (error || libs_json.is_empty()) { print_verbose("No previously installed libraries found"); return; @@ -2525,7 +2525,7 @@ void EditorExportPlatformAndroid::_remove_copied_libs() { print_verbose("Removing previously installed library " + libs[i]); da->remove(libs[i]); } - da->remove(GDNATIVE_LIBS_PATH); + da->remove(GDEXTENSION_LIBS_PATH); } String EditorExportPlatformAndroid::join_list(const List<String> &p_parts, const String &p_separator) { @@ -2661,7 +2661,7 @@ Error EditorExportPlatformAndroid::export_project_helper(const Ref<EditorExportP return err; } if (user_data.libs.size() > 0) { - Ref<FileAccess> fa = FileAccess::open(GDNATIVE_LIBS_PATH, FileAccess::WRITE); + Ref<FileAccess> fa = FileAccess::open(GDEXTENSION_LIBS_PATH, FileAccess::WRITE); fa->store_string(JSON::stringify(user_data.libs, "\t")); } } else { diff --git a/platform/android/java/editor/src/main/AndroidManifest.xml b/platform/android/java/editor/src/main/AndroidManifest.xml index f3ddaafd0e..80ef10b6a4 100644 --- a/platform/android/java/editor/src/main/AndroidManifest.xml +++ b/platform/android/java/editor/src/main/AndroidManifest.xml @@ -27,6 +27,7 @@ android:icon="@mipmap/icon" android:label="@string/godot_editor_name_string" tools:ignore="GoogleAppIndexingWarning" + android:theme="@style/GodotEditorTheme" android:requestLegacyExternalStorage="true"> <activity @@ -35,7 +36,6 @@ android:launchMode="singleTask" android:screenOrientation="userLandscape" android:exported="true" - android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen" android:process=":GodotProjectManager"> <layout android:defaultHeight="@dimen/editor_default_window_height" @@ -53,8 +53,7 @@ android:process=":GodotEditor" android:launchMode="singleTask" android:screenOrientation="userLandscape" - android:exported="false" - android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"> + android:exported="false"> <layout android:defaultHeight="@dimen/editor_default_window_height" android:defaultWidth="@dimen/editor_default_window_width" /> </activity> @@ -66,8 +65,7 @@ android:process=":GodotGame" android:launchMode="singleTask" android:exported="false" - android:screenOrientation="userLandscape" - android:theme="@android:style/Theme.Black.NoTitleBar.Fullscreen"> + android:screenOrientation="userLandscape"> <layout android:defaultHeight="@dimen/editor_default_window_height" android:defaultWidth="@dimen/editor_default_window_width" /> </activity> diff --git a/platform/android/java/editor/src/main/res/values/themes.xml b/platform/android/java/editor/src/main/res/values/themes.xml new file mode 100644 index 0000000000..fda04d6dc7 --- /dev/null +++ b/platform/android/java/editor/src/main/res/values/themes.xml @@ -0,0 +1,5 @@ +<?xml version="1.0" encoding="utf-8"?> +<resources> + <style name="GodotEditorTheme" parent="@android:style/Theme.Black.NoTitleBar.Fullscreen"> + </style> +</resources> diff --git a/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java b/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java index 2f26497cc8..0ba86e4316 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java +++ b/platform/android/java/lib/src/org/godotengine/godot/input/GodotInputHandler.java @@ -422,7 +422,7 @@ public class GodotInputHandler implements InputManager.InputDeviceListener { } private static boolean isMouseEvent(int eventSource) { - boolean mouseSource = ((eventSource & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) || ((eventSource & InputDevice.SOURCE_STYLUS) == InputDevice.SOURCE_STYLUS); + boolean mouseSource = ((eventSource & InputDevice.SOURCE_MOUSE) == InputDevice.SOURCE_MOUSE) || ((eventSource & (InputDevice.SOURCE_TOUCHSCREEN | InputDevice.SOURCE_STYLUS)) == InputDevice.SOURCE_STYLUS); if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.O) { mouseSource = mouseSource || ((eventSource & InputDevice.SOURCE_MOUSE_RELATIVE) == InputDevice.SOURCE_MOUSE_RELATIVE); } diff --git a/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java b/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java index bb5042fa09..8ca5bcaa6e 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java +++ b/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPlugin.java @@ -71,11 +71,11 @@ import javax.microedition.khronos.opengles.GL10; * - 'plugin.init.ClassFullName' is the full name (package + class name) of the plugin class * extending {@link GodotPlugin}. * - * A plugin can also define and provide c/c++ gdnative libraries and nativescripts for the target + * A plugin can also define and provide c/c++ gdextension libraries and nativescripts for the target * app/game to leverage. - * The shared library for the gdnative library will be automatically bundled by the aar build + * The shared library for the gdextension library will be automatically bundled by the aar build * system. - * Godot '*.gdnlib' and '*.gdns' resource files must however be manually defined in the project + * Godot '*.gdextension' resource files must however be manually defined in the project * 'assets' directory. The recommended path for these resources in the 'assets' directory should be: * 'godot/plugin/v1/[PluginName]/' */ @@ -112,7 +112,7 @@ public abstract class GodotPlugin { public final void onRegisterPluginWithGodotNative() { registeredSignals.putAll( registerPluginWithGodotNative(this, getPluginName(), getPluginMethods(), getPluginSignals(), - getPluginGDNativeLibrariesPaths())); + getPluginGDExtensionLibrariesPaths())); } /** @@ -124,7 +124,7 @@ public abstract class GodotPlugin { GodotPluginInfoProvider pluginInfoProvider) { registerPluginWithGodotNative(pluginObject, pluginInfoProvider.getPluginName(), Collections.emptyList(), pluginInfoProvider.getPluginSignals(), - pluginInfoProvider.getPluginGDNativeLibrariesPaths()); + pluginInfoProvider.getPluginGDExtensionLibrariesPaths()); // Notify that registration is complete. pluginInfoProvider.onPluginRegistered(); @@ -132,7 +132,7 @@ public abstract class GodotPlugin { private static Map<String, SignalInfo> registerPluginWithGodotNative(Object pluginObject, String pluginName, List<String> pluginMethods, Set<SignalInfo> pluginSignals, - Set<String> pluginGDNativeLibrariesPaths) { + Set<String> pluginGDExtensionLibrariesPaths) { nativeRegisterSingleton(pluginName, pluginObject); Set<Method> filteredMethods = new HashSet<>(); @@ -176,9 +176,9 @@ public abstract class GodotPlugin { registeredSignals.put(signalName, signalInfo); } - // Get the list of gdnative libraries to register. - if (!pluginGDNativeLibrariesPaths.isEmpty()) { - nativeRegisterGDNativeLibraries(pluginGDNativeLibrariesPaths.toArray(new String[0])); + // Get the list of gdextension libraries to register. + if (!pluginGDExtensionLibrariesPaths.isEmpty()) { + nativeRegisterGDExtensionLibraries(pluginGDExtensionLibrariesPaths.toArray(new String[0])); } return registeredSignals; @@ -304,12 +304,12 @@ public abstract class GodotPlugin { } /** - * Returns the paths for the plugin's gdnative libraries. + * Returns the paths for the plugin's gdextension libraries. * - * The paths must be relative to the 'assets' directory and point to a '*.gdnlib' file. + * The paths must be relative to the 'assets' directory and point to a '*.gdextension' file. */ @NonNull - protected Set<String> getPluginGDNativeLibrariesPaths() { + protected Set<String> getPluginGDExtensionLibrariesPaths() { return Collections.emptySet(); } @@ -420,10 +420,10 @@ public abstract class GodotPlugin { private static native void nativeRegisterMethod(String p_sname, String p_name, String p_ret, String[] p_params); /** - * Used to register gdnative libraries bundled by the plugin. - * @param gdnlibPaths Paths to the libraries relative to the 'assets' directory. + * Used to register gdextension libraries bundled by the plugin. + * @param gdextensionPaths Paths to the libraries relative to the 'assets' directory. */ - private static native void nativeRegisterGDNativeLibraries(String[] gdnlibPaths); + private static native void nativeRegisterGDExtensionLibraries(String[] gdextensionPaths); /** * Used to complete registration of the {@link GodotPlugin} instance's methods. diff --git a/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginInfoProvider.java b/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginInfoProvider.java index cfb84c3931..53b78aebfb 100644 --- a/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginInfoProvider.java +++ b/platform/android/java/lib/src/org/godotengine/godot/plugin/GodotPluginInfoProvider.java @@ -54,12 +54,12 @@ public interface GodotPluginInfoProvider { } /** - * Returns the paths for the plugin's gdnative libraries (if any). + * Returns the paths for the plugin's gdextension libraries (if any). * - * The paths must be relative to the 'assets' directory and point to a '*.gdnlib' file. + * The paths must be relative to the 'assets' directory and point to a '*.gdextension' file. */ @NonNull - default Set<String> getPluginGDNativeLibrariesPaths() { + default Set<String> getPluginGDExtensionLibrariesPaths() { return Collections.emptySet(); } diff --git a/platform/android/plugin/godot_plugin_jni.cpp b/platform/android/plugin/godot_plugin_jni.cpp index 5a7123b833..fe35babba6 100644 --- a/platform/android/plugin/godot_plugin_jni.cpp +++ b/platform/android/plugin/godot_plugin_jni.cpp @@ -128,21 +128,21 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeEmitS singleton->emit_signalp(StringName(signal_name), args, count); } -JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterGDNativeLibraries(JNIEnv *env, jclass clazz, jobjectArray gdnlib_paths) { - int gdnlib_count = env->GetArrayLength(gdnlib_paths); - if (gdnlib_count == 0) { +JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterGDExtensionLibraries(JNIEnv *env, jclass clazz, jobjectArray gdextension_paths) { + int gdextension_count = env->GetArrayLength(gdextension_paths); + if (gdextension_count == 0) { return; } - // Retrieve the current list of gdnative libraries. + // Retrieve the current list of gdextension libraries. Array singletons; - if (ProjectSettings::get_singleton()->has_setting("gdnative/singletons")) { - singletons = GLOBAL_GET("gdnative/singletons"); + if (ProjectSettings::get_singleton()->has_setting("gdextension/singletons")) { + singletons = GLOBAL_GET("gdextension/singletons"); } // Insert the libraries provided by the plugin - for (int i = 0; i < gdnlib_count; i++) { - jstring relative_path = (jstring)env->GetObjectArrayElement(gdnlib_paths, i); + for (int i = 0; i < gdextension_count; i++) { + jstring relative_path = (jstring)env->GetObjectArrayElement(gdextension_paths, i); String path = "res://" + jstring_to_string(relative_path, env); if (!singletons.has(path)) { @@ -152,6 +152,6 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegis } // Insert the updated list back into project settings. - ProjectSettings::get_singleton()->set("gdnative/singletons", singletons); + ProjectSettings::get_singleton()->set("gdextension/singletons", singletons); } } diff --git a/platform/android/plugin/godot_plugin_jni.h b/platform/android/plugin/godot_plugin_jni.h index 35f9d5b513..e36cc8b0e3 100644 --- a/platform/android/plugin/godot_plugin_jni.h +++ b/platform/android/plugin/godot_plugin_jni.h @@ -39,7 +39,7 @@ JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegis JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterMethod(JNIEnv *env, jclass clazz, jstring sname, jstring name, jstring ret, jobjectArray args); JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterSignal(JNIEnv *env, jclass clazz, jstring j_plugin_name, jstring j_signal_name, jobjectArray j_signal_param_types); JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeEmitSignal(JNIEnv *env, jclass clazz, jstring j_plugin_name, jstring j_signal_name, jobjectArray j_signal_params); -JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterGDNativeLibraries(JNIEnv *env, jclass clazz, jobjectArray gdnlib_paths); +JNIEXPORT void JNICALL Java_org_godotengine_godot_plugin_GodotPlugin_nativeRegisterGDExtensionLibraries(JNIEnv *env, jclass clazz, jobjectArray gdextension_paths); } #endif // GODOT_PLUGIN_JNI_H diff --git a/platform/ios/display_server_ios.h b/platform/ios/display_server_ios.h index 447f919139..0ca0d3d1fe 100644 --- a/platform/ios/display_server_ios.h +++ b/platform/ios/display_server_ios.h @@ -113,7 +113,7 @@ public: // MARK: Keyboard - void key(Key p_key, bool p_pressed); + void key(Key p_key, char32_t p_char, bool p_pressed); // MARK: Motion @@ -162,6 +162,7 @@ public: virtual void window_set_current_screen(int p_screen, WindowID p_window = MAIN_WINDOW_ID) override; virtual Point2i window_get_position(WindowID p_window = MAIN_WINDOW_ID) const override; + virtual Point2i window_get_position_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override; virtual void window_set_position(const Point2i &p_position, WindowID p_window = MAIN_WINDOW_ID) override; virtual void window_set_transient(WindowID p_window, WindowID p_parent) override; @@ -174,7 +175,7 @@ public: virtual void window_set_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID) override; virtual Size2i window_get_size(WindowID p_window = MAIN_WINDOW_ID) const override; - virtual Size2i window_get_real_size(WindowID p_window = MAIN_WINDOW_ID) const override; + virtual Size2i window_get_size_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override; virtual void window_set_mode(WindowMode p_mode, WindowID p_window = MAIN_WINDOW_ID) override; virtual WindowMode window_get_mode(WindowID p_window = MAIN_WINDOW_ID) const override; @@ -199,7 +200,7 @@ public: virtual void window_set_vsync_mode(DisplayServer::VSyncMode p_vsync_mode, WindowID p_window = MAIN_WINDOW_ID) override; virtual DisplayServer::VSyncMode window_get_vsync_mode(WindowID p_vsync_mode) const override; - virtual bool screen_is_touchscreen(int p_screen) const override; + virtual bool is_touchscreen_available() const override; virtual void virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, VirtualKeyboardType p_type, int p_max_length, int p_cursor_start, int p_cursor_end) override; virtual void virtual_keyboard_hide() override; diff --git a/platform/ios/display_server_ios.mm b/platform/ios/display_server_ios.mm index 6793b40dd4..3f4a406116 100644 --- a/platform/ios/display_server_ios.mm +++ b/platform/ios/display_server_ios.mm @@ -227,27 +227,23 @@ void DisplayServerIOS::_window_callback(const Callable &p_callable, const Varian // MARK: Touches void DisplayServerIOS::touch_press(int p_idx, int p_x, int p_y, bool p_pressed, bool p_double_click) { - if (!GLOBAL_GET("debug/disable_touch")) { - Ref<InputEventScreenTouch> ev; - ev.instantiate(); - - ev->set_index(p_idx); - ev->set_pressed(p_pressed); - ev->set_position(Vector2(p_x, p_y)); - ev->set_double_tap(p_double_click); - perform_event(ev); - } + Ref<InputEventScreenTouch> ev; + ev.instantiate(); + + ev->set_index(p_idx); + ev->set_pressed(p_pressed); + ev->set_position(Vector2(p_x, p_y)); + ev->set_double_tap(p_double_click); + perform_event(ev); } void DisplayServerIOS::touch_drag(int p_idx, int p_prev_x, int p_prev_y, int p_x, int p_y) { - if (!GLOBAL_GET("debug/disable_touch")) { - Ref<InputEventScreenDrag> ev; - ev.instantiate(); - ev->set_index(p_idx); - ev->set_position(Vector2(p_x, p_y)); - ev->set_relative(Vector2(p_x - p_prev_x, p_y - p_prev_y)); - perform_event(ev); - } + Ref<InputEventScreenDrag> ev; + ev.instantiate(); + ev->set_index(p_idx); + ev->set_position(Vector2(p_x, p_y)); + ev->set_relative(Vector2(p_x - p_prev_x, p_y - p_prev_y)); + perform_event(ev); } void DisplayServerIOS::perform_event(const Ref<InputEvent> &p_event) { @@ -260,14 +256,14 @@ void DisplayServerIOS::touches_cancelled(int p_idx) { // MARK: Keyboard -void DisplayServerIOS::key(Key p_key, bool p_pressed) { +void DisplayServerIOS::key(Key p_key, char32_t p_char, bool p_pressed) { Ref<InputEventKey> ev; ev.instantiate(); ev->set_echo(false); ev->set_pressed(p_pressed); ev->set_keycode(p_key); ev->set_physical_keycode(p_key); - ev->set_unicode((char32_t)p_key); + ev->set_unicode(p_char); perform_event(ev); } @@ -496,6 +492,10 @@ Point2i DisplayServerIOS::window_get_position(WindowID p_window) const { return Point2i(); } +Point2i DisplayServerIOS::window_get_position_with_decorations(WindowID p_window) const { + return Point2i(); +} + void DisplayServerIOS::window_set_position(const Point2i &p_position, WindowID p_window) { // Probably not supported for single window iOS app } @@ -529,7 +529,7 @@ Size2i DisplayServerIOS::window_get_size(WindowID p_window) const { return Size2i(screenBounds.size.width, screenBounds.size.height) * screen_get_max_scale(); } -Size2i DisplayServerIOS::window_get_real_size(WindowID p_window) const { +Size2i DisplayServerIOS::window_get_size_with_decorations(WindowID p_window) const { return window_get_size(p_window); } @@ -581,10 +581,20 @@ bool DisplayServerIOS::can_any_window_draw() const { return true; } -bool DisplayServerIOS::screen_is_touchscreen(int p_screen) const { +bool DisplayServerIOS::is_touchscreen_available() const { return true; } +_FORCE_INLINE_ int _convert_utf32_offset_to_utf16(const String &p_existing_text, int p_pos) { + int limit = p_pos; + for (int i = 0; i < MIN(p_existing_text.length(), p_pos); i++) { + if (p_existing_text[i] > 0xffff) { + limit++; + } + } + return limit; +} + void DisplayServerIOS::virtual_keyboard_show(const String &p_existing_text, const Rect2 &p_screen_rect, VirtualKeyboardType p_type, int p_max_length, int p_cursor_start, int p_cursor_end) { NSString *existingString = [[NSString alloc] initWithUTF8String:p_existing_text.utf8().get_data()]; @@ -623,8 +633,8 @@ void DisplayServerIOS::virtual_keyboard_show(const String &p_existing_text, cons [AppDelegate.viewController.keyboardView becomeFirstResponderWithString:existingString - cursorStart:p_cursor_start - cursorEnd:p_cursor_end]; + cursorStart:_convert_utf32_offset_to_utf16(p_existing_text, p_cursor_start) + cursorEnd:_convert_utf32_offset_to_utf16(p_existing_text, p_cursor_end)]; } void DisplayServerIOS::virtual_keyboard_hide() { diff --git a/platform/ios/export/export_plugin.cpp b/platform/ios/export/export_plugin.cpp index 33f1071077..ea37278309 100644 --- a/platform/ios/export/export_plugin.cpp +++ b/platform/ios/export/export_plugin.cpp @@ -1134,7 +1134,7 @@ Error EditorExportPlatformIOS::_copy_asset(const String &p_out_dir, const String "<key>CFBundleShortVersionString</key>\n" "<string>1.0</string>\n" "<key>CFBundleIdentifier</key>\n" - "<string>com.gdnative.framework.$name</string>\n" + "<string>com.gdextension.framework.$name</string>\n" "<key>CFBundleName</key>\n" "<string>$name</string>\n" "<key>CFBundleExecutable</key>\n" diff --git a/platform/ios/keyboard_input_view.mm b/platform/ios/keyboard_input_view.mm index f031a1de22..8fb5656c24 100644 --- a/platform/ios/keyboard_input_view.mm +++ b/platform/ios/keyboard_input_view.mm @@ -115,8 +115,8 @@ - (void)deleteText:(NSInteger)charactersToDelete { for (int i = 0; i < charactersToDelete; i++) { - DisplayServerIOS::get_singleton()->key(Key::BACKSPACE, true); - DisplayServerIOS::get_singleton()->key(Key::BACKSPACE, false); + DisplayServerIOS::get_singleton()->key(Key::BACKSPACE, 0, true); + DisplayServerIOS::get_singleton()->key(Key::BACKSPACE, 0, false); } } @@ -126,20 +126,28 @@ for (int i = 0; i < characters.size(); i++) { int character = characters[i]; - - switch (character) { - case 10: - character = (int)Key::ENTER; - break; - case 8198: - character = (int)Key::SPACE; - break; - default: - break; + Key key = Key::NONE; + + if (character == '\t') { // 0x09 + key = Key::TAB; + } else if (character == '\n') { // 0x0A + key = Key::ENTER; + } else if (character == 0x2006) { + key = Key::SPACE; + } else if (character == U'Â¥') { + key = Key::YEN; + } else if (character == U'§') { + key = Key::SECTION; + } else if (character >= 0x20 && character <= 0x7E) { // ASCII. + if (character > 0x60 && character < 0x7B) { // Lowercase ASCII. + key = (Key)(character - 32); + } else { + key = (Key)character; + } } - DisplayServerIOS::get_singleton()->key((Key)character, true); - DisplayServerIOS::get_singleton()->key((Key)character, false); + DisplayServerIOS::get_singleton()->key(key, character, true); + DisplayServerIOS::get_singleton()->key(key, character, false); } } diff --git a/platform/ios/os_ios.h b/platform/ios/os_ios.h index 186efd14a8..3589dd17c9 100644 --- a/platform/ios/os_ios.h +++ b/platform/ios/os_ios.h @@ -77,6 +77,8 @@ private: CGFloat _stretch_to_ct(int p_stretch) const; String _get_default_fontname(const String &p_font_name) const; + static _FORCE_INLINE_ String get_framework_executable(const String &p_path); + void deinitialize_modules(); public: diff --git a/platform/ios/os_ios.mm b/platform/ios/os_ios.mm index 9617627b6f..d0c367cc45 100644 --- a/platform/ios/os_ios.mm +++ b/platform/ios/os_ios.mm @@ -198,8 +198,31 @@ void OS_IOS::finalize() { // MARK: Dynamic Libraries +_FORCE_INLINE_ String OS_IOS::get_framework_executable(const String &p_path) { + Ref<DirAccess> da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + + // Read framework bundle to get executable name. + NSURL *url = [NSURL fileURLWithPath:@(p_path.utf8().get_data())]; + NSBundle *bundle = [NSBundle bundleWithURL:url]; + if (bundle) { + String exe_path = String::utf8([[bundle executablePath] UTF8String]); + if (da->file_exists(exe_path)) { + return exe_path; + } + } + + // Try default executable name (invalid framework). + if (da->dir_exists(p_path) && da->file_exists(p_path.path_join(p_path.get_file().get_basename()))) { + return p_path.path_join(p_path.get_file().get_basename()); + } + + // Not a framework, try loading as .dylib. + return p_path; +} + Error OS_IOS::open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path, String *r_resolved_path) { if (p_path.length() == 0) { + // Static xcframework. p_library_handle = RTLD_SELF; if (r_resolved_path != nullptr) { @@ -208,7 +231,27 @@ Error OS_IOS::open_dynamic_library(const String p_path, void *&p_library_handle, return OK; } - return OS_Unix::open_dynamic_library(p_path, p_library_handle, p_also_set_library_path, r_resolved_path); + + String path = get_framework_executable(p_path); + + if (!FileAccess::exists(path)) { + // Load .dylib or framework from within the executable path. + path = get_framework_executable(get_executable_path().get_base_dir().path_join(p_path.get_file())); + } + + if (!FileAccess::exists(path)) { + // Load .dylib or framework from a standard iOS location. + path = get_framework_executable(get_executable_path().get_base_dir().path_join("Frameworks").path_join(p_path.get_file())); + } + + p_library_handle = dlopen(path.utf8().get_data(), RTLD_NOW); + ERR_FAIL_COND_V_MSG(!p_library_handle, ERR_CANT_OPEN, "Can't open dynamic library: " + p_path + ", error: " + dlerror() + "."); + + if (r_resolved_path != nullptr) { + *r_resolved_path = path; + } + + return OK; } Error OS_IOS::close_dynamic_library(void *p_library_handle) { diff --git a/platform/linuxbsd/dbus-so_wrap.c b/platform/linuxbsd/dbus-so_wrap.c index 0876bc88b0..48d0d9b907 100644 --- a/platform/linuxbsd/dbus-so_wrap.c +++ b/platform/linuxbsd/dbus-so_wrap.c @@ -1,7 +1,7 @@ // This file is generated. Do not edit! // see https://github.com/hpvb/dynload-wrapper for details // generated by ./generate-wrapper.py 0.3 on 2022-07-29 07:23:21 -// flags: ./generate-wrapper.py --include /usr/include/dbus-1.0/dbus/dbus.h --sys-include <dbus/dbus.h> --soname libdbus-1.so --init-name dbus --output-header dbus-so_wrap.h --output-implementation dbus-so_wrap.c +// flags: ./generate-wrapper.py --include /usr/include/dbus-1.0/dbus/dbus.h --sys-include <dbus/dbus.h> --soname libdbus-1.so.3 --init-name dbus --output-header dbus-so_wrap.h --output-implementation dbus-so_wrap.c // #include <stdint.h> @@ -725,7 +725,7 @@ dbus_bool_t (*dbus_threads_init_default_dylibloader_wrapper_dbus)( void); int initialize_dbus(int verbose) { void *handle; char *error; - handle = dlopen("libdbus-1.so", RTLD_LAZY); + handle = dlopen("libdbus-1.so.3", RTLD_LAZY); if (!handle) { if (verbose) { fprintf(stderr, "%s\n", dlerror()); diff --git a/platform/linuxbsd/fontconfig-so_wrap.c b/platform/linuxbsd/fontconfig-so_wrap.c index a428cf1fb4..62901b14a9 100644 --- a/platform/linuxbsd/fontconfig-so_wrap.c +++ b/platform/linuxbsd/fontconfig-so_wrap.c @@ -1,7 +1,7 @@ // This file is generated. Do not edit! // see https://github.com/hpvb/dynload-wrapper for details // generated by ./generate-wrapper.py 0.3 on 2022-11-22 10:28:00 -// flags: ./generate-wrapper.py --include /usr/include/fontconfig/fontconfig.h --sys-include <fontconfig/fontconfig.h> --soname libfontconfig.so --init-name fontconfig --output-header fontconfig-so_wrap.h --output-implementation fontconfig-so_wrap.c --omit-prefix FcCharSetFirst --omit-prefix FcCharSetNext +// flags: ./generate-wrapper.py --include /usr/include/fontconfig/fontconfig.h --sys-include <fontconfig/fontconfig.h> --soname libfontconfig.so.1 --init-name fontconfig --output-header fontconfig-so_wrap.h --output-implementation fontconfig-so_wrap.c --omit-prefix FcCharSetFirst --omit-prefix FcCharSetNext // #include <stdint.h> @@ -677,7 +677,7 @@ FcBool (*FcConfigParseAndLoadFromMemory_dylibloader_wrapper_fontconfig)( FcConfi int initialize_fontconfig(int verbose) { void *handle; char *error; - handle = dlopen("libfontconfig.so", RTLD_LAZY); + handle = dlopen("libfontconfig.so.1", RTLD_LAZY); if (!handle) { if (verbose) { fprintf(stderr, "%s\n", dlerror()); diff --git a/platform/linuxbsd/tts_linux.cpp b/platform/linuxbsd/tts_linux.cpp index aea1183d3d..8fa708aad6 100644 --- a/platform/linuxbsd/tts_linux.cpp +++ b/platform/linuxbsd/tts_linux.cpp @@ -117,13 +117,12 @@ void TTS_Linux::speech_event_callback(size_t p_msg_id, size_t p_client_id, SPDNo free_spd_voices(voices); } PackedInt32Array breaks = TS->string_get_word_breaks(message.text, language); - int prev = 0; - for (int i = 0; i < breaks.size(); i++) { - text += message.text.substr(prev, breaks[i] - prev); - text += "<mark name=\"" + String::num_int64(breaks[i], 10) + "\"/>"; - prev = breaks[i]; + for (int i = 0; i < breaks.size(); i += 2) { + const int start = breaks[i]; + const int end = breaks[i + 1]; + text += message.text.substr(start, end - start + 1); + text += "<mark name=\"" + String::num_int64(end, 10) + "\"/>"; } - text += message.text.substr(prev, -1); spd_set_synthesis_voice(tts->synth, message.voice.utf8().get_data()); spd_set_volume(tts->synth, message.volume * 2 - 100); diff --git a/platform/linuxbsd/x11/display_server_x11.cpp b/platform/linuxbsd/x11/display_server_x11.cpp index ec6947e180..57f125a754 100644 --- a/platform/linuxbsd/x11/display_server_x11.cpp +++ b/platform/linuxbsd/x11/display_server_x11.cpp @@ -1397,8 +1397,8 @@ void DisplayServerX11::window_set_mouse_passthrough(const Vector<Vector2> &p_reg XRectangle rect; rect.x = 0; rect.y = 0; - rect.width = window_get_real_size(p_window).x; - rect.height = window_get_real_size(p_window).y; + rect.width = window_get_size_with_decorations(p_window).x; + rect.height = window_get_size_with_decorations(p_window).y; XUnionRectWithRegion(&rect, region, region); } else { XPoint *points = (XPoint *)memalloc(sizeof(XPoint) * p_region.size()); @@ -1582,7 +1582,7 @@ void DisplayServerX11::_update_size_hints(WindowID p_window) { xsh->width = wd.size.width; xsh->height = wd.size.height; - if (window_mode == WINDOW_MODE_FULLSCREEN) { + if (window_mode == WINDOW_MODE_FULLSCREEN || window_mode == WINDOW_MODE_EXCLUSIVE_FULLSCREEN) { // Do not set any other hints to prevent the window manager from ignoring the fullscreen flags } else if (window_get_flag(WINDOW_FLAG_RESIZE_DISABLED, p_window)) { // If resizing is disabled, use the forced size @@ -1618,6 +1618,40 @@ Point2i DisplayServerX11::window_get_position(WindowID p_window) const { return wd.position; } +Point2i DisplayServerX11::window_get_position_with_decorations(WindowID p_window) const { + _THREAD_SAFE_METHOD_ + + ERR_FAIL_COND_V(!windows.has(p_window), Size2i()); + const WindowData &wd = windows[p_window]; + + if (wd.fullscreen) { + return wd.position; + } + + XWindowAttributes xwa; + XSync(x11_display, False); + XGetWindowAttributes(x11_display, wd.x11_window, &xwa); + int x = wd.position.x; + int y = wd.position.y; + Atom prop = XInternAtom(x11_display, "_NET_FRAME_EXTENTS", True); + if (prop != None) { + Atom type; + int format; + unsigned long len; + unsigned long remaining; + unsigned char *data = nullptr; + if (XGetWindowProperty(x11_display, wd.x11_window, prop, 0, 4, False, AnyPropertyType, &type, &format, &len, &remaining, &data) == Success) { + if (format == 32 && len == 4 && data) { + long *extents = (long *)data; + x -= extents[0]; // left + y -= extents[2]; // top + } + XFree(data); + } + } + return Size2i(x, y); +} + void DisplayServerX11::window_set_position(const Point2i &p_position, WindowID p_window) { _THREAD_SAFE_METHOD_ @@ -1762,12 +1796,16 @@ Size2i DisplayServerX11::window_get_size(WindowID p_window) const { return wd.size; } -Size2i DisplayServerX11::window_get_real_size(WindowID p_window) const { +Size2i DisplayServerX11::window_get_size_with_decorations(WindowID p_window) const { _THREAD_SAFE_METHOD_ ERR_FAIL_COND_V(!windows.has(p_window), Size2i()); const WindowData &wd = windows[p_window]; + if (wd.fullscreen) { + return wd.size; + } + XWindowAttributes xwa; XSync(x11_display, False); XGetWindowAttributes(x11_display, wd.x11_window, &xwa); @@ -1949,7 +1987,7 @@ void DisplayServerX11::_validate_mode_on_map(WindowID p_window) { // Check if we applied any window modes that didn't take effect while unmapped const WindowData &wd = windows[p_window]; if (wd.fullscreen && !_window_fullscreen_check(p_window)) { - _set_wm_fullscreen(p_window, true); + _set_wm_fullscreen(p_window, true, wd.exclusive_fullscreen); } else if (wd.maximized && !_window_maximize_check(p_window, "_NET_WM_STATE")) { _set_wm_maximized(p_window, true); } else if (wd.minimized && !_window_minimize_check(p_window)) { @@ -2024,7 +2062,7 @@ void DisplayServerX11::_set_wm_minimized(WindowID p_window, bool p_enabled) { wd.minimized = p_enabled; } -void DisplayServerX11::_set_wm_fullscreen(WindowID p_window, bool p_enabled) { +void DisplayServerX11::_set_wm_fullscreen(WindowID p_window, bool p_enabled, bool p_exclusive) { ERR_FAIL_COND(!windows.has(p_window)); WindowData &wd = windows[p_window]; @@ -2063,7 +2101,14 @@ void DisplayServerX11::_set_wm_fullscreen(WindowID p_window, bool p_enabled) { // set bypass compositor hint Atom bypass_compositor = XInternAtom(x11_display, "_NET_WM_BYPASS_COMPOSITOR", False); - unsigned long compositing_disable_on = p_enabled ? 1 : 0; + unsigned long compositing_disable_on = 0; // Use default. + if (p_enabled) { + if (p_exclusive) { + compositing_disable_on = 1; // Force composition OFF to reduce overhead. + } else { + compositing_disable_on = 2; // Force composition ON to allow popup windows. + } + } if (bypass_compositor != None) { XChangeProperty(x11_display, wd.x11_window, bypass_compositor, XA_CARDINAL, 32, PropModeReplace, (unsigned char *)&compositing_disable_on, 1); } @@ -2109,8 +2154,9 @@ void DisplayServerX11::window_set_mode(WindowMode p_mode, WindowID p_window) { case WINDOW_MODE_FULLSCREEN: { //Remove full-screen wd.fullscreen = false; + wd.exclusive_fullscreen = false; - _set_wm_fullscreen(p_window, false); + _set_wm_fullscreen(p_window, false, false); //un-maximize required for always on top bool on_top = window_get_flag(WINDOW_FLAG_ALWAYS_ON_TOP, p_window); @@ -2143,7 +2189,13 @@ void DisplayServerX11::window_set_mode(WindowMode p_mode, WindowID p_window) { } wd.fullscreen = true; - _set_wm_fullscreen(p_window, true); + if (p_mode == WINDOW_MODE_EXCLUSIVE_FULLSCREEN) { + wd.exclusive_fullscreen = true; + _set_wm_fullscreen(p_window, true, true); + } else { + wd.exclusive_fullscreen = false; + _set_wm_fullscreen(p_window, true, false); + } } break; case WINDOW_MODE_MAXIMIZED: { _set_wm_maximized(p_window, true); @@ -2158,7 +2210,11 @@ DisplayServer::WindowMode DisplayServerX11::window_get_mode(WindowID p_window) c const WindowData &wd = windows[p_window]; if (wd.fullscreen) { //if fullscreen, it's not in another mode - return WINDOW_MODE_FULLSCREEN; + if (wd.exclusive_fullscreen) { + return WINDOW_MODE_EXCLUSIVE_FULLSCREEN; + } else { + return WINDOW_MODE_FULLSCREEN; + } } // Test maximized. @@ -3929,29 +3985,41 @@ void DisplayServerX11::process_events() { } else { DEBUG_LOG_X11("[%u] ButtonRelease window=%lu (%u), button_index=%u \n", frame, event.xbutton.window, window_id, mb->get_button_index()); - if (!wd.focused) { + WindowID window_id_other = INVALID_WINDOW_ID; + Window wd_other_x11_window; + if (wd.focused) { + // Handle cases where an unfocused popup is open that needs to receive button-up events. + WindowID popup_id = _get_focused_window_or_popup(); + if (popup_id != INVALID_WINDOW_ID && popup_id != window_id) { + window_id_other = popup_id; + wd_other_x11_window = windows[popup_id].x11_window; + } + } else { // Propagate the event to the focused window, // because it's received only on the topmost window. // Note: This is needed for drag & drop to work between windows, // because the engine expects events to keep being processed // on the same window dragging started. for (const KeyValue<WindowID, WindowData> &E : windows) { - const WindowData &wd_other = E.value; - WindowID window_id_other = E.key; - if (wd_other.focused) { - if (window_id_other != window_id) { - int x, y; - Window child; - XTranslateCoordinates(x11_display, wd.x11_window, wd_other.x11_window, event.xbutton.x, event.xbutton.y, &x, &y, &child); - - mb->set_window_id(window_id_other); - mb->set_position(Vector2(x, y)); - mb->set_global_position(mb->get_position()); + if (E.value.focused) { + if (E.key != window_id) { + window_id_other = E.key; + wd_other_x11_window = E.value.x11_window; } break; } } } + + if (window_id_other != INVALID_WINDOW_ID) { + int x, y; + Window child; + XTranslateCoordinates(x11_display, wd.x11_window, wd_other_x11_window, event.xbutton.x, event.xbutton.y, &x, &y, &child); + + mb->set_window_id(window_id_other); + mb->set_position(Vector2(x, y)); + mb->set_global_position(mb->get_position()); + } } Input::get_singleton()->parse_input_event(mb); diff --git a/platform/linuxbsd/x11/display_server_x11.h b/platform/linuxbsd/x11/display_server_x11.h index c88a6b466a..2578ca06fd 100644 --- a/platform/linuxbsd/x11/display_server_x11.h +++ b/platform/linuxbsd/x11/display_server_x11.h @@ -159,6 +159,7 @@ class DisplayServerX11 : public DisplayServer { //better to guess on the fly, given WM can change it //WindowMode mode; bool fullscreen = false; //OS can't exit from this mode + bool exclusive_fullscreen = false; bool on_top = false; bool borderless = false; bool resize_disabled = false; @@ -283,7 +284,7 @@ class DisplayServerX11 : public DisplayServer { bool _window_minimize_check(WindowID p_window) const; void _validate_mode_on_map(WindowID p_window); void _update_size_hints(WindowID p_window); - void _set_wm_fullscreen(WindowID p_window, bool p_enabled); + void _set_wm_fullscreen(WindowID p_window, bool p_enabled, bool p_exclusive); void _set_wm_maximized(WindowID p_window, bool p_enabled); void _set_wm_minimized(WindowID p_window, bool p_enabled); @@ -392,6 +393,7 @@ public: virtual void window_set_current_screen(int p_screen, WindowID p_window = MAIN_WINDOW_ID) override; virtual Point2i window_get_position(WindowID p_window = MAIN_WINDOW_ID) const override; + virtual Point2i window_get_position_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override; virtual void window_set_position(const Point2i &p_position, WindowID p_window = MAIN_WINDOW_ID) override; virtual void window_set_max_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID) override; @@ -405,7 +407,7 @@ public: virtual void window_set_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID) override; virtual Size2i window_get_size(WindowID p_window = MAIN_WINDOW_ID) const override; - virtual Size2i window_get_real_size(WindowID p_window = MAIN_WINDOW_ID) const override; + virtual Size2i window_get_size_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override; virtual void window_set_mode(WindowMode p_mode, WindowID p_window = MAIN_WINDOW_ID) override; virtual WindowMode window_get_mode(WindowID p_window = MAIN_WINDOW_ID) const override; diff --git a/platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.c b/platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.c index d689ff1aa8..7042a60d47 100644 --- a/platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.c +++ b/platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.c @@ -5,7 +5,7 @@ // // NOTE: Generated from Xcursor 1.2.0. // This has been handpatched to workaround some issues with the generator that -// will be eventually fixed. In this case, non-existant symbols inherited from +// will be eventually fixed. In this case, non-existent symbols inherited from // libX11, but absent in libXcursor.so.1, were removed. #include <stdint.h> diff --git a/platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.h b/platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.h index 43bbcf62c5..d00fccffda 100644 --- a/platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.h +++ b/platform/linuxbsd/x11/dynwrappers/xcursor-so_wrap.h @@ -7,7 +7,7 @@ // // NOTE: Generated from Xcursor 1.2.0. // This has been handpatched to workaround some issues with the generator that -// will be eventually fixed. In this case, non-existant symbols inherited from +// will be eventually fixed. In this case, non-existent symbols inherited from // libX11, but absent in libXcursor.so.1, were removed. #include <stdint.h> diff --git a/platform/linuxbsd/x11/dynwrappers/xext-so_wrap.c b/platform/linuxbsd/x11/dynwrappers/xext-so_wrap.c index 711dd3fa5e..c8e87a6b85 100644 --- a/platform/linuxbsd/x11/dynwrappers/xext-so_wrap.c +++ b/platform/linuxbsd/x11/dynwrappers/xext-so_wrap.c @@ -5,10 +5,10 @@ // // NOTE: Generated from Xext 1.3.5. // This has been handpatched to workaround some issues with the generator that -// will be eventually fixed. In this case, non-existant symbols inherited from +// will be eventually fixed. In this case, non-existent symbols inherited from // libX11, but absent in libXext.so.6, were removed and an include needed for // proper parsing was added (this had also to be temporarily added to the -// original header, as dynload-wrapper would complain otherwsise) +// original header, as dynload-wrapper would complain otherwise) #include <stdint.h> // HANDPATCH: Needed for a successful compilation. diff --git a/platform/linuxbsd/x11/dynwrappers/xext-so_wrap.h b/platform/linuxbsd/x11/dynwrappers/xext-so_wrap.h index 991d07b405..aee92b593e 100644 --- a/platform/linuxbsd/x11/dynwrappers/xext-so_wrap.h +++ b/platform/linuxbsd/x11/dynwrappers/xext-so_wrap.h @@ -7,10 +7,10 @@ // // NOTE: Generated from Xext 1.3.5. // This has been handpatched to workaround some issues with the generator that -// will be eventually fixed. In this case, non-existant symbols inherited from +// will be eventually fixed. In this case, non-existent symbols inherited from // libX11, but absent in libXext.so.6, were removed and an include needed for // proper parsing was added (this had also to be temporarily added to the -// original header, as dynload-wrapper would complain otherwsise) +// original header, as dynload-wrapper would complain otherwise) #include <stdint.h> // HANDPATCH: Needed for a successful compilation. diff --git a/platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.c b/platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.c index 42af983345..85ac80e3f2 100644 --- a/platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.c +++ b/platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.c @@ -5,7 +5,7 @@ // // NOTE: Generated from Xinerama 1.1.4. // This has been handpatched to workaround some issues with the generator that -// will be eventually fixed. In this case, non-existant symbols inherited from +// will be eventually fixed. In this case, non-existent symbols inherited from // libX11, but absent in libXinerama.so.1, were removed. #include <stdint.h> diff --git a/platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.h b/platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.h index 891d9f21fd..9139421cd6 100644 --- a/platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.h +++ b/platform/linuxbsd/x11/dynwrappers/xinerama-so_wrap.h @@ -7,7 +7,7 @@ // // NOTE: Generated from Xinerama 1.1.4. // This has been handpatched to workaround some issues with the generator that -// will be eventually fixed. In this case, non-existant symbols inherited from +// will be eventually fixed. In this case, non-existent symbols inherited from // libX11, but absent in libXinerama.so.1, were removed. #include <stdint.h> diff --git a/platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.c b/platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.c index 5e1f0999fc..5f16bc6111 100644 --- a/platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.c +++ b/platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.c @@ -5,7 +5,7 @@ // // NOTE: Generated from Xi 1.7.10. // This has been handpatched to workaround some issues with the generator that -// will be eventually fixed. In this case, non-existant symbols inherited from +// will be eventually fixed. In this case, non-existent symbols inherited from // libX11, liXext and libXfixes, but absent in libXi.so.6, were removed. #include <stdint.h> diff --git a/platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.h b/platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.h index 95740cee58..ecb7aa5048 100644 --- a/platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.h +++ b/platform/linuxbsd/x11/dynwrappers/xinput2-so_wrap.h @@ -7,7 +7,7 @@ // // NOTE: Generated from Xi 1.7.10. // This has been handpatched to workaround some issues with the generator that -// will be eventually fixed. In this case, non-existant symbols inherited from +// will be eventually fixed. In this case, non-existent symbols inherited from // libX11, liXext and libXfixes, but absent in libXi.so.6, were removed. #include <stdint.h> diff --git a/platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.c b/platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.c index eb0f9abf15..f37f3a9db0 100644 --- a/platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.c +++ b/platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.c @@ -5,7 +5,7 @@ // // NOTE: Generated from Xrandr 1.5.2. // This has been handpatched to workaround some issues with the generator that -// will be eventually fixed. In this case, non-existant symbols inherited from +// will be eventually fixed. In this case, non-existent symbols inherited from // libX11 and libXrender, but absent in libXrandr.so.2, were removed. #include <stdint.h> diff --git a/platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.h b/platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.h index f1ca9f94a5..046d4c7de3 100644 --- a/platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.h +++ b/platform/linuxbsd/x11/dynwrappers/xrandr-so_wrap.h @@ -7,7 +7,7 @@ // // NOTE: Generated from Xrandr 1.5.2. // This has been handpatched to workaround some issues with the generator that -// will be eventually fixed. In this case, non-existant symbols inherited from +// will be eventually fixed. In this case, non-existent symbols inherited from // libX11 and libXrender, but absent in libXrandr.so.2, were removed. #include <stdint.h> diff --git a/platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.c b/platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.c index b63a1eca8d..2d3847e584 100644 --- a/platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.c +++ b/platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.c @@ -5,7 +5,7 @@ // // NOTE: Generated from Xrender 0.9.10. // This has been handpatched to workaround some issues with the generator that -// will be eventually fixed. In this case, non-existant symbols inherited from +// will be eventually fixed. In this case, non-existent symbols inherited from // libX11, but absent in libXrender.so.1, were removed. #include <stdint.h> diff --git a/platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.h b/platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.h index d3862ed459..e873448ec5 100644 --- a/platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.h +++ b/platform/linuxbsd/x11/dynwrappers/xrender-so_wrap.h @@ -7,7 +7,7 @@ // // NOTE: Generated from Xrender 0.9.10. // This has been handpatched to workaround some issues with the generator that -// will be eventually fixed. In this case, non-existant symbols inherited from +// will be eventually fixed. In this case, non-existent symbols inherited from // libX11, but absent in libXrender.so.1, were removed. #include <stdint.h> diff --git a/platform/macos/display_server_macos.h b/platform/macos/display_server_macos.h index 8f315f736b..bd26f6e417 100644 --- a/platform/macos/display_server_macos.h +++ b/platform/macos/display_server_macos.h @@ -355,6 +355,7 @@ public: virtual void window_set_current_screen(int p_screen, WindowID p_window = MAIN_WINDOW_ID) override; virtual Point2i window_get_position(WindowID p_window = MAIN_WINDOW_ID) const override; + virtual Point2i window_get_position_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override; virtual void window_set_position(const Point2i &p_position, WindowID p_window = MAIN_WINDOW_ID) override; virtual void window_set_transient(WindowID p_window, WindowID p_parent) override; @@ -368,7 +369,7 @@ public: virtual void window_set_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID) override; virtual Size2i window_get_size(WindowID p_window = MAIN_WINDOW_ID) const override; - virtual Size2i window_get_real_size(WindowID p_window = MAIN_WINDOW_ID) const override; + virtual Size2i window_get_size_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override; virtual void window_set_mode(WindowMode p_mode, WindowID p_window = MAIN_WINDOW_ID) override; virtual WindowMode window_get_mode(WindowID p_window = MAIN_WINDOW_ID) const override; diff --git a/platform/macos/display_server_macos.mm b/platform/macos/display_server_macos.mm index ad6143e16e..5c979dbf22 100644 --- a/platform/macos/display_server_macos.mm +++ b/platform/macos/display_server_macos.mm @@ -2414,6 +2414,27 @@ Point2i DisplayServerMacOS::window_get_position(WindowID p_window) const { return pos; } +Point2i DisplayServerMacOS::window_get_position_with_decorations(WindowID p_window) const { + _THREAD_SAFE_METHOD_ + + ERR_FAIL_COND_V(!windows.has(p_window), Point2i()); + const WindowData &wd = windows[p_window]; + + const NSRect nsrect = [wd.window_object frame]; + Point2i pos; + + // Return the position of the top-left corner, for OS X the y starts at the bottom. + const float scale = screen_get_max_scale(); + pos.x = nsrect.origin.x; + pos.y = (nsrect.origin.y + nsrect.size.height); + pos *= scale; + pos -= _get_screens_origin(); + // OS X native y-coordinate relative to _get_screens_origin() is negative, + // Godot expects a positive value. + pos.y *= -1; + return pos; +} + void DisplayServerMacOS::window_set_position(const Point2i &p_position, WindowID p_window) { _THREAD_SAFE_METHOD_ @@ -2573,7 +2594,7 @@ Size2i DisplayServerMacOS::window_get_size(WindowID p_window) const { return wd.size; } -Size2i DisplayServerMacOS::window_get_real_size(WindowID p_window) const { +Size2i DisplayServerMacOS::window_get_size_with_decorations(WindowID p_window) const { _THREAD_SAFE_METHOD_ ERR_FAIL_COND_V(!windows.has(p_window), Size2i()); diff --git a/platform/macos/export/export_plugin.cpp b/platform/macos/export/export_plugin.cpp index 5e71d10a3f..49c8c7758d 100644 --- a/platform/macos/export/export_plugin.cpp +++ b/platform/macos/export/export_plugin.cpp @@ -91,11 +91,14 @@ bool EditorExportPlatformMacOS::get_export_option_visibility(const EditorExportP return false; } } break; - case 2: { // "altool" + case 2: { // "notarytool" + // All options are visible. + } break; + case 3: { // "altool" // All options are visible. } break; default: { // disabled - if (p_option == "notarization/apple_id_name" || p_option == "notarization/apple_id_password" || p_option == "notarization/apple_team_id" || p_option == "notarization/api_uuid" || p_option == "notarization/api_key") { + if (p_option == "notarization/apple_id_name" || p_option == "notarization/apple_id_password" || p_option == "notarization/apple_team_id" || p_option == "notarization/api_uuid" || p_option == "notarization/api_key" || p_option == "notarization/api_key_id") { return false; } } break; @@ -129,9 +132,9 @@ void EditorExportPlatformMacOS::get_export_options(List<ExportOption> *r_options r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "display/high_res"), false)); #ifdef MACOS_ENABLED - r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "codesign/codesign", PROPERTY_HINT_ENUM, "Disabled,Built-in (ad-hoc only),PyOxidizer rcodesign,Xcode codesign"), 3, true)); + r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "codesign/codesign", PROPERTY_HINT_ENUM, "Disabled,Built-in (ad-hoc only),rcodesign,Xcode codesign"), 3, true)); #else - r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "codesign/codesign", PROPERTY_HINT_ENUM, "Disabled,Built-in (ad-hoc only),PyOxidizer rcodesign"), 1, true)); + r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "codesign/codesign", PROPERTY_HINT_ENUM, "Disabled,Built-in (ad-hoc only),rcodesign"), 1, true)); #endif // "codesign" only options: r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "codesign/identity", PROPERTY_HINT_PLACEHOLDER_TEXT, "Type: Name (ID)"), "")); @@ -165,17 +168,18 @@ void EditorExportPlatformMacOS::get_export_options(List<ExportOption> *r_options r_options->push_back(ExportOption(PropertyInfo(Variant::PACKED_STRING_ARRAY, "codesign/custom_options"), PackedStringArray())); #ifdef MACOS_ENABLED - r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "notarization/notarization", PROPERTY_HINT_ENUM, "Disabled,PyOxidizer rcodesign,Xcode altool"), 0, true)); + r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "notarization/notarization", PROPERTY_HINT_ENUM, "Disabled,rcodesign,Xcode notarytool,Xcode altool (deprecated)"), 0, true)); #else - r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "notarization/notarization", PROPERTY_HINT_ENUM, "Disabled,PyOxidizer rcodesign"), 0, true)); + r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "notarization/notarization", PROPERTY_HINT_ENUM, "Disabled,rcodesign"), 0, true)); #endif - // "altool" only options: + // "altool" and "notarytool" only options: r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "notarization/apple_id_name", PROPERTY_HINT_PLACEHOLDER_TEXT, "Apple ID email"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "notarization/apple_id_password", PROPERTY_HINT_PASSWORD, "Enable two-factor authentication and provide app-specific password"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "notarization/apple_team_id", PROPERTY_HINT_PLACEHOLDER_TEXT, "Provide team ID if your Apple ID belongs to multiple teams"), "")); - // "altool" and "rcodesign" only options: - r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "notarization/api_uuid", PROPERTY_HINT_PLACEHOLDER_TEXT, "App Store Connect issuer ID"), "")); - r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "notarization/api_key", PROPERTY_HINT_PLACEHOLDER_TEXT, "App Store Connect API key ID"), "")); + // "altool", "notarytool" and "rcodesign" only options: + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "notarization/api_uuid", PROPERTY_HINT_PLACEHOLDER_TEXT, "App Store Connect issuer ID UUID"), "")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "notarization/api_key", PROPERTY_HINT_GLOBAL_FILE, "*.p8"), "")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "notarization/api_key_id", PROPERTY_HINT_PLACEHOLDER_TEXT, "App Store Connect API key ID"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "privacy/microphone_usage_description", PROPERTY_HINT_PLACEHOLDER_TEXT, "Provide a message if you need to use the microphone"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::DICTIONARY, "privacy/microphone_usage_description_localized", PROPERTY_HINT_LOCALIZABLE_STRING), Dictionary())); @@ -498,7 +502,12 @@ Error EditorExportPlatformMacOS::_notarize(const Ref<EditorExportPreset> &p_pres args.push_back(p_preset->get("notarization/api_uuid")); args.push_back("--api-key"); - args.push_back(p_preset->get("notarization/api_key")); + args.push_back(p_preset->get("notarization/api_key_id")); + + if (!p_preset->get("notarization/api_key").operator String().is_empty()) { + args.push_back("--api-key-path"); + args.push_back(p_preset->get("notarization/api_key")); + } args.push_back(p_path); @@ -519,7 +528,7 @@ Error EditorExportPlatformMacOS::_notarize(const Ref<EditorExportPreset> &p_pres } else { print_verbose("rcodesign (" + p_path + "):\n" + str); int next_nl = str.find("\n", rq_offset); - String request_uuid = (next_nl == -1) ? str.substr(rq_offset + 14, -1) : str.substr(rq_offset + 14, next_nl - rq_offset - 14); + String request_uuid = (next_nl == -1) ? str.substr(rq_offset + 23, -1) : str.substr(rq_offset + 23, next_nl - rq_offset - 23); add_message(EXPORT_MESSAGE_INFO, TTR("Notarization"), vformat(TTR("Notarization request UUID: \"%s\""), request_uuid)); add_message(EXPORT_MESSAGE_INFO, TTR("Notarization"), TTR("The notarization process generally takes less than an hour.")); add_message(EXPORT_MESSAGE_INFO, TTR("Notarization"), "\t" + TTR("You can check progress manually by opening a Terminal and running the following command:")); @@ -529,7 +538,91 @@ Error EditorExportPlatformMacOS::_notarize(const Ref<EditorExportPreset> &p_pres } } break; #ifdef MACOS_ENABLED - case 2: { // "altool" + case 2: { // "notarytool" + print_verbose("using notarytool notarization..."); + + if (!FileAccess::exists("/usr/bin/xcrun") && !FileAccess::exists("/bin/xcrun")) { + add_message(EXPORT_MESSAGE_ERROR, TTR("Notarization"), TTR("Xcode command line tools are not installed.")); + return Error::FAILED; + } + + List<String> args; + + args.push_back("notarytool"); + args.push_back("submit"); + + args.push_back(p_path); + + if (p_preset->get("notarization/apple_id_name") == "" && p_preset->get("notarization/api_uuid") == "") { + add_message(EXPORT_MESSAGE_ERROR, TTR("Notarization"), TTR("Neither Apple ID name nor App Store Connect issuer ID name not specified.")); + return Error::FAILED; + } + if (p_preset->get("notarization/apple_id_name") != "" && p_preset->get("notarization/api_uuid") != "") { + add_message(EXPORT_MESSAGE_ERROR, TTR("Notarization"), TTR("Both Apple ID name and App Store Connect issuer ID name are specified, only one should be set at the same time.")); + return Error::FAILED; + } + + if (p_preset->get("notarization/apple_id_name") != "") { + if (p_preset->get("notarization/apple_id_password") == "") { + add_message(EXPORT_MESSAGE_ERROR, TTR("Notarization"), TTR("Apple ID password not specified.")); + return Error::FAILED; + } + args.push_back("--apple-id"); + args.push_back(p_preset->get("notarization/apple_id_name")); + + args.push_back("--password"); + args.push_back(p_preset->get("notarization/apple_id_password")); + } else { + if (p_preset->get("notarization/api_key_id") == "") { + add_message(EXPORT_MESSAGE_ERROR, TTR("Notarization"), TTR("App Store Connect API key ID not specified.")); + return Error::FAILED; + } + args.push_back("--issuer"); + args.push_back(p_preset->get("notarization/api_uuid")); + + if (!p_preset->get("notarization/api_key").operator String().is_empty()) { + args.push_back("--key"); + args.push_back(p_preset->get("notarization/api_key")); + } + + args.push_back("--key-id"); + args.push_back(p_preset->get("notarization/api_key_id")); + } + + args.push_back("--no-progress"); + + if (p_preset->get("notarization/apple_team_id")) { + args.push_back("--team-id"); + args.push_back(p_preset->get("notarization/apple_team_id")); + } + + String str; + int exitcode = 0; + Error err = OS::get_singleton()->execute("xcrun", args, &str, &exitcode, true); + if (err != OK) { + add_message(EXPORT_MESSAGE_WARNING, TTR("Notarization"), TTR("Could not start xcrun executable.")); + return err; + } + + int rq_offset = str.find("id:"); + if (exitcode != 0 || rq_offset == -1) { + print_line("notarytool (" + p_path + "):\n" + str); + add_message(EXPORT_MESSAGE_WARNING, TTR("Notarization"), TTR("Notarization failed, see editor log for details.")); + return Error::FAILED; + } else { + print_verbose("notarytool (" + p_path + "):\n" + str); + int next_nl = str.find("\n", rq_offset); + String request_uuid = (next_nl == -1) ? str.substr(rq_offset + 4, -1) : str.substr(rq_offset + 4, next_nl - rq_offset - 4); + add_message(EXPORT_MESSAGE_INFO, TTR("Notarization"), vformat(TTR("Notarization request UUID: \"%s\""), request_uuid)); + add_message(EXPORT_MESSAGE_INFO, TTR("Notarization"), TTR("The notarization process generally takes less than an hour.")); + add_message(EXPORT_MESSAGE_INFO, TTR("Notarization"), "\t" + TTR("You can check progress manually by opening a Terminal and running the following command:")); + add_message(EXPORT_MESSAGE_INFO, TTR("Notarization"), "\t\t\"xcrun notarytool log <request uuid> --issuer <api uuid> --key-id <api key id> --key <api key path>\" or"); + add_message(EXPORT_MESSAGE_INFO, TTR("Notarization"), "\t\t\"xcrun notarytool log <request uuid> --apple-id <your email> --password <app-specific pwd>>\""); + add_message(EXPORT_MESSAGE_INFO, TTR("Notarization"), "\t" + TTR("Run the following command to staple the notarization ticket to the exported application (optional):")); + add_message(EXPORT_MESSAGE_INFO, TTR("Notarization"), "\t\t\"xcrun stapler staple <app path>\""); + } + } break; + case 3: { // "altool" print_verbose("using altool notarization..."); if (!FileAccess::exists("/usr/bin/xcrun") && !FileAccess::exists("/bin/xcrun")) { @@ -573,7 +666,7 @@ Error EditorExportPlatformMacOS::_notarize(const Ref<EditorExportPreset> &p_pres args.push_back(p_preset->get("notarization/api_uuid")); args.push_back("--apiKey"); - args.push_back(p_preset->get("notarization/api_key")); + args.push_back(p_preset->get("notarization/api_key_id")); } args.push_back("--type"); @@ -595,7 +688,7 @@ Error EditorExportPlatformMacOS::_notarize(const Ref<EditorExportPreset> &p_pres return err; } - int rq_offset = str.find("RequestUUID"); + int rq_offset = str.find("RequestUUID:"); if (exitcode != 0 || rq_offset == -1) { print_line("xcrun altool (" + p_path + "):\n" + str); add_message(EXPORT_MESSAGE_WARNING, TTR("Notarization"), TTR("Notarization failed, see editor log for details.")); @@ -603,7 +696,7 @@ Error EditorExportPlatformMacOS::_notarize(const Ref<EditorExportPreset> &p_pres } else { print_verbose("xcrun altool (" + p_path + "):\n" + str); int next_nl = str.find("\n", rq_offset); - String request_uuid = (next_nl == -1) ? str.substr(rq_offset + 14, -1) : str.substr(rq_offset + 14, next_nl - rq_offset - 14); + String request_uuid = (next_nl == -1) ? str.substr(rq_offset + 13, -1) : str.substr(rq_offset + 13, next_nl - rq_offset - 13); add_message(EXPORT_MESSAGE_INFO, TTR("Notarization"), vformat(TTR("Notarization request UUID: \"%s\""), request_uuid)); add_message(EXPORT_MESSAGE_INFO, TTR("Notarization"), TTR("The notarization process generally takes less than an hour. When the process is completed, you'll receive an email.")); add_message(EXPORT_MESSAGE_INFO, TTR("Notarization"), "\t" + TTR("You can check progress manually by opening a Terminal and running the following command:")); @@ -1819,7 +1912,7 @@ bool EditorExportPlatformMacOS::has_valid_project_configuration(const Ref<Editor err += TTR("Notarization: Code signing is required for notarization.") + "\n"; valid = false; } - if (notary_tool == 2) { + if (notary_tool == 2 || notary_tool == 3) { if (!FileAccess::exists("/usr/bin/xcrun") && !FileAccess::exists("/bin/xcrun")) { err += TTR("Notarization: Xcode command line tools are not installed.") + "\n"; valid = false; @@ -1838,7 +1931,7 @@ bool EditorExportPlatformMacOS::has_valid_project_configuration(const Ref<Editor } } if (p_preset->get("notarization/api_uuid") != "") { - if (p_preset->get("notarization/api_key") == "") { + if (p_preset->get("notarization/api_key_id") == "") { err += TTR("Notarization: App Store Connect API key ID not specified.") + "\n"; valid = false; } @@ -1849,7 +1942,7 @@ bool EditorExportPlatformMacOS::has_valid_project_configuration(const Ref<Editor err += TTR("Notarization: App Store Connect issuer ID name not specified.") + "\n"; valid = false; } - if (p_preset->get("notarization/api_key") == "") { + if (p_preset->get("notarization/api_key_id") == "") { err += TTR("Notarization: App Store Connect API key ID not specified.") + "\n"; valid = false; } diff --git a/platform/macos/export/plist.cpp b/platform/macos/export/plist.cpp index 82ecd41d9c..c88b6e1077 100644 --- a/platform/macos/export/plist.cpp +++ b/platform/macos/export/plist.cpp @@ -30,6 +30,119 @@ #include "plist.h" +PList::PLNodeType PListNode::get_type() const { + return data_type; +} + +Variant PListNode::get_value() const { + switch (data_type) { + case PList::PL_NODE_TYPE_NIL: { + return Variant(); + } break; + case PList::PL_NODE_TYPE_STRING: { + return String::utf8(data_string.get_data()); + } break; + case PList::PL_NODE_TYPE_ARRAY: { + Array arr; + for (const Ref<PListNode> &E : data_array) { + arr.push_back(E); + } + return arr; + } break; + case PList::PL_NODE_TYPE_DICT: { + Dictionary dict; + for (const KeyValue<String, Ref<PListNode>> &E : data_dict) { + dict[E.key] = E.value; + } + return dict; + } break; + case PList::PL_NODE_TYPE_BOOLEAN: { + return data_bool; + } break; + case PList::PL_NODE_TYPE_INTEGER: { + return data_int; + } break; + case PList::PL_NODE_TYPE_REAL: { + return data_real; + } break; + case PList::PL_NODE_TYPE_DATA: { + int strlen = data_string.length(); + + size_t arr_len = 0; + Vector<uint8_t> buf; + { + buf.resize(strlen / 4 * 3 + 1); + uint8_t *w = buf.ptrw(); + + ERR_FAIL_COND_V(CryptoCore::b64_decode(&w[0], buf.size(), &arr_len, (unsigned char *)data_string.get_data(), strlen) != OK, Vector<uint8_t>()); + } + buf.resize(arr_len); + return buf; + } break; + case PList::PL_NODE_TYPE_DATE: { + return String(data_string.get_data()); + } break; + } + return Variant(); +} + +Ref<PListNode> PListNode::new_node(const Variant &p_value) { + Ref<PListNode> node; + node.instantiate(); + + switch (p_value.get_type()) { + case Variant::NIL: { + node->data_type = PList::PL_NODE_TYPE_NIL; + } break; + case Variant::BOOL: { + node->data_type = PList::PL_NODE_TYPE_BOOLEAN; + node->data_bool = p_value; + } break; + case Variant::INT: { + node->data_type = PList::PL_NODE_TYPE_INTEGER; + node->data_int = p_value; + } break; + case Variant::FLOAT: { + node->data_type = PList::PL_NODE_TYPE_REAL; + node->data_real = p_value; + } break; + case Variant::STRING_NAME: + case Variant::STRING: { + node->data_type = PList::PL_NODE_TYPE_STRING; + node->data_string = p_value.operator String().utf8(); + } break; + case Variant::DICTIONARY: { + node->data_type = PList::PL_NODE_TYPE_DICT; + Dictionary dict = p_value; + const Variant *next = dict.next(nullptr); + while (next) { + Ref<PListNode> sub_node = dict[*next]; + ERR_FAIL_COND_V_MSG(sub_node.is_null(), Ref<PListNode>(), "Invalid dictionary element, should be PListNode."); + node->data_dict[*next] = sub_node; + next = dict.next(next); + } + } break; + case Variant::ARRAY: { + node->data_type = PList::PL_NODE_TYPE_ARRAY; + Array ar = p_value; + for (int i = 0; i < ar.size(); i++) { + Ref<PListNode> sub_node = ar[i]; + ERR_FAIL_COND_V_MSG(sub_node.is_null(), Ref<PListNode>(), "Invalid array element, should be PListNode."); + node->data_array.push_back(sub_node); + } + } break; + case Variant::PACKED_BYTE_ARRAY: { + node->data_type = PList::PL_NODE_TYPE_DATA; + PackedByteArray buf = p_value; + node->data_string = CryptoCore::b64_encode_str(buf.ptr(), buf.size()).utf8(); + } break; + default: { + ERR_FAIL_V_MSG(Ref<PListNode>(), "Unsupported data type."); + } break; + } + return node; +} + Ref<PListNode> PListNode::new_array() { Ref<PListNode> node = memnew(PListNode()); ERR_FAIL_COND_V(node.is_null(), Ref<PListNode>()); @@ -65,6 +178,7 @@ Ref<PListNode> PListNode::new_date(const String &p_string) { ERR_FAIL_COND_V(node.is_null(), Ref<PListNode>()); node->data_type = PList::PLNodeType::PL_NODE_TYPE_DATE; node->data_string = p_string.utf8(); + node->data_real = (double)Time::get_singleton()->get_unix_time_from_datetime_string(p_string) - 978307200.0; return node; } @@ -76,7 +190,7 @@ Ref<PListNode> PListNode::new_bool(bool p_bool) { return node; } -Ref<PListNode> PListNode::new_int(int32_t p_int) { +Ref<PListNode> PListNode::new_int(int64_t p_int) { Ref<PListNode> node = memnew(PListNode()); ERR_FAIL_COND_V(node.is_null(), Ref<PListNode>()); node->data_type = PList::PLNodeType::PL_NODE_TYPE_INTEGER; @@ -84,7 +198,7 @@ Ref<PListNode> PListNode::new_int(int32_t p_int) { return node; } -Ref<PListNode> PListNode::new_real(float p_real) { +Ref<PListNode> PListNode::new_real(double p_real) { Ref<PListNode> node = memnew(PListNode()); ERR_FAIL_COND_V(node.is_null(), Ref<PListNode>()); node->data_type = PList::PLNodeType::PL_NODE_TYPE_REAL; @@ -337,6 +451,168 @@ PList::PList(const String &p_string) { load_string(p_string); } +uint64_t PList::read_bplist_var_size_int(Ref<FileAccess> p_file, uint8_t p_size) { + uint64_t pos = p_file->get_position(); + uint64_t ret = 0; + switch (p_size) { + case 1: { + ret = p_file->get_8(); + } break; + case 2: { + ret = BSWAP16(p_file->get_16()); + } break; + case 3: { + ret = BSWAP32(p_file->get_32() & 0x00FFFFFF); + } break; + case 4: { + ret = BSWAP32(p_file->get_32()); + } break; + case 5: { + ret = BSWAP64(p_file->get_64() & 0x000000FFFFFFFFFF); + } break; + case 6: { + ret = BSWAP64(p_file->get_64() & 0x0000FFFFFFFFFFFF); + } break; + case 7: { + ret = BSWAP64(p_file->get_64() & 0x00FFFFFFFFFFFFFF); + } break; + case 8: { + ret = BSWAP64(p_file->get_64()); + } break; + default: { + ret = 0; + } + } + p_file->seek(pos + p_size); + + return ret; +} + +Ref<PListNode> PList::read_bplist_obj(Ref<FileAccess> p_file, uint64_t p_offset_idx) { + Ref<PListNode> node; + node.instantiate(); + + uint64_t ot_off = trailer.offset_table_start + p_offset_idx * trailer.offset_size; + p_file->seek(ot_off); + uint64_t marker_off = read_bplist_var_size_int(p_file, trailer.offset_size); + ERR_FAIL_COND_V_MSG(marker_off == 0, Ref<PListNode>(), "Invalid marker size."); + + p_file->seek(marker_off); + uint8_t marker = p_file->get_8(); + uint8_t marker_type = marker & 0xF0; + uint64_t marker_size = marker & 0x0F; + + switch (marker_type) { + case 0x00: { + if (marker_size == 0x00) { + node->data_type = PL_NODE_TYPE_NIL; + } else if (marker_size == 0x08) { + node->data_type = PL_NODE_TYPE_BOOLEAN; + node->data_bool = false; + } else if (marker_size == 0x09) { + node->data_type = PL_NODE_TYPE_BOOLEAN; + node->data_bool = true; + } else { + ERR_FAIL_V_MSG(Ref<PListNode>(), "Invalid nil/bool marker value."); + } + } break; + case 0x10: { + node->data_type = PL_NODE_TYPE_INTEGER; + node->data_int = static_cast<int64_t>(read_bplist_var_size_int(p_file, pow(2, marker_size))); + } break; + case 0x20: { + node->data_type = PL_NODE_TYPE_REAL; + node->data_int = static_cast<int64_t>(read_bplist_var_size_int(p_file, pow(2, marker_size))); + } break; + case 0x30: { + node->data_type = PL_NODE_TYPE_DATE; + node->data_int = BSWAP64(p_file->get_64()); + node->data_string = Time::get_singleton()->get_datetime_string_from_unix_time(node->data_real + 978307200.0).utf8(); + } break; + case 0x40: { + if (marker_size == 0x0F) { + uint8_t ext = p_file->get_8() & 0xF; + marker_size = read_bplist_var_size_int(p_file, pow(2, ext)); + } + node->data_type = PL_NODE_TYPE_DATA; + PackedByteArray buf; + buf.resize(marker_size + 1); + p_file->get_buffer(reinterpret_cast<uint8_t *>(buf.ptrw()), marker_size); + node->data_string = CryptoCore::b64_encode_str(buf.ptr(), buf.size()).utf8(); + } break; + case 0x50: { + if (marker_size == 0x0F) { + uint8_t ext = p_file->get_8() & 0xF; + marker_size = read_bplist_var_size_int(p_file, pow(2, ext)); + } + node->data_type = PL_NODE_TYPE_STRING; + node->data_string.resize(marker_size + 1); + p_file->get_buffer(reinterpret_cast<uint8_t *>(node->data_string.ptrw()), marker_size); + } break; + case 0x60: { + if (marker_size == 0x0F) { + uint8_t ext = p_file->get_8() & 0xF; + marker_size = read_bplist_var_size_int(p_file, pow(2, ext)); + } + Char16String cs16; + cs16.resize(marker_size + 1); + for (uint64_t i = 0; i < marker_size; i++) { + cs16[i] = BSWAP16(p_file->get_16()); + } + node->data_type = PL_NODE_TYPE_STRING; + node->data_string = String::utf16(cs16.ptr(), cs16.length()).utf8(); + } break; + case 0x80: { + node->data_type = PL_NODE_TYPE_INTEGER; + node->data_int = static_cast<int64_t>(read_bplist_var_size_int(p_file, marker_size + 1)); + } break; + case 0xA0: + case 0xC0: { + if (marker_size == 0x0F) { + uint8_t ext = p_file->get_8() & 0xF; + marker_size = read_bplist_var_size_int(p_file, pow(2, ext)); + } + uint64_t pos = p_file->get_position(); + + node->data_type = PL_NODE_TYPE_ARRAY; + for (uint64_t i = 0; i < marker_size; i++) { + p_file->seek(pos + trailer.ref_size * i); + uint64_t ref = read_bplist_var_size_int(p_file, trailer.ref_size); + + Ref<PListNode> element = read_bplist_obj(p_file, ref); + ERR_FAIL_COND_V(element.is_null(), Ref<PListNode>()); + node->data_array.push_back(element); + } + } break; + case 0xD0: { + if (marker_size == 0x0F) { + uint8_t ext = p_file->get_8() & 0xF; + marker_size = read_bplist_var_size_int(p_file, pow(2, ext)); + } + uint64_t pos = p_file->get_position(); + + node->data_type = PL_NODE_TYPE_DICT; + for (uint64_t i = 0; i < marker_size; i++) { + p_file->seek(pos + trailer.ref_size * i); + uint64_t key_ref = read_bplist_var_size_int(p_file, trailer.ref_size); + + p_file->seek(pos + trailer.ref_size * (i + marker_size)); + uint64_t obj_ref = read_bplist_var_size_int(p_file, trailer.ref_size); + + Ref<PListNode> element_key = read_bplist_obj(p_file, key_ref); + ERR_FAIL_COND_V(element_key.is_null() || element_key->data_type != PL_NODE_TYPE_STRING, Ref<PListNode>()); + Ref<PListNode> element = read_bplist_obj(p_file, obj_ref); + ERR_FAIL_COND_V(element.is_null(), Ref<PListNode>()); + node->data_dict[String::utf8(element_key->data_string.ptr(), element_key->data_string.length())] = element; + } + } break; + default: { + ERR_FAIL_V_MSG(Ref<PListNode>(), "Invalid marker type."); + } + } + return node; +} + bool PList::load_file(const String &p_filename) { root = Ref<PListNode>(); @@ -349,7 +625,15 @@ bool PList::load_file(const String &p_filename) { fb->get_buffer(magic, 8); if (String((const char *)magic, 8) == "bplist00") { - ERR_FAIL_V_MSG(false, "PList: Binary property lists are not supported."); + fb->seek_end(-26); + trailer.offset_size = fb->get_8(); + trailer.ref_size = fb->get_8(); + trailer.object_num = BSWAP64(fb->get_64()); + trailer.root_offset_idx = BSWAP64(fb->get_64()); + trailer.offset_table_start = BSWAP64(fb->get_64()); + root = read_bplist_obj(fb, trailer.root_offset_idx); + + return root.is_valid(); } else { // Load text plist. Error err; diff --git a/platform/macos/export/plist.h b/platform/macos/export/plist.h index 97331a3629..d53e88832f 100644 --- a/platform/macos/export/plist.h +++ b/platform/macos/export/plist.h @@ -35,6 +35,7 @@ #include "core/crypto/crypto_core.h" #include "core/io/file_access.h" +#include "core/os/time.h" class PListNode; @@ -55,8 +56,20 @@ public: }; private: + struct PListTrailer { + uint8_t offset_size; + uint8_t ref_size; + uint64_t object_num; + uint64_t root_offset_idx; + uint64_t offset_table_start; + }; + + PListTrailer trailer; Ref<PListNode> root; + uint64_t read_bplist_var_size_int(Ref<FileAccess> p_file, uint8_t p_size); + Ref<PListNode> read_bplist_obj(Ref<FileAccess> p_file, uint64_t p_offset_idx); + public: PList(); PList(const String &p_string); @@ -82,19 +95,23 @@ public: Vector<Ref<PListNode>> data_array; HashMap<String, Ref<PListNode>> data_dict; union { - int32_t data_int; + int64_t data_int; bool data_bool; - float data_real; + double data_real; }; + PList::PLNodeType get_type() const; + Variant get_value() const; + + static Ref<PListNode> new_node(const Variant &p_value); static Ref<PListNode> new_array(); static Ref<PListNode> new_dict(); static Ref<PListNode> new_string(const String &p_string); static Ref<PListNode> new_data(const String &p_string); static Ref<PListNode> new_date(const String &p_string); static Ref<PListNode> new_bool(bool p_bool); - static Ref<PListNode> new_int(int32_t p_int); - static Ref<PListNode> new_real(float p_real); + static Ref<PListNode> new_int(int64_t p_int); + static Ref<PListNode> new_real(double p_real); bool push_subnode(const Ref<PListNode> &p_node, const String &p_key = ""); diff --git a/platform/macos/os_macos.mm b/platform/macos/os_macos.mm index ebba96ceb1..fd8ba38808 100644 --- a/platform/macos/os_macos.mm +++ b/platform/macos/os_macos.mm @@ -45,16 +45,6 @@ #include <os/log.h> #include <sys/sysctl.h> -_FORCE_INLINE_ String OS_MacOS::get_framework_executable(const String &p_path) { - // Append framework executable name, or return as is if p_path is not a framework. - Ref<DirAccess> da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); - if (da->dir_exists(p_path) && da->file_exists(p_path.path_join(p_path.get_file().get_basename()))) { - return p_path.path_join(p_path.get_file().get_basename()); - } else { - return p_path; - } -} - void OS_MacOS::pre_wait_observer_cb(CFRunLoopObserverRef p_observer, CFRunLoopActivity p_activiy, void *p_context) { // Prevent main loop from sleeping and redraw window during modal popup display. // Do not redraw when rendering is done from the separate thread, it will conflict with the OpenGL context updates. @@ -162,6 +152,28 @@ void OS_MacOS::alert(const String &p_alert, const String &p_title) { } } +_FORCE_INLINE_ String OS_MacOS::get_framework_executable(const String &p_path) { + Ref<DirAccess> da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM); + + // Read framework bundle to get executable name. + NSURL *url = [NSURL fileURLWithPath:@(p_path.utf8().get_data())]; + NSBundle *bundle = [NSBundle bundleWithURL:url]; + if (bundle) { + String exe_path = String::utf8([[bundle executablePath] UTF8String]); + if (da->file_exists(exe_path)) { + return exe_path; + } + } + + // Try default executable name (invalid framework). + if (da->dir_exists(p_path) && da->file_exists(p_path.path_join(p_path.get_file().get_basename()))) { + return p_path.path_join(p_path.get_file().get_basename()); + } + + // Not a framework, try loading as .dylib. + return p_path; +} + Error OS_MacOS::open_dynamic_library(const String p_path, void *&p_library_handle, bool p_also_set_library_path, String *r_resolved_path) { String path = get_framework_executable(p_path); @@ -190,14 +202,6 @@ MainLoop *OS_MacOS::get_main_loop() const { } String OS_MacOS::get_config_path() const { - // The XDG Base Directory specification technically only applies on Linux/*BSD, but it doesn't hurt to support it on macOS as well. - if (has_environment("XDG_CONFIG_HOME")) { - if (get_environment("XDG_CONFIG_HOME").is_absolute_path()) { - return get_environment("XDG_CONFIG_HOME"); - } else { - WARN_PRINT_ONCE("`XDG_CONFIG_HOME` is a relative path. Ignoring its value and falling back to `$HOME/Library/Application Support` or `.` per the XDG Base Directory specification."); - } - } if (has_environment("HOME")) { return get_environment("HOME").path_join("Library/Application Support"); } @@ -205,26 +209,10 @@ String OS_MacOS::get_config_path() const { } String OS_MacOS::get_data_path() const { - // The XDG Base Directory specification technically only applies on Linux/*BSD, but it doesn't hurt to support it on macOS as well. - if (has_environment("XDG_DATA_HOME")) { - if (get_environment("XDG_DATA_HOME").is_absolute_path()) { - return get_environment("XDG_DATA_HOME"); - } else { - WARN_PRINT_ONCE("`XDG_DATA_HOME` is a relative path. Ignoring its value and falling back to `get_config_path()` per the XDG Base Directory specification."); - } - } return get_config_path(); } String OS_MacOS::get_cache_path() const { - // The XDG Base Directory specification technically only applies on Linux/*BSD, but it doesn't hurt to support it on macOS as well. - if (has_environment("XDG_CACHE_HOME")) { - if (get_environment("XDG_CACHE_HOME").is_absolute_path()) { - return get_environment("XDG_CACHE_HOME"); - } else { - WARN_PRINT_ONCE("`XDG_CACHE_HOME` is a relative path. Ignoring its value and falling back to `$HOME/Library/Caches` or `get_config_path()` per the XDG Base Directory specification."); - } - } if (has_environment("HOME")) { return get_environment("HOME").path_join("Library/Caches"); } diff --git a/platform/web/display_server_web.cpp b/platform/web/display_server_web.cpp index f704124704..d057010c02 100644 --- a/platform/web/display_server_web.cpp +++ b/platform/web/display_server_web.cpp @@ -579,8 +579,8 @@ void DisplayServerWeb::touch_callback(int p_type, int p_count) { } } -bool DisplayServerWeb::screen_is_touchscreen(int p_screen) const { - return godot_js_display_touchscreen_is_available(); +bool DisplayServerWeb::is_touchscreen_available() const { + return godot_js_display_touchscreen_is_available() || (Input::get_singleton() && Input::get_singleton()->is_emulating_touch_from_mouse()); } // Virtual Keyboard @@ -943,7 +943,11 @@ void DisplayServerWeb::window_set_current_screen(int p_screen, WindowID p_window } Point2i DisplayServerWeb::window_get_position(WindowID p_window) const { - return Point2i(); // TODO Does this need implementation? + return Point2i(); +} + +Point2i DisplayServerWeb::window_get_position_with_decorations(WindowID p_window) const { + return Point2i(); } void DisplayServerWeb::window_set_position(const Point2i &p_position, WindowID p_window) { @@ -980,7 +984,7 @@ Size2i DisplayServerWeb::window_get_size(WindowID p_window) const { return Size2i(size[0], size[1]); } -Size2i DisplayServerWeb::window_get_real_size(WindowID p_window) const { +Size2i DisplayServerWeb::window_get_size_with_decorations(WindowID p_window) const { return window_get_size(p_window); } diff --git a/platform/web/display_server_web.h b/platform/web/display_server_web.h index 1919736802..fce98ec3d0 100644 --- a/platform/web/display_server_web.h +++ b/platform/web/display_server_web.h @@ -143,7 +143,7 @@ public: virtual Point2i mouse_get_position() const override; // touch - virtual bool screen_is_touchscreen(int p_screen = SCREEN_OF_MAIN_WINDOW) const override; + virtual bool is_touchscreen_available() const override; // clipboard virtual void clipboard_set(const String &p_text) override; @@ -182,6 +182,7 @@ public: virtual void window_set_current_screen(int p_screen, WindowID p_window = MAIN_WINDOW_ID) override; virtual Point2i window_get_position(WindowID p_window = MAIN_WINDOW_ID) const override; + virtual Point2i window_get_position_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override; virtual void window_set_position(const Point2i &p_position, WindowID p_window = MAIN_WINDOW_ID) override; virtual void window_set_transient(WindowID p_window, WindowID p_parent) override; @@ -194,7 +195,7 @@ public: virtual void window_set_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID) override; virtual Size2i window_get_size(WindowID p_window = MAIN_WINDOW_ID) const override; - virtual Size2i window_get_real_size(WindowID p_window = MAIN_WINDOW_ID) const override; + virtual Size2i window_get_size_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override; virtual void window_set_mode(WindowMode p_mode, WindowID p_window = MAIN_WINDOW_ID) override; virtual WindowMode window_get_mode(WindowID p_window = MAIN_WINDOW_ID) const override; diff --git a/platform/web/export/export_plugin.cpp b/platform/web/export/export_plugin.cpp index f59ac54f20..3087b12c40 100644 --- a/platform/web/export/export_plugin.cpp +++ b/platform/web/export/export_plugin.cpp @@ -133,7 +133,7 @@ void EditorExportPlatformWeb::_fix_html(Vector<uint8_t> &p_html, const Ref<Edito config["canvasResizePolicy"] = p_preset->get("html/canvas_resize_policy"); config["experimentalVK"] = p_preset->get("html/experimental_virtual_keyboard"); config["focusCanvas"] = p_preset->get("html/focus_canvas_on_start"); - config["gdnativeLibs"] = libs; + config["gdextensionLibs"] = libs; config["executable"] = p_name; config["args"] = args; config["fileSizes"] = p_file_sizes; diff --git a/platform/web/js/engine/config.js b/platform/web/js/engine/config.js index 4560f12b49..6a30c253fb 100644 --- a/platform/web/js/engine/config.js +++ b/platform/web/js/engine/config.js @@ -127,7 +127,7 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused- * @ignore * @type {Array.<string>} */ - gdnativeLibs: [], + gdextensionLibs: [], /** * @ignore * @type {Array.<string>} @@ -257,7 +257,7 @@ const InternalConfig = function (initConfig) { // eslint-disable-line no-unused- this.experimentalVK = parse('experimentalVK', this.experimentalVK); this.focusCanvas = parse('focusCanvas', this.focusCanvas); this.serviceWorker = parse('serviceWorker', this.serviceWorker); - this.gdnativeLibs = parse('gdnativeLibs', this.gdnativeLibs); + this.gdextensionLibs = parse('gdextensionLibs', this.gdextensionLibs); this.fileSizes = parse('fileSizes', this.fileSizes); this.args = parse('args', this.args); this.onExecute = parse('onExecute', this.onExecute); diff --git a/platform/web/js/engine/engine.js b/platform/web/js/engine/engine.js index 9227aa1f05..fb80bd55e1 100644 --- a/platform/web/js/engine/engine.js +++ b/platform/web/js/engine/engine.js @@ -162,9 +162,9 @@ const Engine = (function () { // Godot configuration. me.rtenv['initConfig'](config); - // Preload GDNative libraries. + // Preload GDExtension libraries. const libs = []; - me.config.gdnativeLibs.forEach(function (lib) { + me.config.gdextensionLibs.forEach(function (lib) { libs.push(me.rtenv['loadDynamicLibrary'](lib, { 'loadAsync': true })); }); return Promise.all(libs).then(function () { diff --git a/platform/windows/display_server_windows.cpp b/platform/windows/display_server_windows.cpp index c704a26b7a..e7864ebac0 100644 --- a/platform/windows/display_server_windows.cpp +++ b/platform/windows/display_server_windows.cpp @@ -909,6 +909,24 @@ Point2i DisplayServerWindows::window_get_position(WindowID p_window) const { return Point2i(point.x, point.y); } +Point2i DisplayServerWindows::window_get_position_with_decorations(WindowID p_window) const { + _THREAD_SAFE_METHOD_ + + ERR_FAIL_COND_V(!windows.has(p_window), Point2i()); + const WindowData &wd = windows[p_window]; + + if (wd.minimized) { + return wd.last_pos; + } + + RECT r; + if (GetWindowRect(wd.hWnd, &r)) { + return Point2i(r.left, r.top); + } + + return Point2i(); +} + void DisplayServerWindows::_update_real_mouse_position(WindowID p_window) { ERR_FAIL_COND(!windows.has(p_window)); @@ -1124,7 +1142,7 @@ Size2i DisplayServerWindows::window_get_size(WindowID p_window) const { return Size2(); } -Size2i DisplayServerWindows::window_get_real_size(WindowID p_window) const { +Size2i DisplayServerWindows::window_get_size_with_decorations(WindowID p_window) const { _THREAD_SAFE_METHOD_ ERR_FAIL_COND_V(!windows.has(p_window), Size2i()); @@ -2414,7 +2432,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA case WM_GETMINMAXINFO: { if (windows[window_id].resizable && !windows[window_id].fullscreen) { // Size of window decorations. - Size2 decor = window_get_real_size(window_id) - window_get_size(window_id); + Size2 decor = window_get_size_with_decorations(window_id) - window_get_size(window_id); MINMAXINFO *min_max_info = (MINMAXINFO *)lParam; if (windows[window_id].min_size != Size2()) { @@ -2473,7 +2491,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA window_mouseover_id = INVALID_WINDOW_ID; _send_window_event(windows[window_id], WINDOW_EVENT_MOUSE_EXIT); - } else if (window_mouseover_id != INVALID_WINDOW_ID) { + } else if (window_mouseover_id != INVALID_WINDOW_ID && windows.has(window_mouseover_id)) { // This is reached during drag and drop, after dropping in a different window. // Once-off notification, must call again. track_mouse_leave_event(windows[window_mouseover_id].hWnd); @@ -2712,7 +2730,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA // Mouse enter. if (mouse_mode != MOUSE_MODE_CAPTURED) { - if (window_mouseover_id != INVALID_WINDOW_ID) { + if (window_mouseover_id != INVALID_WINDOW_ID && windows.has(window_mouseover_id)) { // Leave previous window. _send_window_event(windows[window_mouseover_id], WINDOW_EVENT_MOUSE_EXIT); } @@ -2814,7 +2832,7 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA } DisplayServer::WindowID over_id = get_window_at_screen_position(mouse_get_position()); - if (!Rect2(window_get_position(over_id), Point2(windows[over_id].width, windows[over_id].height)).has_point(mouse_get_position())) { + if (windows.has(over_id) && !Rect2(window_get_position(over_id), Point2(windows[over_id].width, windows[over_id].height)).has_point(mouse_get_position())) { // Don't consider the windowborder as part of the window. over_id = INVALID_WINDOW_ID; } @@ -2822,12 +2840,12 @@ LRESULT DisplayServerWindows::WndProc(HWND hWnd, UINT uMsg, WPARAM wParam, LPARA // Mouse enter. if (mouse_mode != MOUSE_MODE_CAPTURED) { - if (window_mouseover_id != INVALID_WINDOW_ID) { + if (window_mouseover_id != INVALID_WINDOW_ID && windows.has(window_mouseover_id)) { // Leave previous window. _send_window_event(windows[window_mouseover_id], WINDOW_EVENT_MOUSE_EXIT); } - if (over_id != INVALID_WINDOW_ID) { + if (over_id != INVALID_WINDOW_ID && windows.has(over_id)) { _send_window_event(windows[over_id], WINDOW_EVENT_MOUSE_ENTER); } } @@ -3520,7 +3538,7 @@ DisplayServer::WindowID DisplayServerWindows::_create_window(WindowMode p_mode, DWORD dwExStyle; DWORD dwStyle; - _get_window_style(window_id_counter == MAIN_WINDOW_ID, (p_mode == WINDOW_MODE_FULLSCREEN || p_mode == WINDOW_MODE_EXCLUSIVE_FULLSCREEN), p_mode == WINDOW_MODE_EXCLUSIVE_FULLSCREEN, p_flags & WINDOW_FLAG_BORDERLESS_BIT, !(p_flags & WINDOW_FLAG_RESIZE_DISABLED_BIT), p_mode == WINDOW_MODE_MAXIMIZED, (p_flags & WINDOW_FLAG_NO_FOCUS_BIT), dwStyle, dwExStyle); + _get_window_style(window_id_counter == MAIN_WINDOW_ID, (p_mode == WINDOW_MODE_FULLSCREEN || p_mode == WINDOW_MODE_EXCLUSIVE_FULLSCREEN), p_mode == WINDOW_MODE_EXCLUSIVE_FULLSCREEN, p_flags & WINDOW_FLAG_BORDERLESS_BIT, !(p_flags & WINDOW_FLAG_RESIZE_DISABLED_BIT), p_mode == WINDOW_MODE_MAXIMIZED, (p_flags & WINDOW_FLAG_NO_FOCUS_BIT) | (p_flags & WINDOW_FLAG_POPUP), dwStyle, dwExStyle); RECT WindowRect; diff --git a/platform/windows/display_server_windows.h b/platform/windows/display_server_windows.h index 8ac0086d69..4702bb7765 100644 --- a/platform/windows/display_server_windows.h +++ b/platform/windows/display_server_windows.h @@ -555,6 +555,7 @@ public: virtual void window_set_current_screen(int p_screen, WindowID p_window = MAIN_WINDOW_ID) override; virtual Point2i window_get_position(WindowID p_window = MAIN_WINDOW_ID) const override; + virtual Point2i window_get_position_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override; virtual void window_set_position(const Point2i &p_position, WindowID p_window = MAIN_WINDOW_ID) override; virtual void window_set_transient(WindowID p_window, WindowID p_parent) override; @@ -568,7 +569,7 @@ public: virtual void window_set_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID) override; virtual Size2i window_get_size(WindowID p_window = MAIN_WINDOW_ID) const override; - virtual Size2i window_get_real_size(WindowID p_window = MAIN_WINDOW_ID) const override; //wtf is this? should probable use proper name + virtual Size2i window_get_size_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override; virtual void window_set_mode(WindowMode p_mode, WindowID p_window = MAIN_WINDOW_ID) override; virtual WindowMode window_get_mode(WindowID p_window = MAIN_WINDOW_ID) const override; diff --git a/platform/windows/export/export_plugin.cpp b/platform/windows/export/export_plugin.cpp index f04177d79a..89f56ffd93 100644 --- a/platform/windows/export/export_plugin.cpp +++ b/platform/windows/export/export_plugin.cpp @@ -226,7 +226,7 @@ void EditorExportPlatformWindows::get_export_options(List<ExportOption> *r_optio r_options->push_back(ExportOption(PropertyInfo(Variant::BOOL, "application/modify_resources"), true)); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/icon", PROPERTY_HINT_FILE, "*.ico,*.png,*.webp,*.svg"), "")); - r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/console_wrapper_icon", PROPERTY_HINT_FILE, "*.ico.*.png,*.webp,*.svg"), "")); + r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/console_wrapper_icon", PROPERTY_HINT_FILE, "*.ico,*.png,*.webp,*.svg"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::INT, "application/icon_interpolation", PROPERTY_HINT_ENUM, "Nearest neighbor,Bilinear,Cubic,Trilinear,Lanczos"), 4)); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/file_version", PROPERTY_HINT_PLACEHOLDER_TEXT, "1.0.0.0"), "")); r_options->push_back(ExportOption(PropertyInfo(Variant::STRING, "application/product_version", PROPERTY_HINT_PLACEHOLDER_TEXT, "1.0.0.0"), "")); diff --git a/platform/windows/os_windows.cpp b/platform/windows/os_windows.cpp index e957a25e87..f8633d29ac 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -272,7 +272,7 @@ Error OS_Windows::open_dynamic_library(const String p_path, void *&p_library_han String path = p_path.replace("/", "\\"); if (!FileAccess::exists(path)) { - //this code exists so gdnative can load .dll files from within the executable path + //this code exists so gdextension can load .dll files from within the executable path path = get_executable_path().get_base_dir().path_join(p_path.get_file()); } @@ -1059,7 +1059,7 @@ String OS_Windows::get_system_font_path(const String &p_font_name, int p_weight, UINT32 index = 0; BOOL exists = false; HRESULT hr = font_collection->FindFamilyName((const WCHAR *)font_name.utf16().get_data(), &index, &exists); - if (FAILED(hr)) { + if (FAILED(hr) || !exists) { return String(); } @@ -1164,8 +1164,11 @@ bool OS_Windows::set_environment(const String &p_var, const String &p_value) con String OS_Windows::get_stdin_string(bool p_block) { if (p_block) { - char buff[1024]; - return fgets(buff, 1024, stdin); + WCHAR buff[1024]; + DWORD count = 0; + if (ReadConsoleW(GetStdHandle(STD_INPUT_HANDLE), buff, 1024, &count, nullptr)) { + return String::utf16((const char16_t *)buff, count); + } } return String(); @@ -1336,14 +1339,6 @@ uint64_t OS_Windows::get_embedded_pck_offset() const { } String OS_Windows::get_config_path() const { - // The XDG Base Directory specification technically only applies on Linux/*BSD, but it doesn't hurt to support it on Windows as well. - if (has_environment("XDG_CONFIG_HOME")) { - if (get_environment("XDG_CONFIG_HOME").is_absolute_path()) { - return get_environment("XDG_CONFIG_HOME").replace("\\", "/"); - } else { - WARN_PRINT_ONCE("`XDG_CONFIG_HOME` is a relative path. Ignoring its value and falling back to `%APPDATA%` or `.` per the XDG Base Directory specification."); - } - } if (has_environment("APPDATA")) { return get_environment("APPDATA").replace("\\", "/"); } @@ -1351,29 +1346,13 @@ String OS_Windows::get_config_path() const { } String OS_Windows::get_data_path() const { - // The XDG Base Directory specification technically only applies on Linux/*BSD, but it doesn't hurt to support it on Windows as well. - if (has_environment("XDG_DATA_HOME")) { - if (get_environment("XDG_DATA_HOME").is_absolute_path()) { - return get_environment("XDG_DATA_HOME").replace("\\", "/"); - } else { - WARN_PRINT_ONCE("`XDG_DATA_HOME` is a relative path. Ignoring its value and falling back to `get_config_path()` per the XDG Base Directory specification."); - } - } return get_config_path(); } String OS_Windows::get_cache_path() const { static String cache_path_cache; if (cache_path_cache.is_empty()) { - // The XDG Base Directory specification technically only applies on Linux/*BSD, but it doesn't hurt to support it on Windows as well. - if (has_environment("XDG_CACHE_HOME")) { - if (get_environment("XDG_CACHE_HOME").is_absolute_path()) { - cache_path_cache = get_environment("XDG_CACHE_HOME").replace("\\", "/"); - } else { - WARN_PRINT_ONCE("`XDG_CACHE_HOME` is a relative path. Ignoring its value and falling back to `%LOCALAPPDATA%\\cache`, `%TEMP%` or `get_config_path()` per the XDG Base Directory specification."); - } - } - if (cache_path_cache.is_empty() && has_environment("LOCALAPPDATA")) { + if (has_environment("LOCALAPPDATA")) { cache_path_cache = get_environment("LOCALAPPDATA").replace("\\", "/"); } if (cache_path_cache.is_empty() && has_environment("TEMP")) { diff --git a/platform/windows/platform_windows_builders.py b/platform/windows/platform_windows_builders.py index 33ca2e8ffa..b522a75a9c 100644 --- a/platform/windows/platform_windows_builders.py +++ b/platform/windows/platform_windows_builders.py @@ -4,18 +4,15 @@ All such functions are invoked in a subprocess on Windows to prevent build flaki """ import os +from detect import get_mingw_bin_prefix from platform_methods import subprocess_main def make_debug_mingw(target, source, env): - mingw_prefix = "" - if env["arch"] == "x86_32": - mingw_prefix = env["mingw_prefix_32"] - else: - mingw_prefix = env["mingw_prefix_64"] - os.system(mingw_prefix + "objcopy --only-keep-debug {0} {0}.debugsymbols".format(target[0])) - os.system(mingw_prefix + "strip --strip-debug --strip-unneeded {0}".format(target[0])) - os.system(mingw_prefix + "objcopy --add-gnu-debuglink={0}.debugsymbols {0}".format(target[0])) + mingw_bin_prefix = get_mingw_bin_prefix(env["mingw_prefix"], env["arch"]) + os.system(mingw_bin_prefix + "objcopy --only-keep-debug {0} {0}.debugsymbols".format(target[0])) + os.system(mingw_bin_prefix + "strip --strip-debug --strip-unneeded {0}".format(target[0])) + os.system(mingw_bin_prefix + "objcopy --add-gnu-debuglink={0}.debugsymbols {0}".format(target[0])) if __name__ == "__main__": diff --git a/scene/2d/back_buffer_copy.cpp b/scene/2d/back_buffer_copy.cpp index aa4ae01fd9..9c332123e3 100644 --- a/scene/2d/back_buffer_copy.cpp +++ b/scene/2d/back_buffer_copy.cpp @@ -71,12 +71,19 @@ Rect2 BackBufferCopy::get_rect() const { void BackBufferCopy::set_copy_mode(CopyMode p_mode) { copy_mode = p_mode; _update_copy_mode(); + notify_property_list_changed(); } BackBufferCopy::CopyMode BackBufferCopy::get_copy_mode() const { return copy_mode; } +void BackBufferCopy::_validate_property(PropertyInfo &p_property) const { + if (copy_mode != COPY_MODE_RECT && p_property.name == "rect") { + p_property.usage = PROPERTY_USAGE_NO_EDITOR; + } +} + void BackBufferCopy::_bind_methods() { ClassDB::bind_method(D_METHOD("set_rect", "rect"), &BackBufferCopy::set_rect); ClassDB::bind_method(D_METHOD("get_rect"), &BackBufferCopy::get_rect); diff --git a/scene/2d/back_buffer_copy.h b/scene/2d/back_buffer_copy.h index 1f2d5810b0..caacbc83c6 100644 --- a/scene/2d/back_buffer_copy.h +++ b/scene/2d/back_buffer_copy.h @@ -51,6 +51,7 @@ private: protected: static void _bind_methods(); + void _validate_property(PropertyInfo &p_property) const; public: #ifdef TOOLS_ENABLED diff --git a/scene/2d/camera_2d.cpp b/scene/2d/camera_2d.cpp index 4b31bbddac..229625ad6d 100644 --- a/scene/2d/camera_2d.cpp +++ b/scene/2d/camera_2d.cpp @@ -39,8 +39,11 @@ void Camera2D::_update_scroll() { } if (Engine::get_singleton()->is_editor_hint()) { - queue_redraw(); //will just be drawn - return; + queue_redraw(); + // Only set viewport transform when not bound to the main viewport. + if (get_viewport() == get_tree()->get_edited_scene_root()->get_viewport()) { + return; + } } if (!viewport) { diff --git a/scene/2d/canvas_group.cpp b/scene/2d/canvas_group.cpp index d4182f85a7..0ada703837 100644 --- a/scene/2d/canvas_group.cpp +++ b/scene/2d/canvas_group.cpp @@ -47,7 +47,7 @@ void CanvasGroup::set_clear_margin(real_t p_clear_margin) { ERR_FAIL_COND(p_clear_margin < 0.0); clear_margin = p_clear_margin; - RS::get_singleton()->canvas_item_set_canvas_group_mode(get_canvas_item(), RS::CANVAS_GROUP_MODE_TRANSPARENT, clear_margin, true, clear_margin, use_mipmaps); + RS::get_singleton()->canvas_item_set_canvas_group_mode(get_canvas_item(), RS::CANVAS_GROUP_MODE_TRANSPARENT, clear_margin, true, fit_margin, use_mipmaps); queue_redraw(); } diff --git a/scene/2d/gpu_particles_2d.cpp b/scene/2d/gpu_particles_2d.cpp index c8f5d7f5a6..ccbc080768 100644 --- a/scene/2d/gpu_particles_2d.cpp +++ b/scene/2d/gpu_particles_2d.cpp @@ -625,6 +625,8 @@ void GPUParticles2D::_bind_methods() { ADD_PROPERTY_DEFAULT("emitting", true); // Workaround for doctool in headless mode, as dummy rasterizer always returns false. ADD_PROPERTY(PropertyInfo(Variant::INT, "amount", PROPERTY_HINT_RANGE, "1,1000000,1,exp"), "set_amount", "get_amount"); ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "sub_emitter", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "GPUParticles2D"), "set_sub_emitter", "get_sub_emitter"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "process_material", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial,ParticleProcessMaterial"), "set_process_material", "get_process_material"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_texture", "get_texture"); ADD_GROUP("Time", ""); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "lifetime", PROPERTY_HINT_RANGE, "0.01,600.0,0.01,or_greater,suffix:s"), "set_lifetime", "get_lifetime"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "one_shot"), "set_one_shot", "get_one_shot"); @@ -646,10 +648,6 @@ void GPUParticles2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "trail_lifetime", PROPERTY_HINT_RANGE, "0.01,10,0.01,or_greater,suffix:s"), "set_trail_lifetime", "get_trail_lifetime"); ADD_PROPERTY(PropertyInfo(Variant::INT, "trail_sections", PROPERTY_HINT_RANGE, "2,128,1"), "set_trail_sections", "get_trail_sections"); ADD_PROPERTY(PropertyInfo(Variant::INT, "trail_section_subdivisions", PROPERTY_HINT_RANGE, "1,1024,1"), "set_trail_section_subdivisions", "get_trail_section_subdivisions"); - ADD_GROUP("Process Material", "process_"); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "process_material", PROPERTY_HINT_RESOURCE_TYPE, "ShaderMaterial,ParticleProcessMaterial"), "set_process_material", "get_process_material"); - ADD_GROUP("Textures", ""); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "texture", PROPERTY_HINT_RESOURCE_TYPE, "Texture2D"), "set_texture", "get_texture"); BIND_ENUM_CONSTANT(DRAW_ORDER_INDEX); BIND_ENUM_CONSTANT(DRAW_ORDER_LIFETIME); diff --git a/scene/2d/joint_2d.cpp b/scene/2d/joint_2d.cpp index 8de4c281f4..3ec744ff8e 100644 --- a/scene/2d/joint_2d.cpp +++ b/scene/2d/joint_2d.cpp @@ -112,7 +112,7 @@ void Joint2D::_update_joint(bool p_only_free) { ERR_FAIL_COND_MSG(!joint.is_valid(), "Failed to configure the joint."); - PhysicsServer2D::get_singleton()->get_singleton()->joint_set_param(joint, PhysicsServer2D::JOINT_PARAM_BIAS, bias); + PhysicsServer2D::get_singleton()->joint_set_param(joint, PhysicsServer2D::JOINT_PARAM_BIAS, bias); ba = body_a->get_rid(); bb = body_b->get_rid(); @@ -188,7 +188,7 @@ void Joint2D::_notification(int p_what) { void Joint2D::set_bias(real_t p_bias) { bias = p_bias; if (joint.is_valid()) { - PhysicsServer2D::get_singleton()->get_singleton()->joint_set_param(joint, PhysicsServer2D::JOINT_PARAM_BIAS, bias); + PhysicsServer2D::get_singleton()->joint_set_param(joint, PhysicsServer2D::JOINT_PARAM_BIAS, bias); } } diff --git a/scene/2d/multimesh_instance_2d.cpp b/scene/2d/multimesh_instance_2d.cpp index 68d529fd32..fa72fc5b8b 100644 --- a/scene/2d/multimesh_instance_2d.cpp +++ b/scene/2d/multimesh_instance_2d.cpp @@ -30,6 +30,7 @@ #include "multimesh_instance_2d.h" +#include "core/core_string_names.h" #include "scene/scene_string_names.h" void MultiMeshInstance2D::_notification(int p_what) { @@ -60,7 +61,16 @@ void MultiMeshInstance2D::_bind_methods() { } void MultiMeshInstance2D::set_multimesh(const Ref<MultiMesh> &p_multimesh) { + // Cleanup previous connection if any. + if (multimesh.is_valid()) { + multimesh->disconnect(CoreStringNames::get_singleton()->changed, callable_mp((CanvasItem *)this, &CanvasItem::queue_redraw)); + } multimesh = p_multimesh; + + // Connect to the multimesh so the AABB can update when instance transforms are changed. + if (multimesh.is_valid()) { + multimesh->connect(CoreStringNames::get_singleton()->changed, callable_mp((CanvasItem *)this, &CanvasItem::queue_redraw)); + } queue_redraw(); } diff --git a/scene/2d/navigation_agent_2d.cpp b/scene/2d/navigation_agent_2d.cpp index aa32a27c70..62afe0d89b 100644 --- a/scene/2d/navigation_agent_2d.cpp +++ b/scene/2d/navigation_agent_2d.cpp @@ -70,6 +70,9 @@ void NavigationAgent2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_navigation_layer_value", "layer_number", "value"), &NavigationAgent2D::set_navigation_layer_value); ClassDB::bind_method(D_METHOD("get_navigation_layer_value", "layer_number"), &NavigationAgent2D::get_navigation_layer_value); + ClassDB::bind_method(D_METHOD("set_path_metadata_flags", "flags"), &NavigationAgent2D::set_path_metadata_flags); + ClassDB::bind_method(D_METHOD("get_path_metadata_flags"), &NavigationAgent2D::get_path_metadata_flags); + ClassDB::bind_method(D_METHOD("set_navigation_map", "navigation_map"), &NavigationAgent2D::set_navigation_map); ClassDB::bind_method(D_METHOD("get_navigation_map"), &NavigationAgent2D::get_navigation_map); @@ -79,8 +82,9 @@ void NavigationAgent2D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_next_location"), &NavigationAgent2D::get_next_location); ClassDB::bind_method(D_METHOD("distance_to_target"), &NavigationAgent2D::distance_to_target); ClassDB::bind_method(D_METHOD("set_velocity", "velocity"), &NavigationAgent2D::set_velocity); - ClassDB::bind_method(D_METHOD("get_nav_path"), &NavigationAgent2D::get_nav_path); - ClassDB::bind_method(D_METHOD("get_nav_path_index"), &NavigationAgent2D::get_nav_path_index); + ClassDB::bind_method(D_METHOD("get_current_navigation_result"), &NavigationAgent2D::get_current_navigation_result); + ClassDB::bind_method(D_METHOD("get_current_navigation_path"), &NavigationAgent2D::get_current_navigation_path); + ClassDB::bind_method(D_METHOD("get_current_navigation_path_index"), &NavigationAgent2D::get_current_navigation_path_index); ClassDB::bind_method(D_METHOD("is_target_reached"), &NavigationAgent2D::is_target_reached); ClassDB::bind_method(D_METHOD("is_target_reachable"), &NavigationAgent2D::is_target_reachable); ClassDB::bind_method(D_METHOD("is_navigation_finished"), &NavigationAgent2D::is_navigation_finished); @@ -94,6 +98,7 @@ void NavigationAgent2D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "target_desired_distance", PROPERTY_HINT_RANGE, "0.1,100,0.01,suffix:px"), "set_target_desired_distance", "get_target_desired_distance"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "path_max_distance", PROPERTY_HINT_RANGE, "10,100,1,suffix:px"), "set_path_max_distance", "get_path_max_distance"); ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_2D_NAVIGATION), "set_navigation_layers", "get_navigation_layers"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "path_metadata_flags", PROPERTY_HINT_FLAGS, "Include Types,Include RIDs,Include Owners"), "set_path_metadata_flags", "get_path_metadata_flags"); ADD_GROUP("Avoidance", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "avoidance_enabled"), "set_avoidance_enabled", "get_avoidance_enabled"); @@ -105,6 +110,8 @@ void NavigationAgent2D::_bind_methods() { ADD_SIGNAL(MethodInfo("path_changed")); ADD_SIGNAL(MethodInfo("target_reached")); + ADD_SIGNAL(MethodInfo("waypoint_reached", PropertyInfo(Variant::DICTIONARY, "details"))); + ADD_SIGNAL(MethodInfo("link_reached", PropertyInfo(Variant::DICTIONARY, "details"))); ADD_SIGNAL(MethodInfo("navigation_finished")); ADD_SIGNAL(MethodInfo("velocity_computed", PropertyInfo(Variant::VECTOR2, "safe_velocity"))); } @@ -197,9 +204,9 @@ NavigationAgent2D::~NavigationAgent2D() { void NavigationAgent2D::set_avoidance_enabled(bool p_enabled) { avoidance_enabled = p_enabled; if (avoidance_enabled) { - NavigationServer2D::get_singleton()->agent_set_callback(agent, this, "_avoidance_done"); + NavigationServer2D::get_singleton()->agent_set_callback(agent, get_instance_id(), "_avoidance_done"); } else { - NavigationServer2D::get_singleton()->agent_set_callback(agent, nullptr, "_avoidance_done"); + NavigationServer2D::get_singleton()->agent_set_callback(agent, ObjectID(), "_avoidance_done"); } } @@ -209,7 +216,7 @@ bool NavigationAgent2D::get_avoidance_enabled() const { void NavigationAgent2D::set_agent_parent(Node *p_agent_parent) { // remove agent from any avoidance map before changing parent or there will be leftovers on the RVO map - NavigationServer2D::get_singleton()->agent_set_callback(agent, nullptr, "_avoidance_done"); + NavigationServer2D::get_singleton()->agent_set_callback(agent, ObjectID(), "_avoidance_done"); if (Object::cast_to<Node2D>(p_agent_parent) != nullptr) { // place agent on navigation map first or else the RVO agent callback creation fails silently later agent_parent = Object::cast_to<Node2D>(p_agent_parent); @@ -256,6 +263,14 @@ bool NavigationAgent2D::get_navigation_layer_value(int p_layer_number) const { return get_navigation_layers() & (1 << (p_layer_number - 1)); } +void NavigationAgent2D::set_path_metadata_flags(BitField<NavigationPathQueryParameters2D::PathMetadataFlags> p_path_metadata_flags) { + if (path_metadata_flags == p_path_metadata_flags) { + return; + } + + path_metadata_flags = p_path_metadata_flags; +} + void NavigationAgent2D::set_navigation_map(RID p_navigation_map) { map_override = p_navigation_map; NavigationServer2D::get_singleton()->agent_set_map(agent, map_override); @@ -330,14 +345,10 @@ Vector2 NavigationAgent2D::get_next_location() { ERR_FAIL_COND_V_MSG(agent_parent == nullptr, Vector2(), "The agent has no parent."); return agent_parent->get_global_position(); } else { - return navigation_path[nav_path_index]; + return navigation_path[navigation_path_index]; } } -const Vector<Vector2> &NavigationAgent2D::get_nav_path() const { - return navigation_result->get_path(); -} - real_t NavigationAgent2D::distance_to_target() const { ERR_FAIL_COND_V_MSG(agent_parent == nullptr, 0.0, "The agent has no parent."); return agent_parent->get_global_position().distance_to(target_location); @@ -422,12 +433,12 @@ void NavigationAgent2D::update_navigation() { reload_path = true; } else { // Check if too far from the navigation path - if (nav_path_index > 0) { + if (navigation_path_index > 0) { const Vector<Vector2> &navigation_path = navigation_result->get_path(); Vector2 segment[2]; - segment[0] = navigation_path[nav_path_index - 1]; - segment[1] = navigation_path[nav_path_index]; + segment[0] = navigation_path[navigation_path_index - 1]; + segment[1] = navigation_path[navigation_path_index]; Vector2 p = Geometry2D::get_closest_point_to_segment(origin, segment); if (origin.distance_to(p) >= path_max_distance) { // To faraway, reload path @@ -440,6 +451,7 @@ void NavigationAgent2D::update_navigation() { navigation_query->set_start_position(origin); navigation_query->set_target_position(target_location); navigation_query->set_navigation_layers(navigation_layers); + navigation_query->set_metadata_flags(path_metadata_flags); if (map_override.is_valid()) { navigation_query->set_map(map_override); @@ -449,7 +461,7 @@ void NavigationAgent2D::update_navigation() { NavigationServer2D::get_singleton()->query_path(navigation_query, navigation_result); navigation_finished = false; - nav_path_index = 0; + navigation_path_index = 0; emit_signal(SNAME("path_changed")); } @@ -461,11 +473,55 @@ void NavigationAgent2D::update_navigation() { if (navigation_finished == false) { // Advances to the next far away location. const Vector<Vector2> &navigation_path = navigation_result->get_path(); - while (origin.distance_to(navigation_path[nav_path_index]) < path_desired_distance) { - nav_path_index += 1; - if (nav_path_index == navigation_path.size()) { + const Vector<int32_t> &navigation_path_types = navigation_result->get_path_types(); + const TypedArray<RID> &navigation_path_rids = navigation_result->get_path_rids(); + const Vector<int64_t> &navigation_path_owners = navigation_result->get_path_owner_ids(); + + while (origin.distance_to(navigation_path[navigation_path_index]) < path_desired_distance) { + Dictionary details; + + const Vector2 waypoint = navigation_path[navigation_path_index]; + details[SNAME("location")] = waypoint; + + int waypoint_type = -1; + if (path_metadata_flags.has_flag(NavigationPathQueryParameters2D::PathMetadataFlags::PATH_METADATA_INCLUDE_TYPES)) { + const NavigationPathQueryResult2D::PathSegmentType type = NavigationPathQueryResult2D::PathSegmentType(navigation_path_types[navigation_path_index]); + + details[SNAME("type")] = type; + waypoint_type = type; + } + + if (path_metadata_flags.has_flag(NavigationPathQueryParameters2D::PathMetadataFlags::PATH_METADATA_INCLUDE_RIDS)) { + details[SNAME("rid")] = navigation_path_rids[navigation_path_index]; + } + + if (path_metadata_flags.has_flag(NavigationPathQueryParameters2D::PathMetadataFlags::PATH_METADATA_INCLUDE_OWNERS)) { + const ObjectID waypoint_owner_id = ObjectID(navigation_path_owners[navigation_path_index]); + + // Get a reference to the owning object. + Object *owner = nullptr; + if (waypoint_owner_id.is_valid()) { + owner = ObjectDB::get_instance(waypoint_owner_id); + } + + details[SNAME("owner")] = owner; + } + + // Emit a signal for the waypoint + emit_signal(SNAME("waypoint_reached"), details); + + // Emit a signal if we've reached a navigation link + if (waypoint_type == NavigationPathQueryResult2D::PATH_SEGMENT_TYPE_LINK) { + emit_signal(SNAME("link_reached"), details); + } + + // Move to the next waypoint on the list + navigation_path_index += 1; + + // Check to see if we've finished our route + if (navigation_path_index == navigation_path.size()) { _check_distance_to_target(); - nav_path_index -= 1; + navigation_path_index -= 1; navigation_finished = true; target_position_submitted = false; emit_signal(SNAME("navigation_finished")); diff --git a/scene/2d/navigation_agent_2d.h b/scene/2d/navigation_agent_2d.h index 9f2d2e9ea7..439192cce7 100644 --- a/scene/2d/navigation_agent_2d.h +++ b/scene/2d/navigation_agent_2d.h @@ -32,10 +32,10 @@ #define NAVIGATION_AGENT_2D_H #include "scene/main/node.h" +#include "servers/navigation/navigation_path_query_parameters_2d.h" +#include "servers/navigation/navigation_path_query_result_2d.h" class Node2D; -class NavigationPathQueryParameters2D; -class NavigationPathQueryResult2D; class NavigationAgent2D : public Node { GDCLASS(NavigationAgent2D, Node); @@ -48,6 +48,7 @@ class NavigationAgent2D : public Node { bool avoidance_enabled = false; uint32_t navigation_layers = 1; + BitField<NavigationPathQueryParameters2D::PathMetadataFlags> path_metadata_flags = NavigationPathQueryParameters2D::PathMetadataFlags::PATH_METADATA_INCLUDE_ALL; real_t path_desired_distance = 1.0; real_t target_desired_distance = 1.0; @@ -63,7 +64,7 @@ class NavigationAgent2D : public Node { bool target_position_submitted = false; Ref<NavigationPathQueryParameters2D> navigation_query; Ref<NavigationPathQueryResult2D> navigation_result; - int nav_path_index = 0; + int navigation_path_index = 0; bool velocity_submitted = false; Vector2 prev_safe_velocity; /// The submitted target velocity @@ -96,6 +97,11 @@ public: void set_navigation_layer_value(int p_layer_number, bool p_value); bool get_navigation_layer_value(int p_layer_number) const; + void set_path_metadata_flags(BitField<NavigationPathQueryParameters2D::PathMetadataFlags> p_flags); + BitField<NavigationPathQueryParameters2D::PathMetadataFlags> get_path_metadata_flags() const { + return path_metadata_flags; + } + void set_navigation_map(RID p_navigation_map); RID get_navigation_map() const; @@ -142,10 +148,14 @@ public: Vector2 get_next_location(); - const Vector<Vector2> &get_nav_path() const; - - int get_nav_path_index() const { - return nav_path_index; + Ref<NavigationPathQueryResult2D> get_current_navigation_result() const { + return navigation_result; + } + const Vector<Vector2> &get_current_navigation_path() const { + return navigation_result->get_path(); + } + int get_current_navigation_path_index() const { + return navigation_path_index; } real_t distance_to_target() const; diff --git a/scene/2d/navigation_link_2d.cpp b/scene/2d/navigation_link_2d.cpp index 3f7e10eaea..d639e1cc89 100644 --- a/scene/2d/navigation_link_2d.cpp +++ b/scene/2d/navigation_link_2d.cpp @@ -279,6 +279,8 @@ PackedStringArray NavigationLink2D::get_configuration_warnings() const { NavigationLink2D::NavigationLink2D() { link = NavigationServer2D::get_singleton()->link_create(); + NavigationServer2D::get_singleton()->link_set_owner_id(link, get_instance_id()); + set_notify_transform(true); } diff --git a/scene/2d/navigation_region_2d.cpp b/scene/2d/navigation_region_2d.cpp index 13d371042b..675ef7c780 100644 --- a/scene/2d/navigation_region_2d.cpp +++ b/scene/2d/navigation_region_2d.cpp @@ -31,333 +31,10 @@ #include "navigation_region_2d.h" #include "core/core_string_names.h" -#include "core/math/geometry_2d.h" -#include "core/os/mutex.h" #include "scene/resources/world_2d.h" #include "servers/navigation_server_2d.h" #include "servers/navigation_server_3d.h" -#include "thirdparty/misc/polypartition.h" - -#ifdef TOOLS_ENABLED -Rect2 NavigationPolygon::_edit_get_rect() const { - if (rect_cache_dirty) { - item_rect = Rect2(); - bool first = true; - - for (int i = 0; i < outlines.size(); i++) { - const Vector<Vector2> &outline = outlines[i]; - const int outline_size = outline.size(); - if (outline_size < 3) { - continue; - } - const Vector2 *p = outline.ptr(); - for (int j = 0; j < outline_size; j++) { - if (first) { - item_rect = Rect2(p[j], Vector2(0, 0)); - first = false; - } else { - item_rect.expand_to(p[j]); - } - } - } - - rect_cache_dirty = false; - } - return item_rect; -} - -bool NavigationPolygon::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - for (int i = 0; i < outlines.size(); i++) { - const Vector<Vector2> &outline = outlines[i]; - const int outline_size = outline.size(); - if (outline_size < 3) { - continue; - } - if (Geometry2D::is_point_in_polygon(p_point, Variant(outline))) { - return true; - } - } - return false; -} -#endif - -void NavigationPolygon::set_vertices(const Vector<Vector2> &p_vertices) { - { - MutexLock lock(navmesh_generation); - navmesh.unref(); - } - vertices = p_vertices; - rect_cache_dirty = true; -} - -Vector<Vector2> NavigationPolygon::get_vertices() const { - return vertices; -} - -void NavigationPolygon::_set_polygons(const TypedArray<Vector<int32_t>> &p_array) { - { - MutexLock lock(navmesh_generation); - navmesh.unref(); - } - polygons.resize(p_array.size()); - for (int i = 0; i < p_array.size(); i++) { - polygons.write[i].indices = p_array[i]; - } -} - -TypedArray<Vector<int32_t>> NavigationPolygon::_get_polygons() const { - TypedArray<Vector<int32_t>> ret; - ret.resize(polygons.size()); - for (int i = 0; i < ret.size(); i++) { - ret[i] = polygons[i].indices; - } - - return ret; -} - -void NavigationPolygon::_set_outlines(const TypedArray<Vector<Vector2>> &p_array) { - outlines.resize(p_array.size()); - for (int i = 0; i < p_array.size(); i++) { - outlines.write[i] = p_array[i]; - } - rect_cache_dirty = true; -} - -TypedArray<Vector<Vector2>> NavigationPolygon::_get_outlines() const { - TypedArray<Vector<Vector2>> ret; - ret.resize(outlines.size()); - for (int i = 0; i < ret.size(); i++) { - ret[i] = outlines[i]; - } - - return ret; -} - -void NavigationPolygon::add_polygon(const Vector<int> &p_polygon) { - Polygon polygon; - polygon.indices = p_polygon; - polygons.push_back(polygon); - { - MutexLock lock(navmesh_generation); - navmesh.unref(); - } -} - -void NavigationPolygon::add_outline_at_index(const Vector<Vector2> &p_outline, int p_index) { - outlines.insert(p_index, p_outline); - rect_cache_dirty = true; -} - -int NavigationPolygon::get_polygon_count() const { - return polygons.size(); -} - -Vector<int> NavigationPolygon::get_polygon(int p_idx) { - ERR_FAIL_INDEX_V(p_idx, polygons.size(), Vector<int>()); - return polygons[p_idx].indices; -} - -void NavigationPolygon::clear_polygons() { - polygons.clear(); - { - MutexLock lock(navmesh_generation); - navmesh.unref(); - } -} - -Ref<NavigationMesh> NavigationPolygon::get_mesh() { - MutexLock lock(navmesh_generation); - - if (navmesh.is_null()) { - navmesh.instantiate(); - Vector<Vector3> verts; - { - verts.resize(get_vertices().size()); - Vector3 *w = verts.ptrw(); - - const Vector2 *r = get_vertices().ptr(); - - for (int i(0); i < get_vertices().size(); i++) { - w[i] = Vector3(r[i].x, 0.0, r[i].y); - } - } - navmesh->set_vertices(verts); - - for (int i(0); i < get_polygon_count(); i++) { - navmesh->add_polygon(get_polygon(i)); - } - } - - return navmesh; -} - -void NavigationPolygon::add_outline(const Vector<Vector2> &p_outline) { - outlines.push_back(p_outline); - rect_cache_dirty = true; -} - -int NavigationPolygon::get_outline_count() const { - return outlines.size(); -} - -void NavigationPolygon::set_outline(int p_idx, const Vector<Vector2> &p_outline) { - ERR_FAIL_INDEX(p_idx, outlines.size()); - outlines.write[p_idx] = p_outline; - rect_cache_dirty = true; -} - -void NavigationPolygon::remove_outline(int p_idx) { - ERR_FAIL_INDEX(p_idx, outlines.size()); - outlines.remove_at(p_idx); - rect_cache_dirty = true; -} - -Vector<Vector2> NavigationPolygon::get_outline(int p_idx) const { - ERR_FAIL_INDEX_V(p_idx, outlines.size(), Vector<Vector2>()); - return outlines[p_idx]; -} - -void NavigationPolygon::clear_outlines() { - outlines.clear(); - rect_cache_dirty = true; -} - -void NavigationPolygon::make_polygons_from_outlines() { - { - MutexLock lock(navmesh_generation); - navmesh.unref(); - } - List<TPPLPoly> in_poly, out_poly; - - Vector2 outside_point(-1e10, -1e10); - - for (int i = 0; i < outlines.size(); i++) { - Vector<Vector2> ol = outlines[i]; - int olsize = ol.size(); - if (olsize < 3) { - continue; - } - const Vector2 *r = ol.ptr(); - for (int j = 0; j < olsize; j++) { - outside_point.x = MAX(r[j].x, outside_point.x); - outside_point.y = MAX(r[j].y, outside_point.y); - } - } - - outside_point += Vector2(0.7239784, 0.819238); //avoid precision issues - - for (int i = 0; i < outlines.size(); i++) { - Vector<Vector2> ol = outlines[i]; - int olsize = ol.size(); - if (olsize < 3) { - continue; - } - const Vector2 *r = ol.ptr(); - - int interscount = 0; - //test if this is an outer outline - for (int k = 0; k < outlines.size(); k++) { - if (i == k) { - continue; //no self intersect - } - - Vector<Vector2> ol2 = outlines[k]; - int olsize2 = ol2.size(); - if (olsize2 < 3) { - continue; - } - const Vector2 *r2 = ol2.ptr(); - - for (int l = 0; l < olsize2; l++) { - if (Geometry2D::segment_intersects_segment(r[0], outside_point, r2[l], r2[(l + 1) % olsize2], nullptr)) { - interscount++; - } - } - } - - bool outer = (interscount % 2) == 0; - - TPPLPoly tp; - tp.Init(olsize); - for (int j = 0; j < olsize; j++) { - tp[j] = r[j]; - } - - if (outer) { - tp.SetOrientation(TPPL_ORIENTATION_CCW); - } else { - tp.SetOrientation(TPPL_ORIENTATION_CW); - tp.SetHole(true); - } - - in_poly.push_back(tp); - } - - TPPLPartition tpart; - if (tpart.ConvexPartition_HM(&in_poly, &out_poly) == 0) { //failed! - ERR_PRINT("NavigationPolygon: Convex partition failed! Failed to convert outlines to a valid NavigationMesh." - "\nNavigationPolygon outlines can not overlap vertices or edges inside same outline or with other outlines or have any intersections." - "\nAdd the outmost and largest outline first. To add holes inside this outline add the smaller outlines with opposite winding order."); - return; - } - - polygons.clear(); - vertices.clear(); - - HashMap<Vector2, int> points; - for (List<TPPLPoly>::Element *I = out_poly.front(); I; I = I->next()) { - TPPLPoly &tp = I->get(); - - struct Polygon p; - - for (int64_t i = 0; i < tp.GetNumPoints(); i++) { - HashMap<Vector2, int>::Iterator E = points.find(tp[i]); - if (!E) { - E = points.insert(tp[i], vertices.size()); - vertices.push_back(tp[i]); - } - p.indices.push_back(E->value); - } - - polygons.push_back(p); - } - - emit_signal(CoreStringNames::get_singleton()->changed); -} - -void NavigationPolygon::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_vertices", "vertices"), &NavigationPolygon::set_vertices); - ClassDB::bind_method(D_METHOD("get_vertices"), &NavigationPolygon::get_vertices); - - ClassDB::bind_method(D_METHOD("add_polygon", "polygon"), &NavigationPolygon::add_polygon); - ClassDB::bind_method(D_METHOD("get_polygon_count"), &NavigationPolygon::get_polygon_count); - ClassDB::bind_method(D_METHOD("get_polygon", "idx"), &NavigationPolygon::get_polygon); - ClassDB::bind_method(D_METHOD("clear_polygons"), &NavigationPolygon::clear_polygons); - ClassDB::bind_method(D_METHOD("get_mesh"), &NavigationPolygon::get_mesh); - - ClassDB::bind_method(D_METHOD("add_outline", "outline"), &NavigationPolygon::add_outline); - ClassDB::bind_method(D_METHOD("add_outline_at_index", "outline", "index"), &NavigationPolygon::add_outline_at_index); - ClassDB::bind_method(D_METHOD("get_outline_count"), &NavigationPolygon::get_outline_count); - ClassDB::bind_method(D_METHOD("set_outline", "idx", "outline"), &NavigationPolygon::set_outline); - ClassDB::bind_method(D_METHOD("get_outline", "idx"), &NavigationPolygon::get_outline); - ClassDB::bind_method(D_METHOD("remove_outline", "idx"), &NavigationPolygon::remove_outline); - ClassDB::bind_method(D_METHOD("clear_outlines"), &NavigationPolygon::clear_outlines); - ClassDB::bind_method(D_METHOD("make_polygons_from_outlines"), &NavigationPolygon::make_polygons_from_outlines); - - ClassDB::bind_method(D_METHOD("_set_polygons", "polygons"), &NavigationPolygon::_set_polygons); - ClassDB::bind_method(D_METHOD("_get_polygons"), &NavigationPolygon::_get_polygons); - - ClassDB::bind_method(D_METHOD("_set_outlines", "outlines"), &NavigationPolygon::_set_outlines); - ClassDB::bind_method(D_METHOD("_get_outlines"), &NavigationPolygon::_get_outlines); - - ADD_PROPERTY(PropertyInfo(Variant::PACKED_VECTOR2_ARRAY, "vertices", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "set_vertices", "get_vertices"); - ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "polygons", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "_set_polygons", "_get_polygons"); - ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "outlines", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "_set_outlines", "_get_outlines"); -} - -///////////////////////////// - void NavigationRegion2D::set_enabled(bool p_enabled) { if (enabled == p_enabled) { return; @@ -460,11 +137,11 @@ RID NavigationRegion2D::get_region_rid() const { #ifdef TOOLS_ENABLED Rect2 NavigationRegion2D::_edit_get_rect() const { - return navpoly.is_valid() ? navpoly->_edit_get_rect() : Rect2(); + return navigation_polygon.is_valid() ? navigation_polygon->_edit_get_rect() : Rect2(); } bool NavigationRegion2D::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { - return navpoly.is_valid() ? navpoly->_edit_is_selected_on_click(p_point, p_tolerance) : false; + return navigation_polygon.is_valid() ? navigation_polygon->_edit_is_selected_on_click(p_point, p_tolerance) : false; } #endif @@ -490,8 +167,8 @@ void NavigationRegion2D::_notification(int p_what) { case NOTIFICATION_DRAW: { #ifdef DEBUG_ENABLED - if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || NavigationServer3D::get_singleton()->get_debug_enabled()) && navpoly.is_valid()) { - Vector<Vector2> verts = navpoly->get_vertices(); + if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || NavigationServer3D::get_singleton()->get_debug_enabled()) && navigation_polygon.is_valid()) { + Vector<Vector2> verts = navigation_polygon->get_vertices(); if (verts.size() < 3) { return; } @@ -506,9 +183,9 @@ void NavigationRegion2D::_notification(int p_what) { RandomPCG rand; - for (int i = 0; i < navpoly->get_polygon_count(); i++) { + for (int i = 0; i < navigation_polygon->get_polygon_count(); i++) { // An array of vertices for this polygon. - Vector<int> polygon = navpoly->get_polygon(i); + Vector<int> polygon = navigation_polygon->get_polygon(i); Vector<Vector2> vertices; vertices.resize(polygon.size()); for (int j = 0; j < polygon.size(); j++) { @@ -549,36 +226,36 @@ void NavigationRegion2D::_notification(int p_what) { } } -void NavigationRegion2D::set_navigation_polygon(const Ref<NavigationPolygon> &p_navpoly) { - if (p_navpoly == navpoly) { +void NavigationRegion2D::set_navigation_polygon(const Ref<NavigationPolygon> &p_navigation_polygon) { + if (p_navigation_polygon == navigation_polygon) { return; } - if (navpoly.is_valid()) { - navpoly->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NavigationRegion2D::_navpoly_changed)); + if (navigation_polygon.is_valid()) { + navigation_polygon->disconnect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NavigationRegion2D::_navigation_polygon_changed)); } - navpoly = p_navpoly; - NavigationServer2D::get_singleton()->region_set_navpoly(region, p_navpoly); + navigation_polygon = p_navigation_polygon; + NavigationServer2D::get_singleton()->region_set_navigation_polygon(region, p_navigation_polygon); - if (navpoly.is_valid()) { - navpoly->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NavigationRegion2D::_navpoly_changed)); + if (navigation_polygon.is_valid()) { + navigation_polygon->connect(CoreStringNames::get_singleton()->changed, callable_mp(this, &NavigationRegion2D::_navigation_polygon_changed)); } - _navpoly_changed(); + _navigation_polygon_changed(); update_configuration_warnings(); } Ref<NavigationPolygon> NavigationRegion2D::get_navigation_polygon() const { - return navpoly; + return navigation_polygon; } -void NavigationRegion2D::_navpoly_changed() { +void NavigationRegion2D::_navigation_polygon_changed() { if (is_inside_tree() && (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_navigation_hint())) { queue_redraw(); } - if (navpoly.is_valid()) { - NavigationServer2D::get_singleton()->region_set_navpoly(region, navpoly); + if (navigation_polygon.is_valid()) { + NavigationServer2D::get_singleton()->region_set_navigation_polygon(region, navigation_polygon); } } @@ -594,7 +271,7 @@ PackedStringArray NavigationRegion2D::get_configuration_warnings() const { PackedStringArray warnings = Node2D::get_configuration_warnings(); if (is_visible_in_tree() && is_inside_tree()) { - if (!navpoly.is_valid()) { + if (!navigation_polygon.is_valid()) { warnings.push_back(RTR("A NavigationMesh resource must be set or created for this node to work. Please set a property or draw a polygon.")); } } @@ -603,7 +280,7 @@ PackedStringArray NavigationRegion2D::get_configuration_warnings() const { } void NavigationRegion2D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_navigation_polygon", "navpoly"), &NavigationRegion2D::set_navigation_polygon); + ClassDB::bind_method(D_METHOD("set_navigation_polygon", "navigation_polygon"), &NavigationRegion2D::set_navigation_polygon); ClassDB::bind_method(D_METHOD("get_navigation_polygon"), &NavigationRegion2D::get_navigation_polygon); ClassDB::bind_method(D_METHOD("set_enabled", "enabled"), &NavigationRegion2D::set_enabled); @@ -623,18 +300,39 @@ void NavigationRegion2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_travel_cost", "travel_cost"), &NavigationRegion2D::set_travel_cost); ClassDB::bind_method(D_METHOD("get_travel_cost"), &NavigationRegion2D::get_travel_cost); - ClassDB::bind_method(D_METHOD("_navpoly_changed"), &NavigationRegion2D::_navpoly_changed); + ClassDB::bind_method(D_METHOD("_navigation_polygon_changed"), &NavigationRegion2D::_navigation_polygon_changed); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "navpoly", PROPERTY_HINT_RESOURCE_TYPE, "NavigationPolygon"), "set_navigation_polygon", "get_navigation_polygon"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "navigation_polygon", PROPERTY_HINT_RESOURCE_TYPE, "NavigationPolygon"), "set_navigation_polygon", "get_navigation_polygon"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enabled"), "set_enabled", "is_enabled"); ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_2D_NAVIGATION), "set_navigation_layers", "get_navigation_layers"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "enter_cost"), "set_enter_cost", "get_enter_cost"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "travel_cost"), "set_travel_cost", "get_travel_cost"); } +#ifndef DISABLE_DEPRECATED +// Compatibility with earlier 4.0 betas. +bool NavigationRegion2D::_set(const StringName &p_name, const Variant &p_value) { + if (p_name == "navpoly") { + set_navigation_polygon(p_value); + return true; + } + return false; +} + +bool NavigationRegion2D::_get(const StringName &p_name, Variant &r_ret) const { + if (p_name == "navpoly") { + r_ret = get_navigation_polygon(); + return true; + } + return false; +} +#endif // DISABLE_DEPRECATED + NavigationRegion2D::NavigationRegion2D() { set_notify_transform(true); + region = NavigationServer2D::get_singleton()->region_create(); + NavigationServer2D::get_singleton()->region_set_owner_id(region, get_instance_id()); NavigationServer2D::get_singleton()->region_set_enter_cost(region, get_enter_cost()); NavigationServer2D::get_singleton()->region_set_travel_cost(region, get_travel_cost()); diff --git a/scene/2d/navigation_region_2d.h b/scene/2d/navigation_region_2d.h index c630e20780..45029fd95f 100644 --- a/scene/2d/navigation_region_2d.h +++ b/scene/2d/navigation_region_2d.h @@ -31,65 +31,7 @@ #ifndef NAVIGATION_REGION_2D_H #define NAVIGATION_REGION_2D_H -#include "scene/2d/node_2d.h" -#include "scene/resources/navigation_mesh.h" - -class NavigationPolygon : public Resource { - GDCLASS(NavigationPolygon, Resource); - - Vector<Vector2> vertices; - struct Polygon { - Vector<int> indices; - }; - Vector<Polygon> polygons; - Vector<Vector<Vector2>> outlines; - - mutable Rect2 item_rect; - mutable bool rect_cache_dirty = true; - - Mutex navmesh_generation; - // Navigation mesh - Ref<NavigationMesh> navmesh; - -protected: - static void _bind_methods(); - - void _set_polygons(const TypedArray<Vector<int32_t>> &p_array); - TypedArray<Vector<int32_t>> _get_polygons() const; - - void _set_outlines(const TypedArray<Vector<Vector2>> &p_array); - TypedArray<Vector<Vector2>> _get_outlines() const; - -public: -#ifdef TOOLS_ENABLED - Rect2 _edit_get_rect() const; - bool _edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const; -#endif - - void set_vertices(const Vector<Vector2> &p_vertices); - Vector<Vector2> get_vertices() const; - - void add_polygon(const Vector<int> &p_polygon); - int get_polygon_count() const; - - void add_outline(const Vector<Vector2> &p_outline); - void add_outline_at_index(const Vector<Vector2> &p_outline, int p_index); - void set_outline(int p_idx, const Vector<Vector2> &p_outline); - Vector<Vector2> get_outline(int p_idx) const; - void remove_outline(int p_idx); - int get_outline_count() const; - - void clear_outlines(); - void make_polygons_from_outlines(); - - Vector<int> get_polygon(int p_idx); - void clear_polygons(); - - Ref<NavigationMesh> get_mesh(); - - NavigationPolygon() {} - ~NavigationPolygon() {} -}; +#include "scene/resources/navigation_polygon.h" class NavigationRegion2D : public Node2D { GDCLASS(NavigationRegion2D, Node2D); @@ -99,15 +41,20 @@ class NavigationRegion2D : public Node2D { uint32_t navigation_layers = 1; real_t enter_cost = 0.0; real_t travel_cost = 1.0; - Ref<NavigationPolygon> navpoly; + Ref<NavigationPolygon> navigation_polygon; - void _navpoly_changed(); + void _navigation_polygon_changed(); void _map_changed(RID p_RID); protected: void _notification(int p_what); static void _bind_methods(); +#ifndef DISABLE_DEPRECATED + bool _set(const StringName &p_name, const Variant &p_value); + bool _get(const StringName &p_name, Variant &r_ret) const; +#endif // DISABLE_DEPRECATED + public: #ifdef TOOLS_ENABLED virtual Rect2 _edit_get_rect() const override; @@ -131,7 +78,7 @@ public: void set_travel_cost(real_t p_travel_cost); real_t get_travel_cost() const; - void set_navigation_polygon(const Ref<NavigationPolygon> &p_navpoly); + void set_navigation_polygon(const Ref<NavigationPolygon> &p_navigation_polygon); Ref<NavigationPolygon> get_navigation_polygon() const; PackedStringArray get_configuration_warnings() const override; diff --git a/scene/2d/node_2d.cpp b/scene/2d/node_2d.cpp index 4788a1b813..166bc26848 100644 --- a/scene/2d/node_2d.cpp +++ b/scene/2d/node_2d.cpp @@ -149,6 +149,10 @@ void Node2D::set_rotation(real_t p_radians) { _update_transform(); } +void Node2D::set_rotation_degrees(real_t p_degrees) { + set_rotation(Math::deg_to_rad(p_degrees)); +} + void Node2D::set_skew(real_t p_radians) { if (_xform_dirty) { const_cast<Node2D *>(this)->_update_xform_values(); @@ -187,6 +191,10 @@ real_t Node2D::get_rotation() const { return rotation; } +real_t Node2D::get_rotation_degrees() const { + return Math::rad_to_deg(get_rotation()); +} + real_t Node2D::get_skew() const { if (_xform_dirty) { const_cast<Node2D *>(this)->_update_xform_values(); @@ -259,6 +267,10 @@ real_t Node2D::get_global_rotation() const { return get_global_transform().get_rotation(); } +real_t Node2D::get_global_rotation_degrees() const { + return Math::rad_to_deg(get_global_rotation()); +} + real_t Node2D::get_global_skew() const { return get_global_transform().get_skew(); } @@ -276,6 +288,10 @@ void Node2D::set_global_rotation(const real_t p_radians) { } } +void Node2D::set_global_rotation_degrees(const real_t p_degrees) { + set_global_rotation(Math::deg_to_rad(p_degrees)); +} + void Node2D::set_global_skew(const real_t p_radians) { CanvasItem *parent = get_parent_item(); if (parent) { @@ -372,11 +388,13 @@ void Node2D::_notification(int p_notification) { void Node2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_position", "position"), &Node2D::set_position); ClassDB::bind_method(D_METHOD("set_rotation", "radians"), &Node2D::set_rotation); + ClassDB::bind_method(D_METHOD("set_rotation_degrees", "degrees"), &Node2D::set_rotation_degrees); ClassDB::bind_method(D_METHOD("set_skew", "radians"), &Node2D::set_skew); ClassDB::bind_method(D_METHOD("set_scale", "scale"), &Node2D::set_scale); ClassDB::bind_method(D_METHOD("get_position"), &Node2D::get_position); ClassDB::bind_method(D_METHOD("get_rotation"), &Node2D::get_rotation); + ClassDB::bind_method(D_METHOD("get_rotation_degrees"), &Node2D::get_rotation_degrees); ClassDB::bind_method(D_METHOD("get_skew"), &Node2D::get_skew); ClassDB::bind_method(D_METHOD("get_scale"), &Node2D::get_scale); @@ -390,7 +408,9 @@ void Node2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_global_position", "position"), &Node2D::set_global_position); ClassDB::bind_method(D_METHOD("get_global_position"), &Node2D::get_global_position); ClassDB::bind_method(D_METHOD("set_global_rotation", "radians"), &Node2D::set_global_rotation); + ClassDB::bind_method(D_METHOD("set_global_rotation_degrees", "degrees"), &Node2D::set_global_rotation_degrees); ClassDB::bind_method(D_METHOD("get_global_rotation"), &Node2D::get_global_rotation); + ClassDB::bind_method(D_METHOD("get_global_rotation_degrees"), &Node2D::get_global_rotation_degrees); ClassDB::bind_method(D_METHOD("set_global_skew", "radians"), &Node2D::set_global_skew); ClassDB::bind_method(D_METHOD("get_global_skew"), &Node2D::get_global_skew); ClassDB::bind_method(D_METHOD("set_global_scale", "scale"), &Node2D::set_global_scale); @@ -410,12 +430,14 @@ void Node2D::_bind_methods() { ADD_GROUP("Transform", ""); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "position", PROPERTY_HINT_RANGE, "-99999,99999,0.001,or_less,or_greater,hide_slider,suffix:px"), "set_position", "get_position"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "rotation", PROPERTY_HINT_RANGE, "-360,360,0.1,or_less,or_greater,radians"), "set_rotation", "get_rotation"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "rotation_degrees", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_rotation_degrees", "get_rotation_degrees"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "scale", PROPERTY_HINT_LINK), "set_scale", "get_scale"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "skew", PROPERTY_HINT_RANGE, "-89.9,89.9,0.1,radians"), "set_skew", "get_skew"); ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "transform", PROPERTY_HINT_NONE, "suffix:px", PROPERTY_USAGE_NONE), "set_transform", "get_transform"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "global_position", PROPERTY_HINT_NONE, "suffix:px", PROPERTY_USAGE_NONE), "set_global_position", "get_global_position"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "global_rotation", PROPERTY_HINT_NONE, "radians", PROPERTY_USAGE_NONE), "set_global_rotation", "get_global_rotation"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "global_rotation_degrees", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_rotation_degrees", "get_global_rotation_degrees"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "global_scale", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_scale", "get_global_scale"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "global_skew", PROPERTY_HINT_NONE, "radians", PROPERTY_USAGE_NONE), "set_global_skew", "get_global_skew"); ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM2D, "global_transform", PROPERTY_HINT_NONE, "suffix:px", PROPERTY_USAGE_NONE), "set_global_transform", "get_global_transform"); diff --git a/scene/2d/node_2d.h b/scene/2d/node_2d.h index 76707dc422..b066332dcb 100644 --- a/scene/2d/node_2d.h +++ b/scene/2d/node_2d.h @@ -73,6 +73,7 @@ public: void set_position(const Point2 &p_pos); void set_rotation(real_t p_radians); + void set_rotation_degrees(real_t p_degrees); void set_skew(real_t p_radians); void set_scale(const Size2 &p_scale); @@ -85,11 +86,13 @@ public: Point2 get_position() const; real_t get_rotation() const; + real_t get_rotation_degrees() const; real_t get_skew() const; Size2 get_scale() const; Point2 get_global_position() const; real_t get_global_rotation() const; + real_t get_global_rotation_degrees() const; real_t get_global_skew() const; Size2 get_global_scale() const; @@ -97,6 +100,7 @@ public: void set_global_transform(const Transform2D &p_transform); void set_global_position(const Point2 &p_pos); void set_global_rotation(const real_t p_radians); + void set_global_rotation_degrees(const real_t p_degrees); void set_global_skew(const real_t p_radians); void set_global_scale(const Size2 &p_scale); diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp index 0159e9f313..6ab13c9aa7 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -358,7 +358,7 @@ TileMap::TerrainConstraint::TerrainConstraint(const TileMap *p_tile_map, const V terrain = p_terrain; } -Vector2i TileMap::transform_coords_layout(Vector2i p_coords, TileSet::TileOffsetAxis p_offset_axis, TileSet::TileLayout p_from_layout, TileSet::TileLayout p_to_layout) { +Vector2i TileMap::transform_coords_layout(const Vector2i &p_coords, TileSet::TileOffsetAxis p_offset_axis, TileSet::TileLayout p_from_layout, TileSet::TileLayout p_to_layout) { // Transform to stacked layout. Vector2i output = p_coords; if (p_offset_axis == TileSet::TILE_OFFSET_AXIS_VERTICAL) { @@ -755,6 +755,7 @@ void TileMap::set_y_sort_enabled(bool p_enable) { _clear_internals(); _recreate_internals(); emit_signal(SNAME("changed")); + update_configuration_warnings(); } Vector2i TileMap::_coords_to_quadrant_coords(int p_layer, const Vector2i &p_coords) const { @@ -995,9 +996,11 @@ void TileMap::_recompute_rect_cache() { } } + bool changed = rect_cache != r_total; + rect_cache = r_total; - item_rect_changed(); + item_rect_changed(changed); rect_cache_dirty = false; #endif @@ -1089,7 +1092,7 @@ void TileMap::_rendering_update_layer(int p_layer) { /*Transform2D xform; xform.set_origin(Vector2(0, p_layer)); rs->canvas_item_set_transform(ci, xform);*/ - rs->canvas_item_set_draw_index(ci, p_layer); + rs->canvas_item_set_draw_index(ci, p_layer - (int64_t)0x80000000); layers[p_layer].canvas_item = ci; } @@ -1340,7 +1343,7 @@ void TileMap::_rendering_draw_quadrant_debug(TileMapQuadrant *p_quadrant) { } } -void TileMap::draw_tile(RID p_canvas_item, Vector2i p_position, const Ref<TileSet> p_tile_set, int p_atlas_source_id, Vector2i p_atlas_coords, int p_alternative_tile, int p_frame, Color p_modulation, const TileData *p_tile_data_override) { +void TileMap::draw_tile(RID p_canvas_item, const Vector2i &p_position, const Ref<TileSet> p_tile_set, int p_atlas_source_id, const Vector2i &p_atlas_coords, int p_alternative_tile, int p_frame, Color p_modulation, const TileData *p_tile_data_override) { ERR_FAIL_COND(!p_tile_set.is_valid()); ERR_FAIL_COND(!p_tile_set->has_source(p_atlas_source_id)); ERR_FAIL_COND(!p_tile_set->get_source(p_atlas_source_id)->has_tile(p_atlas_coords)); @@ -1725,17 +1728,18 @@ void TileMap::_navigation_update_dirty_quadrants(SelfList<TileMapQuadrant>::List q.navigation_regions[E_cell].resize(tile_set->get_navigation_layers_count()); for (int layer_index = 0; layer_index < tile_set->get_navigation_layers_count(); layer_index++) { - Ref<NavigationPolygon> navpoly; - navpoly = tile_data->get_navigation_polygon(layer_index); + Ref<NavigationPolygon> navigation_polygon; + navigation_polygon = tile_data->get_navigation_polygon(layer_index); - if (navpoly.is_valid()) { + if (navigation_polygon.is_valid()) { Transform2D tile_transform; tile_transform.set_origin(map_to_local(E_cell)); RID region = NavigationServer2D::get_singleton()->region_create(); + NavigationServer2D::get_singleton()->region_set_owner_id(region, get_instance_id()); NavigationServer2D::get_singleton()->region_set_map(region, get_world_2d()->get_navigation_map()); NavigationServer2D::get_singleton()->region_set_transform(region, tilemap_xform * tile_transform); - NavigationServer2D::get_singleton()->region_set_navpoly(region, navpoly); + NavigationServer2D::get_singleton()->region_set_navigation_polygon(region, navigation_polygon); q.navigation_regions[E_cell].write[layer_index] = region; } } @@ -1992,7 +1996,6 @@ void TileMap::set_cell(int p_layer, const Vector2i &p_coords, int p_source_id, c if ((source_id == TileSet::INVALID_SOURCE || atlas_coords == TileSetSource::INVALID_ATLAS_COORDS || alternative_tile == TileSetSource::INVALID_TILE_ALTERNATIVE) && (source_id != TileSet::INVALID_SOURCE || atlas_coords != TileSetSource::INVALID_ATLAS_COORDS || alternative_tile != TileSetSource::INVALID_TILE_ALTERNATIVE)) { - WARN_PRINT("Setting a cell as empty requires both source_id, atlas_coord and alternative_tile to be set to their respective \"invalid\" values. Values were thus changes accordingly."); source_id = TileSet::INVALID_SOURCE; atlas_coords = TileSetSource::INVALID_ATLAS_COORDS; alternative_tile = TileSetSource::INVALID_TILE_ALTERNATIVE; @@ -2183,7 +2186,7 @@ Ref<TileMapPattern> TileMap::get_pattern(int p_layer, TypedArray<Vector2i> p_coo return output; } -Vector2i TileMap::map_pattern(Vector2i p_position_in_tilemap, Vector2i p_coords_in_pattern, Ref<TileMapPattern> p_pattern) { +Vector2i TileMap::map_pattern(const Vector2i &p_position_in_tilemap, const Vector2i &p_coords_in_pattern, Ref<TileMapPattern> p_pattern) { ERR_FAIL_COND_V(p_pattern.is_null(), Vector2i()); ERR_FAIL_COND_V(!p_pattern->has_cell(p_coords_in_pattern), Vector2i()); @@ -2207,7 +2210,7 @@ Vector2i TileMap::map_pattern(Vector2i p_position_in_tilemap, Vector2i p_coords_ return output; } -void TileMap::set_pattern(int p_layer, Vector2i p_position, const Ref<TileMapPattern> p_pattern) { +void TileMap::set_pattern(int p_layer, const Vector2i &p_position, const Ref<TileMapPattern> p_pattern) { ERR_FAIL_INDEX(p_layer, (int)layers.size()); ERR_FAIL_COND(!tile_set.is_valid()); @@ -2218,7 +2221,7 @@ void TileMap::set_pattern(int p_layer, Vector2i p_position, const Ref<TileMapPat } } -TileSet::TerrainsPattern TileMap::_get_best_terrain_pattern_for_constraints(int p_terrain_set, const Vector2i &p_position, RBSet<TerrainConstraint> p_constraints, TileSet::TerrainsPattern p_current_pattern) { +TileSet::TerrainsPattern TileMap::_get_best_terrain_pattern_for_constraints(int p_terrain_set, const Vector2i &p_position, const RBSet<TerrainConstraint> &p_constraints, TileSet::TerrainsPattern p_current_pattern) { if (!tile_set.is_valid()) { return TileSet::TerrainsPattern(); } @@ -2231,7 +2234,7 @@ TileSet::TerrainsPattern TileMap::_get_best_terrain_pattern_for_constraints(int // Check the center bit constraint TerrainConstraint terrain_constraint = TerrainConstraint(this, p_position, terrain_pattern.get_terrain()); - RBSet<TerrainConstraint>::Element *in_set_constraint_element = p_constraints.find(terrain_constraint); + const RBSet<TerrainConstraint>::Element *in_set_constraint_element = p_constraints.find(terrain_constraint); if (in_set_constraint_element) { if (in_set_constraint_element->get().get_terrain() != terrain_constraint.get_terrain()) { score += in_set_constraint_element->get().get_priority(); @@ -2278,7 +2281,7 @@ TileSet::TerrainsPattern TileMap::_get_best_terrain_pattern_for_constraints(int return min_score_pattern; } -RBSet<TileMap::TerrainConstraint> TileMap::_get_terrain_constraints_from_added_pattern(Vector2i p_position, int p_terrain_set, TileSet::TerrainsPattern p_terrains_pattern) const { +RBSet<TileMap::TerrainConstraint> TileMap::_get_terrain_constraints_from_added_pattern(const Vector2i &p_position, int p_terrain_set, TileSet::TerrainsPattern p_terrains_pattern) const { if (!tile_set.is_valid()) { return RBSet<TerrainConstraint>(); } @@ -2386,7 +2389,7 @@ RBSet<TileMap::TerrainConstraint> TileMap::_get_terrain_constraints_from_painted return constraints; } -HashMap<Vector2i, TileSet::TerrainsPattern> TileMap::terrain_fill_constraints(int p_layer, const Vector<Vector2i> &p_to_replace, int p_terrain_set, const RBSet<TerrainConstraint> p_constraints) { +HashMap<Vector2i, TileSet::TerrainsPattern> TileMap::terrain_fill_constraints(int p_layer, const Vector<Vector2i> &p_to_replace, int p_terrain_set, const RBSet<TerrainConstraint> &p_constraints) { if (!tile_set.is_valid()) { return HashMap<Vector2i, TileSet::TerrainsPattern>(); } @@ -3838,7 +3841,7 @@ void TileMap::set_texture_repeat(CanvasItem::TextureRepeat p_texture_repeat) { } } -TypedArray<Vector2i> TileMap::get_surrounding_tiles(Vector2i coords) { +TypedArray<Vector2i> TileMap::get_surrounding_cells(const Vector2i &coords) { if (!tile_set.is_valid()) { return TypedArray<Vector2i>(); } @@ -3876,7 +3879,7 @@ TypedArray<Vector2i> TileMap::get_surrounding_tiles(Vector2i coords) { return around; } -void TileMap::draw_cells_outline(Control *p_control, RBSet<Vector2i> p_cells, Color p_color, Transform2D p_transform) { +void TileMap::draw_cells_outline(Control *p_control, const RBSet<Vector2i> &p_cells, Color p_color, Transform2D p_transform) { if (!tile_set.is_valid()) { return; } @@ -3901,35 +3904,26 @@ void TileMap::draw_cells_outline(Control *p_control, RBSet<Vector2i> p_cells, Co DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_SIDE, 2, 3); DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_LEFT_SIDE, 3, 0); DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_SIDE, 0, 1); + } else if (shape == TileSet::TILE_SHAPE_ISOMETRIC) { + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE, 2, 3); + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE, 1, 2); + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE, 0, 1); + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE, 3, 0); } else { if (tile_set->get_tile_offset_axis() == TileSet::TILE_OFFSET_AXIS_HORIZONTAL) { - if (shape == TileSet::TILE_SHAPE_ISOMETRIC) { - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE, 3, 4); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE, 2, 3); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE, 0, 1); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE, 5, 0); - } else { - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE, 3, 4); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE, 2, 3); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_LEFT_SIDE, 1, 2); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE, 0, 1); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE, 5, 0); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_RIGHT_SIDE, 4, 5); - } + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE, 3, 4); + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE, 2, 3); + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_LEFT_SIDE, 1, 2); + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE, 0, 1); + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE, 5, 0); + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_RIGHT_SIDE, 4, 5); } else { - if (shape == TileSet::TILE_SHAPE_ISOMETRIC) { - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE, 3, 4); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE, 5, 0); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE, 0, 1); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE, 2, 3); - } else { - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE, 3, 4); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_SIDE, 4, 5); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE, 5, 0); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE, 0, 1); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_SIDE, 1, 2); - DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE, 2, 3); - } + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_RIGHT_SIDE, 3, 4); + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_SIDE, 4, 5); + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_BOTTOM_LEFT_SIDE, 5, 0); + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_LEFT_SIDE, 0, 1); + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_SIDE, 1, 2); + DRAW_SIDE_IF_NEEDED(TileSet::CELL_NEIGHBOR_TOP_RIGHT_SIDE, 2, 3); } } } @@ -3955,6 +3949,22 @@ PackedStringArray TileMap::get_configuration_warnings() const { } } + if (tile_set.is_valid() && tile_set->get_tile_shape() == TileSet::TILE_SHAPE_ISOMETRIC) { + bool warn = !is_y_sort_enabled(); + if (!warn) { + for (int layer = 0; layer < (int)layers.size(); layer++) { + if (!layers[layer].y_sort_enabled) { + warn = true; + break; + } + } + } + + if (warn) { + warnings.push_back(RTR("Isometric TileSet will likely not look as intended without Y-sort enabled for the TileMap and all of its layers.")); + } + } + return warnings; } @@ -4012,7 +4022,7 @@ void TileMap::_bind_methods() { ClassDB::bind_method(D_METHOD("force_update", "layer"), &TileMap::force_update, DEFVAL(-1)); - ClassDB::bind_method(D_METHOD("get_surrounding_tiles", "coords"), &TileMap::get_surrounding_tiles); + ClassDB::bind_method(D_METHOD("get_surrounding_cells", "coords"), &TileMap::get_surrounding_cells); ClassDB::bind_method(D_METHOD("get_used_cells", "layer"), &TileMap::get_used_cells); ClassDB::bind_method(D_METHOD("get_used_rect"), &TileMap::get_used_rect); @@ -4051,6 +4061,7 @@ void TileMap::_tile_set_changed() { _tile_set_changed_deferred_update_needed = true; instantiated_scenes.clear(); call_deferred(SNAME("_tile_set_changed_deferred_update")); + update_configuration_warnings(); } void TileMap::_tile_set_changed_deferred_update() { @@ -4069,5 +4080,9 @@ TileMap::TileMap() { } TileMap::~TileMap() { + if (tile_set.is_valid()) { + tile_set->disconnect("changed", callable_mp(this, &TileMap::_tile_set_changed)); + } + _clear_internals(); } diff --git a/scene/2d/tile_map.h b/scene/2d/tile_map.h index 68a5d3c80b..6f71636e47 100644 --- a/scene/2d/tile_map.h +++ b/scene/2d/tile_map.h @@ -155,7 +155,7 @@ public: priority = p_priority; } - int get_priority() { + int get_priority() const { return priority; } @@ -268,8 +268,8 @@ private: void _scenes_draw_quadrant_debug(TileMapQuadrant *p_quadrant); // Terrains. - TileSet::TerrainsPattern _get_best_terrain_pattern_for_constraints(int p_terrain_set, const Vector2i &p_position, RBSet<TerrainConstraint> p_constraints, TileSet::TerrainsPattern p_current_pattern); - RBSet<TerrainConstraint> _get_terrain_constraints_from_added_pattern(Vector2i p_position, int p_terrain_set, TileSet::TerrainsPattern p_terrains_pattern) const; + TileSet::TerrainsPattern _get_best_terrain_pattern_for_constraints(int p_terrain_set, const Vector2i &p_position, const RBSet<TerrainConstraint> &p_constraints, TileSet::TerrainsPattern p_current_pattern); + RBSet<TerrainConstraint> _get_terrain_constraints_from_added_pattern(const Vector2i &p_position, int p_terrain_set, TileSet::TerrainsPattern p_terrains_pattern) const; RBSet<TerrainConstraint> _get_terrain_constraints_from_painted_cells_list(int p_layer, const RBSet<Vector2i> &p_painted, int p_terrain_set, bool p_ignore_empty_terrains) const; // Set and get tiles from data arrays. @@ -291,7 +291,7 @@ protected: static void _bind_methods(); public: - static Vector2i transform_coords_layout(Vector2i p_coords, TileSet::TileOffsetAxis p_offset_axis, TileSet::TileLayout p_from_layout, TileSet::TileLayout p_to_layout); + static Vector2i transform_coords_layout(const Vector2i &p_coords, TileSet::TileOffsetAxis p_offset_axis, TileSet::TileLayout p_from_layout, TileSet::TileLayout p_to_layout); enum { INVALID_CELL = -1 @@ -307,7 +307,7 @@ public: void set_quadrant_size(int p_size); int get_quadrant_size() const; - static void draw_tile(RID p_canvas_item, Vector2i p_position, const Ref<TileSet> p_tile_set, int p_atlas_source_id, Vector2i p_atlas_coords, int p_alternative_tile, int p_frame = -1, Color p_modulation = Color(1.0, 1.0, 1.0, 1.0), const TileData *p_tile_data_override = nullptr); + static void draw_tile(RID p_canvas_item, const Vector2i &p_position, const Ref<TileSet> p_tile_set, int p_atlas_source_id, const Vector2i &p_atlas_coords, int p_alternative_tile, int p_frame = -1, Color p_modulation = Color(1.0, 1.0, 1.0, 1.0), const TileData *p_tile_data_override = nullptr); // Layers management. int get_layers_count() const; @@ -350,11 +350,11 @@ public: // Patterns. Ref<TileMapPattern> get_pattern(int p_layer, TypedArray<Vector2i> p_coords_array); - Vector2i map_pattern(Vector2i p_position_in_tilemap, Vector2i p_coords_in_pattern, Ref<TileMapPattern> p_pattern); - void set_pattern(int p_layer, Vector2i p_position, const Ref<TileMapPattern> p_pattern); + Vector2i map_pattern(const Vector2i &p_position_in_tilemap, const Vector2i &p_coords_in_pattern, Ref<TileMapPattern> p_pattern); + void set_pattern(int p_layer, const Vector2i &p_position, const Ref<TileMapPattern> p_pattern); // Terrains. - HashMap<Vector2i, TileSet::TerrainsPattern> terrain_fill_constraints(int p_layer, const Vector<Vector2i> &p_to_replace, int p_terrain_set, const RBSet<TerrainConstraint> p_constraints); // Not exposed. + HashMap<Vector2i, TileSet::TerrainsPattern> terrain_fill_constraints(int p_layer, const Vector<Vector2i> &p_to_replace, int p_terrain_set, const RBSet<TerrainConstraint> &p_constraints); // Not exposed. HashMap<Vector2i, TileSet::TerrainsPattern> terrain_fill_connect(int p_layer, const Vector<Vector2i> &p_coords_array, int p_terrain_set, int p_terrain, bool p_ignore_empty_terrains = true); // Not exposed. HashMap<Vector2i, TileSet::TerrainsPattern> terrain_fill_path(int p_layer, const Vector<Vector2i> &p_coords_array, int p_terrain_set, int p_terrain, bool p_ignore_empty_terrains = true); // Not exposed. HashMap<Vector2i, TileSet::TerrainsPattern> terrain_fill_pattern(int p_layer, const Vector<Vector2i> &p_coords_array, int p_terrain_set, TileSet::TerrainsPattern p_terrains_pattern, bool p_ignore_empty_terrains = true); // Not exposed. @@ -400,8 +400,8 @@ public: void force_update(int p_layer = -1); // Helpers? - TypedArray<Vector2i> get_surrounding_tiles(Vector2i coords); - void draw_cells_outline(Control *p_control, RBSet<Vector2i> p_cells, Color p_color, Transform2D p_transform = Transform2D()); + TypedArray<Vector2i> get_surrounding_cells(const Vector2i &coords); + void draw_cells_outline(Control *p_control, const RBSet<Vector2i> &p_cells, Color p_color, Transform2D p_transform = Transform2D()); // Virtual function to modify the TileData at runtime GDVIRTUAL2R(bool, _use_tile_data_runtime_update, int, Vector2i); diff --git a/scene/2d/touch_screen_button.cpp b/scene/2d/touch_screen_button.cpp index a02f322ef1..11b4718802 100644 --- a/scene/2d/touch_screen_button.cpp +++ b/scene/2d/touch_screen_button.cpp @@ -100,7 +100,7 @@ void TouchScreenButton::_notification(int p_what) { if (!is_inside_tree()) { return; } - if (!Engine::get_singleton()->is_editor_hint() && !!DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id())) && visibility == VISIBILITY_TOUCHSCREEN_ONLY) { + if (!Engine::get_singleton()->is_editor_hint() && !DisplayServer::get_singleton()->is_touchscreen_available() && visibility == VISIBILITY_TOUCHSCREEN_ONLY) { return; } @@ -137,7 +137,7 @@ void TouchScreenButton::_notification(int p_what) { } break; case NOTIFICATION_ENTER_TREE: { - if (!Engine::get_singleton()->is_editor_hint() && !!DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id())) && visibility == VISIBILITY_TOUCHSCREEN_ONLY) { + if (!Engine::get_singleton()->is_editor_hint() && !DisplayServer::get_singleton()->is_touchscreen_available() && visibility == VISIBILITY_TOUCHSCREEN_ONLY) { return; } queue_redraw(); diff --git a/scene/3d/camera_3d.cpp b/scene/3d/camera_3d.cpp index 304e56326d..2a50575749 100644 --- a/scene/3d/camera_3d.cpp +++ b/scene/3d/camera_3d.cpp @@ -112,6 +112,12 @@ void Camera3D::_notification(int p_what) { if (current || first_camera) { viewport->_camera_3d_set(this); } + +#ifdef TOOLS_ENABLED + if (Engine::get_singleton()->is_editor_hint()) { + viewport->connect(SNAME("size_changed"), callable_mp((Node3D *)this, &Camera3D::update_gizmos)); + } +#endif } break; case NOTIFICATION_TRANSFORM_CHANGED: { @@ -133,6 +139,11 @@ void Camera3D::_notification(int p_what) { } if (viewport) { +#ifdef TOOLS_ENABLED + if (Engine::get_singleton()->is_editor_hint()) { + viewport->disconnect(SNAME("size_changed"), callable_mp((Node3D *)this, &Camera3D::update_gizmos)); + } +#endif viewport->_camera_3d_remove(this); viewport = nullptr; } diff --git a/scene/3d/collision_shape_3d.cpp b/scene/3d/collision_shape_3d.cpp index ef381641ab..2729dfc369 100644 --- a/scene/3d/collision_shape_3d.cpp +++ b/scene/3d/collision_shape_3d.cpp @@ -34,6 +34,7 @@ #include "physics_body_3d.h" #include "scene/resources/concave_polygon_shape_3d.h" #include "scene/resources/convex_polygon_shape_3d.h" +#include "scene/resources/world_boundary_shape_3d.h" void CollisionShape3D::make_convex_from_siblings() { Node *p = get_parent(); @@ -125,10 +126,12 @@ PackedStringArray CollisionShape3D::get_configuration_warnings() const { warnings.push_back(RTR("A shape must be provided for CollisionShape3D to function. Please create a shape resource for it.")); } - if (shape.is_valid() && - Object::cast_to<RigidBody3D>(get_parent()) && - Object::cast_to<ConcavePolygonShape3D>(*shape)) { - warnings.push_back(RTR("ConcavePolygonShape3D doesn't support RigidBody3D in another mode than static.")); + if (shape.is_valid() && Object::cast_to<RigidBody3D>(get_parent())) { + if (Object::cast_to<ConcavePolygonShape3D>(*shape)) { + warnings.push_back(RTR("ConcavePolygonShape3D doesn't support RigidBody3D in another mode than static.")); + } else if (Object::cast_to<WorldBoundaryShape3D>(*shape)) { + warnings.push_back(RTR("WorldBoundaryShape3D doesn't support RigidBody3D in another mode than static.")); + } } return warnings; diff --git a/scene/3d/mesh_instance_3d.cpp b/scene/3d/mesh_instance_3d.cpp index 88b1c340d8..16de95bfb1 100644 --- a/scene/3d/mesh_instance_3d.cpp +++ b/scene/3d/mesh_instance_3d.cpp @@ -52,7 +52,19 @@ bool MeshInstance3D::_set(const StringName &p_name, const Variant &p_value) { if (p_name.operator String().begins_with("surface_material_override/")) { int idx = p_name.operator String().get_slicec('/', 1).to_int(); - if (idx >= surface_override_materials.size() || idx < 0) { + + // This is a bit of a hack to ensure compatibility with material + // overrides that start indexing at 1. + // We assume that idx 0 is always read first, if its not, this won't work. + if (idx == 0) { + surface_index_0 = true; + } + if (!surface_index_0) { + // This means the file was created when the indexing started at 1, so decrease by one. + idx--; + } + + if (idx > surface_override_materials.size() || idx < 0) { return false; } diff --git a/scene/3d/mesh_instance_3d.h b/scene/3d/mesh_instance_3d.h index caf7d25616..e1cc5272ea 100644 --- a/scene/3d/mesh_instance_3d.h +++ b/scene/3d/mesh_instance_3d.h @@ -57,6 +57,7 @@ protected: bool _set(const StringName &p_name, const Variant &p_value); bool _get(const StringName &p_name, Variant &r_ret) const; void _get_property_list(List<PropertyInfo> *p_list) const; + bool surface_index_0 = false; void _notification(int p_what); static void _bind_methods(); diff --git a/scene/3d/navigation_agent_3d.cpp b/scene/3d/navigation_agent_3d.cpp index 1673b06bad..741f7397ad 100644 --- a/scene/3d/navigation_agent_3d.cpp +++ b/scene/3d/navigation_agent_3d.cpp @@ -74,6 +74,9 @@ void NavigationAgent3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_navigation_layer_value", "layer_number", "value"), &NavigationAgent3D::set_navigation_layer_value); ClassDB::bind_method(D_METHOD("get_navigation_layer_value", "layer_number"), &NavigationAgent3D::get_navigation_layer_value); + ClassDB::bind_method(D_METHOD("set_path_metadata_flags", "flags"), &NavigationAgent3D::set_path_metadata_flags); + ClassDB::bind_method(D_METHOD("get_path_metadata_flags"), &NavigationAgent3D::get_path_metadata_flags); + ClassDB::bind_method(D_METHOD("set_navigation_map", "navigation_map"), &NavigationAgent3D::set_navigation_map); ClassDB::bind_method(D_METHOD("get_navigation_map"), &NavigationAgent3D::get_navigation_map); @@ -83,8 +86,9 @@ void NavigationAgent3D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_next_location"), &NavigationAgent3D::get_next_location); ClassDB::bind_method(D_METHOD("distance_to_target"), &NavigationAgent3D::distance_to_target); ClassDB::bind_method(D_METHOD("set_velocity", "velocity"), &NavigationAgent3D::set_velocity); - ClassDB::bind_method(D_METHOD("get_nav_path"), &NavigationAgent3D::get_nav_path); - ClassDB::bind_method(D_METHOD("get_nav_path_index"), &NavigationAgent3D::get_nav_path_index); + ClassDB::bind_method(D_METHOD("get_current_navigation_result"), &NavigationAgent3D::get_current_navigation_result); + ClassDB::bind_method(D_METHOD("get_current_navigation_path"), &NavigationAgent3D::get_current_navigation_path); + ClassDB::bind_method(D_METHOD("get_current_navigation_path_index"), &NavigationAgent3D::get_current_navigation_path_index); ClassDB::bind_method(D_METHOD("is_target_reached"), &NavigationAgent3D::is_target_reached); ClassDB::bind_method(D_METHOD("is_target_reachable"), &NavigationAgent3D::is_target_reachable); ClassDB::bind_method(D_METHOD("is_navigation_finished"), &NavigationAgent3D::is_navigation_finished); @@ -99,6 +103,7 @@ void NavigationAgent3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "agent_height_offset", PROPERTY_HINT_RANGE, "-100.0,100,0.01,suffix:m"), "set_agent_height_offset", "get_agent_height_offset"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "path_max_distance", PROPERTY_HINT_RANGE, "0.01,100,0.1,suffix:m"), "set_path_max_distance", "get_path_max_distance"); ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_3D_NAVIGATION), "set_navigation_layers", "get_navigation_layers"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "path_metadata_flags", PROPERTY_HINT_FLAGS, "Include Types,Include RIDs,Include Owners"), "set_path_metadata_flags", "get_path_metadata_flags"); ADD_GROUP("Avoidance", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "avoidance_enabled"), "set_avoidance_enabled", "get_avoidance_enabled"); @@ -111,6 +116,8 @@ void NavigationAgent3D::_bind_methods() { ADD_SIGNAL(MethodInfo("path_changed")); ADD_SIGNAL(MethodInfo("target_reached")); + ADD_SIGNAL(MethodInfo("waypoint_reached", PropertyInfo(Variant::DICTIONARY, "details"))); + ADD_SIGNAL(MethodInfo("link_reached", PropertyInfo(Variant::DICTIONARY, "details"))); ADD_SIGNAL(MethodInfo("navigation_finished")); ADD_SIGNAL(MethodInfo("velocity_computed", PropertyInfo(Variant::VECTOR3, "safe_velocity"))); } @@ -204,9 +211,9 @@ NavigationAgent3D::~NavigationAgent3D() { void NavigationAgent3D::set_avoidance_enabled(bool p_enabled) { avoidance_enabled = p_enabled; if (avoidance_enabled) { - NavigationServer3D::get_singleton()->agent_set_callback(agent, this, "_avoidance_done"); + NavigationServer3D::get_singleton()->agent_set_callback(agent, get_instance_id(), "_avoidance_done"); } else { - NavigationServer3D::get_singleton()->agent_set_callback(agent, nullptr, "_avoidance_done"); + NavigationServer3D::get_singleton()->agent_set_callback(agent, ObjectID(), "_avoidance_done"); } } @@ -216,7 +223,7 @@ bool NavigationAgent3D::get_avoidance_enabled() const { void NavigationAgent3D::set_agent_parent(Node *p_agent_parent) { // remove agent from any avoidance map before changing parent or there will be leftovers on the RVO map - NavigationServer3D::get_singleton()->agent_set_callback(agent, nullptr, "_avoidance_done"); + NavigationServer3D::get_singleton()->agent_set_callback(agent, ObjectID(), "_avoidance_done"); if (Object::cast_to<Node3D>(p_agent_parent) != nullptr) { // place agent on navigation map first or else the RVO agent callback creation fails silently later agent_parent = Object::cast_to<Node3D>(p_agent_parent); @@ -263,6 +270,14 @@ bool NavigationAgent3D::get_navigation_layer_value(int p_layer_number) const { return get_navigation_layers() & (1 << (p_layer_number - 1)); } +void NavigationAgent3D::set_path_metadata_flags(BitField<NavigationPathQueryParameters3D::PathMetadataFlags> p_path_metadata_flags) { + if (path_metadata_flags == p_path_metadata_flags) { + return; + } + + path_metadata_flags = p_path_metadata_flags; +} + void NavigationAgent3D::set_navigation_map(RID p_navigation_map) { map_override = p_navigation_map; NavigationServer3D::get_singleton()->agent_set_map(agent, map_override); @@ -346,14 +361,10 @@ Vector3 NavigationAgent3D::get_next_location() { ERR_FAIL_COND_V_MSG(agent_parent == nullptr, Vector3(), "The agent has no parent."); return agent_parent->get_global_transform().origin; } else { - return navigation_path[nav_path_index] - Vector3(0, navigation_height_offset, 0); + return navigation_path[navigation_path_index] - Vector3(0, navigation_height_offset, 0); } } -const Vector<Vector3> &NavigationAgent3D::get_nav_path() const { - return navigation_result->get_path(); -} - real_t NavigationAgent3D::distance_to_target() const { ERR_FAIL_COND_V_MSG(agent_parent == nullptr, 0.0, "The agent has no parent."); return agent_parent->get_global_transform().origin.distance_to(target_location); @@ -437,12 +448,12 @@ void NavigationAgent3D::update_navigation() { reload_path = true; } else { // Check if too far from the navigation path - if (nav_path_index > 0) { + if (navigation_path_index > 0) { const Vector<Vector3> &navigation_path = navigation_result->get_path(); Vector3 segment[2]; - segment[0] = navigation_path[nav_path_index - 1]; - segment[1] = navigation_path[nav_path_index]; + segment[0] = navigation_path[navigation_path_index - 1]; + segment[1] = navigation_path[navigation_path_index]; segment[0].y -= navigation_height_offset; segment[1].y -= navigation_height_offset; Vector3 p = Geometry3D::get_closest_point_to_segment(origin, segment); @@ -457,6 +468,7 @@ void NavigationAgent3D::update_navigation() { navigation_query->set_start_position(origin); navigation_query->set_target_position(target_location); navigation_query->set_navigation_layers(navigation_layers); + navigation_query->set_metadata_flags(path_metadata_flags); if (map_override.is_valid()) { navigation_query->set_map(map_override); @@ -466,7 +478,7 @@ void NavigationAgent3D::update_navigation() { NavigationServer3D::get_singleton()->query_path(navigation_query, navigation_result); navigation_finished = false; - nav_path_index = 0; + navigation_path_index = 0; emit_signal(SNAME("path_changed")); } @@ -478,11 +490,55 @@ void NavigationAgent3D::update_navigation() { if (navigation_finished == false) { // Advances to the next far away location. const Vector<Vector3> &navigation_path = navigation_result->get_path(); - while (origin.distance_to(navigation_path[nav_path_index] - Vector3(0, navigation_height_offset, 0)) < path_desired_distance) { - nav_path_index += 1; - if (nav_path_index == navigation_path.size()) { + const Vector<int32_t> &navigation_path_types = navigation_result->get_path_types(); + const TypedArray<RID> &navigation_path_rids = navigation_result->get_path_rids(); + const Vector<int64_t> &navigation_path_owners = navigation_result->get_path_owner_ids(); + + while (origin.distance_to(navigation_path[navigation_path_index] - Vector3(0, navigation_height_offset, 0)) < path_desired_distance) { + Dictionary details; + + const Vector3 waypoint = navigation_path[navigation_path_index]; + details[SNAME("location")] = waypoint; + + int waypoint_type = -1; + if (path_metadata_flags.has_flag(NavigationPathQueryParameters3D::PathMetadataFlags::PATH_METADATA_INCLUDE_TYPES)) { + const NavigationPathQueryResult3D::PathSegmentType type = NavigationPathQueryResult3D::PathSegmentType(navigation_path_types[navigation_path_index]); + + details[SNAME("type")] = type; + waypoint_type = type; + } + + if (path_metadata_flags.has_flag(NavigationPathQueryParameters3D::PathMetadataFlags::PATH_METADATA_INCLUDE_RIDS)) { + details[SNAME("rid")] = navigation_path_rids[navigation_path_index]; + } + + if (path_metadata_flags.has_flag(NavigationPathQueryParameters3D::PathMetadataFlags::PATH_METADATA_INCLUDE_OWNERS)) { + const ObjectID waypoint_owner_id = ObjectID(navigation_path_owners[navigation_path_index]); + + // Get a reference to the owning object. + Object *owner = nullptr; + if (waypoint_owner_id.is_valid()) { + owner = ObjectDB::get_instance(waypoint_owner_id); + } + + details[SNAME("owner")] = owner; + } + + // Emit a signal for the waypoint + emit_signal(SNAME("waypoint_reached"), details); + + // Emit a signal if we've reached a navigation link + if (waypoint_type == NavigationPathQueryResult3D::PATH_SEGMENT_TYPE_LINK) { + emit_signal(SNAME("link_reached"), details); + } + + // Move to the next waypoint on the list + navigation_path_index += 1; + + // Check to see if we've finished our route + if (navigation_path_index == navigation_path.size()) { _check_distance_to_target(); - nav_path_index -= 1; + navigation_path_index -= 1; navigation_finished = true; target_position_submitted = false; emit_signal(SNAME("navigation_finished")); diff --git a/scene/3d/navigation_agent_3d.h b/scene/3d/navigation_agent_3d.h index 658f0e0630..cda218b538 100644 --- a/scene/3d/navigation_agent_3d.h +++ b/scene/3d/navigation_agent_3d.h @@ -32,10 +32,10 @@ #define NAVIGATION_AGENT_3D_H #include "scene/main/node.h" +#include "servers/navigation/navigation_path_query_parameters_3d.h" +#include "servers/navigation/navigation_path_query_result_3d.h" class Node3D; -class NavigationPathQueryParameters3D; -class NavigationPathQueryResult3D; class NavigationAgent3D : public Node { GDCLASS(NavigationAgent3D, Node); @@ -48,6 +48,7 @@ class NavigationAgent3D : public Node { bool avoidance_enabled = false; uint32_t navigation_layers = 1; + BitField<NavigationPathQueryParameters3D::PathMetadataFlags> path_metadata_flags = NavigationPathQueryParameters3D::PathMetadataFlags::PATH_METADATA_INCLUDE_ALL; real_t path_desired_distance = 1.0; real_t target_desired_distance = 1.0; @@ -65,7 +66,7 @@ class NavigationAgent3D : public Node { bool target_position_submitted = false; Ref<NavigationPathQueryParameters3D> navigation_query; Ref<NavigationPathQueryResult3D> navigation_result; - int nav_path_index = 0; + int navigation_path_index = 0; bool velocity_submitted = false; Vector3 prev_safe_velocity; /// The submitted target velocity @@ -98,6 +99,11 @@ public: void set_navigation_layer_value(int p_layer_number, bool p_value); bool get_navigation_layer_value(int p_layer_number) const; + void set_path_metadata_flags(BitField<NavigationPathQueryParameters3D::PathMetadataFlags> p_flags); + BitField<NavigationPathQueryParameters3D::PathMetadataFlags> get_path_metadata_flags() const { + return path_metadata_flags; + } + void set_navigation_map(RID p_navigation_map); RID get_navigation_map() const; @@ -154,10 +160,14 @@ public: Vector3 get_next_location(); - const Vector<Vector3> &get_nav_path() const; - - int get_nav_path_index() const { - return nav_path_index; + Ref<NavigationPathQueryResult3D> get_current_navigation_result() const { + return navigation_result; + } + const Vector<Vector3> &get_current_navigation_path() const { + return navigation_result->get_path(); + } + int get_current_navigation_path_index() const { + return navigation_path_index; } real_t distance_to_target() const; diff --git a/scene/3d/navigation_link_3d.cpp b/scene/3d/navigation_link_3d.cpp index 78fe4754ea..bee7c7f39b 100644 --- a/scene/3d/navigation_link_3d.cpp +++ b/scene/3d/navigation_link_3d.cpp @@ -221,6 +221,8 @@ void NavigationLink3D::_notification(int p_what) { NavigationLink3D::NavigationLink3D() { link = NavigationServer3D::get_singleton()->link_create(); + NavigationServer3D::get_singleton()->link_set_owner_id(link, get_instance_id()); + set_notify_transform(true); } diff --git a/scene/3d/navigation_region_3d.cpp b/scene/3d/navigation_region_3d.cpp index 06182d921c..86b78f847e 100644 --- a/scene/3d/navigation_region_3d.cpp +++ b/scene/3d/navigation_region_3d.cpp @@ -192,26 +192,26 @@ void NavigationRegion3D::_notification(int p_what) { } } -void NavigationRegion3D::set_navigation_mesh(const Ref<NavigationMesh> &p_navmesh) { - if (p_navmesh == navmesh) { +void NavigationRegion3D::set_navigation_mesh(const Ref<NavigationMesh> &p_navigation_mesh) { + if (p_navigation_mesh == navigation_mesh) { return; } - if (navmesh.is_valid()) { - navmesh->disconnect("changed", callable_mp(this, &NavigationRegion3D::_navigation_changed)); + if (navigation_mesh.is_valid()) { + navigation_mesh->disconnect("changed", callable_mp(this, &NavigationRegion3D::_navigation_changed)); } - navmesh = p_navmesh; + navigation_mesh = p_navigation_mesh; - if (navmesh.is_valid()) { - navmesh->connect("changed", callable_mp(this, &NavigationRegion3D::_navigation_changed)); + if (navigation_mesh.is_valid()) { + navigation_mesh->connect("changed", callable_mp(this, &NavigationRegion3D::_navigation_changed)); } - NavigationServer3D::get_singleton()->region_set_navmesh(region, p_navmesh); + NavigationServer3D::get_singleton()->region_set_navigation_mesh(region, p_navigation_mesh); #ifdef DEBUG_ENABLED if (is_inside_tree() && NavigationServer3D::get_singleton()->get_debug_enabled()) { - if (navmesh.is_valid()) { + if (navigation_mesh.is_valid()) { _update_debug_mesh(); _update_debug_edge_connections_mesh(); } else { @@ -232,7 +232,7 @@ void NavigationRegion3D::set_navigation_mesh(const Ref<NavigationMesh> &p_navmes } Ref<NavigationMesh> NavigationRegion3D::get_navigation_mesh() const { - return navmesh; + return navigation_mesh; } struct BakeThreadsArgs { @@ -245,7 +245,7 @@ void _bake_navigation_mesh(void *p_user_data) { if (args->nav_region->get_navigation_mesh().is_valid()) { Ref<NavigationMesh> nav_mesh = args->nav_region->get_navigation_mesh()->duplicate(); - NavigationServer3D::get_singleton()->region_bake_navmesh(nav_mesh, args->nav_region); + NavigationServer3D::get_singleton()->region_bake_navigation_mesh(nav_mesh, args->nav_region); args->nav_region->call_deferred(SNAME("_bake_finished"), nav_mesh); memdelete(args); } else { @@ -278,7 +278,7 @@ PackedStringArray NavigationRegion3D::get_configuration_warnings() const { PackedStringArray warnings = Node::get_configuration_warnings(); if (is_visible_in_tree() && is_inside_tree()) { - if (!navmesh.is_valid()) { + if (!navigation_mesh.is_valid()) { warnings.push_back(RTR("A NavigationMesh resource must be set or created for this node to work.")); } } @@ -287,7 +287,7 @@ PackedStringArray NavigationRegion3D::get_configuration_warnings() const { } void NavigationRegion3D::_bind_methods() { - ClassDB::bind_method(D_METHOD("set_navigation_mesh", "navmesh"), &NavigationRegion3D::set_navigation_mesh); + ClassDB::bind_method(D_METHOD("set_navigation_mesh", "navigation_mesh"), &NavigationRegion3D::set_navigation_mesh); ClassDB::bind_method(D_METHOD("get_navigation_mesh"), &NavigationRegion3D::get_navigation_mesh); ClassDB::bind_method(D_METHOD("set_enabled", "enabled"), &NavigationRegion3D::set_enabled); @@ -308,9 +308,9 @@ void NavigationRegion3D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_travel_cost"), &NavigationRegion3D::get_travel_cost); ClassDB::bind_method(D_METHOD("bake_navigation_mesh", "on_thread"), &NavigationRegion3D::bake_navigation_mesh, DEFVAL(true)); - ClassDB::bind_method(D_METHOD("_bake_finished", "nav_mesh"), &NavigationRegion3D::_bake_finished); + ClassDB::bind_method(D_METHOD("_bake_finished", "navigation_mesh"), &NavigationRegion3D::_bake_finished); - ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "navmesh", PROPERTY_HINT_RESOURCE_TYPE, "NavigationMesh"), "set_navigation_mesh", "get_navigation_mesh"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "navigation_mesh", PROPERTY_HINT_RESOURCE_TYPE, "NavigationMesh"), "set_navigation_mesh", "get_navigation_mesh"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "enabled"), "set_enabled", "is_enabled"); ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_3D_NAVIGATION), "set_navigation_layers", "get_navigation_layers"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "enter_cost"), "set_enter_cost", "get_enter_cost"); @@ -320,6 +320,25 @@ void NavigationRegion3D::_bind_methods() { ADD_SIGNAL(MethodInfo("bake_finished")); } +#ifndef DISABLE_DEPRECATED +// Compatibility with earlier 4.0 betas. +bool NavigationRegion3D::_set(const StringName &p_name, const Variant &p_value) { + if (p_name == "navmesh") { + set_navigation_mesh(p_value); + return true; + } + return false; +} + +bool NavigationRegion3D::_get(const StringName &p_name, Variant &r_ret) const { + if (p_name == "navmesh") { + r_ret = get_navigation_mesh(); + return true; + } + return false; +} +#endif // DISABLE_DEPRECATED + void NavigationRegion3D::_navigation_changed() { update_gizmos(); update_configuration_warnings(); @@ -339,7 +358,9 @@ void NavigationRegion3D::_navigation_map_changed(RID p_map) { NavigationRegion3D::NavigationRegion3D() { set_notify_transform(true); + region = NavigationServer3D::get_singleton()->region_create(); + NavigationServer3D::get_singleton()->region_set_owner_id(region, get_instance_id()); NavigationServer3D::get_singleton()->region_set_enter_cost(region, get_enter_cost()); NavigationServer3D::get_singleton()->region_set_travel_cost(region, get_travel_cost()); @@ -351,8 +372,8 @@ NavigationRegion3D::NavigationRegion3D() { } NavigationRegion3D::~NavigationRegion3D() { - if (navmesh.is_valid()) { - navmesh->disconnect("changed", callable_mp(this, &NavigationRegion3D::_navigation_changed)); + if (navigation_mesh.is_valid()) { + navigation_mesh->disconnect("changed", callable_mp(this, &NavigationRegion3D::_navigation_changed)); } NavigationServer3D::get_singleton()->free(region); @@ -390,7 +411,7 @@ void NavigationRegion3D::_update_debug_mesh() { return; } - if (!navmesh.is_valid()) { + if (!navigation_mesh.is_valid()) { if (debug_instance.is_valid()) { RS::get_singleton()->instance_set_visible(debug_instance, false); } @@ -410,12 +431,12 @@ void NavigationRegion3D::_update_debug_mesh() { bool enabled_geometry_face_random_color = NavigationServer3D::get_singleton()->get_debug_navigation_enable_geometry_face_random_color(); bool enabled_edge_lines = NavigationServer3D::get_singleton()->get_debug_navigation_enable_edge_lines(); - Vector<Vector3> vertices = navmesh->get_vertices(); + Vector<Vector3> vertices = navigation_mesh->get_vertices(); if (vertices.size() == 0) { return; } - int polygon_count = navmesh->get_polygon_count(); + int polygon_count = navigation_mesh->get_polygon_count(); if (polygon_count == 0) { return; } @@ -448,7 +469,7 @@ void NavigationRegion3D::_update_debug_mesh() { polygon_color.a = debug_navigation_geometry_face_color.a; } - Vector<int> polygon = navmesh->get_polygon(i); + Vector<int> polygon = navigation_mesh->get_polygon(i); face_vertex_array.push_back(vertices[polygon[0]]); face_vertex_array.push_back(vertices[polygon[1]]); @@ -526,7 +547,7 @@ void NavigationRegion3D::_update_debug_edge_connections_mesh() { return; } - if (!navmesh.is_valid()) { + if (!navigation_mesh.is_valid()) { if (debug_edge_connections_instance.is_valid()) { RS::get_singleton()->instance_set_visible(debug_edge_connections_instance, false); } diff --git a/scene/3d/navigation_region_3d.h b/scene/3d/navigation_region_3d.h index 660538d314..811c0885a1 100644 --- a/scene/3d/navigation_region_3d.h +++ b/scene/3d/navigation_region_3d.h @@ -42,7 +42,7 @@ class NavigationRegion3D : public Node3D { uint32_t navigation_layers = 1; real_t enter_cost = 0.0; real_t travel_cost = 1.0; - Ref<NavigationMesh> navmesh; + Ref<NavigationMesh> navigation_mesh; Thread bake_thread; @@ -64,6 +64,11 @@ protected: void _notification(int p_what); static void _bind_methods(); +#ifndef DISABLE_DEPRECATED + bool _set(const StringName &p_name, const Variant &p_value); + bool _get(const StringName &p_name, Variant &r_ret) const; +#endif // DISABLE_DEPRECATED + public: void set_enabled(bool p_enabled); bool is_enabled() const; @@ -82,13 +87,13 @@ public: void set_travel_cost(real_t p_travel_cost); real_t get_travel_cost() const; - void set_navigation_mesh(const Ref<NavigationMesh> &p_navmesh); + void set_navigation_mesh(const Ref<NavigationMesh> &p_navigation_mesh); Ref<NavigationMesh> get_navigation_mesh() const; /// Bakes the navigation mesh; once done, automatically /// sets the new navigation mesh and emits a signal void bake_navigation_mesh(bool p_on_thread); - void _bake_finished(Ref<NavigationMesh> p_nav_mesh); + void _bake_finished(Ref<NavigationMesh> p_navigation_mesh); PackedStringArray get_configuration_warnings() const override; diff --git a/scene/3d/node_3d.cpp b/scene/3d/node_3d.cpp index 1327bdd6e9..32bbea8ff3 100644 --- a/scene/3d/node_3d.cpp +++ b/scene/3d/node_3d.cpp @@ -188,7 +188,7 @@ void Node3D::_notification(int p_what) { #ifdef TOOLS_ENABLED if (Engine::get_singleton()->is_editor_hint() && get_tree()->is_node_being_edited(this)) { - get_tree()->call_group_flags(SceneTree::GROUP_CALL_DEFERRED, SceneStringNames::get_singleton()->_spatial_editor_group, SceneStringNames::get_singleton()->_request_gizmo, this); + get_tree()->call_group_flags(SceneTree::GROUP_CALL_DEFERRED, SceneStringNames::get_singleton()->_spatial_editor_group, SNAME("_request_gizmo_for_id"), get_instance_id()); } #endif } break; @@ -251,12 +251,22 @@ Vector3 Node3D::get_global_rotation() const { return get_global_transform().get_basis().get_euler(); } +Vector3 Node3D::get_global_rotation_degrees() const { + Vector3 radians = get_global_rotation(); + return Vector3(Math::rad_to_deg(radians.x), Math::rad_to_deg(radians.y), Math::rad_to_deg(radians.z)); +} + void Node3D::set_global_rotation(const Vector3 &p_euler_rad) { Transform3D transform = get_global_transform(); transform.basis = Basis::from_euler(p_euler_rad); set_global_transform(transform); } +void Node3D::set_global_rotation_degrees(const Vector3 &p_euler_degrees) { + Vector3 radians(Math::deg_to_rad(p_euler_degrees.x), Math::deg_to_rad(p_euler_degrees.y), Math::deg_to_rad(p_euler_degrees.z)); + set_global_rotation(radians); +} + void Node3D::set_transform(const Transform3D &p_transform) { data.local_transform = p_transform; data.dirty = DIRTY_EULER_ROTATION_AND_SCALE; // Make rot/scale dirty. @@ -440,6 +450,11 @@ void Node3D::set_rotation(const Vector3 &p_euler_rad) { } } +void Node3D::set_rotation_degrees(const Vector3 &p_euler_degrees) { + Vector3 radians(Math::deg_to_rad(p_euler_degrees.x), Math::deg_to_rad(p_euler_degrees.y), Math::deg_to_rad(p_euler_degrees.z)); + set_rotation(radians); +} + void Node3D::set_scale(const Vector3 &p_scale) { if (data.dirty & DIRTY_EULER_ROTATION_AND_SCALE) { // Update rotation only if rotation and scale are dirty, as scale will be overridden. @@ -467,6 +482,11 @@ Vector3 Node3D::get_rotation() const { return data.euler_rotation; } +Vector3 Node3D::get_rotation_degrees() const { + Vector3 radians = get_rotation(); + return Vector3(Math::rad_to_deg(radians.x), Math::rad_to_deg(radians.y), Math::rad_to_deg(radians.z)); +} + Vector3 Node3D::get_scale() const { if (data.dirty & DIRTY_EULER_ROTATION_AND_SCALE) { _update_rotation_and_scale(); @@ -482,7 +502,7 @@ void Node3D::update_gizmos() { } if (data.gizmos.is_empty()) { - get_tree()->call_group_flags(SceneTree::GROUP_CALL_DEFERRED, SceneStringNames::get_singleton()->_spatial_editor_group, SceneStringNames::get_singleton()->_request_gizmo, this); + get_tree()->call_group_flags(SceneTree::GROUP_CALL_DEFERRED, SceneStringNames::get_singleton()->_spatial_editor_group, SNAME("_request_gizmo_for_id"), get_instance_id()); return; } if (data.gizmos_dirty) { @@ -958,8 +978,10 @@ void Node3D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_transform"), &Node3D::get_transform); ClassDB::bind_method(D_METHOD("set_position", "position"), &Node3D::set_position); ClassDB::bind_method(D_METHOD("get_position"), &Node3D::get_position); - ClassDB::bind_method(D_METHOD("set_rotation", "euler"), &Node3D::set_rotation); + ClassDB::bind_method(D_METHOD("set_rotation", "euler_radians"), &Node3D::set_rotation); ClassDB::bind_method(D_METHOD("get_rotation"), &Node3D::get_rotation); + ClassDB::bind_method(D_METHOD("set_rotation_degrees", "euler_degrees"), &Node3D::set_rotation_degrees); + ClassDB::bind_method(D_METHOD("get_rotation_degrees"), &Node3D::get_rotation_degrees); ClassDB::bind_method(D_METHOD("set_rotation_order", "order"), &Node3D::set_rotation_order); ClassDB::bind_method(D_METHOD("get_rotation_order"), &Node3D::get_rotation_order); ClassDB::bind_method(D_METHOD("set_rotation_edit_mode", "edit_mode"), &Node3D::set_rotation_edit_mode); @@ -975,8 +997,10 @@ void Node3D::_bind_methods() { ClassDB::bind_method(D_METHOD("get_global_transform"), &Node3D::get_global_transform); ClassDB::bind_method(D_METHOD("set_global_position", "position"), &Node3D::set_global_position); ClassDB::bind_method(D_METHOD("get_global_position"), &Node3D::get_global_position); - ClassDB::bind_method(D_METHOD("set_global_rotation", "radians"), &Node3D::set_global_rotation); + ClassDB::bind_method(D_METHOD("set_global_rotation", "euler_radians"), &Node3D::set_global_rotation); ClassDB::bind_method(D_METHOD("get_global_rotation"), &Node3D::get_global_rotation); + ClassDB::bind_method(D_METHOD("set_global_rotation_degrees", "euler_degrees"), &Node3D::set_global_rotation_degrees); + ClassDB::bind_method(D_METHOD("get_global_rotation_degrees"), &Node3D::get_global_rotation_degrees); ClassDB::bind_method(D_METHOD("get_parent_node_3d"), &Node3D::get_parent_node_3d); ClassDB::bind_method(D_METHOD("set_ignore_transform_notification", "enabled"), &Node3D::set_ignore_transform_notification); @@ -1045,6 +1069,7 @@ void Node3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::TRANSFORM3D, "global_transform", PROPERTY_HINT_NONE, "suffix:m", PROPERTY_USAGE_NONE), "set_global_transform", "get_global_transform"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "position", PROPERTY_HINT_RANGE, "-99999,99999,0.001,or_greater,or_less,hide_slider,suffix:m", PROPERTY_USAGE_EDITOR), "set_position", "get_position"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "rotation", PROPERTY_HINT_RANGE, "-360,360,0.1,or_less,or_greater,radians", PROPERTY_USAGE_EDITOR), "set_rotation", "get_rotation"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "rotation_degrees", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_rotation_degrees", "get_rotation_degrees"); ADD_PROPERTY(PropertyInfo(Variant::QUATERNION, "quaternion", PROPERTY_HINT_HIDE_QUATERNION_EDIT, "", PROPERTY_USAGE_EDITOR), "set_quaternion", "get_quaternion"); ADD_PROPERTY(PropertyInfo(Variant::BASIS, "basis", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR), "set_basis", "get_basis"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "scale", PROPERTY_HINT_LINK, "", PROPERTY_USAGE_EDITOR), "set_scale", "get_scale"); @@ -1054,6 +1079,7 @@ void Node3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "global_position", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_position", "get_global_position"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "global_rotation", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_rotation", "get_global_rotation"); + ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "global_rotation_degrees", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_global_rotation_degrees", "get_global_rotation_degrees"); ADD_GROUP("Visibility", ""); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "visible"), "set_visible", "is_visible"); ADD_PROPERTY(PropertyInfo(Variant::NODE_PATH, "visibility_parent", PROPERTY_HINT_NODE_PATH_VALID_TYPES, "GeometryInstance3D"), "set_visibility_parent", "get_visibility_parent"); diff --git a/scene/3d/node_3d.h b/scene/3d/node_3d.h index 76c1e3e22c..9558a978fd 100644 --- a/scene/3d/node_3d.h +++ b/scene/3d/node_3d.h @@ -172,19 +172,23 @@ public: void set_rotation_order(EulerOrder p_order); void set_rotation(const Vector3 &p_euler_rad); + void set_rotation_degrees(const Vector3 &p_euler_degrees); void set_scale(const Vector3 &p_scale); void set_global_position(const Vector3 &p_position); void set_global_rotation(const Vector3 &p_euler_rad); + void set_global_rotation_degrees(const Vector3 &p_euler_degrees); Vector3 get_position() const; EulerOrder get_rotation_order() const; Vector3 get_rotation() const; + Vector3 get_rotation_degrees() const; Vector3 get_scale() const; Vector3 get_global_position() const; Vector3 get_global_rotation() const; + Vector3 get_global_rotation_degrees() const; void set_transform(const Transform3D &p_transform); void set_basis(const Basis &p_basis); diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp index d69953fee5..e488ff3059 100644 --- a/scene/3d/sprite_3d.cpp +++ b/scene/3d/sprite_3d.cpp @@ -191,9 +191,7 @@ void SpriteBase3D::draw_texture_rect(Ref<Texture2D> p_texture, Rect2 p_dst_rect, uint32_t v_normal; { - Vector3 n = normal * Vector3(0.5, 0.5, 0.5) + Vector3(0.5, 0.5, 0.5); - - Vector2 res = n.octahedron_encode(); + Vector2 res = normal.octahedron_encode(); uint32_t value = 0; value |= (uint16_t)CLAMP(res.x * 65535, 0, 65535); value |= (uint16_t)CLAMP(res.y * 65535, 0, 65535) << 16; diff --git a/scene/3d/visual_instance_3d.cpp b/scene/3d/visual_instance_3d.cpp index b5b37bf837..c027e33ad3 100644 --- a/scene/3d/visual_instance_3d.cpp +++ b/scene/3d/visual_instance_3d.cpp @@ -30,6 +30,7 @@ #include "visual_instance_3d.h" +#include "core/core_string_names.h" #include "scene/scene_string_names.h" AABB VisualInstance3D::get_aabb() const { @@ -134,7 +135,13 @@ VisualInstance3D::~VisualInstance3D() { } void GeometryInstance3D::set_material_override(const Ref<Material> &p_material) { + if (material_override.is_valid()) { + material_override->disconnect(CoreStringNames::get_singleton()->property_list_changed, callable_mp((Object *)this, &Object::notify_property_list_changed)); + } material_override = p_material; + if (material_override.is_valid()) { + material_override->connect(CoreStringNames::get_singleton()->property_list_changed, callable_mp((Object *)this, &Object::notify_property_list_changed)); + } RS::get_singleton()->instance_geometry_set_material_override(get_instance(), p_material.is_valid() ? p_material->get_rid() : RID()); } @@ -331,8 +338,16 @@ Variant GeometryInstance3D::get_instance_shader_parameter(const StringName &p_na return RS::get_singleton()->instance_geometry_get_shader_parameter(get_instance(), p_name); } -void GeometryInstance3D::set_custom_aabb(AABB aabb) { - RS::get_singleton()->instance_set_custom_aabb(get_instance(), aabb); +void GeometryInstance3D::set_custom_aabb(AABB p_aabb) { + if (p_aabb == custom_aabb) { + return; + } + custom_aabb = p_aabb; + RS::get_singleton()->instance_set_custom_aabb(get_instance(), custom_aabb); +} + +AABB GeometryInstance3D::get_custom_aabb() const { + return custom_aabb; } void GeometryInstance3D::set_lightmap_scale(LightmapScale p_scale) { @@ -442,6 +457,7 @@ void GeometryInstance3D::_bind_methods() { ClassDB::bind_method(D_METHOD("is_ignoring_occlusion_culling"), &GeometryInstance3D::is_ignoring_occlusion_culling); ClassDB::bind_method(D_METHOD("set_custom_aabb", "aabb"), &GeometryInstance3D::set_custom_aabb); + ClassDB::bind_method(D_METHOD("get_custom_aabb"), &GeometryInstance3D::get_custom_aabb); ClassDB::bind_method(D_METHOD("get_aabb"), &GeometryInstance3D::get_aabb); @@ -451,6 +467,7 @@ void GeometryInstance3D::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "transparency", PROPERTY_HINT_RANGE, "0.0,1.0,0.01"), "set_transparency", "get_transparency"); ADD_PROPERTY(PropertyInfo(Variant::INT, "cast_shadow", PROPERTY_HINT_ENUM, "Off,On,Double-Sided,Shadows Only"), "set_cast_shadows_setting", "get_cast_shadows_setting"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "extra_cull_margin", PROPERTY_HINT_RANGE, "0,16384,0.01,suffix:m"), "set_extra_cull_margin", "get_extra_cull_margin"); + ADD_PROPERTY(PropertyInfo(Variant::AABB, "custom_aabb", PROPERTY_HINT_NONE, "suffix:m"), "set_custom_aabb", "get_custom_aabb"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "lod_bias", PROPERTY_HINT_RANGE, "0.001,128,0.001"), "set_lod_bias", "get_lod_bias"); ADD_PROPERTY(PropertyInfo(Variant::BOOL, "ignore_occlusion_culling"), "set_ignore_occlusion_culling", "is_ignoring_occlusion_culling"); diff --git a/scene/3d/visual_instance_3d.h b/scene/3d/visual_instance_3d.h index f18bff2ddc..c741ef710d 100644 --- a/scene/3d/visual_instance_3d.h +++ b/scene/3d/visual_instance_3d.h @@ -121,6 +121,7 @@ private: mutable HashMap<StringName, StringName> instance_shader_parameter_property_remap; float extra_cull_margin = 0.0; + AABB custom_aabb; LightmapScale lightmap_scale = LIGHTMAP_SCALE_1X; GIMode gi_mode = GI_MODE_STATIC; bool ignore_occlusion_culling = false; @@ -177,7 +178,8 @@ public: void set_instance_shader_parameter(const StringName &p_name, const Variant &p_value); Variant get_instance_shader_parameter(const StringName &p_name) const; - void set_custom_aabb(AABB aabb); + void set_custom_aabb(AABB p_aabb); + AABB get_custom_aabb() const; void set_ignore_occlusion_culling(bool p_enabled); bool is_ignoring_occlusion_culling(); diff --git a/scene/animation/animation_blend_tree.cpp b/scene/animation/animation_blend_tree.cpp index 6200062f60..d10b271b79 100644 --- a/scene/animation/animation_blend_tree.cpp +++ b/scene/animation/animation_blend_tree.cpp @@ -351,7 +351,7 @@ double AnimationNodeOneShot::process(double p_time, bool p_seek, bool p_is_exter } else { main_rem = blend_input(0, p_time, p_seek, p_is_external_seeking, 1.0 - blend, FILTER_BLEND, sync); // Unlike below, processing this edge is a corner case. } - double os_rem = blend_input(1, os_seek ? cur_time : p_time, os_seek, p_is_external_seeking, MAX(CMP_EPSILON, blend), FILTER_PASS, true); // Blend values must be more than CMP_EPSILON to process discrete keys in edge. + double os_rem = blend_input(1, os_seek ? cur_time : p_time, os_seek, p_is_external_seeking, Math::is_zero_approx(blend) ? CMP_EPSILON : blend, FILTER_PASS, true); // Blend values must be more than CMP_EPSILON to process discrete keys in edge. if (do_start) { cur_remaining = os_rem; @@ -769,17 +769,18 @@ double AnimationNodeTransition::process(double p_time, bool p_seek, bool p_is_ex } // Blend values must be more than CMP_EPSILON to process discrete keys in edge. + real_t blend_inv = 1.0 - blend; if (from_start && !p_seek && switched) { //just switched, seek to start of current - rem = blend_input(cur_current, 0, true, p_is_external_seeking, MAX(CMP_EPSILON, 1.0 - blend), FILTER_IGNORE, true); + rem = blend_input(cur_current, 0, true, p_is_external_seeking, Math::is_zero_approx(blend_inv) ? CMP_EPSILON : blend_inv, FILTER_IGNORE, true); } else { - rem = blend_input(cur_current, p_time, p_seek, p_is_external_seeking, MAX(CMP_EPSILON, 1.0 - blend), FILTER_IGNORE, true); + rem = blend_input(cur_current, p_time, p_seek, p_is_external_seeking, Math::is_zero_approx(blend_inv) ? CMP_EPSILON : blend_inv, FILTER_IGNORE, true); } if (p_seek) { - blend_input(cur_prev, p_time, true, p_is_external_seeking, MAX(CMP_EPSILON, blend), FILTER_IGNORE, true); + blend_input(cur_prev, p_time, true, p_is_external_seeking, Math::is_zero_approx(blend) ? CMP_EPSILON : blend, FILTER_IGNORE, true); cur_time = p_time; } else { - blend_input(cur_prev, p_time, false, p_is_external_seeking, MAX(CMP_EPSILON, blend), FILTER_IGNORE, true); + blend_input(cur_prev, p_time, false, p_is_external_seeking, Math::is_zero_approx(blend) ? CMP_EPSILON : blend, FILTER_IGNORE, true); cur_time += p_time; cur_prev_xfading -= p_time; if (cur_prev_xfading < 0) { diff --git a/scene/animation/animation_node_state_machine.cpp b/scene/animation/animation_node_state_machine.cpp index d3746c1144..aff2b11267 100644 --- a/scene/animation/animation_node_state_machine.cpp +++ b/scene/animation/animation_node_state_machine.cpp @@ -433,10 +433,11 @@ double AnimationNodeStateMachinePlayback::process(AnimationNodeStateMachine *p_s if (current_curve.is_valid()) { fade_blend = current_curve->sample(fade_blend); } - float rem = p_state_machine->blend_node(current, p_state_machine->states[current].node, p_time, p_seek, p_is_external_seeking, MAX(CMP_EPSILON, fade_blend), AnimationNode::FILTER_IGNORE, true); // Blend values must be more than CMP_EPSILON to process discrete keys in edge. + float rem = p_state_machine->blend_node(current, p_state_machine->states[current].node, p_time, p_seek, p_is_external_seeking, Math::is_zero_approx(fade_blend) ? CMP_EPSILON : fade_blend, AnimationNode::FILTER_IGNORE, true); // Blend values must be more than CMP_EPSILON to process discrete keys in edge. + float fade_blend_inv = 1.0 - fade_blend; if (fading_from != StringName()) { - p_state_machine->blend_node(fading_from, p_state_machine->states[fading_from].node, p_time, p_seek, p_is_external_seeking, MAX(CMP_EPSILON, 1.0 - fade_blend), AnimationNode::FILTER_IGNORE, true); // Blend values must be more than CMP_EPSILON to process discrete keys in edge. + p_state_machine->blend_node(fading_from, p_state_machine->states[fading_from].node, p_time, p_seek, p_is_external_seeking, Math::is_zero_approx(fade_blend_inv) ? CMP_EPSILON : fade_blend_inv, AnimationNode::FILTER_IGNORE, true); // Blend values must be more than CMP_EPSILON to process discrete keys in edge. } //guess playback position @@ -834,7 +835,8 @@ void AnimationNodeStateMachine::rename_node(const StringName &p_name, const Stri _rename_transitions(p_name, p_new_name); - emit_signal("tree_changed"); + emit_changed(); + emit_signal(SNAME("tree_changed")); } void AnimationNodeStateMachine::_rename_transitions(const StringName &p_name, const StringName &p_new_name) { @@ -877,9 +879,8 @@ void AnimationNodeStateMachine::_rename_transitions(const StringName &p_name, co transitions.write[i].to = p_new_name; } - - updating_transitions = false; } + updating_transitions = false; } void AnimationNodeStateMachine::get_node_list(List<StringName> *r_nodes) const { @@ -1291,6 +1292,7 @@ Vector2 AnimationNodeStateMachine::get_node_position(const StringName &p_name) c } void AnimationNodeStateMachine::_tree_changed() { + emit_changed(); emit_signal(SNAME("tree_changed")); } diff --git a/scene/animation/animation_player.cpp b/scene/animation/animation_player.cpp index f7baa7facc..cc6fadd9b2 100644 --- a/scene/animation/animation_player.cpp +++ b/scene/animation/animation_player.cpp @@ -956,8 +956,8 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, double } if (player->is_playing()) { - player->play(anim_name); player->seek(at_anim_pos); + player->play(anim_name); nc->animation_playing = true; playing_caches.insert(nc); } else { @@ -985,8 +985,8 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, double nc->animation_playing = false; } } else { + player->seek(0.0); player->play(anim_name); - player->seek(0.0, true); nc->animation_playing = true; playing_caches.insert(nc); } @@ -1001,6 +1001,7 @@ void AnimationPlayer::_animation_process_animation(AnimationData *p_anim, double void AnimationPlayer::_animation_process_data(PlaybackData &cd, double p_delta, float p_blend, bool p_seeked, bool p_started) { double delta = p_delta * speed_scale * cd.speed_scale; double next_pos = cd.pos + delta; + bool backwards = signbit(delta); // Negative zero means playing backwards too. real_t len = cd.from->animation->get_length(); Animation::LoopedFlag looped_flag = Animation::LOOPED_FLAG_NONE; @@ -1012,23 +1013,7 @@ void AnimationPlayer::_animation_process_data(PlaybackData &cd, double p_delta, } else if (next_pos > len) { next_pos = len; } - - bool backwards = signbit(delta); // Negative zero means playing backwards too - delta = next_pos - cd.pos; // Fix delta (after determination of backwards because negative zero is lost here) - - if (&cd == &playback.current) { - if (!backwards && cd.pos <= len && next_pos == len) { - //playback finished - end_reached = true; - end_notify = cd.pos < len; // Notify only if not already at the end - } - - if (backwards && cd.pos >= 0 && next_pos == 0) { - //playback finished - end_reached = true; - end_notify = cd.pos > 0; // Notify only if not already at the beginning - } - } + delta = next_pos - cd.pos; // Fix delta (after determination of backwards because negative zero is lost here). } break; case Animation::LOOP_LINEAR: { @@ -1057,8 +1042,28 @@ void AnimationPlayer::_animation_process_data(PlaybackData &cd, double p_delta, break; } - _animation_process_animation(cd.from, cd.pos, next_pos, delta, p_blend, &cd == &playback.current, p_seeked, p_started, looped_flag); + double prev_pos = cd.pos; // The animation may be changed during process, so it is safer that the state is changed before process. cd.pos = next_pos; + + AnimationData *prev_from = cd.from; + _animation_process_animation(cd.from, prev_pos, cd.pos, delta, p_blend, &cd == &playback.current, p_seeked, p_started, looped_flag); + + // End detection. + if (cd.from->animation->get_loop_mode() == Animation::LOOP_NONE) { + if (prev_from != playback.current.from) { + return; // Animation has been changed in the process (may be caused by method track), abort process. + } + if (!backwards && prev_pos <= len && next_pos == len) { + // Playback finished. + end_reached = true; + end_notify = prev_pos < len; // Notify only if not already at the end. + } + if (backwards && prev_pos >= 0 && next_pos == 0) { + // Playback finished. + end_reached = true; + end_notify = prev_pos > 0; // Notify only if not already at the beginning. + } + } } void AnimationPlayer::_animation_process2(double p_delta, bool p_started) { @@ -1066,23 +1071,25 @@ void AnimationPlayer::_animation_process2(double p_delta, bool p_started) { accum_pass++; - _animation_process_data(c.current, p_delta, 1.0f, c.seeked, p_started); + bool seeked = c.seeked; // The animation may be changed during process, so it is safer that the state is changed before process. if (p_delta != 0) { c.seeked = false; } + _animation_process_data(c.current, p_delta, 1.0f, seeked, p_started); + List<Blend>::Element *prev = nullptr; for (List<Blend>::Element *E = c.blend.back(); E; E = prev) { Blend &b = E->get(); float blend = b.blend_left / b.blend_time; - _animation_process_data(b.data, p_delta, blend, false, false); - b.blend_left -= Math::absf(speed_scale * p_delta); - prev = E->prev(); if (b.blend_left < 0) { c.blend.erase(E); } + // The effect of animation changes during blending is unknown... + // In that case, we recommends to use method call mode "deferred", not "immediate". + _animation_process_data(b.data, p_delta, blend, false, false); } } @@ -1123,8 +1130,6 @@ void AnimationPlayer::_animation_update_transforms() { } } - cache_update_size = 0; - for (int i = 0; i < cache_update_prop_size; i++) { TrackNodeCache::PropertyAnim *pa = cache_update_prop[i]; @@ -1186,29 +1191,35 @@ void AnimationPlayer::_animation_update_transforms() { } } - cache_update_prop_size = 0; - for (int i = 0; i < cache_update_bezier_size; i++) { TrackNodeCache::BezierAnim *ba = cache_update_bezier[i]; ERR_CONTINUE(ba->accum_pass != accum_pass); ba->object->set_indexed(ba->bezier_property, ba->bezier_accum); } - - cache_update_bezier_size = 0; } void AnimationPlayer::_animation_process(double p_delta) { if (playback.current.from) { end_reached = false; end_notify = false; - _animation_process2(p_delta, playback.started); + bool started = playback.started; // The animation may be changed during process, so it is safer that the state is changed before process. if (playback.started) { playback.started = false; } + cache_update_size = 0; + cache_update_prop_size = 0; + cache_update_bezier_size = 0; + + AnimationData *prev_from = playback.current.from; + _animation_process2(p_delta, started); + if (prev_from != playback.current.from) { + return; // Animation has been changed in the process (may be caused by method track), abort process. + } _animation_update_transforms(); + if (end_reached) { if (queued.size()) { String old = playback.assigned; @@ -2060,7 +2071,7 @@ Ref<AnimatedValuesBackup> AnimationPlayer::apply_reset(bool p_user_initiated) { old_values->restore(); Ref<EditorUndoRedoManager> &ur = EditorNode::get_undo_redo(); - ur->create_action(TTR("Anim Apply Reset")); + ur->create_action(TTR("Animation Apply Reset")); ur->add_do_method(new_values.ptr(), "restore"); ur->add_undo_method(old_values.ptr(), "restore"); ur->commit_action(); diff --git a/scene/animation/animation_tree.cpp b/scene/animation/animation_tree.cpp index bd9b918900..b06a21dea9 100644 --- a/scene/animation/animation_tree.cpp +++ b/scene/animation/animation_tree.cpp @@ -1031,7 +1031,9 @@ void AnimationTree::_process_graph(double p_delta) { } NodePath path = a->track_get_path(i); - ERR_CONTINUE(!track_cache.has(path)); + if (!track_cache.has(path)) { + continue; // No path, but avoid error spamming. + } TrackCache *track = track_cache[path]; ERR_CONTINUE(!state.track_map.has(path)); @@ -1582,8 +1584,8 @@ void AnimationTree::_process_graph(double p_delta) { } if (player2->is_playing() || seeked) { - player2->play(anim_name); player2->seek(at_anim_pos); + player2->play(anim_name); t->playing = true; playing_caches.insert(t); } else { @@ -1757,7 +1759,7 @@ void AnimationTree::_setup_animation_player() { AnimationPlayer *new_player = nullptr; if (!animation_player.is_empty()) { - new_player = Object::cast_to<AnimationPlayer>(get_node(animation_player)); + new_player = Object::cast_to<AnimationPlayer>(get_node_or_null(animation_player)); if (new_player && !new_player->is_connected("animation_list_changed", callable_mp(this, &AnimationTree::_animation_player_changed))) { new_player->connect("animation_list_changed", callable_mp(this, &AnimationTree::_animation_player_changed)); } diff --git a/scene/gui/code_edit.cpp b/scene/gui/code_edit.cpp index f46daef127..c84438ed5e 100644 --- a/scene/gui/code_edit.cpp +++ b/scene/gui/code_edit.cpp @@ -115,7 +115,9 @@ void CodeEdit::_notification(int p_what) { const Point2 caret_pos = get_caret_draw_pos(); const int total_height = csb->get_minimum_size().y + code_completion_rect.size.height; - if (caret_pos.y + row_height + total_height > get_size().height) { + const bool can_fit_completion_above = (caret_pos.y - row_height > total_height); + const bool can_fit_completion_below = (caret_pos.y + row_height + total_height <= get_size().height); + if (!can_fit_completion_below && can_fit_completion_above) { code_completion_rect.position.y = (caret_pos.y - total_height - row_height) + line_spacing; } else { code_completion_rect.position.y = caret_pos.y + (line_spacing / 2.0f); @@ -2079,20 +2081,22 @@ void CodeEdit::confirm_code_completion(bool p_replace) { } char32_t last_completion_char_display = display_text[display_text.length() - 1]; + bool last_char_matches = (last_completion_char == next_char || last_completion_char_display == next_char); int pre_brace_pair = get_caret_column(i) > 0 ? _get_auto_brace_pair_open_at_pos(caret_line, get_caret_column(i)) : -1; int post_brace_pair = get_caret_column(i) < get_line(caret_line).length() ? _get_auto_brace_pair_close_at_pos(caret_line, get_caret_column(i)) : -1; - if (post_brace_pair != -1 && (last_completion_char == next_char || last_completion_char_display == next_char)) { + // Strings do not nest like brackets, so ensure we don't add an additional closing pair. + if (has_string_delimiter(String::chr(last_completion_char)) && post_brace_pair != -1 && last_char_matches) { remove_text(caret_line, get_caret_column(i), caret_line, get_caret_column(i) + 1); adjust_carets_after_edit(i, caret_line, get_caret_column(i), caret_line, get_caret_column(i) + 1); - } - - if (pre_brace_pair != -1 && pre_brace_pair != post_brace_pair && (last_completion_char == next_char || last_completion_char_display == next_char)) { - remove_text(caret_line, get_caret_column(i), caret_line, get_caret_column(i) + 1); - adjust_carets_after_edit(i, caret_line, get_caret_column(i), caret_line, get_caret_column(i) + 1); - } else if (auto_brace_completion_enabled && pre_brace_pair != -1 && post_brace_pair == -1) { - insert_text_at_caret(auto_brace_completion_pairs[pre_brace_pair].close_key, i); - set_caret_column(get_caret_column(i) - auto_brace_completion_pairs[pre_brace_pair].close_key.length(), i == 0, i); + } else { + if (pre_brace_pair != -1 && pre_brace_pair != post_brace_pair && last_char_matches) { + remove_text(caret_line, get_caret_column(i), caret_line, get_caret_column(i) + 1); + adjust_carets_after_edit(i, caret_line, get_caret_column(i), caret_line, get_caret_column(i) + 1); + } else if (auto_brace_completion_enabled && pre_brace_pair != -1) { + insert_text_at_caret(auto_brace_completion_pairs[pre_brace_pair].close_key, i); + set_caret_column(get_caret_column(i) - auto_brace_completion_pairs[pre_brace_pair].close_key.length(), i == 0, i); + } } if (pre_brace_pair == -1 && post_brace_pair == -1 && get_caret_column(i) > 0 && get_caret_column(i) < get_line(caret_line).length()) { diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp index e90a6a69ab..21c7c4ddb4 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -257,36 +257,36 @@ bool Control::_set(const StringName &p_name, const Variant &p_value) { if (p_value.get_type() == Variant::NIL || (p_value.get_type() == Variant::OBJECT && (Object *)p_value == nullptr)) { if (name.begins_with("theme_override_icons/")) { String dname = name.get_slicec('/', 1); - if (data.icon_override.has(dname)) { - data.icon_override[dname]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); + if (data.theme_icon_override.has(dname)) { + data.theme_icon_override[dname]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); } - data.icon_override.erase(dname); + data.theme_icon_override.erase(dname); _notify_theme_override_changed(); } else if (name.begins_with("theme_override_styles/")) { String dname = name.get_slicec('/', 1); - if (data.style_override.has(dname)) { - data.style_override[dname]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); + if (data.theme_style_override.has(dname)) { + data.theme_style_override[dname]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); } - data.style_override.erase(dname); + data.theme_style_override.erase(dname); _notify_theme_override_changed(); } else if (name.begins_with("theme_override_fonts/")) { String dname = name.get_slicec('/', 1); - if (data.font_override.has(dname)) { - data.font_override[dname]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); + if (data.theme_font_override.has(dname)) { + data.theme_font_override[dname]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); } - data.font_override.erase(dname); + data.theme_font_override.erase(dname); _notify_theme_override_changed(); } else if (name.begins_with("theme_override_font_sizes/")) { String dname = name.get_slicec('/', 1); - data.font_size_override.erase(dname); + data.theme_font_size_override.erase(dname); _notify_theme_override_changed(); } else if (name.begins_with("theme_override_colors/")) { String dname = name.get_slicec('/', 1); - data.color_override.erase(dname); + data.theme_color_override.erase(dname); _notify_theme_override_changed(); } else if (name.begins_with("theme_override_constants/")) { String dname = name.get_slicec('/', 1); - data.constant_override.erase(dname); + data.theme_constant_override.erase(dname); _notify_theme_override_changed(); } else { return false; @@ -326,22 +326,22 @@ bool Control::_get(const StringName &p_name, Variant &r_ret) const { if (sname.begins_with("theme_override_icons/")) { String name = sname.get_slicec('/', 1); - r_ret = data.icon_override.has(name) ? Variant(data.icon_override[name]) : Variant(); + r_ret = data.theme_icon_override.has(name) ? Variant(data.theme_icon_override[name]) : Variant(); } else if (sname.begins_with("theme_override_styles/")) { String name = sname.get_slicec('/', 1); - r_ret = data.style_override.has(name) ? Variant(data.style_override[name]) : Variant(); + r_ret = data.theme_style_override.has(name) ? Variant(data.theme_style_override[name]) : Variant(); } else if (sname.begins_with("theme_override_fonts/")) { String name = sname.get_slicec('/', 1); - r_ret = data.font_override.has(name) ? Variant(data.font_override[name]) : Variant(); + r_ret = data.theme_font_override.has(name) ? Variant(data.theme_font_override[name]) : Variant(); } else if (sname.begins_with("theme_override_font_sizes/")) { String name = sname.get_slicec('/', 1); - r_ret = data.font_size_override.has(name) ? Variant(data.font_size_override[name]) : Variant(); + r_ret = data.theme_font_size_override.has(name) ? Variant(data.theme_font_size_override[name]) : Variant(); } else if (sname.begins_with("theme_override_colors/")) { String name = sname.get_slicec('/', 1); - r_ret = data.color_override.has(name) ? Variant(data.color_override[name]) : Variant(); + r_ret = data.theme_color_override.has(name) ? Variant(data.theme_color_override[name]) : Variant(); } else if (sname.begins_with("theme_override_constants/")) { String name = sname.get_slicec('/', 1); - r_ret = data.constant_override.has(name) ? Variant(data.constant_override[name]) : Variant(); + r_ret = data.theme_constant_override.has(name) ? Variant(data.theme_constant_override[name]) : Variant(); } else { return false; } @@ -350,16 +350,16 @@ bool Control::_get(const StringName &p_name, Variant &r_ret) const { } void Control::_get_property_list(List<PropertyInfo> *p_list) const { - Ref<Theme> theme = ThemeDB::get_singleton()->get_default_theme(); + Ref<Theme> default_theme = ThemeDB::get_singleton()->get_default_theme(); p_list->push_back(PropertyInfo(Variant::NIL, TTRC("Theme Overrides"), PROPERTY_HINT_NONE, "theme_override_", PROPERTY_USAGE_GROUP)); { List<StringName> names; - theme->get_color_list(get_class_name(), &names); + default_theme->get_color_list(get_class_name(), &names); for (const StringName &E : names) { uint32_t usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; - if (data.color_override.has(E)) { + if (data.theme_color_override.has(E)) { usage |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; } @@ -368,10 +368,10 @@ void Control::_get_property_list(List<PropertyInfo> *p_list) const { } { List<StringName> names; - theme->get_constant_list(get_class_name(), &names); + default_theme->get_constant_list(get_class_name(), &names); for (const StringName &E : names) { uint32_t usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; - if (data.constant_override.has(E)) { + if (data.theme_constant_override.has(E)) { usage |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; } @@ -380,10 +380,10 @@ void Control::_get_property_list(List<PropertyInfo> *p_list) const { } { List<StringName> names; - theme->get_font_list(get_class_name(), &names); + default_theme->get_font_list(get_class_name(), &names); for (const StringName &E : names) { uint32_t usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; - if (data.font_override.has(E)) { + if (data.theme_font_override.has(E)) { usage |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; } @@ -392,10 +392,10 @@ void Control::_get_property_list(List<PropertyInfo> *p_list) const { } { List<StringName> names; - theme->get_font_size_list(get_class_name(), &names); + default_theme->get_font_size_list(get_class_name(), &names); for (const StringName &E : names) { uint32_t usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; - if (data.font_size_override.has(E)) { + if (data.theme_font_size_override.has(E)) { usage |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; } @@ -404,10 +404,10 @@ void Control::_get_property_list(List<PropertyInfo> *p_list) const { } { List<StringName> names; - theme->get_icon_list(get_class_name(), &names); + default_theme->get_icon_list(get_class_name(), &names); for (const StringName &E : names) { uint32_t usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; - if (data.icon_override.has(E)) { + if (data.theme_icon_override.has(E)) { usage |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; } @@ -416,10 +416,10 @@ void Control::_get_property_list(List<PropertyInfo> *p_list) const { } { List<StringName> names; - theme->get_stylebox_list(get_class_name(), &names); + default_theme->get_stylebox_list(get_class_name(), &names); for (const StringName &E : names) { uint32_t usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; - if (data.style_override.has(E)) { + if (data.theme_style_override.has(E)) { usage |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; } @@ -1475,10 +1475,18 @@ void Control::set_rotation(real_t p_radians) { _notify_transform(); } +void Control::set_rotation_degrees(real_t p_degrees) { + set_rotation(Math::deg_to_rad(p_degrees)); +} + real_t Control::get_rotation() const { return data.rotation; } +real_t Control::get_rotation_degrees() const { + return Math::rad_to_deg(get_rotation()); +} + void Control::set_pivot_offset(const Vector2 &p_pivot) { if (data.pivot_offset == p_pivot) { return; @@ -1563,6 +1571,12 @@ void Control::set_custom_minimum_size(const Size2 &p_custom) { if (p_custom == data.custom_minimum_size) { return; } + + if (isnan(p_custom.x) || isnan(p_custom.y)) { + // Prevent infinite loop. + return; + } + data.custom_minimum_size = p_custom; update_minimum_size(); } @@ -2381,7 +2395,7 @@ StringName Control::get_theme_type_variation() const { Ref<Texture2D> Control::get_theme_icon(const StringName &p_name, const StringName &p_theme_type) const { if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == data.theme_type_variation) { - const Ref<Texture2D> *tex = data.icon_override.getptr(p_name); + const Ref<Texture2D> *tex = data.theme_icon_override.getptr(p_name); if (tex) { return *tex; } @@ -2400,7 +2414,7 @@ Ref<Texture2D> Control::get_theme_icon(const StringName &p_name, const StringNam Ref<StyleBox> Control::get_theme_stylebox(const StringName &p_name, const StringName &p_theme_type) const { if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == data.theme_type_variation) { - const Ref<StyleBox> *style = data.style_override.getptr(p_name); + const Ref<StyleBox> *style = data.theme_style_override.getptr(p_name); if (style) { return *style; } @@ -2419,7 +2433,7 @@ Ref<StyleBox> Control::get_theme_stylebox(const StringName &p_name, const String Ref<Font> Control::get_theme_font(const StringName &p_name, const StringName &p_theme_type) const { if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == data.theme_type_variation) { - const Ref<Font> *font = data.font_override.getptr(p_name); + const Ref<Font> *font = data.theme_font_override.getptr(p_name); if (font) { return *font; } @@ -2438,7 +2452,7 @@ Ref<Font> Control::get_theme_font(const StringName &p_name, const StringName &p_ int Control::get_theme_font_size(const StringName &p_name, const StringName &p_theme_type) const { if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == data.theme_type_variation) { - const int *font_size = data.font_size_override.getptr(p_name); + const int *font_size = data.theme_font_size_override.getptr(p_name); if (font_size && (*font_size) > 0) { return *font_size; } @@ -2457,7 +2471,7 @@ int Control::get_theme_font_size(const StringName &p_name, const StringName &p_t Color Control::get_theme_color(const StringName &p_name, const StringName &p_theme_type) const { if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == data.theme_type_variation) { - const Color *color = data.color_override.getptr(p_name); + const Color *color = data.theme_color_override.getptr(p_name); if (color) { return *color; } @@ -2476,7 +2490,7 @@ Color Control::get_theme_color(const StringName &p_name, const StringName &p_the int Control::get_theme_constant(const StringName &p_name, const StringName &p_theme_type) const { if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == data.theme_type_variation) { - const int *constant = data.constant_override.getptr(p_name); + const int *constant = data.theme_constant_override.getptr(p_name); if (constant) { return *constant; } @@ -2570,123 +2584,123 @@ bool Control::has_theme_constant(const StringName &p_name, const StringName &p_t void Control::add_theme_icon_override(const StringName &p_name, const Ref<Texture2D> &p_icon) { ERR_FAIL_COND(!p_icon.is_valid()); - if (data.icon_override.has(p_name)) { - data.icon_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); + if (data.theme_icon_override.has(p_name)) { + data.theme_icon_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); } - data.icon_override[p_name] = p_icon; - data.icon_override[p_name]->connect("changed", callable_mp(this, &Control::_notify_theme_override_changed), CONNECT_REFERENCE_COUNTED); + data.theme_icon_override[p_name] = p_icon; + data.theme_icon_override[p_name]->connect("changed", callable_mp(this, &Control::_notify_theme_override_changed), CONNECT_REFERENCE_COUNTED); _notify_theme_override_changed(); } void Control::add_theme_style_override(const StringName &p_name, const Ref<StyleBox> &p_style) { ERR_FAIL_COND(!p_style.is_valid()); - if (data.style_override.has(p_name)) { - data.style_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); + if (data.theme_style_override.has(p_name)) { + data.theme_style_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); } - data.style_override[p_name] = p_style; - data.style_override[p_name]->connect("changed", callable_mp(this, &Control::_notify_theme_override_changed), CONNECT_REFERENCE_COUNTED); + data.theme_style_override[p_name] = p_style; + data.theme_style_override[p_name]->connect("changed", callable_mp(this, &Control::_notify_theme_override_changed), CONNECT_REFERENCE_COUNTED); _notify_theme_override_changed(); } void Control::add_theme_font_override(const StringName &p_name, const Ref<Font> &p_font) { ERR_FAIL_COND(!p_font.is_valid()); - if (data.font_override.has(p_name)) { - data.font_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); + if (data.theme_font_override.has(p_name)) { + data.theme_font_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); } - data.font_override[p_name] = p_font; - data.font_override[p_name]->connect("changed", callable_mp(this, &Control::_notify_theme_override_changed), CONNECT_REFERENCE_COUNTED); + data.theme_font_override[p_name] = p_font; + data.theme_font_override[p_name]->connect("changed", callable_mp(this, &Control::_notify_theme_override_changed), CONNECT_REFERENCE_COUNTED); _notify_theme_override_changed(); } void Control::add_theme_font_size_override(const StringName &p_name, int p_font_size) { - data.font_size_override[p_name] = p_font_size; + data.theme_font_size_override[p_name] = p_font_size; _notify_theme_override_changed(); } void Control::add_theme_color_override(const StringName &p_name, const Color &p_color) { - data.color_override[p_name] = p_color; + data.theme_color_override[p_name] = p_color; _notify_theme_override_changed(); } void Control::add_theme_constant_override(const StringName &p_name, int p_constant) { - data.constant_override[p_name] = p_constant; + data.theme_constant_override[p_name] = p_constant; _notify_theme_override_changed(); } void Control::remove_theme_icon_override(const StringName &p_name) { - if (data.icon_override.has(p_name)) { - data.icon_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); + if (data.theme_icon_override.has(p_name)) { + data.theme_icon_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); } - data.icon_override.erase(p_name); + data.theme_icon_override.erase(p_name); _notify_theme_override_changed(); } void Control::remove_theme_style_override(const StringName &p_name) { - if (data.style_override.has(p_name)) { - data.style_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); + if (data.theme_style_override.has(p_name)) { + data.theme_style_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); } - data.style_override.erase(p_name); + data.theme_style_override.erase(p_name); _notify_theme_override_changed(); } void Control::remove_theme_font_override(const StringName &p_name) { - if (data.font_override.has(p_name)) { - data.font_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); + if (data.theme_font_override.has(p_name)) { + data.theme_font_override[p_name]->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); } - data.font_override.erase(p_name); + data.theme_font_override.erase(p_name); _notify_theme_override_changed(); } void Control::remove_theme_font_size_override(const StringName &p_name) { - data.font_size_override.erase(p_name); + data.theme_font_size_override.erase(p_name); _notify_theme_override_changed(); } void Control::remove_theme_color_override(const StringName &p_name) { - data.color_override.erase(p_name); + data.theme_color_override.erase(p_name); _notify_theme_override_changed(); } void Control::remove_theme_constant_override(const StringName &p_name) { - data.constant_override.erase(p_name); + data.theme_constant_override.erase(p_name); _notify_theme_override_changed(); } bool Control::has_theme_icon_override(const StringName &p_name) const { - const Ref<Texture2D> *tex = data.icon_override.getptr(p_name); + const Ref<Texture2D> *tex = data.theme_icon_override.getptr(p_name); return tex != nullptr; } bool Control::has_theme_stylebox_override(const StringName &p_name) const { - const Ref<StyleBox> *style = data.style_override.getptr(p_name); + const Ref<StyleBox> *style = data.theme_style_override.getptr(p_name); return style != nullptr; } bool Control::has_theme_font_override(const StringName &p_name) const { - const Ref<Font> *font = data.font_override.getptr(p_name); + const Ref<Font> *font = data.theme_font_override.getptr(p_name); return font != nullptr; } bool Control::has_theme_font_size_override(const StringName &p_name) const { - const int *font_size = data.font_size_override.getptr(p_name); + const int *font_size = data.theme_font_size_override.getptr(p_name); return font_size != nullptr; } bool Control::has_theme_color_override(const StringName &p_name) const { - const Color *color = data.color_override.getptr(p_name); + const Color *color = data.theme_color_override.getptr(p_name); return color != nullptr; } bool Control::has_theme_constant_override(const StringName &p_name) const { - const int *constant = data.constant_override.getptr(p_name); + const int *constant = data.theme_constant_override.getptr(p_name); return constant != nullptr; } @@ -3036,6 +3050,7 @@ void Control::_bind_methods() { ClassDB::bind_method(D_METHOD("set_global_position", "position", "keep_offsets"), &Control::set_global_position, DEFVAL(false)); ClassDB::bind_method(D_METHOD("_set_global_position", "position"), &Control::_set_global_position); ClassDB::bind_method(D_METHOD("set_rotation", "radians"), &Control::set_rotation); + ClassDB::bind_method(D_METHOD("set_rotation_degrees", "degrees"), &Control::set_rotation_degrees); ClassDB::bind_method(D_METHOD("set_scale", "scale"), &Control::set_scale); ClassDB::bind_method(D_METHOD("set_pivot_offset", "pivot_offset"), &Control::set_pivot_offset); ClassDB::bind_method(D_METHOD("get_begin"), &Control::get_begin); @@ -3043,6 +3058,7 @@ void Control::_bind_methods() { ClassDB::bind_method(D_METHOD("get_position"), &Control::get_position); ClassDB::bind_method(D_METHOD("get_size"), &Control::get_size); ClassDB::bind_method(D_METHOD("get_rotation"), &Control::get_rotation); + ClassDB::bind_method(D_METHOD("get_rotation_degrees"), &Control::get_rotation_degrees); ClassDB::bind_method(D_METHOD("get_scale"), &Control::get_scale); ClassDB::bind_method(D_METHOD("get_pivot_offset"), &Control::get_pivot_offset); ClassDB::bind_method(D_METHOD("get_custom_minimum_size"), &Control::get_custom_minimum_size); @@ -3211,6 +3227,7 @@ void Control::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "position", PROPERTY_HINT_NONE, "suffix:px", PROPERTY_USAGE_EDITOR), "_set_position", "get_position"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "global_position", PROPERTY_HINT_NONE, "suffix:px", PROPERTY_USAGE_NONE), "_set_global_position", "get_global_position"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "rotation", PROPERTY_HINT_RANGE, "-360,360,0.1,or_less,or_greater,radians"), "set_rotation", "get_rotation"); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "rotation_degrees", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NONE), "set_rotation_degrees", "get_rotation_degrees"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "scale"), "set_scale", "get_scale"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "pivot_offset", PROPERTY_HINT_NONE, "suffix:px"), "set_pivot_offset", "get_pivot_offset"); @@ -3359,21 +3376,21 @@ Control::~Control() { memdelete(data.theme_owner); // Resources need to be disconnected. - for (KeyValue<StringName, Ref<Texture2D>> &E : data.icon_override) { + for (KeyValue<StringName, Ref<Texture2D>> &E : data.theme_icon_override) { E.value->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); } - for (KeyValue<StringName, Ref<StyleBox>> &E : data.style_override) { + for (KeyValue<StringName, Ref<StyleBox>> &E : data.theme_style_override) { E.value->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); } - for (KeyValue<StringName, Ref<Font>> &E : data.font_override) { + for (KeyValue<StringName, Ref<Font>> &E : data.theme_font_override) { E.value->disconnect("changed", callable_mp(this, &Control::_notify_theme_override_changed)); } // Then override maps can be simply cleared. - data.icon_override.clear(); - data.style_override.clear(); - data.font_override.clear(); - data.font_size_override.clear(); - data.color_override.clear(); - data.constant_override.clear(); + data.theme_icon_override.clear(); + data.theme_style_override.clear(); + data.theme_font_override.clear(); + data.theme_font_size_override.clear(); + data.theme_color_override.clear(); + data.theme_constant_override.clear(); } diff --git a/scene/gui/control.h b/scene/gui/control.h index 3e9bb48a4a..f82fba3b1b 100644 --- a/scene/gui/control.h +++ b/scene/gui/control.h @@ -228,12 +228,12 @@ private: StringName theme_type_variation; bool bulk_theme_override = false; - Theme::ThemeIconMap icon_override; - Theme::ThemeStyleMap style_override; - Theme::ThemeFontMap font_override; - Theme::ThemeFontSizeMap font_size_override; - Theme::ThemeColorMap color_override; - Theme::ThemeConstantMap constant_override; + Theme::ThemeIconMap theme_icon_override; + Theme::ThemeStyleMap theme_style_override; + Theme::ThemeFontMap theme_font_override; + Theme::ThemeFontSizeMap theme_font_size_override; + Theme::ThemeColorMap theme_color_override; + Theme::ThemeConstantMap theme_constant_override; mutable HashMap<StringName, Theme::ThemeIconMap> theme_icon_cache; mutable HashMap<StringName, Theme::ThemeStyleMap> theme_style_cache; @@ -451,7 +451,9 @@ public: void set_scale(const Vector2 &p_scale); Vector2 get_scale() const; void set_rotation(real_t p_radians); + void set_rotation_degrees(real_t p_degrees); real_t get_rotation() const; + real_t get_rotation_degrees() const; void set_pivot_offset(const Vector2 &p_pivot); Vector2 get_pivot_offset() const; diff --git a/scene/gui/item_list.cpp b/scene/gui/item_list.cpp index 82f089735d..c44feddd38 100644 --- a/scene/gui/item_list.cpp +++ b/scene/gui/item_list.cpp @@ -1550,6 +1550,7 @@ bool ItemList::get_allow_reselect() const { } void ItemList::set_icon_scale(real_t p_scale) { + ERR_FAIL_COND(!Math::is_finite(p_scale)); icon_scale = p_scale; } diff --git a/scene/gui/line_edit.cpp b/scene/gui/line_edit.cpp index bd39ee3bb3..b8e2c76413 100644 --- a/scene/gui/line_edit.cpp +++ b/scene/gui/line_edit.cpp @@ -822,7 +822,7 @@ void LineEdit::_notification(int p_what) { case HORIZONTAL_ALIGNMENT_FILL: case HORIZONTAL_ALIGNMENT_LEFT: { if (rtl) { - x_ofs = MAX(style->get_margin(SIDE_LEFT), int(size.width - style->get_margin(SIDE_RIGHT) - (text_width))); + x_ofs = MAX(style->get_margin(SIDE_LEFT), int(size.width - Math::ceil(style->get_margin(SIDE_RIGHT) + (text_width)))); } else { x_ofs = style->get_offset().x; } @@ -838,7 +838,7 @@ void LineEdit::_notification(int p_what) { if (rtl) { x_ofs = style->get_offset().x; } else { - x_ofs = MAX(style->get_margin(SIDE_LEFT), int(size.width - style->get_margin(SIDE_RIGHT) - (text_width))); + x_ofs = MAX(style->get_margin(SIDE_LEFT), int(size.width - Math::ceil(style->get_margin(SIDE_RIGHT) + (text_width)))); } } break; } diff --git a/scene/gui/link_button.cpp b/scene/gui/link_button.cpp index 7219e86f52..2c43ca7143 100644 --- a/scene/gui/link_button.cpp +++ b/scene/gui/link_button.cpp @@ -108,6 +108,14 @@ String LinkButton::get_language() const { return language; } +void LinkButton::set_uri(const String &p_uri) { + uri = p_uri; +} + +String LinkButton::get_uri() const { + return uri; +} + void LinkButton::set_underline_mode(UnderlineMode p_underline_mode) { if (underline_mode == p_underline_mode) { return; @@ -121,6 +129,14 @@ LinkButton::UnderlineMode LinkButton::get_underline_mode() const { return underline_mode; } +void LinkButton::pressed() { + if (uri.is_empty()) { + return; + } + + OS::get_singleton()->shell_open(uri); +} + Size2 LinkButton::get_minimum_size() const { return text_buf->get_size(); } @@ -245,6 +261,8 @@ void LinkButton::_bind_methods() { ClassDB::bind_method(D_METHOD("get_text_direction"), &LinkButton::get_text_direction); ClassDB::bind_method(D_METHOD("set_language", "language"), &LinkButton::set_language); ClassDB::bind_method(D_METHOD("get_language"), &LinkButton::get_language); + ClassDB::bind_method(D_METHOD("set_uri", "uri"), &LinkButton::set_uri); + ClassDB::bind_method(D_METHOD("get_uri"), &LinkButton::get_uri); ClassDB::bind_method(D_METHOD("set_underline_mode", "underline_mode"), &LinkButton::set_underline_mode); ClassDB::bind_method(D_METHOD("get_underline_mode"), &LinkButton::get_underline_mode); ClassDB::bind_method(D_METHOD("set_structured_text_bidi_override", "parser"), &LinkButton::set_structured_text_bidi_override); @@ -258,6 +276,7 @@ void LinkButton::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::STRING, "text"), "set_text", "get_text"); ADD_PROPERTY(PropertyInfo(Variant::INT, "underline", PROPERTY_HINT_ENUM, "Always,On Hover,Never"), "set_underline_mode", "get_underline_mode"); + ADD_PROPERTY(PropertyInfo(Variant::STRING, "uri"), "set_uri", "get_uri"); ADD_GROUP("BiDi", ""); ADD_PROPERTY(PropertyInfo(Variant::INT, "text_direction", PROPERTY_HINT_ENUM, "Auto,Left-to-Right,Right-to-Left,Inherited"), "set_text_direction", "get_text_direction"); diff --git a/scene/gui/link_button.h b/scene/gui/link_button.h index accd848163..c71872fc86 100644 --- a/scene/gui/link_button.h +++ b/scene/gui/link_button.h @@ -49,6 +49,7 @@ private: String xl_text; Ref<TextLine> text_buf; UnderlineMode underline_mode = UNDERLINE_MODE_ALWAYS; + String uri; String language; TextDirection text_direction = TEXT_DIRECTION_AUTO; @@ -76,6 +77,7 @@ private: void _shape(); protected: + virtual void pressed() override; virtual Size2 get_minimum_size() const override; virtual void _update_theme_item_cache() override; void _notification(int p_what); @@ -84,6 +86,8 @@ protected: public: void set_text(const String &p_text); String get_text() const; + void set_uri(const String &p_uri); + String get_uri() const; void set_structured_text_bidi_override(TextServer::StructuredTextParser p_parser); TextServer::StructuredTextParser get_structured_text_bidi_override() const; diff --git a/scene/gui/popup_menu.cpp b/scene/gui/popup_menu.cpp index ab74979777..5d8e106e26 100644 --- a/scene/gui/popup_menu.cpp +++ b/scene/gui/popup_menu.cpp @@ -221,7 +221,7 @@ void PopupMenu::_activate_submenu(int p_over, bool p_by_keyboard) { Rect2 safe_area = this_rect; safe_area.position.y += items[p_over]._ofs_cache + scroll_offset + theme_cache.panel_style->get_offset().height - theme_cache.v_separation / 2; - safe_area.size.y = items[p_over]._height_cache; + safe_area.size.y = items[p_over]._height_cache + theme_cache.v_separation; DisplayServer::get_singleton()->window_set_popup_safe_rect(submenu_popup->get_window_id(), safe_area); // Make the position of the parent popup relative to submenu popup. diff --git a/scene/gui/rich_text_effect.h b/scene/gui/rich_text_effect.h index 66b8a21760..886442bc80 100644 --- a/scene/gui/rich_text_effect.h +++ b/scene/gui/rich_text_effect.h @@ -79,7 +79,7 @@ public: uint32_t get_glyph_index() const { return glyph_index; }; void set_glyph_index(uint32_t p_glyph_index) { glyph_index = p_glyph_index; }; - uint16_t get_glyph_flags() const { return glyph_index; }; + uint16_t get_glyph_flags() const { return glyph_flags; }; void set_glyph_flags(uint16_t p_glyph_flags) { glyph_flags = p_glyph_flags; }; uint8_t get_glyph_count() const { return glyph_count; }; diff --git a/scene/gui/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index 60d107cce6..a0f2096009 100644 --- a/scene/gui/rich_text_label.cpp +++ b/scene/gui/rich_text_label.cpp @@ -150,7 +150,12 @@ RichTextLabel::Item *RichTextLabel::_get_item_at_pos(RichTextLabel::Item *p_item return it; } } break; - case ITEM_IMAGE: + case ITEM_IMAGE: { + offset += 1; + if (offset > p_position) { + return it; + } + } break; case ITEM_TABLE: { offset += 1; } break; @@ -325,7 +330,11 @@ float RichTextLabel::_resize_line(ItemFrame *p_frame, int p_line, const Ref<Font if (table->columns[i].expand && total_ratio > 0 && remaining_width > 0) { table->columns[i].width += table->columns[i].expand_ratio * remaining_width / total_ratio; } - table->total_width += table->columns[i].width + theme_cache.table_h_separation; + if (i != col_count - 1) { + table->total_width += table->columns[i].width + theme_cache.table_h_separation; + } else { + table->total_width += table->columns[i].width; + } } // Resize to max_width if needed and distribute the remaining space. @@ -366,6 +375,7 @@ float RichTextLabel::_resize_line(ItemFrame *p_frame, int p_line, const Ref<Font idx = 0; table->total_height = 0; table->rows.clear(); + table->rows_baseline.clear(); Vector2 offset; float row_height = 0.0; @@ -379,13 +389,13 @@ float RichTextLabel::_resize_line(ItemFrame *p_frame, int p_line, const Ref<Font offset.x += frame->padding.position.x; float yofs = frame->padding.position.y; float prev_h = 0; + float row_baseline = 0.0; for (int i = 0; i < (int)frame->lines.size(); i++) { MutexLock sub_lock(frame->lines[i].text_buf->get_mutex()); frame->lines[i].text_buf->set_width(table->columns[column].width); table->columns[column].width = MAX(table->columns[column].width, ceil(frame->lines[i].text_buf->get_size().x)); frame->lines[i].offset.y = prev_h; - frame->lines[i].offset += offset; float h = frame->lines[i].text_buf->get_size().y + (frame->lines[i].text_buf->get_line_count() - 1) * theme_cache.line_separation; if (i > 0) { @@ -399,6 +409,9 @@ float RichTextLabel::_resize_line(ItemFrame *p_frame, int p_line, const Ref<Font } yofs += h; prev_h = frame->lines[i].offset.y + frame->lines[i].text_buf->get_size().y + frame->lines[i].text_buf->get_line_count() * theme_cache.line_separation; + + frame->lines[i].offset += offset; + row_baseline = MAX(row_baseline, frame->lines[i].text_buf->get_line_ascent(frame->lines[i].text_buf->get_line_count() - 1)); } yofs += frame->padding.size.y; offset.x += table->columns[column].width + theme_cache.table_h_separation + frame->padding.size.x; @@ -410,11 +423,17 @@ float RichTextLabel::_resize_line(ItemFrame *p_frame, int p_line, const Ref<Font table->total_height += row_height; offset.y += row_height; table->rows.push_back(row_height); + table->rows_baseline.push_back(table->total_height - row_height + row_baseline); row_height = 0; } idx++; } - l.text_buf->resize_object((uint64_t)it, Size2(table->total_width, table->total_height), table->inline_align); + int row_idx = (table->align_to_row < 0) ? table->rows_baseline.size() - 1 : table->align_to_row; + if (table->rows_baseline.size() != 0 && row_idx < (int)table->rows_baseline.size() - 1) { + l.text_buf->resize_object((uint64_t)it, Size2(table->total_width, table->total_height), table->inline_align, Math::round(table->rows_baseline[row_idx])); + } else { + l.text_buf->resize_object((uint64_t)it, Size2(table->total_width, table->total_height), table->inline_align); + } } break; default: break; @@ -600,7 +619,11 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font> if (table->columns[i].expand && total_ratio > 0 && remaining_width > 0) { table->columns[i].width += table->columns[i].expand_ratio * remaining_width / total_ratio; } - table->total_width += table->columns[i].width + theme_cache.table_h_separation; + if (i != col_count - 1) { + table->total_width += table->columns[i].width + theme_cache.table_h_separation; + } else { + table->total_width += table->columns[i].width; + } } // Resize to max_width if needed and distribute the remaining space. @@ -641,6 +664,7 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font> idx = 0; table->total_height = 0; table->rows.clear(); + table->rows_baseline.clear(); Vector2 offset; float row_height = 0.0; @@ -654,6 +678,7 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font> offset.x += frame->padding.position.x; float yofs = frame->padding.position.y; float prev_h = 0; + float row_baseline = 0.0; for (int i = 0; i < (int)frame->lines.size(); i++) { MutexLock sub_lock(frame->lines[i].text_buf->get_mutex()); @@ -661,7 +686,6 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font> table->columns[column].width = MAX(table->columns[column].width, ceil(frame->lines[i].text_buf->get_size().x)); frame->lines[i].offset.y = prev_h; - frame->lines[i].offset += offset; float h = frame->lines[i].text_buf->get_size().y + (frame->lines[i].text_buf->get_line_count() - 1) * theme_cache.line_separation; if (i > 0) { @@ -675,6 +699,9 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font> } yofs += h; prev_h = frame->lines[i].offset.y + frame->lines[i].text_buf->get_size().y + frame->lines[i].text_buf->get_line_count() * theme_cache.line_separation; + + frame->lines[i].offset += offset; + row_baseline = MAX(row_baseline, frame->lines[i].text_buf->get_line_ascent(frame->lines[i].text_buf->get_line_count() - 1)); } yofs += frame->padding.size.y; offset.x += table->columns[column].width + theme_cache.table_h_separation + frame->padding.size.x; @@ -687,12 +714,17 @@ float RichTextLabel::_shape_line(ItemFrame *p_frame, int p_line, const Ref<Font> table->total_height += row_height; offset.y += row_height; table->rows.push_back(row_height); + table->rows_baseline.push_back(table->total_height - row_height + row_baseline); row_height = 0; } idx++; } - - l.text_buf->add_object((uint64_t)it, Size2(table->total_width, table->total_height), table->inline_align, t_char_count); + int row_idx = (table->align_to_row < 0) ? table->rows_baseline.size() - 1 : table->align_to_row; + if (table->rows_baseline.size() != 0 && row_idx < (int)table->rows_baseline.size() - 1) { + l.text_buf->add_object((uint64_t)it, Size2(table->total_width, table->total_height), table->inline_align, t_char_count, Math::round(table->rows_baseline[row_idx])); + } else { + l.text_buf->add_object((uint64_t)it, Size2(table->total_width, table->total_height), table->inline_align, t_char_count); + } txt += String::chr(0xfffc).repeat(t_char_count); } break; default: @@ -1854,10 +1886,6 @@ void RichTextLabel::_notification(int p_what) { } Control::CursorShape RichTextLabel::get_cursor_shape(const Point2 &p_pos) const { - if (!underline_meta) { - return get_default_cursor_shape(); - } - if (selection.click_item) { return CURSOR_IBEAM; } @@ -3302,7 +3330,7 @@ void RichTextLabel::push_hint(const String &p_string) { _add_item(item, true); } -void RichTextLabel::push_table(int p_columns, InlineAlignment p_alignment) { +void RichTextLabel::push_table(int p_columns, InlineAlignment p_alignment, int p_align_to_row) { _stop_thread(); MutexLock data_lock(data_mutex); @@ -3312,6 +3340,7 @@ void RichTextLabel::push_table(int p_columns, InlineAlignment p_alignment) { item->columns.resize(p_columns); item->total_width = 0; item->inline_align = p_alignment; + item->align_to_row = p_align_to_row; for (int i = 0; i < (int)item->columns.size(); i++) { item->columns[i].expand = false; item->columns[i].expand_ratio = 1; @@ -3792,6 +3821,8 @@ void RichTextLabel::append_text(const String &p_bbcode) { alignment = INLINE_ALIGNMENT_TOP_TO; } else if (subtag[1] == "center" || subtag[1] == "c") { alignment = INLINE_ALIGNMENT_CENTER_TO; + } else if (subtag[1] == "baseline" || subtag[1] == "l") { + alignment = INLINE_ALIGNMENT_BASELINE_TO; } else if (subtag[1] == "bottom" || subtag[1] == "b") { alignment = INLINE_ALIGNMENT_BOTTOM_TO; } @@ -3813,8 +3844,12 @@ void RichTextLabel::append_text(const String &p_bbcode) { alignment = INLINE_ALIGNMENT_BOTTOM; } } + int row = -1; + if (subtag.size() > 3) { + row = subtag[3].to_int(); + } - push_table(columns, (InlineAlignment)alignment); + push_table(columns, (InlineAlignment)alignment, row); pos = brk_end + 1; tag_stack.push_front("table"); } else if (tag == "cell") { @@ -3866,6 +3901,11 @@ void RichTextLabel::append_text(const String &p_bbcode) { Color color1 = Color::from_string(subtag_a[1], fallback_color); set_cell_row_background_color(color1, color1); } + } else if (subtag_a[0] == "padding") { + Vector<String> subtag_b = subtag_a[1].split(","); + if (subtag_b.size() == 4) { + set_cell_padding(Rect2(subtag_b[0].to_float(), subtag_b[1].to_float(), subtag_b[2].to_float(), subtag_b[3].to_float())); + } } } } @@ -5291,7 +5331,7 @@ void RichTextLabel::_bind_methods() { ClassDB::bind_method(D_METHOD("push_hint", "description"), &RichTextLabel::push_hint); ClassDB::bind_method(D_METHOD("push_underline"), &RichTextLabel::push_underline); ClassDB::bind_method(D_METHOD("push_strikethrough"), &RichTextLabel::push_strikethrough); - ClassDB::bind_method(D_METHOD("push_table", "columns", "inline_align"), &RichTextLabel::push_table, DEFVAL(INLINE_ALIGNMENT_TOP)); + ClassDB::bind_method(D_METHOD("push_table", "columns", "inline_align", "align_to_row"), &RichTextLabel::push_table, DEFVAL(INLINE_ALIGNMENT_TOP), DEFVAL(-1)); ClassDB::bind_method(D_METHOD("push_dropcap", "string", "font", "size", "dropcap_margins", "color", "outline_size", "outline_color"), &RichTextLabel::push_dropcap, DEFVAL(Rect2()), DEFVAL(Color(1, 1, 1)), DEFVAL(0), DEFVAL(Color(0, 0, 0, 0))); ClassDB::bind_method(D_METHOD("set_table_column_expand", "column", "expand", "ratio"), &RichTextLabel::set_table_column_expand); ClassDB::bind_method(D_METHOD("set_cell_row_background_color", "odd_row_bg", "even_row_bg"), &RichTextLabel::set_cell_row_background_color); diff --git a/scene/gui/rich_text_label.h b/scene/gui/rich_text_label.h index b00cc3d055..7aa6e6fa2a 100644 --- a/scene/gui/rich_text_label.h +++ b/scene/gui/rich_text_label.h @@ -268,7 +268,9 @@ private: LocalVector<Column> columns; LocalVector<float> rows; + LocalVector<float> rows_baseline; + int align_to_row = -1; int total_width = 0; int total_height = 0; InlineAlignment inline_align = INLINE_ALIGNMENT_TOP; @@ -592,7 +594,7 @@ public: void push_list(int p_level, ListType p_list, bool p_capitalize); void push_meta(const Variant &p_meta); void push_hint(const String &p_string); - void push_table(int p_columns, InlineAlignment p_alignment = INLINE_ALIGNMENT_TOP); + void push_table(int p_columns, InlineAlignment p_alignment = INLINE_ALIGNMENT_TOP, int p_align_to_row = -1); void push_fade(int p_start_index, int p_length); void push_shake(int p_strength, float p_rate, bool p_connected); void push_wave(float p_frequency, float p_amplitude, bool p_connected); diff --git a/scene/gui/scroll_bar.cpp b/scene/gui/scroll_bar.cpp index 6899178885..a44ddff507 100644 --- a/scene/gui/scroll_bar.cpp +++ b/scene/gui/scroll_bar.cpp @@ -550,7 +550,7 @@ void ScrollBar::_drag_node_input(const Ref<InputEvent> &p_input) { drag_node_accum = Vector2(); last_drag_node_accum = Vector2(); drag_node_from = Vector2(orientation == HORIZONTAL ? get_value() : 0, orientation == VERTICAL ? get_value() : 0); - drag_node_touching = DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id())); + drag_node_touching = DisplayServer::get_singleton()->is_touchscreen_available(); drag_node_touching_deaccel = false; time_since_motion = 0; diff --git a/scene/gui/scroll_container.cpp b/scene/gui/scroll_container.cpp index 531226f938..73d30b7568 100644 --- a/scene/gui/scroll_container.cpp +++ b/scene/gui/scroll_container.cpp @@ -164,8 +164,8 @@ void ScrollContainer::gui_input(const Ref<InputEvent> &p_gui_input) { } } - bool screen_is_touchscreen = DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id())); - if (!screen_is_touchscreen) { + bool is_touchscreen_available = DisplayServer::get_singleton()->is_touchscreen_available(); + if (!is_touchscreen_available) { return; } diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp index a96d85dffa..6d9e8a90c2 100644 --- a/scene/gui/text_edit.cpp +++ b/scene/gui/text_edit.cpp @@ -680,7 +680,7 @@ void TextEdit::_notification(int p_what) { } } - bool draw_placeholder = text.size() == 1 && text[0].length() == 0; + bool draw_placeholder = text.size() == 1 && text[0].is_empty() && ime_text.is_empty(); // Get the highlighted words. String highlighted_text = get_selected_text(0); diff --git a/scene/gui/tree.cpp b/scene/gui/tree.cpp index c0990211aa..79bad44e15 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -2471,6 +2471,8 @@ bool Tree::_is_sibling_branch_selected(TreeItem *p_from) const { } void Tree::select_single_item(TreeItem *p_selected, TreeItem *p_current, int p_col, TreeItem *p_prev, bool *r_in_range, bool p_force_deselect) { + popup_editor->hide(); + TreeItem::Cell &selected_cell = p_selected->cells.write[p_col]; bool switched = false; @@ -3671,7 +3673,7 @@ void Tree::gui_input(const Ref<InputEvent> &p_event) { drag_accum = 0; //last_drag_accum=0; drag_from = v_scroll->get_value(); - drag_touching = DisplayServer::get_singleton()->screen_is_touchscreen(DisplayServer::get_singleton()->window_get_current_screen(get_viewport()->get_window_id())); + drag_touching = DisplayServer::get_singleton()->is_touchscreen_available(); drag_touching_deaccel = false; if (drag_touching) { set_physics_process_internal(true); @@ -3783,7 +3785,9 @@ bool Tree::edit_selected() { } else if (c.mode == TreeItem::CELL_MODE_STRING || c.mode == TreeItem::CELL_MODE_RANGE) { Rect2 popup_rect; - Vector2 ofs(0, Math::floor((text_editor->get_size().height - rect.size.height) / 2)); // "floor()" centers vertically. + int value_editor_height = c.mode == TreeItem::CELL_MODE_RANGE ? value_editor->get_minimum_size().height : 0; + // "floor()" centers vertically. + Vector2 ofs(0, Math::floor((MAX(text_editor->get_minimum_size().height, rect.size.height - value_editor_height) - rect.size.height) / 2)); Point2i textedpos = get_screen_position() + rect.position - ofs; cache.text_editor_position = textedpos; @@ -3799,7 +3803,7 @@ bool Tree::edit_selected() { text_editor->select_all(); if (c.mode == TreeItem::CELL_MODE_RANGE) { - popup_rect.size.y += value_editor->get_minimum_size().height; + popup_rect.size.y += value_editor_height; value_editor->show(); updating_value_editor = true; @@ -4216,7 +4220,9 @@ Tree::SelectMode Tree::get_select_mode() const { void Tree::deselect_all() { TreeItem *item = get_next_selected(get_root()); while (item) { - item->deselect(selected_col); + for (int i = 0; i < columns.size(); i++) { + item->deselect(i); + } TreeItem *prev_item = item; item = get_next_selected(get_root()); ERR_FAIL_COND(item == prev_item); @@ -5277,7 +5283,6 @@ Tree::Tree() { add_child(popup_menu, false, INTERNAL_MODE_FRONT); popup_editor = memnew(Popup); - popup_editor->set_wrap_controls(true); add_child(popup_editor, false, INTERNAL_MODE_FRONT); popup_editor_vb = memnew(VBoxContainer); popup_editor->add_child(popup_editor_vb); @@ -5286,11 +5291,9 @@ Tree::Tree() { text_editor = memnew(LineEdit); popup_editor_vb->add_child(text_editor); text_editor->set_v_size_flags(SIZE_EXPAND_FILL); - text_editor->set_h_size_flags(SIZE_EXPAND_FILL); value_editor = memnew(HSlider); - value_editor->set_v_size_flags(SIZE_EXPAND_FILL); - value_editor->set_h_size_flags(SIZE_EXPAND_FILL); popup_editor_vb->add_child(value_editor); + value_editor->set_v_size_flags(SIZE_EXPAND_FILL); value_editor->hide(); h_scroll = memnew(HScrollBar); diff --git a/scene/main/canvas_item.cpp b/scene/main/canvas_item.cpp index 2563fa5914..f3812eb497 100644 --- a/scene/main/canvas_item.cpp +++ b/scene/main/canvas_item.cpp @@ -144,7 +144,7 @@ void CanvasItem::_redraw_callback() { Transform2D CanvasItem::get_global_transform_with_canvas() const { if (canvas_layer) { - return canvas_layer->get_transform() * get_global_transform(); + return canvas_layer->get_final_transform() * get_global_transform(); } else if (is_inside_tree()) { return get_viewport()->get_canvas_transform() * get_global_transform(); } else { @@ -621,10 +621,10 @@ void CanvasItem::draw_texture_rect_region(const Ref<Texture2D> &p_texture, const p_texture->draw_rect_region(canvas_item, p_rect, p_src_rect, p_modulate, p_transpose, p_clip_uv); } -void CanvasItem::draw_msdf_texture_rect_region(const Ref<Texture2D> &p_texture, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, double p_outline, double p_pixel_range) { +void CanvasItem::draw_msdf_texture_rect_region(const Ref<Texture2D> &p_texture, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate, double p_outline, double p_pixel_range, double p_scale) { ERR_FAIL_COND_MSG(!drawing, "Drawing is only allowed inside NOTIFICATION_DRAW, _draw() function or 'draw' signal."); ERR_FAIL_COND(p_texture.is_null()); - RenderingServer::get_singleton()->canvas_item_add_msdf_texture_rect_region(canvas_item, p_rect, p_texture->get_rid(), p_src_rect, p_modulate, p_outline, p_pixel_range); + RenderingServer::get_singleton()->canvas_item_add_msdf_texture_rect_region(canvas_item, p_rect, p_texture->get_rid(), p_src_rect, p_modulate, p_outline, p_pixel_range, p_scale); } void CanvasItem::draw_lcd_texture_rect_region(const Ref<Texture2D> &p_texture, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate) { @@ -950,14 +950,14 @@ void CanvasItem::_bind_methods() { ClassDB::bind_method(D_METHOD("set_self_modulate", "self_modulate"), &CanvasItem::set_self_modulate); ClassDB::bind_method(D_METHOD("get_self_modulate"), &CanvasItem::get_self_modulate); - ClassDB::bind_method(D_METHOD("set_z_index", "z_index"), &Node2D::set_z_index); - ClassDB::bind_method(D_METHOD("get_z_index"), &Node2D::get_z_index); + ClassDB::bind_method(D_METHOD("set_z_index", "z_index"), &CanvasItem::set_z_index); + ClassDB::bind_method(D_METHOD("get_z_index"), &CanvasItem::get_z_index); - ClassDB::bind_method(D_METHOD("set_z_as_relative", "enable"), &Node2D::set_z_as_relative); - ClassDB::bind_method(D_METHOD("is_z_relative"), &Node2D::is_z_relative); + ClassDB::bind_method(D_METHOD("set_z_as_relative", "enable"), &CanvasItem::set_z_as_relative); + ClassDB::bind_method(D_METHOD("is_z_relative"), &CanvasItem::is_z_relative); - ClassDB::bind_method(D_METHOD("set_y_sort_enabled", "enabled"), &Node2D::set_y_sort_enabled); - ClassDB::bind_method(D_METHOD("is_y_sort_enabled"), &Node2D::is_y_sort_enabled); + ClassDB::bind_method(D_METHOD("set_y_sort_enabled", "enabled"), &CanvasItem::set_y_sort_enabled); + ClassDB::bind_method(D_METHOD("is_y_sort_enabled"), &CanvasItem::is_y_sort_enabled); ClassDB::bind_method(D_METHOD("set_draw_behind_parent", "enable"), &CanvasItem::set_draw_behind_parent); ClassDB::bind_method(D_METHOD("is_draw_behind_parent_enabled"), &CanvasItem::is_draw_behind_parent_enabled); @@ -974,7 +974,7 @@ void CanvasItem::_bind_methods() { ClassDB::bind_method(D_METHOD("draw_texture", "texture", "position", "modulate"), &CanvasItem::draw_texture, DEFVAL(Color(1, 1, 1, 1))); ClassDB::bind_method(D_METHOD("draw_texture_rect", "texture", "rect", "tile", "modulate", "transpose"), &CanvasItem::draw_texture_rect, DEFVAL(Color(1, 1, 1, 1)), DEFVAL(false)); ClassDB::bind_method(D_METHOD("draw_texture_rect_region", "texture", "rect", "src_rect", "modulate", "transpose", "clip_uv"), &CanvasItem::draw_texture_rect_region, DEFVAL(Color(1, 1, 1, 1)), DEFVAL(false), DEFVAL(true)); - ClassDB::bind_method(D_METHOD("draw_msdf_texture_rect_region", "texture", "rect", "src_rect", "modulate", "outline", "pixel_range"), &CanvasItem::draw_msdf_texture_rect_region, DEFVAL(Color(1, 1, 1, 1)), DEFVAL(0.0), DEFVAL(4.0)); + ClassDB::bind_method(D_METHOD("draw_msdf_texture_rect_region", "texture", "rect", "src_rect", "modulate", "outline", "pixel_range", "scale"), &CanvasItem::draw_msdf_texture_rect_region, DEFVAL(Color(1, 1, 1, 1)), DEFVAL(0.0), DEFVAL(4.0), DEFVAL(1.0)); ClassDB::bind_method(D_METHOD("draw_lcd_texture_rect_region", "texture", "rect", "src_rect", "modulate"), &CanvasItem::draw_lcd_texture_rect_region, DEFVAL(Color(1, 1, 1, 1))); ClassDB::bind_method(D_METHOD("draw_style_box", "style_box", "rect"), &CanvasItem::draw_style_box); ClassDB::bind_method(D_METHOD("draw_primitive", "points", "colors", "uvs", "texture", "width"), &CanvasItem::draw_primitive, DEFVAL(Ref<Texture2D>()), DEFVAL(1.0)); @@ -1099,7 +1099,7 @@ Transform2D CanvasItem::get_canvas_transform() const { ERR_FAIL_COND_V(!is_inside_tree(), Transform2D()); if (canvas_layer) { - return canvas_layer->get_transform(); + return canvas_layer->get_final_transform(); } else if (Object::cast_to<CanvasItem>(get_parent())) { return Object::cast_to<CanvasItem>(get_parent())->get_canvas_transform(); } else { @@ -1111,7 +1111,7 @@ Transform2D CanvasItem::get_viewport_transform() const { ERR_FAIL_COND_V(!is_inside_tree(), Transform2D()); if (canvas_layer) { - return get_viewport()->get_final_transform() * canvas_layer->get_transform(); + return get_viewport()->get_final_transform() * canvas_layer->get_final_transform(); } else { return get_viewport()->get_final_transform() * get_viewport()->get_canvas_transform(); } diff --git a/scene/main/canvas_item.h b/scene/main/canvas_item.h index 4ace982825..bae03d706a 100644 --- a/scene/main/canvas_item.h +++ b/scene/main/canvas_item.h @@ -259,7 +259,7 @@ public: void draw_texture(const Ref<Texture2D> &p_texture, const Point2 &p_pos, const Color &p_modulate = Color(1, 1, 1, 1)); void draw_texture_rect(const Ref<Texture2D> &p_texture, const Rect2 &p_rect, bool p_tile = false, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false); void draw_texture_rect_region(const Ref<Texture2D> &p_texture, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false, bool p_clip_uv = false); - void draw_msdf_texture_rect_region(const Ref<Texture2D> &p_texture, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), double p_outline = 0.0, double p_pixel_range = 4.0); + void draw_msdf_texture_rect_region(const Ref<Texture2D> &p_texture, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), double p_outline = 0.0, double p_pixel_range = 4.0, double p_scale = 1.0); void draw_lcd_texture_rect_region(const Ref<Texture2D> &p_texture, const Rect2 &p_rect, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1)); void draw_style_box(const Ref<StyleBox> &p_style_box, const Rect2 &p_rect); void draw_primitive(const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, Ref<Texture2D> p_texture = Ref<Texture2D>(), real_t p_width = 1); diff --git a/scene/main/canvas_layer.cpp b/scene/main/canvas_layer.cpp index 5fde18721a..97b784e9d0 100644 --- a/scene/main/canvas_layer.cpp +++ b/scene/main/canvas_layer.cpp @@ -88,6 +88,18 @@ Transform2D CanvasLayer::get_transform() const { return transform; } +Transform2D CanvasLayer::get_final_transform() const { + if (is_following_viewport()) { + Transform2D follow; + follow.scale(Vector2(get_follow_viewport_scale(), get_follow_viewport_scale())); + if (vp) { + follow = vp->get_canvas_transform() * follow; + } + return follow * transform; + } + return transform; +} + void CanvasLayer::_update_xform() { transform.set_rotation_and_scale(rot, scale); transform.set_origin(ofs); @@ -304,6 +316,7 @@ void CanvasLayer::_bind_methods() { ClassDB::bind_method(D_METHOD("set_transform", "transform"), &CanvasLayer::set_transform); ClassDB::bind_method(D_METHOD("get_transform"), &CanvasLayer::get_transform); + ClassDB::bind_method(D_METHOD("get_final_transform"), &CanvasLayer::get_final_transform); ClassDB::bind_method(D_METHOD("set_offset", "offset"), &CanvasLayer::set_offset); ClassDB::bind_method(D_METHOD("get_offset"), &CanvasLayer::get_offset); diff --git a/scene/main/canvas_layer.h b/scene/main/canvas_layer.h index 74b5ebd453..2afc842a50 100644 --- a/scene/main/canvas_layer.h +++ b/scene/main/canvas_layer.h @@ -77,6 +77,7 @@ public: void set_transform(const Transform2D &p_xform); Transform2D get_transform() const; + Transform2D get_final_transform() const; void set_offset(const Vector2 &p_offset); Vector2 get_offset() const; diff --git a/scene/main/multiplayer_peer.h b/scene/main/multiplayer_peer.h index 4b5909538e..fa6b11e5db 100644 --- a/scene/main/multiplayer_peer.h +++ b/scene/main/multiplayer_peer.h @@ -112,11 +112,11 @@ protected: public: /* PacketPeer extension */ virtual Error get_packet(const uint8_t **r_buffer, int &r_buffer_size) override; ///< buffer is GONE after next get_packet - GDVIRTUAL2R(Error, _get_packet, GDNativeConstPtr<const uint8_t *>, GDNativePtr<int>); + GDVIRTUAL2R(Error, _get_packet, GDExtensionConstPtr<const uint8_t *>, GDExtensionPtr<int>); GDVIRTUAL0R(PackedByteArray, _get_packet_script); // For GDScript. virtual Error put_packet(const uint8_t *p_buffer, int p_buffer_size) override; - GDVIRTUAL2R(Error, _put_packet, GDNativeConstPtr<const uint8_t>, int); + GDVIRTUAL2R(Error, _put_packet, GDExtensionConstPtr<const uint8_t>, int); GDVIRTUAL1R(Error, _put_packet_script, PackedByteArray); // For GDScript. EXBIND0RC(int, get_available_packet_count); diff --git a/scene/main/scene_tree.cpp b/scene/main/scene_tree.cpp index ceb5b76ff2..e61cca0a0f 100644 --- a/scene/main/scene_tree.cpp +++ b/scene/main/scene_tree.cpp @@ -594,6 +594,12 @@ void SceneTree::finalize() { timer->release_connections(); } timers.clear(); + + // Cleanup tweens. + for (Ref<Tween> &tween : tweens) { + tween->clear(); + } + tweens.clear(); } void SceneTree::quit(int p_exit_code) { @@ -942,6 +948,9 @@ void SceneTree::_call_input_pause(const StringName &p_group, CallInputType p_cal } for (const ObjectID &id : no_context_node_ids) { + if (p_viewport->is_input_handled()) { + break; + } Node *n = Object::cast_to<Node>(ObjectDB::get_instance(id)); if (n) { n->_call_shortcut_input(p_input); @@ -1413,7 +1422,7 @@ SceneTree::SceneTree() { ProjectSettings::get_singleton()->set_custom_property_info("rendering/anti_aliasing/quality/msaa_3d", PropertyInfo(Variant::INT, "rendering/anti_aliasing/quality/msaa_3d", PROPERTY_HINT_ENUM, String::utf8("Disabled (Fastest),2× (Average),4× (Slow),8× (Slowest)"))); root->set_msaa_3d(Viewport::MSAA(msaa_mode_3d)); - const bool transparent_background = GLOBAL_DEF("rendering/transparent_background", false); + const bool transparent_background = GLOBAL_DEF("rendering/viewport/transparent_background", false); root->set_transparent_background(transparent_background); const int ssaa_mode = GLOBAL_DEF_BASIC("rendering/anti_aliasing/quality/screen_space_aa", 0); diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp index fdbcb20d30..afc31ae480 100644 --- a/scene/main/viewport.cpp +++ b/scene/main/viewport.cpp @@ -642,7 +642,7 @@ void Viewport::_process_picking() { ObjectID canvas_layer_id; if (E) { // A descendant CanvasLayer. - canvas_layer_transform = E->get_transform(); + canvas_layer_transform = E->get_final_transform(); canvas_layer_id = E->get_instance_id(); } else { // This Viewport's builtin canvas. diff --git a/scene/main/window.cpp b/scene/main/window.cpp index aff2c594d9..c71c3e195b 100644 --- a/scene/main/window.cpp +++ b/scene/main/window.cpp @@ -40,6 +40,218 @@ #include "scene/theme/theme_db.h" #include "scene/theme/theme_owner.h" +// Dynamic properties. + +bool Window::_set(const StringName &p_name, const Variant &p_value) { + String name = p_name; + if (!name.begins_with("theme_override")) { + return false; + } + + if (p_value.get_type() == Variant::NIL || (p_value.get_type() == Variant::OBJECT && (Object *)p_value == nullptr)) { + if (name.begins_with("theme_override_icons/")) { + String dname = name.get_slicec('/', 1); + if (theme_icon_override.has(dname)) { + theme_icon_override[dname]->disconnect("changed", callable_mp(this, &Window::_notify_theme_override_changed)); + } + theme_icon_override.erase(dname); + _notify_theme_override_changed(); + } else if (name.begins_with("theme_override_styles/")) { + String dname = name.get_slicec('/', 1); + if (theme_style_override.has(dname)) { + theme_style_override[dname]->disconnect("changed", callable_mp(this, &Window::_notify_theme_override_changed)); + } + theme_style_override.erase(dname); + _notify_theme_override_changed(); + } else if (name.begins_with("theme_override_fonts/")) { + String dname = name.get_slicec('/', 1); + if (theme_font_override.has(dname)) { + theme_font_override[dname]->disconnect("changed", callable_mp(this, &Window::_notify_theme_override_changed)); + } + theme_font_override.erase(dname); + _notify_theme_override_changed(); + } else if (name.begins_with("theme_override_font_sizes/")) { + String dname = name.get_slicec('/', 1); + theme_font_size_override.erase(dname); + _notify_theme_override_changed(); + } else if (name.begins_with("theme_override_colors/")) { + String dname = name.get_slicec('/', 1); + theme_color_override.erase(dname); + _notify_theme_override_changed(); + } else if (name.begins_with("theme_override_constants/")) { + String dname = name.get_slicec('/', 1); + theme_constant_override.erase(dname); + _notify_theme_override_changed(); + } else { + return false; + } + + } else { + if (name.begins_with("theme_override_icons/")) { + String dname = name.get_slicec('/', 1); + add_theme_icon_override(dname, p_value); + } else if (name.begins_with("theme_override_styles/")) { + String dname = name.get_slicec('/', 1); + add_theme_style_override(dname, p_value); + } else if (name.begins_with("theme_override_fonts/")) { + String dname = name.get_slicec('/', 1); + add_theme_font_override(dname, p_value); + } else if (name.begins_with("theme_override_font_sizes/")) { + String dname = name.get_slicec('/', 1); + add_theme_font_size_override(dname, p_value); + } else if (name.begins_with("theme_override_colors/")) { + String dname = name.get_slicec('/', 1); + add_theme_color_override(dname, p_value); + } else if (name.begins_with("theme_override_constants/")) { + String dname = name.get_slicec('/', 1); + add_theme_constant_override(dname, p_value); + } else { + return false; + } + } + return true; +} + +bool Window::_get(const StringName &p_name, Variant &r_ret) const { + String sname = p_name; + if (!sname.begins_with("theme_override")) { + return false; + } + + if (sname.begins_with("theme_override_icons/")) { + String name = sname.get_slicec('/', 1); + r_ret = theme_icon_override.has(name) ? Variant(theme_icon_override[name]) : Variant(); + } else if (sname.begins_with("theme_override_styles/")) { + String name = sname.get_slicec('/', 1); + r_ret = theme_style_override.has(name) ? Variant(theme_style_override[name]) : Variant(); + } else if (sname.begins_with("theme_override_fonts/")) { + String name = sname.get_slicec('/', 1); + r_ret = theme_font_override.has(name) ? Variant(theme_font_override[name]) : Variant(); + } else if (sname.begins_with("theme_override_font_sizes/")) { + String name = sname.get_slicec('/', 1); + r_ret = theme_font_size_override.has(name) ? Variant(theme_font_size_override[name]) : Variant(); + } else if (sname.begins_with("theme_override_colors/")) { + String name = sname.get_slicec('/', 1); + r_ret = theme_color_override.has(name) ? Variant(theme_color_override[name]) : Variant(); + } else if (sname.begins_with("theme_override_constants/")) { + String name = sname.get_slicec('/', 1); + r_ret = theme_constant_override.has(name) ? Variant(theme_constant_override[name]) : Variant(); + } else { + return false; + } + + return true; +} + +void Window::_get_property_list(List<PropertyInfo> *p_list) const { + Ref<Theme> default_theme = ThemeDB::get_singleton()->get_default_theme(); + + p_list->push_back(PropertyInfo(Variant::NIL, TTRC("Theme Overrides"), PROPERTY_HINT_NONE, "theme_override_", PROPERTY_USAGE_GROUP)); + + { + List<StringName> names; + default_theme->get_color_list(get_class_name(), &names); + for (const StringName &E : names) { + uint32_t usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; + if (theme_color_override.has(E)) { + usage |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; + } + + p_list->push_back(PropertyInfo(Variant::COLOR, "theme_override_colors/" + E, PROPERTY_HINT_NONE, "", usage)); + } + } + { + List<StringName> names; + default_theme->get_constant_list(get_class_name(), &names); + for (const StringName &E : names) { + uint32_t usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; + if (theme_constant_override.has(E)) { + usage |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; + } + + p_list->push_back(PropertyInfo(Variant::INT, "theme_override_constants/" + E, PROPERTY_HINT_RANGE, "-16384,16384", usage)); + } + } + { + List<StringName> names; + default_theme->get_font_list(get_class_name(), &names); + for (const StringName &E : names) { + uint32_t usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; + if (theme_font_override.has(E)) { + usage |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; + } + + p_list->push_back(PropertyInfo(Variant::OBJECT, "theme_override_fonts/" + E, PROPERTY_HINT_RESOURCE_TYPE, "Font", usage)); + } + } + { + List<StringName> names; + default_theme->get_font_size_list(get_class_name(), &names); + for (const StringName &E : names) { + uint32_t usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; + if (theme_font_size_override.has(E)) { + usage |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; + } + + p_list->push_back(PropertyInfo(Variant::INT, "theme_override_font_sizes/" + E, PROPERTY_HINT_RANGE, "1,256,1,or_greater,suffix:px", usage)); + } + } + { + List<StringName> names; + default_theme->get_icon_list(get_class_name(), &names); + for (const StringName &E : names) { + uint32_t usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; + if (theme_icon_override.has(E)) { + usage |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; + } + + p_list->push_back(PropertyInfo(Variant::OBJECT, "theme_override_icons/" + E, PROPERTY_HINT_RESOURCE_TYPE, "Texture2D", usage)); + } + } + { + List<StringName> names; + default_theme->get_stylebox_list(get_class_name(), &names); + for (const StringName &E : names) { + uint32_t usage = PROPERTY_USAGE_EDITOR | PROPERTY_USAGE_CHECKABLE; + if (theme_style_override.has(E)) { + usage |= PROPERTY_USAGE_STORAGE | PROPERTY_USAGE_CHECKED; + } + + p_list->push_back(PropertyInfo(Variant::OBJECT, "theme_override_styles/" + E, PROPERTY_HINT_RESOURCE_TYPE, "StyleBox", usage)); + } + } +} + +void Window::_validate_property(PropertyInfo &p_property) const { + if (p_property.name == "theme_type_variation") { + List<StringName> names; + + // Only the default theme and the project theme are used for the list of options. + // This is an imposed limitation to simplify the logic needed to leverage those options. + ThemeDB::get_singleton()->get_default_theme()->get_type_variation_list(get_class_name(), &names); + if (ThemeDB::get_singleton()->get_project_theme().is_valid()) { + ThemeDB::get_singleton()->get_project_theme()->get_type_variation_list(get_class_name(), &names); + } + names.sort_custom<StringName::AlphCompare>(); + + Vector<StringName> unique_names; + String hint_string; + for (const StringName &E : names) { + // Skip duplicate values. + if (unique_names.has(E)) { + continue; + } + + hint_string += String(E) + ","; + unique_names.append(E); + } + + p_property.hint_string = hint_string; + } +} + +// + void Window::set_title(const String &p_title) { title = p_title; @@ -106,9 +318,16 @@ void Window::reset_size() { set_size(Size2i()); } -Size2i Window::get_real_size() const { +Point2i Window::get_position_with_decorations() const { + if (window_id != DisplayServer::INVALID_WINDOW_ID) { + return DisplayServer::get_singleton()->window_get_position_with_decorations(window_id); + } + return position; +} + +Size2i Window::get_size_with_decorations() const { if (window_id != DisplayServer::INVALID_WINDOW_ID) { - return DisplayServer::get_singleton()->window_get_real_size(window_id); + return DisplayServer::get_singleton()->window_get_size_with_decorations(window_id); } return size; } @@ -1316,6 +1535,8 @@ void Window::remove_child_notify(Node *p_child) { } } +// Theming. + void Window::set_theme_owner_node(Node *p_node) { theme_owner->set_owner_node(p_node); } @@ -1369,6 +1590,12 @@ void Window::_theme_changed() { } } +void Window::_notify_theme_override_changed() { + if (!bulk_theme_override && is_inside_tree()) { + notification(NOTIFICATION_THEME_CHANGED); + } +} + void Window::_invalidate_theme_cache() { theme_icon_cache.clear(); theme_style_cache.clear(); @@ -1379,6 +1606,9 @@ void Window::_invalidate_theme_cache() { } void Window::_update_theme_item_cache() { + // Request an update on the next frame to reflect theme changes. + // Updating without a delay can cause a lot of lag. + child_controls_changed(); } void Window::set_theme_type_variation(const StringName &p_theme_type) { @@ -1392,7 +1622,16 @@ StringName Window::get_theme_type_variation() const { return theme_type_variation; } +/// Theme property lookup. + Ref<Texture2D> Window::get_theme_icon(const StringName &p_name, const StringName &p_theme_type) const { + if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == theme_type_variation) { + const Ref<Texture2D> *tex = theme_icon_override.getptr(p_name); + if (tex) { + return *tex; + } + } + if (theme_icon_cache.has(p_theme_type) && theme_icon_cache[p_theme_type].has(p_name)) { return theme_icon_cache[p_theme_type][p_name]; } @@ -1405,6 +1644,13 @@ Ref<Texture2D> Window::get_theme_icon(const StringName &p_name, const StringName } Ref<StyleBox> Window::get_theme_stylebox(const StringName &p_name, const StringName &p_theme_type) const { + if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == theme_type_variation) { + const Ref<StyleBox> *style = theme_style_override.getptr(p_name); + if (style) { + return *style; + } + } + if (theme_style_cache.has(p_theme_type) && theme_style_cache[p_theme_type].has(p_name)) { return theme_style_cache[p_theme_type][p_name]; } @@ -1417,6 +1663,13 @@ Ref<StyleBox> Window::get_theme_stylebox(const StringName &p_name, const StringN } Ref<Font> Window::get_theme_font(const StringName &p_name, const StringName &p_theme_type) const { + if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == theme_type_variation) { + const Ref<Font> *font = theme_font_override.getptr(p_name); + if (font) { + return *font; + } + } + if (theme_font_cache.has(p_theme_type) && theme_font_cache[p_theme_type].has(p_name)) { return theme_font_cache[p_theme_type][p_name]; } @@ -1429,6 +1682,13 @@ Ref<Font> Window::get_theme_font(const StringName &p_name, const StringName &p_t } int Window::get_theme_font_size(const StringName &p_name, const StringName &p_theme_type) const { + if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == theme_type_variation) { + const int *font_size = theme_font_size_override.getptr(p_name); + if (font_size && (*font_size) > 0) { + return *font_size; + } + } + if (theme_font_size_cache.has(p_theme_type) && theme_font_size_cache[p_theme_type].has(p_name)) { return theme_font_size_cache[p_theme_type][p_name]; } @@ -1441,6 +1701,13 @@ int Window::get_theme_font_size(const StringName &p_name, const StringName &p_th } Color Window::get_theme_color(const StringName &p_name, const StringName &p_theme_type) const { + if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == theme_type_variation) { + const Color *color = theme_color_override.getptr(p_name); + if (color) { + return *color; + } + } + if (theme_color_cache.has(p_theme_type) && theme_color_cache[p_theme_type].has(p_name)) { return theme_color_cache[p_theme_type][p_name]; } @@ -1453,6 +1720,13 @@ Color Window::get_theme_color(const StringName &p_name, const StringName &p_them } int Window::get_theme_constant(const StringName &p_name, const StringName &p_theme_type) const { + if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == theme_type_variation) { + const int *constant = theme_constant_override.getptr(p_name); + if (constant) { + return *constant; + } + } + if (theme_constant_cache.has(p_theme_type) && theme_constant_cache[p_theme_type].has(p_name)) { return theme_constant_cache[p_theme_type][p_name]; } @@ -1465,41 +1739,204 @@ int Window::get_theme_constant(const StringName &p_name, const StringName &p_the } bool Window::has_theme_icon(const StringName &p_name, const StringName &p_theme_type) const { + if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == theme_type_variation) { + if (has_theme_icon_override(p_name)) { + return true; + } + } + List<StringName> theme_types; theme_owner->get_theme_type_dependencies(this, p_theme_type, &theme_types); return theme_owner->has_theme_item_in_types(Theme::DATA_TYPE_ICON, p_name, theme_types); } bool Window::has_theme_stylebox(const StringName &p_name, const StringName &p_theme_type) const { + if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == theme_type_variation) { + if (has_theme_stylebox_override(p_name)) { + return true; + } + } + List<StringName> theme_types; theme_owner->get_theme_type_dependencies(this, p_theme_type, &theme_types); return theme_owner->has_theme_item_in_types(Theme::DATA_TYPE_STYLEBOX, p_name, theme_types); } bool Window::has_theme_font(const StringName &p_name, const StringName &p_theme_type) const { + if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == theme_type_variation) { + if (has_theme_font_override(p_name)) { + return true; + } + } + List<StringName> theme_types; theme_owner->get_theme_type_dependencies(this, p_theme_type, &theme_types); return theme_owner->has_theme_item_in_types(Theme::DATA_TYPE_FONT, p_name, theme_types); } bool Window::has_theme_font_size(const StringName &p_name, const StringName &p_theme_type) const { + if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == theme_type_variation) { + if (has_theme_font_size_override(p_name)) { + return true; + } + } + List<StringName> theme_types; theme_owner->get_theme_type_dependencies(this, p_theme_type, &theme_types); return theme_owner->has_theme_item_in_types(Theme::DATA_TYPE_FONT_SIZE, p_name, theme_types); } bool Window::has_theme_color(const StringName &p_name, const StringName &p_theme_type) const { + if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == theme_type_variation) { + if (has_theme_color_override(p_name)) { + return true; + } + } + List<StringName> theme_types; theme_owner->get_theme_type_dependencies(this, p_theme_type, &theme_types); return theme_owner->has_theme_item_in_types(Theme::DATA_TYPE_COLOR, p_name, theme_types); } bool Window::has_theme_constant(const StringName &p_name, const StringName &p_theme_type) const { + if (p_theme_type == StringName() || p_theme_type == get_class_name() || p_theme_type == theme_type_variation) { + if (has_theme_constant_override(p_name)) { + return true; + } + } + List<StringName> theme_types; theme_owner->get_theme_type_dependencies(this, p_theme_type, &theme_types); return theme_owner->has_theme_item_in_types(Theme::DATA_TYPE_CONSTANT, p_name, theme_types); } +/// Local property overrides. + +void Window::add_theme_icon_override(const StringName &p_name, const Ref<Texture2D> &p_icon) { + ERR_FAIL_COND(!p_icon.is_valid()); + + if (theme_icon_override.has(p_name)) { + theme_icon_override[p_name]->disconnect("changed", callable_mp(this, &Window::_notify_theme_override_changed)); + } + + theme_icon_override[p_name] = p_icon; + theme_icon_override[p_name]->connect("changed", callable_mp(this, &Window::_notify_theme_override_changed), CONNECT_REFERENCE_COUNTED); + _notify_theme_override_changed(); +} + +void Window::add_theme_style_override(const StringName &p_name, const Ref<StyleBox> &p_style) { + ERR_FAIL_COND(!p_style.is_valid()); + + if (theme_style_override.has(p_name)) { + theme_style_override[p_name]->disconnect("changed", callable_mp(this, &Window::_notify_theme_override_changed)); + } + + theme_style_override[p_name] = p_style; + theme_style_override[p_name]->connect("changed", callable_mp(this, &Window::_notify_theme_override_changed), CONNECT_REFERENCE_COUNTED); + _notify_theme_override_changed(); +} + +void Window::add_theme_font_override(const StringName &p_name, const Ref<Font> &p_font) { + ERR_FAIL_COND(!p_font.is_valid()); + + if (theme_font_override.has(p_name)) { + theme_font_override[p_name]->disconnect("changed", callable_mp(this, &Window::_notify_theme_override_changed)); + } + + theme_font_override[p_name] = p_font; + theme_font_override[p_name]->connect("changed", callable_mp(this, &Window::_notify_theme_override_changed), CONNECT_REFERENCE_COUNTED); + _notify_theme_override_changed(); +} + +void Window::add_theme_font_size_override(const StringName &p_name, int p_font_size) { + theme_font_size_override[p_name] = p_font_size; + _notify_theme_override_changed(); +} + +void Window::add_theme_color_override(const StringName &p_name, const Color &p_color) { + theme_color_override[p_name] = p_color; + _notify_theme_override_changed(); +} + +void Window::add_theme_constant_override(const StringName &p_name, int p_constant) { + theme_constant_override[p_name] = p_constant; + _notify_theme_override_changed(); +} + +void Window::remove_theme_icon_override(const StringName &p_name) { + if (theme_icon_override.has(p_name)) { + theme_icon_override[p_name]->disconnect("changed", callable_mp(this, &Window::_notify_theme_override_changed)); + } + + theme_icon_override.erase(p_name); + _notify_theme_override_changed(); +} + +void Window::remove_theme_style_override(const StringName &p_name) { + if (theme_style_override.has(p_name)) { + theme_style_override[p_name]->disconnect("changed", callable_mp(this, &Window::_notify_theme_override_changed)); + } + + theme_style_override.erase(p_name); + _notify_theme_override_changed(); +} + +void Window::remove_theme_font_override(const StringName &p_name) { + if (theme_font_override.has(p_name)) { + theme_font_override[p_name]->disconnect("changed", callable_mp(this, &Window::_notify_theme_override_changed)); + } + + theme_font_override.erase(p_name); + _notify_theme_override_changed(); +} + +void Window::remove_theme_font_size_override(const StringName &p_name) { + theme_font_size_override.erase(p_name); + _notify_theme_override_changed(); +} + +void Window::remove_theme_color_override(const StringName &p_name) { + theme_color_override.erase(p_name); + _notify_theme_override_changed(); +} + +void Window::remove_theme_constant_override(const StringName &p_name) { + theme_constant_override.erase(p_name); + _notify_theme_override_changed(); +} + +bool Window::has_theme_icon_override(const StringName &p_name) const { + const Ref<Texture2D> *tex = theme_icon_override.getptr(p_name); + return tex != nullptr; +} + +bool Window::has_theme_stylebox_override(const StringName &p_name) const { + const Ref<StyleBox> *style = theme_style_override.getptr(p_name); + return style != nullptr; +} + +bool Window::has_theme_font_override(const StringName &p_name) const { + const Ref<Font> *font = theme_font_override.getptr(p_name); + return font != nullptr; +} + +bool Window::has_theme_font_size_override(const StringName &p_name) const { + const int *font_size = theme_font_size_override.getptr(p_name); + return font_size != nullptr; +} + +bool Window::has_theme_color_override(const StringName &p_name) const { + const Color *color = theme_color_override.getptr(p_name); + return color != nullptr; +} + +bool Window::has_theme_constant_override(const StringName &p_name) const { + const int *constant = theme_constant_override.getptr(p_name); + return constant != nullptr; +} + +/// Default theme properties. + float Window::get_theme_default_base_scale() const { return theme_owner->get_theme_default_base_scale(); } @@ -1512,6 +1949,21 @@ int Window::get_theme_default_font_size() const { return theme_owner->get_theme_default_font_size(); } +/// Bulk actions. + +void Window::begin_bulk_theme_override() { + bulk_theme_override = true; +} + +void Window::end_bulk_theme_override() { + ERR_FAIL_COND(!bulk_theme_override); + + bulk_theme_override = false; + _notify_theme_override_changed(); +} + +// + Rect2i Window::get_parent_rect() const { ERR_FAIL_COND_V(!is_inside_tree(), Rect2i()); if (is_embedded()) { @@ -1604,34 +2056,6 @@ bool Window::is_auto_translating() const { return auto_translate; } -void Window::_validate_property(PropertyInfo &p_property) const { - if (p_property.name == "theme_type_variation") { - List<StringName> names; - - // Only the default theme and the project theme are used for the list of options. - // This is an imposed limitation to simplify the logic needed to leverage those options. - ThemeDB::get_singleton()->get_default_theme()->get_type_variation_list(get_class_name(), &names); - if (ThemeDB::get_singleton()->get_project_theme().is_valid()) { - ThemeDB::get_singleton()->get_project_theme()->get_type_variation_list(get_class_name(), &names); - } - names.sort_custom<StringName::AlphCompare>(); - - Vector<StringName> unique_names; - String hint_string; - for (const StringName &E : names) { - // Skip duplicate values. - if (unique_names.has(E)) { - continue; - } - - hint_string += String(E) + ","; - unique_names.append(E); - } - - p_property.hint_string = hint_string; - } -} - Transform2D Window::get_screen_transform() const { Transform2D embedder_transform; if (_get_embedder()) { @@ -1655,7 +2079,8 @@ void Window::_bind_methods() { ClassDB::bind_method(D_METHOD("get_size"), &Window::get_size); ClassDB::bind_method(D_METHOD("reset_size"), &Window::reset_size); - ClassDB::bind_method(D_METHOD("get_real_size"), &Window::get_real_size); + ClassDB::bind_method(D_METHOD("get_position_with_decorations"), &Window::get_position_with_decorations); + ClassDB::bind_method(D_METHOD("get_size_with_decorations"), &Window::get_size_with_decorations); ClassDB::bind_method(D_METHOD("set_max_size", "max_size"), &Window::set_max_size); ClassDB::bind_method(D_METHOD("get_max_size"), &Window::get_max_size); @@ -1725,6 +2150,23 @@ void Window::_bind_methods() { ClassDB::bind_method(D_METHOD("set_theme_type_variation", "theme_type"), &Window::set_theme_type_variation); ClassDB::bind_method(D_METHOD("get_theme_type_variation"), &Window::get_theme_type_variation); + ClassDB::bind_method(D_METHOD("begin_bulk_theme_override"), &Window::begin_bulk_theme_override); + ClassDB::bind_method(D_METHOD("end_bulk_theme_override"), &Window::end_bulk_theme_override); + + ClassDB::bind_method(D_METHOD("add_theme_icon_override", "name", "texture"), &Window::add_theme_icon_override); + ClassDB::bind_method(D_METHOD("add_theme_stylebox_override", "name", "stylebox"), &Window::add_theme_style_override); + ClassDB::bind_method(D_METHOD("add_theme_font_override", "name", "font"), &Window::add_theme_font_override); + ClassDB::bind_method(D_METHOD("add_theme_font_size_override", "name", "font_size"), &Window::add_theme_font_size_override); + ClassDB::bind_method(D_METHOD("add_theme_color_override", "name", "color"), &Window::add_theme_color_override); + ClassDB::bind_method(D_METHOD("add_theme_constant_override", "name", "constant"), &Window::add_theme_constant_override); + + ClassDB::bind_method(D_METHOD("remove_theme_icon_override", "name"), &Window::remove_theme_icon_override); + ClassDB::bind_method(D_METHOD("remove_theme_stylebox_override", "name"), &Window::remove_theme_style_override); + ClassDB::bind_method(D_METHOD("remove_theme_font_override", "name"), &Window::remove_theme_font_override); + ClassDB::bind_method(D_METHOD("remove_theme_font_size_override", "name"), &Window::remove_theme_font_size_override); + ClassDB::bind_method(D_METHOD("remove_theme_color_override", "name"), &Window::remove_theme_color_override); + ClassDB::bind_method(D_METHOD("remove_theme_constant_override", "name"), &Window::remove_theme_constant_override); + ClassDB::bind_method(D_METHOD("get_theme_icon", "name", "theme_type"), &Window::get_theme_icon, DEFVAL("")); ClassDB::bind_method(D_METHOD("get_theme_stylebox", "name", "theme_type"), &Window::get_theme_stylebox, DEFVAL("")); ClassDB::bind_method(D_METHOD("get_theme_font", "name", "theme_type"), &Window::get_theme_font, DEFVAL("")); @@ -1732,6 +2174,13 @@ void Window::_bind_methods() { ClassDB::bind_method(D_METHOD("get_theme_color", "name", "theme_type"), &Window::get_theme_color, DEFVAL("")); ClassDB::bind_method(D_METHOD("get_theme_constant", "name", "theme_type"), &Window::get_theme_constant, DEFVAL("")); + ClassDB::bind_method(D_METHOD("has_theme_icon_override", "name"), &Window::has_theme_icon_override); + ClassDB::bind_method(D_METHOD("has_theme_stylebox_override", "name"), &Window::has_theme_stylebox_override); + ClassDB::bind_method(D_METHOD("has_theme_font_override", "name"), &Window::has_theme_font_override); + ClassDB::bind_method(D_METHOD("has_theme_font_size_override", "name"), &Window::has_theme_font_size_override); + ClassDB::bind_method(D_METHOD("has_theme_color_override", "name"), &Window::has_theme_color_override); + ClassDB::bind_method(D_METHOD("has_theme_constant_override", "name"), &Window::has_theme_constant_override); + ClassDB::bind_method(D_METHOD("has_theme_icon", "name", "theme_type"), &Window::has_theme_icon, DEFVAL("")); ClassDB::bind_method(D_METHOD("has_theme_stylebox", "name", "theme_type"), &Window::has_theme_stylebox, DEFVAL("")); ClassDB::bind_method(D_METHOD("has_theme_font", "name", "theme_type"), &Window::has_theme_font, DEFVAL("")); @@ -1785,13 +2234,13 @@ void Window::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "content_scale_aspect", PROPERTY_HINT_ENUM, "Ignore,Keep,Keep Width,Keep Height,Expand"), "set_content_scale_aspect", "get_content_scale_aspect"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "content_scale_factor"), "set_content_scale_factor", "get_content_scale_factor"); + ADD_GROUP("Localization", ""); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "auto_translate"), "set_auto_translate", "is_auto_translating"); + ADD_GROUP("Theme", "theme_"); ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "theme", PROPERTY_HINT_RESOURCE_TYPE, "Theme"), "set_theme", "get_theme"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "theme_type_variation", PROPERTY_HINT_ENUM_SUGGESTION), "set_theme_type_variation", "get_theme_type_variation"); - ADD_GROUP("Auto Translate", ""); - ADD_PROPERTY(PropertyInfo(Variant::BOOL, "auto_translate"), "set_auto_translate", "is_auto_translating"); - ADD_SIGNAL(MethodInfo("window_input", PropertyInfo(Variant::OBJECT, "event", PROPERTY_HINT_RESOURCE_TYPE, "InputEvent"))); ADD_SIGNAL(MethodInfo("files_dropped", PropertyInfo(Variant::PACKED_STRING_ARRAY, "files"))); ADD_SIGNAL(MethodInfo("mouse_entered")); @@ -1851,4 +2300,23 @@ Window::Window() { Window::~Window() { memdelete(theme_owner); + + // Resources need to be disconnected. + for (KeyValue<StringName, Ref<Texture2D>> &E : theme_icon_override) { + E.value->disconnect("changed", callable_mp(this, &Window::_notify_theme_override_changed)); + } + for (KeyValue<StringName, Ref<StyleBox>> &E : theme_style_override) { + E.value->disconnect("changed", callable_mp(this, &Window::_notify_theme_override_changed)); + } + for (KeyValue<StringName, Ref<Font>> &E : theme_font_override) { + E.value->disconnect("changed", callable_mp(this, &Window::_notify_theme_override_changed)); + } + + // Then override maps can be simply cleared. + theme_icon_override.clear(); + theme_style_override.clear(); + theme_font_override.clear(); + theme_font_size_override.clear(); + theme_color_override.clear(); + theme_constant_override.clear(); } diff --git a/scene/main/window.h b/scene/main/window.h index 03597b309a..5024b42587 100644 --- a/scene/main/window.h +++ b/scene/main/window.h @@ -140,6 +140,14 @@ private: Ref<Theme> theme; StringName theme_type_variation; + bool bulk_theme_override = false; + Theme::ThemeIconMap theme_icon_override; + Theme::ThemeStyleMap theme_style_override; + Theme::ThemeFontMap theme_font_override; + Theme::ThemeFontSizeMap theme_font_size_override; + Theme::ThemeColorMap theme_color_override; + Theme::ThemeConstantMap theme_constant_override; + mutable HashMap<StringName, Theme::ThemeIconMap> theme_icon_cache; mutable HashMap<StringName, Theme::ThemeStyleMap> theme_style_cache; mutable HashMap<StringName, Theme::ThemeFontMap> theme_font_cache; @@ -148,6 +156,7 @@ private: mutable HashMap<StringName, Theme::ThemeConstantMap> theme_constant_cache; void _theme_changed(); + void _notify_theme_override_changed(); void _invalidate_theme_cache(); Viewport *embedder = nullptr; @@ -173,6 +182,10 @@ protected: virtual Size2 _get_contents_minimum_size() const; static void _bind_methods(); void _notification(int p_what); + + bool _set(const StringName &p_name, const Variant &p_value); + bool _get(const StringName &p_name, Variant &r_ret) const; + void _get_property_list(List<PropertyInfo> *p_list) const; void _validate_property(PropertyInfo &p_property) const; virtual void add_child_notify(Node *p_child) override; @@ -198,7 +211,8 @@ public: Size2i get_size() const; void reset_size(); - Size2i get_real_size() const; + Point2i get_position_with_decorations() const; + Size2i get_size_with_decorations() const; void set_max_size(const Size2i &p_max_size); Size2i get_max_size() const; @@ -270,16 +284,6 @@ public: void popup_centered(const Size2i &p_minsize = Size2i()); void popup_centered_clamped(const Size2i &p_size = Size2i(), float p_fallback_ratio = 0.75); - void set_theme_owner_node(Node *p_node); - Node *get_theme_owner_node() const; - bool has_theme_owner_node() const; - - void set_theme(const Ref<Theme> &p_theme); - Ref<Theme> get_theme() const; - - void set_theme_type_variation(const StringName &p_theme_type); - StringName get_theme_type_variation() const; - Size2 get_contents_minimum_size() const; void grab_focus(); @@ -295,6 +299,35 @@ public: Rect2i get_usable_parent_rect() const; + // Theming. + + void set_theme_owner_node(Node *p_node); + Node *get_theme_owner_node() const; + bool has_theme_owner_node() const; + + void set_theme(const Ref<Theme> &p_theme); + Ref<Theme> get_theme() const; + + void set_theme_type_variation(const StringName &p_theme_type); + StringName get_theme_type_variation() const; + + void begin_bulk_theme_override(); + void end_bulk_theme_override(); + + void add_theme_icon_override(const StringName &p_name, const Ref<Texture2D> &p_icon); + void add_theme_style_override(const StringName &p_name, const Ref<StyleBox> &p_style); + void add_theme_font_override(const StringName &p_name, const Ref<Font> &p_font); + void add_theme_font_size_override(const StringName &p_name, int p_font_size); + void add_theme_color_override(const StringName &p_name, const Color &p_color); + void add_theme_constant_override(const StringName &p_name, int p_constant); + + void remove_theme_icon_override(const StringName &p_name); + void remove_theme_style_override(const StringName &p_name); + void remove_theme_font_override(const StringName &p_name); + void remove_theme_font_size_override(const StringName &p_name); + void remove_theme_color_override(const StringName &p_name); + void remove_theme_constant_override(const StringName &p_name); + Ref<Texture2D> get_theme_icon(const StringName &p_name, const StringName &p_theme_type = StringName()) const; Ref<StyleBox> get_theme_stylebox(const StringName &p_name, const StringName &p_theme_type = StringName()) const; Ref<Font> get_theme_font(const StringName &p_name, const StringName &p_theme_type = StringName()) const; @@ -302,6 +335,13 @@ public: Color get_theme_color(const StringName &p_name, const StringName &p_theme_type = StringName()) const; int get_theme_constant(const StringName &p_name, const StringName &p_theme_type = StringName()) const; + bool has_theme_icon_override(const StringName &p_name) const; + bool has_theme_stylebox_override(const StringName &p_name) const; + bool has_theme_font_override(const StringName &p_name) const; + bool has_theme_font_size_override(const StringName &p_name) const; + bool has_theme_color_override(const StringName &p_name) const; + bool has_theme_constant_override(const StringName &p_name) const; + bool has_theme_icon(const StringName &p_name, const StringName &p_theme_type = StringName()) const; bool has_theme_stylebox(const StringName &p_name, const StringName &p_theme_type = StringName()) const; bool has_theme_font(const StringName &p_name, const StringName &p_theme_type = StringName()) const; @@ -313,6 +353,8 @@ public: Ref<Font> get_theme_default_font() const; int get_theme_default_font_size() const; + // + virtual Transform2D get_screen_transform() const override; Rect2i get_parent_rect() const; diff --git a/scene/register_scene_types.cpp b/scene/register_scene_types.cpp index 58147b159a..4f300cb5d6 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -31,7 +31,7 @@ #include "register_scene_types.h" #include "core/config/project_settings.h" -#include "core/extension/native_extension_manager.h" +#include "core/extension/gdextension_manager.h" #include "core/object/class_db.h" #include "core/os/os.h" #include "scene/2d/animated_sprite_2d.h" @@ -56,6 +56,7 @@ #include "scene/2d/navigation_agent_2d.h" #include "scene/2d/navigation_link_2d.h" #include "scene/2d/navigation_obstacle_2d.h" +#include "scene/2d/navigation_region_2d.h" #include "scene/2d/parallax_background.h" #include "scene/2d/parallax_layer.h" #include "scene/2d/path_2d.h" @@ -163,6 +164,7 @@ #include "scene/resources/mesh_data_tool.h" #include "scene/resources/multimesh.h" #include "scene/resources/navigation_mesh.h" +#include "scene/resources/navigation_polygon.h" #include "scene/resources/packed_scene.h" #include "scene/resources/particle_process_material.h" #include "scene/resources/physics_material.h" diff --git a/scene/resources/bit_map.cpp b/scene/resources/bit_map.cpp index 0df61871d8..86b806bc4f 100644 --- a/scene/resources/bit_map.cpp +++ b/scene/resources/bit_map.cpp @@ -317,7 +317,7 @@ Vector<Vector<Vector2>> BitMap::_march_square(const Rect2i &p_rect, const Point2 if (sv == 6 || sv == 9) { const Point2i cur_pos(curx, cury); - // Find if this point has occured before. + // Find if this point has occurred before. if (HashMap<Point2i, int>::Iterator found = cross_map.find(cur_pos)) { // Add points after the previous crossing to the result. ret.push_back(_points.slice(found->value + 1, points_size)); diff --git a/scene/resources/curve.cpp b/scene/resources/curve.cpp index bc2149a8c6..be9c0dc725 100644 --- a/scene/resources/curve.cpp +++ b/scene/resources/curve.cpp @@ -790,6 +790,19 @@ void Curve2D::_bake_segment2d_even_length(RBMap<real_t, Vector2> &r_bake, real_t } } +Vector2 Curve2D::_calculate_tangent(const Vector2 &p_begin, const Vector2 &p_control_1, const Vector2 &p_control_2, const Vector2 &p_end, const real_t p_t) { + // Handle corner cases. + if (Math::is_zero_approx(p_t - 0.0f) && p_control_1.is_equal_approx(p_begin)) { + return (p_end - p_begin).normalized(); + } + + if (Math::is_zero_approx(p_t - 1.0f) && p_control_2.is_equal_approx(p_end)) { + return (p_end - p_begin).normalized(); + } + + return p_begin.bezier_derivative(p_control_1, p_control_2, p_end, p_t).normalized(); +} + void Curve2D::_bake() const { if (!baked_cache_dirty) { return; @@ -816,7 +829,7 @@ void Curve2D::_bake() const { return; } - // Tesselate curve to (almost) even length segments + // Tessellate curve to (almost) even length segments { Vector<RBMap<real_t, Vector2>> midpoints = _tessellate_even_length(10, bake_interval); @@ -835,19 +848,19 @@ void Curve2D::_bake() const { // Collect positions and sample tilts and tangents for each baked points. bpw[0] = points[0].position; - bfw[0] = points[0].position.bezier_derivative(points[0].position + points[0].out, points[1].position + points[1].in, points[1].position, 0.0).normalized(); + bfw[0] = _calculate_tangent(points[0].position, points[0].position + points[0].out, points[1].position + points[1].in, points[1].position, 0.0); int pidx = 0; for (int i = 0; i < points.size() - 1; i++) { for (const KeyValue<real_t, Vector2> &E : midpoints[i]) { pidx++; bpw[pidx] = E.value; - bfw[pidx] = points[i].position.bezier_derivative(points[i].position + points[i].out, points[i + 1].position + points[i + 1].in, points[i + 1].position, E.key).normalized(); + bfw[pidx] = _calculate_tangent(points[i].position, points[i].position + points[i].out, points[i + 1].position + points[i + 1].in, points[i + 1].position, E.key); } pidx++; bpw[pidx] = points[i + 1].position; - bfw[pidx] = points[i].position.bezier_derivative(points[i].position + points[i].out, points[i + 1].position + points[i + 1].in, points[i + 1].position, 1.0).normalized(); + bfw[pidx] = _calculate_tangent(points[i].position, points[i].position + points[i].out, points[i + 1].position + points[i + 1].in, points[i + 1].position, 1.0); } // Recalculate the baked distances. @@ -1031,10 +1044,11 @@ Vector2 Curve2D::get_closest_point(const Vector2 &p_to_point) const { real_t nearest_dist = -1.0f; for (int i = 0; i < pc - 1; i++) { + const real_t interval = baked_dist_cache[i + 1] - baked_dist_cache[i]; Vector2 origin = r[i]; - Vector2 direction = (r[i + 1] - origin) / bake_interval; + Vector2 direction = (r[i + 1] - origin) / interval; - real_t d = CLAMP((p_to_point - origin).dot(direction), 0.0f, bake_interval); + real_t d = CLAMP((p_to_point - origin).dot(direction), 0.0f, interval); Vector2 proj = origin + direction * d; real_t dist = proj.distance_squared_to(p_to_point); @@ -1070,10 +1084,13 @@ real_t Curve2D::get_closest_offset(const Vector2 &p_to_point) const { real_t offset = 0.0f; for (int i = 0; i < pc - 1; i++) { + offset = baked_dist_cache[i]; + + const real_t interval = baked_dist_cache[i + 1] - baked_dist_cache[i]; Vector2 origin = r[i]; - Vector2 direction = (r[i + 1] - origin) / bake_interval; + Vector2 direction = (r[i + 1] - origin) / interval; - real_t d = CLAMP((p_to_point - origin).dot(direction), 0.0f, bake_interval); + real_t d = CLAMP((p_to_point - origin).dot(direction), 0.0f, interval); Vector2 proj = origin + direction * d; real_t dist = proj.distance_squared_to(p_to_point); @@ -1082,8 +1099,6 @@ real_t Curve2D::get_closest_offset(const Vector2 &p_to_point) const { nearest = offset + d; nearest_dist = dist; } - - offset += bake_interval; } return nearest; @@ -1480,6 +1495,19 @@ void Curve3D::_bake_segment3d_even_length(RBMap<real_t, Vector3> &r_bake, real_t } } +Vector3 Curve3D::_calculate_tangent(const Vector3 &p_begin, const Vector3 &p_control_1, const Vector3 &p_control_2, const Vector3 &p_end, const real_t p_t) { + // Handle corner cases. + if (Math::is_zero_approx(p_t - 0.0f) && p_control_1.is_equal_approx(p_begin)) { + return (p_end - p_begin).normalized(); + } + + if (Math::is_zero_approx(p_t - 1.0f) && p_control_2.is_equal_approx(p_end)) { + return (p_end - p_begin).normalized(); + } + + return p_begin.bezier_derivative(p_control_1, p_control_2, p_end, p_t).normalized(); +} + void Curve3D::_bake() const { if (!baked_cache_dirty) { return; @@ -1518,7 +1546,7 @@ void Curve3D::_bake() const { return; } - // Step 1: Tesselate curve to (almost) even length segments + // Step 1: Tessellate curve to (almost) even length segments { Vector<RBMap<real_t, Vector3>> midpoints = _tessellate_even_length(10, bake_interval); @@ -1539,7 +1567,7 @@ void Curve3D::_bake() const { // Collect positions and sample tilts and tangents for each baked points. bpw[0] = points[0].position; - bfw[0] = points[0].position.bezier_derivative(points[0].position + points[0].out, points[1].position + points[1].in, points[1].position, 0.0).normalized(); + bfw[0] = _calculate_tangent(points[0].position, points[0].position + points[0].out, points[1].position + points[1].in, points[1].position, 0.0); btw[0] = points[0].tilt; int pidx = 0; @@ -1547,13 +1575,13 @@ void Curve3D::_bake() const { for (const KeyValue<real_t, Vector3> &E : midpoints[i]) { pidx++; bpw[pidx] = E.value; - bfw[pidx] = points[i].position.bezier_derivative(points[i].position + points[i].out, points[i + 1].position + points[i + 1].in, points[i + 1].position, E.key).normalized(); + bfw[pidx] = _calculate_tangent(points[i].position, points[i].position + points[i].out, points[i + 1].position + points[i + 1].in, points[i + 1].position, E.key); btw[pidx] = Math::lerp(points[i].tilt, points[i + 1].tilt, E.key); } pidx++; bpw[pidx] = points[i + 1].position; - bfw[pidx] = points[i].position.bezier_derivative(points[i].position + points[i].out, points[i + 1].position + points[i + 1].in, points[i + 1].position, 1.0).normalized(); + bfw[pidx] = _calculate_tangent(points[i].position, points[i].position + points[i].out, points[i + 1].position + points[i + 1].in, points[i + 1].position, 1.0); btw[pidx] = points[i + 1].tilt; } @@ -1621,7 +1649,7 @@ void Curve3D::_bake() const { } real_t dot = forward_ptr[0].dot(forward_ptr[point_count - 1]); - if (dot < 1.0 - UNIT_EPSILON) { // Alignment should not be too tight, or it dosen't work for coarse bake interval. + if (dot < 1.0 - UNIT_EPSILON) { // Alignment should not be too tight, or it doesn't work for coarse bake interval. is_loop = false; } } diff --git a/scene/resources/curve.h b/scene/resources/curve.h index ea3ceabb14..26608c47cd 100644 --- a/scene/resources/curve.h +++ b/scene/resources/curve.h @@ -178,6 +178,7 @@ class Curve2D : public Resource { void mark_dirty(); + static Vector2 _calculate_tangent(const Vector2 &p_begin, const Vector2 &p_control_1, const Vector2 &p_control_2, const Vector2 &p_end, const real_t p_t); void _bake() const; real_t bake_interval = 5.0; @@ -261,6 +262,7 @@ class Curve3D : public Resource { void mark_dirty(); + static Vector3 _calculate_tangent(const Vector3 &p_begin, const Vector3 &p_control_1, const Vector3 &p_control_2, const Vector3 &p_end, const real_t p_t); void _bake() const; struct Interval { diff --git a/scene/resources/default_theme/default_theme.cpp b/scene/resources/default_theme/default_theme.cpp index f179b4b818..571ddee763 100644 --- a/scene/resources/default_theme/default_theme.cpp +++ b/scene/resources/default_theme/default_theme.cpp @@ -100,6 +100,11 @@ static Ref<StyleBox> make_empty_stylebox(float p_margin_left = -1, float p_margi void fill_default_theme(Ref<Theme> &theme, const Ref<Font> &default_font, const Ref<Font> &bold_font, const Ref<Font> &bold_italics_font, const Ref<Font> &italics_font, Ref<Texture2D> &default_icon, Ref<StyleBox> &default_style, float p_scale) { scale = p_scale; + // Default theme properties. + theme->set_default_font(default_font); + theme->set_default_font_size(default_font_size * scale); + theme->set_default_base_scale(scale); + // Font colors const Color control_font_color = Color(0.875, 0.875, 0.875); const Color control_font_low_color = Color(0.7, 0.7, 0.7); diff --git a/scene/resources/mesh.cpp b/scene/resources/mesh.cpp index a5e7602c8b..af770ddede 100644 --- a/scene/resources/mesh.cpp +++ b/scene/resources/mesh.cpp @@ -1118,7 +1118,19 @@ bool ArrayMesh::_set(const StringName &p_name, const Variant &p_value) { if (sl == -1) { return false; } - int idx = sname.substr(8, sl - 8).to_int() - 1; + int idx = sname.substr(8, sl - 8).to_int(); + + // This is a bit of a hack to ensure compatibility with older material + // overrides that start indexing at 1. + // We assume that idx 0 is always read first, if its not, this won't work. + if (idx == 0) { + surface_index_0 = true; + } + if (!surface_index_0) { + // This means the file was created when the indexing started at 1, so decrease by one. + idx--; + } + String what = sname.get_slicec('/', 1); if (what == "material") { surface_set_material(idx, p_value); @@ -1491,7 +1503,7 @@ bool ArrayMesh::_get(const StringName &p_name, Variant &r_ret) const { if (sl == -1) { return false; } - int idx = sname.substr(8, sl - 8).to_int() - 1; + int idx = sname.substr(8, sl - 8).to_int(); String what = sname.get_slicec('/', 1); if (what == "material") { r_ret = surface_get_material(idx); @@ -1519,11 +1531,11 @@ void ArrayMesh::_get_property_list(List<PropertyInfo> *p_list) const { } for (int i = 0; i < surfaces.size(); i++) { - p_list->push_back(PropertyInfo(Variant::STRING, "surface_" + itos(i + 1) + "/name", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR)); + p_list->push_back(PropertyInfo(Variant::STRING, "surface_" + itos(i) + "/name", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_EDITOR)); if (surfaces[i].is_2d) { - p_list->push_back(PropertyInfo(Variant::OBJECT, "surface_" + itos(i + 1) + "/material", PROPERTY_HINT_RESOURCE_TYPE, "CanvasItemMaterial,ShaderMaterial", PROPERTY_USAGE_EDITOR)); + p_list->push_back(PropertyInfo(Variant::OBJECT, "surface_" + itos(i) + "/material", PROPERTY_HINT_RESOURCE_TYPE, "CanvasItemMaterial,ShaderMaterial", PROPERTY_USAGE_EDITOR)); } else { - p_list->push_back(PropertyInfo(Variant::OBJECT, "surface_" + itos(i + 1) + "/material", PROPERTY_HINT_RESOURCE_TYPE, "BaseMaterial3D,ShaderMaterial", PROPERTY_USAGE_EDITOR)); + p_list->push_back(PropertyInfo(Variant::OBJECT, "surface_" + itos(i) + "/material", PROPERTY_HINT_RESOURCE_TYPE, "BaseMaterial3D,ShaderMaterial", PROPERTY_USAGE_EDITOR)); } } } diff --git a/scene/resources/mesh.h b/scene/resources/mesh.h index 6f995280e8..fabc09a42c 100644 --- a/scene/resources/mesh.h +++ b/scene/resources/mesh.h @@ -262,6 +262,7 @@ protected: bool _set(const StringName &p_name, const Variant &p_value); bool _get(const StringName &p_name, Variant &r_ret) const; void _get_property_list(List<PropertyInfo> *p_list) const; + bool surface_index_0 = false; virtual void reset_state() override; diff --git a/scene/resources/mesh_library.cpp b/scene/resources/mesh_library.cpp index 7c78b757c7..858146da96 100644 --- a/scene/resources/mesh_library.cpp +++ b/scene/resources/mesh_library.cpp @@ -57,10 +57,18 @@ bool MeshLibrary::_set(const StringName &p_name, const Variant &p_value) { _set_item_shapes(idx, p_value); } else if (what == "preview") { set_item_preview(idx, p_value); - } else if (what == "navmesh") { - set_item_navmesh(idx, p_value); - } else if (what == "navmesh_transform") { - set_item_navmesh_transform(idx, p_value); + } else if (what == "navigation_mesh") { + set_item_navigation_mesh(idx, p_value); + } else if (what == "navigation_mesh_transform") { + set_item_navigation_mesh_transform(idx, p_value); +#ifndef DISABLE_DEPRECATED + } else if (what == "navmesh") { // Renamed in 4.0 beta 9. + set_item_navigation_mesh(idx, p_value); + } else if (what == "navmesh_transform") { // Renamed in 4.0 beta 9. + set_item_navigation_mesh_transform(idx, p_value); +#endif // DISABLE_DEPRECATED + } else if (what == "navigation_layers") { + set_item_navigation_layers(idx, p_value); } else { return false; } @@ -85,10 +93,18 @@ bool MeshLibrary::_get(const StringName &p_name, Variant &r_ret) const { r_ret = get_item_mesh_transform(idx); } else if (what == "shapes") { r_ret = _get_item_shapes(idx); - } else if (what == "navmesh") { - r_ret = get_item_navmesh(idx); - } else if (what == "navmesh_transform") { - r_ret = get_item_navmesh_transform(idx); + } else if (what == "navigation_mesh") { + r_ret = get_item_navigation_mesh(idx); + } else if (what == "navigation_mesh_transform") { + r_ret = get_item_navigation_mesh_transform(idx); +#ifndef DISABLE_DEPRECATED + } else if (what == "navmesh") { // Renamed in 4.0 beta 9. + r_ret = get_item_navigation_mesh(idx); + } else if (what == "navmesh_transform") { // Renamed in 4.0 beta 9. + r_ret = get_item_navigation_mesh_transform(idx); +#endif // DISABLE_DEPRECATED + } else if (what == "navigation_layers") { + r_ret = get_item_navigation_layers(idx); } else if (what == "preview") { r_ret = get_item_preview(idx); } else { @@ -105,8 +121,9 @@ void MeshLibrary::_get_property_list(List<PropertyInfo> *p_list) const { p_list->push_back(PropertyInfo(Variant::OBJECT, prop_name + PNAME("mesh"), PROPERTY_HINT_RESOURCE_TYPE, "Mesh")); p_list->push_back(PropertyInfo(Variant::TRANSFORM3D, prop_name + PNAME("mesh_transform"), PROPERTY_HINT_NONE, "suffix:m")); p_list->push_back(PropertyInfo(Variant::ARRAY, prop_name + PNAME("shapes"))); - p_list->push_back(PropertyInfo(Variant::OBJECT, prop_name + PNAME("navmesh"), PROPERTY_HINT_RESOURCE_TYPE, "NavigationMesh")); - p_list->push_back(PropertyInfo(Variant::TRANSFORM3D, prop_name + PNAME("navmesh_transform"), PROPERTY_HINT_NONE, "suffix:m")); + p_list->push_back(PropertyInfo(Variant::OBJECT, prop_name + PNAME("navigation_mesh"), PROPERTY_HINT_RESOURCE_TYPE, "NavigationMesh")); + p_list->push_back(PropertyInfo(Variant::TRANSFORM3D, prop_name + PNAME("navigation_mesh_transform"), PROPERTY_HINT_NONE, "suffix:m")); + p_list->push_back(PropertyInfo(Variant::INT, prop_name + PNAME("navigation_layers"), PROPERTY_HINT_LAYERS_3D_NAVIGATION)); p_list->push_back(PropertyInfo(Variant::OBJECT, prop_name + PNAME("preview"), PROPERTY_HINT_RESOURCE_TYPE, "Texture2D", PROPERTY_USAGE_DEFAULT)); } } @@ -150,18 +167,27 @@ void MeshLibrary::set_item_shapes(int p_item, const Vector<ShapeData> &p_shapes) notify_property_list_changed(); } -void MeshLibrary::set_item_navmesh(int p_item, const Ref<NavigationMesh> &p_navmesh) { +void MeshLibrary::set_item_navigation_mesh(int p_item, const Ref<NavigationMesh> &p_navigation_mesh) { ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); - item_map[p_item].navmesh = p_navmesh; + item_map[p_item].navigation_mesh = p_navigation_mesh; notify_property_list_changed(); notify_change_to_owners(); emit_changed(); notify_property_list_changed(); } -void MeshLibrary::set_item_navmesh_transform(int p_item, const Transform3D &p_transform) { +void MeshLibrary::set_item_navigation_mesh_transform(int p_item, const Transform3D &p_transform) { ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); - item_map[p_item].navmesh_transform = p_transform; + item_map[p_item].navigation_mesh_transform = p_transform; + notify_change_to_owners(); + emit_changed(); + notify_property_list_changed(); +} + +void MeshLibrary::set_item_navigation_layers(int p_item, uint32_t p_navigation_layers) { + ERR_FAIL_COND_MSG(!item_map.has(p_item), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); + item_map[p_item].navigation_layers = p_navigation_layers; + notify_property_list_changed(); notify_change_to_owners(); emit_changed(); notify_property_list_changed(); @@ -194,14 +220,19 @@ Vector<MeshLibrary::ShapeData> MeshLibrary::get_item_shapes(int p_item) const { return item_map[p_item].shapes; } -Ref<NavigationMesh> MeshLibrary::get_item_navmesh(int p_item) const { +Ref<NavigationMesh> MeshLibrary::get_item_navigation_mesh(int p_item) const { ERR_FAIL_COND_V_MSG(!item_map.has(p_item), Ref<NavigationMesh>(), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); - return item_map[p_item].navmesh; + return item_map[p_item].navigation_mesh; } -Transform3D MeshLibrary::get_item_navmesh_transform(int p_item) const { +Transform3D MeshLibrary::get_item_navigation_mesh_transform(int p_item) const { ERR_FAIL_COND_V_MSG(!item_map.has(p_item), Transform3D(), "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); - return item_map[p_item].navmesh_transform; + return item_map[p_item].navigation_mesh_transform; +} + +uint32_t MeshLibrary::get_item_navigation_layers(int p_item) const { + ERR_FAIL_COND_V_MSG(!item_map.has(p_item), 0, "Requested for nonexistent MeshLibrary item '" + itos(p_item) + "'."); + return item_map[p_item].navigation_layers; } Ref<Texture2D> MeshLibrary::get_item_preview(int p_item) const { @@ -314,15 +345,17 @@ void MeshLibrary::_bind_methods() { ClassDB::bind_method(D_METHOD("set_item_name", "id", "name"), &MeshLibrary::set_item_name); ClassDB::bind_method(D_METHOD("set_item_mesh", "id", "mesh"), &MeshLibrary::set_item_mesh); ClassDB::bind_method(D_METHOD("set_item_mesh_transform", "id", "mesh_transform"), &MeshLibrary::set_item_mesh_transform); - ClassDB::bind_method(D_METHOD("set_item_navmesh", "id", "navmesh"), &MeshLibrary::set_item_navmesh); - ClassDB::bind_method(D_METHOD("set_item_navmesh_transform", "id", "navmesh"), &MeshLibrary::set_item_navmesh_transform); + ClassDB::bind_method(D_METHOD("set_item_navigation_mesh", "id", "navigation_mesh"), &MeshLibrary::set_item_navigation_mesh); + ClassDB::bind_method(D_METHOD("set_item_navigation_mesh_transform", "id", "navigation_mesh"), &MeshLibrary::set_item_navigation_mesh_transform); + ClassDB::bind_method(D_METHOD("set_item_navigation_layers", "id", "navigation_layers"), &MeshLibrary::set_item_navigation_layers); ClassDB::bind_method(D_METHOD("set_item_shapes", "id", "shapes"), &MeshLibrary::_set_item_shapes); ClassDB::bind_method(D_METHOD("set_item_preview", "id", "texture"), &MeshLibrary::set_item_preview); ClassDB::bind_method(D_METHOD("get_item_name", "id"), &MeshLibrary::get_item_name); ClassDB::bind_method(D_METHOD("get_item_mesh", "id"), &MeshLibrary::get_item_mesh); ClassDB::bind_method(D_METHOD("get_item_mesh_transform", "id"), &MeshLibrary::get_item_mesh_transform); - ClassDB::bind_method(D_METHOD("get_item_navmesh", "id"), &MeshLibrary::get_item_navmesh); - ClassDB::bind_method(D_METHOD("get_item_navmesh_transform", "id"), &MeshLibrary::get_item_navmesh_transform); + ClassDB::bind_method(D_METHOD("get_item_navigation_mesh", "id"), &MeshLibrary::get_item_navigation_mesh); + ClassDB::bind_method(D_METHOD("get_item_navigation_mesh_transform", "id"), &MeshLibrary::get_item_navigation_mesh_transform); + ClassDB::bind_method(D_METHOD("get_item_navigation_layers", "id"), &MeshLibrary::get_item_navigation_layers); ClassDB::bind_method(D_METHOD("get_item_shapes", "id"), &MeshLibrary::_get_item_shapes); ClassDB::bind_method(D_METHOD("get_item_preview", "id"), &MeshLibrary::get_item_preview); ClassDB::bind_method(D_METHOD("remove_item", "id"), &MeshLibrary::remove_item); diff --git a/scene/resources/mesh_library.h b/scene/resources/mesh_library.h index 79acb41c4e..1d5af9e176 100644 --- a/scene/resources/mesh_library.h +++ b/scene/resources/mesh_library.h @@ -49,11 +49,12 @@ public: struct Item { String name; Ref<Mesh> mesh; + Transform3D mesh_transform; Vector<ShapeData> shapes; Ref<Texture2D> preview; - Transform3D navmesh_transform; - Transform3D mesh_transform; - Ref<NavigationMesh> navmesh; + Ref<NavigationMesh> navigation_mesh; + Transform3D navigation_mesh_transform; + uint32_t navigation_layers = 1; }; RBMap<int, Item> item_map; @@ -74,15 +75,17 @@ public: void set_item_name(int p_item, const String &p_name); void set_item_mesh(int p_item, const Ref<Mesh> &p_mesh); void set_item_mesh_transform(int p_item, const Transform3D &p_transform); - void set_item_navmesh(int p_item, const Ref<NavigationMesh> &p_navmesh); - void set_item_navmesh_transform(int p_item, const Transform3D &p_transform); + void set_item_navigation_mesh(int p_item, const Ref<NavigationMesh> &p_navigation_mesh); + void set_item_navigation_mesh_transform(int p_item, const Transform3D &p_transform); + void set_item_navigation_layers(int p_item, uint32_t p_navigation_layers); void set_item_shapes(int p_item, const Vector<ShapeData> &p_shapes); void set_item_preview(int p_item, const Ref<Texture2D> &p_preview); String get_item_name(int p_item) const; Ref<Mesh> get_item_mesh(int p_item) const; Transform3D get_item_mesh_transform(int p_item) const; - Ref<NavigationMesh> get_item_navmesh(int p_item) const; - Transform3D get_item_navmesh_transform(int p_item) const; + Ref<NavigationMesh> get_item_navigation_mesh(int p_item) const; + Transform3D get_item_navigation_mesh_transform(int p_item) const; + uint32_t get_item_navigation_layers(int p_item) const; Vector<ShapeData> get_item_shapes(int p_item) const; Ref<Texture2D> get_item_preview(int p_item) const; diff --git a/scene/resources/multimesh.cpp b/scene/resources/multimesh.cpp index ff4a7a4560..8afb0563b2 100644 --- a/scene/resources/multimesh.cpp +++ b/scene/resources/multimesh.cpp @@ -242,6 +242,7 @@ void MultiMesh::set_instance_transform(int p_instance, const Transform3D &p_tran void MultiMesh::set_instance_transform_2d(int p_instance, const Transform2D &p_transform) { RenderingServer::get_singleton()->multimesh_instance_set_transform_2d(multimesh, p_instance, p_transform); + emit_changed(); } Transform3D MultiMesh::get_instance_transform(int p_instance) const { diff --git a/scene/resources/navigation_mesh.cpp b/scene/resources/navigation_mesh.cpp index de97498674..5d9adccaac 100644 --- a/scene/resources/navigation_mesh.cpp +++ b/scene/resources/navigation_mesh.cpp @@ -225,13 +225,13 @@ float NavigationMesh::get_edge_max_error() const { return edge_max_error; } -void NavigationMesh::set_verts_per_poly(float p_value) { +void NavigationMesh::set_vertices_per_polygon(float p_value) { ERR_FAIL_COND(p_value < 3); - verts_per_poly = p_value; + vertices_per_polygon = p_value; } -float NavigationMesh::get_verts_per_poly() const { - return verts_per_poly; +float NavigationMesh::get_vertices_per_polygon() const { + return vertices_per_polygon; } void NavigationMesh::set_detail_sample_distance(float p_value) { @@ -483,8 +483,8 @@ void NavigationMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("set_edge_max_error", "edge_max_error"), &NavigationMesh::set_edge_max_error); ClassDB::bind_method(D_METHOD("get_edge_max_error"), &NavigationMesh::get_edge_max_error); - ClassDB::bind_method(D_METHOD("set_verts_per_poly", "verts_per_poly"), &NavigationMesh::set_verts_per_poly); - ClassDB::bind_method(D_METHOD("get_verts_per_poly"), &NavigationMesh::get_verts_per_poly); + ClassDB::bind_method(D_METHOD("set_vertices_per_polygon", "vertices_per_polygon"), &NavigationMesh::set_vertices_per_polygon); + ClassDB::bind_method(D_METHOD("get_vertices_per_polygon"), &NavigationMesh::get_vertices_per_polygon); ClassDB::bind_method(D_METHOD("set_detail_sample_distance", "detail_sample_dist"), &NavigationMesh::set_detail_sample_distance); ClassDB::bind_method(D_METHOD("get_detail_sample_distance"), &NavigationMesh::get_detail_sample_distance); @@ -527,9 +527,9 @@ void NavigationMesh::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "geometry_parsed_geometry_type", PROPERTY_HINT_ENUM, "Mesh Instances,Static Colliders,Both"), "set_parsed_geometry_type", "get_parsed_geometry_type"); ADD_PROPERTY(PropertyInfo(Variant::INT, "geometry_collision_mask", PROPERTY_HINT_LAYERS_3D_PHYSICS), "set_collision_mask", "get_collision_mask"); ADD_PROPERTY_DEFAULT("geometry_collision_mask", 0xFFFFFFFF); - ADD_PROPERTY(PropertyInfo(Variant::INT, "geometry_source_geometry_mode", PROPERTY_HINT_ENUM, "NavMesh Children,Group With Children,Group Explicit"), "set_source_geometry_mode", "get_source_geometry_mode"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "geometry_source_geometry_mode", PROPERTY_HINT_ENUM, "Root Node Children,Group With Children,Group Explicit"), "set_source_geometry_mode", "get_source_geometry_mode"); ADD_PROPERTY(PropertyInfo(Variant::STRING, "geometry_source_group_name"), "set_source_group_name", "get_source_group_name"); - ADD_PROPERTY_DEFAULT("geometry_source_group_name", StringName("navmesh")); + ADD_PROPERTY_DEFAULT("geometry_source_group_name", StringName("navigation_mesh_source_group")); ADD_GROUP("Cells", "cell_"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "cell_size", PROPERTY_HINT_RANGE, "0.01,500.0,0.01,or_greater,suffix:m"), "set_cell_size", "get_cell_size"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "cell_height", PROPERTY_HINT_RANGE, "0.01,500.0,0.01,or_greater,suffix:m"), "set_cell_height", "get_cell_height"); @@ -544,8 +544,8 @@ void NavigationMesh::_bind_methods() { ADD_GROUP("Edges", "edge_"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "edge_max_length", PROPERTY_HINT_RANGE, "0.0,50.0,0.01,or_greater,suffix:m"), "set_edge_max_length", "get_edge_max_length"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "edge_max_error", PROPERTY_HINT_RANGE, "0.1,3.0,0.01,or_greater,suffix:m"), "set_edge_max_error", "get_edge_max_error"); - ADD_GROUP("Polygons", "polygon_"); - ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "polygon_verts_per_poly", PROPERTY_HINT_RANGE, "3.0,12.0,1.0,or_greater"), "set_verts_per_poly", "get_verts_per_poly"); + ADD_GROUP("Polygons", ""); + ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "vertices_per_polygon", PROPERTY_HINT_RANGE, "3.0,12.0,1.0,or_greater"), "set_vertices_per_polygon", "get_vertices_per_polygon"); ADD_GROUP("Details", "detail_"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "detail_sample_distance", PROPERTY_HINT_RANGE, "0.1,16.0,0.01,or_greater,suffix:m"), "set_detail_sample_distance", "get_detail_sample_distance"); ADD_PROPERTY(PropertyInfo(Variant::FLOAT, "detail_sample_max_error", PROPERTY_HINT_RANGE, "0.0,16.0,0.01,or_greater,suffix:m"), "set_detail_sample_max_error", "get_detail_sample_max_error"); @@ -566,7 +566,7 @@ void NavigationMesh::_bind_methods() { BIND_ENUM_CONSTANT(PARSED_GEOMETRY_BOTH); BIND_ENUM_CONSTANT(PARSED_GEOMETRY_MAX); - BIND_ENUM_CONSTANT(SOURCE_GEOMETRY_NAVMESH_CHILDREN); + BIND_ENUM_CONSTANT(SOURCE_GEOMETRY_ROOT_NODE_CHILDREN); BIND_ENUM_CONSTANT(SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN); BIND_ENUM_CONSTANT(SOURCE_GEOMETRY_GROUPS_EXPLICIT); BIND_ENUM_CONSTANT(SOURCE_GEOMETRY_MAX); @@ -581,7 +581,7 @@ void NavigationMesh::_validate_property(PropertyInfo &p_property) const { } if (p_property.name == "geometry_source_group_name") { - if (source_geometry_mode == SOURCE_GEOMETRY_NAVMESH_CHILDREN) { + if (source_geometry_mode == SOURCE_GEOMETRY_ROOT_NODE_CHILDREN) { p_property.usage = PROPERTY_USAGE_NONE; return; } @@ -595,13 +595,16 @@ bool NavigationMesh::_set(const StringName &p_name, const Variant &p_value) { // Compatibility with pre-3.5 "category/path" property names. prop_name = prop_name.replace("/", "_"); if (prop_name == "sample_partition_type_sample_partition_type") { - set("sample_partition_type", p_value); + set_sample_partition_type((NavigationMesh::SamplePartitionType)p_value.operator int()); } else if (prop_name == "filter_filter_walkable_low_height_spans") { - set("filter_walkable_low_height_spans", p_value); + set_filter_walkable_low_height_spans(p_value); } else { set(prop_name, p_value); } - + return true; + } + if (p_name == "polygon_verts_per_poly") { // Renamed in 4.0 beta 9. + set_vertices_per_polygon(p_value); return true; } return false; @@ -613,14 +616,18 @@ bool NavigationMesh::_get(const StringName &p_name, Variant &r_ret) const { // Compatibility with pre-3.5 "category/path" property names. prop_name = prop_name.replace("/", "_"); if (prop_name == "sample_partition_type_sample_partition_type") { - r_ret = get("sample_partition_type"); + r_ret = get_sample_partition_type(); } else if (prop_name == "filter_filter_walkable_low_height_spans") { - r_ret = get("filter_walkable_low_height_spans"); + r_ret = get_filter_walkable_low_height_spans(); } else { r_ret = get(prop_name); } return true; } + if (p_name == "polygon_verts_per_poly") { // Renamed in 4.0 beta 9. + r_ret = get_vertices_per_polygon(); + return true; + } return false; } #endif // DISABLE_DEPRECATED diff --git a/scene/resources/navigation_mesh.h b/scene/resources/navigation_mesh.h index 5ddbd75dcb..3d072423db 100644 --- a/scene/resources/navigation_mesh.h +++ b/scene/resources/navigation_mesh.h @@ -84,7 +84,7 @@ public: }; enum SourceGeometryMode { - SOURCE_GEOMETRY_NAVMESH_CHILDREN = 0, + SOURCE_GEOMETRY_ROOT_NODE_CHILDREN = 0, SOURCE_GEOMETRY_GROUPS_WITH_CHILDREN, SOURCE_GEOMETRY_GROUPS_EXPLICIT, SOURCE_GEOMETRY_MAX @@ -101,7 +101,7 @@ protected: float region_merge_size = 20.0f; float edge_max_length = 12.0f; float edge_max_error = 1.3f; - float verts_per_poly = 6.0f; + float vertices_per_polygon = 6.0f; float detail_sample_distance = 6.0f; float detail_sample_max_error = 1.0f; @@ -109,8 +109,8 @@ protected: ParsedGeometryType parsed_geometry_type = PARSED_GEOMETRY_MESH_INSTANCES; uint32_t collision_mask = 0xFFFFFFFF; - SourceGeometryMode source_geometry_mode = SOURCE_GEOMETRY_NAVMESH_CHILDREN; - StringName source_group_name = "navmesh"; + SourceGeometryMode source_geometry_mode = SOURCE_GEOMETRY_ROOT_NODE_CHILDREN; + StringName source_group_name = "navigation_mesh_source_group"; bool filter_low_hanging_obstacles = false; bool filter_ledge_spans = false; @@ -168,8 +168,8 @@ public: void set_edge_max_error(float p_value); float get_edge_max_error() const; - void set_verts_per_poly(float p_value); - float get_verts_per_poly() const; + void set_vertices_per_polygon(float p_value); + float get_vertices_per_polygon() const; void set_detail_sample_distance(float p_value); float get_detail_sample_distance() const; diff --git a/scene/resources/navigation_polygon.cpp b/scene/resources/navigation_polygon.cpp new file mode 100644 index 0000000000..04077e95a7 --- /dev/null +++ b/scene/resources/navigation_polygon.cpp @@ -0,0 +1,354 @@ +/*************************************************************************/ +/* navigation_polygon.cpp */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#include "navigation_polygon.h" + +#include "core/core_string_names.h" +#include "core/math/geometry_2d.h" +#include "core/os/mutex.h" + +#include "thirdparty/misc/polypartition.h" + +#ifdef TOOLS_ENABLED +Rect2 NavigationPolygon::_edit_get_rect() const { + if (rect_cache_dirty) { + item_rect = Rect2(); + bool first = true; + + for (int i = 0; i < outlines.size(); i++) { + const Vector<Vector2> &outline = outlines[i]; + const int outline_size = outline.size(); + if (outline_size < 3) { + continue; + } + const Vector2 *p = outline.ptr(); + for (int j = 0; j < outline_size; j++) { + if (first) { + item_rect = Rect2(p[j], Vector2(0, 0)); + first = false; + } else { + item_rect.expand_to(p[j]); + } + } + } + + rect_cache_dirty = false; + } + return item_rect; +} + +bool NavigationPolygon::_edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const { + for (int i = 0; i < outlines.size(); i++) { + const Vector<Vector2> &outline = outlines[i]; + const int outline_size = outline.size(); + if (outline_size < 3) { + continue; + } + if (Geometry2D::is_point_in_polygon(p_point, Variant(outline))) { + return true; + } + } + return false; +} +#endif + +void NavigationPolygon::set_vertices(const Vector<Vector2> &p_vertices) { + { + MutexLock lock(navigation_mesh_generation); + navigation_mesh.unref(); + } + vertices = p_vertices; + rect_cache_dirty = true; +} + +Vector<Vector2> NavigationPolygon::get_vertices() const { + return vertices; +} + +void NavigationPolygon::_set_polygons(const TypedArray<Vector<int32_t>> &p_array) { + { + MutexLock lock(navigation_mesh_generation); + navigation_mesh.unref(); + } + polygons.resize(p_array.size()); + for (int i = 0; i < p_array.size(); i++) { + polygons.write[i].indices = p_array[i]; + } +} + +TypedArray<Vector<int32_t>> NavigationPolygon::_get_polygons() const { + TypedArray<Vector<int32_t>> ret; + ret.resize(polygons.size()); + for (int i = 0; i < ret.size(); i++) { + ret[i] = polygons[i].indices; + } + + return ret; +} + +void NavigationPolygon::_set_outlines(const TypedArray<Vector<Vector2>> &p_array) { + outlines.resize(p_array.size()); + for (int i = 0; i < p_array.size(); i++) { + outlines.write[i] = p_array[i]; + } + rect_cache_dirty = true; +} + +TypedArray<Vector<Vector2>> NavigationPolygon::_get_outlines() const { + TypedArray<Vector<Vector2>> ret; + ret.resize(outlines.size()); + for (int i = 0; i < ret.size(); i++) { + ret[i] = outlines[i]; + } + + return ret; +} + +void NavigationPolygon::add_polygon(const Vector<int> &p_polygon) { + Polygon polygon; + polygon.indices = p_polygon; + polygons.push_back(polygon); + { + MutexLock lock(navigation_mesh_generation); + navigation_mesh.unref(); + } +} + +void NavigationPolygon::add_outline_at_index(const Vector<Vector2> &p_outline, int p_index) { + outlines.insert(p_index, p_outline); + rect_cache_dirty = true; +} + +int NavigationPolygon::get_polygon_count() const { + return polygons.size(); +} + +Vector<int> NavigationPolygon::get_polygon(int p_idx) { + ERR_FAIL_INDEX_V(p_idx, polygons.size(), Vector<int>()); + return polygons[p_idx].indices; +} + +void NavigationPolygon::clear_polygons() { + polygons.clear(); + { + MutexLock lock(navigation_mesh_generation); + navigation_mesh.unref(); + } +} + +Ref<NavigationMesh> NavigationPolygon::get_navigation_mesh() { + MutexLock lock(navigation_mesh_generation); + + if (navigation_mesh.is_null()) { + navigation_mesh.instantiate(); + Vector<Vector3> verts; + { + verts.resize(get_vertices().size()); + Vector3 *w = verts.ptrw(); + + const Vector2 *r = get_vertices().ptr(); + + for (int i(0); i < get_vertices().size(); i++) { + w[i] = Vector3(r[i].x, 0.0, r[i].y); + } + } + navigation_mesh->set_vertices(verts); + + for (int i(0); i < get_polygon_count(); i++) { + navigation_mesh->add_polygon(get_polygon(i)); + } + } + + return navigation_mesh; +} + +void NavigationPolygon::add_outline(const Vector<Vector2> &p_outline) { + outlines.push_back(p_outline); + rect_cache_dirty = true; +} + +int NavigationPolygon::get_outline_count() const { + return outlines.size(); +} + +void NavigationPolygon::set_outline(int p_idx, const Vector<Vector2> &p_outline) { + ERR_FAIL_INDEX(p_idx, outlines.size()); + outlines.write[p_idx] = p_outline; + rect_cache_dirty = true; +} + +void NavigationPolygon::remove_outline(int p_idx) { + ERR_FAIL_INDEX(p_idx, outlines.size()); + outlines.remove_at(p_idx); + rect_cache_dirty = true; +} + +Vector<Vector2> NavigationPolygon::get_outline(int p_idx) const { + ERR_FAIL_INDEX_V(p_idx, outlines.size(), Vector<Vector2>()); + return outlines[p_idx]; +} + +void NavigationPolygon::clear_outlines() { + outlines.clear(); + rect_cache_dirty = true; +} + +void NavigationPolygon::make_polygons_from_outlines() { + { + MutexLock lock(navigation_mesh_generation); + navigation_mesh.unref(); + } + List<TPPLPoly> in_poly, out_poly; + + Vector2 outside_point(-1e10, -1e10); + + for (int i = 0; i < outlines.size(); i++) { + Vector<Vector2> ol = outlines[i]; + int olsize = ol.size(); + if (olsize < 3) { + continue; + } + const Vector2 *r = ol.ptr(); + for (int j = 0; j < olsize; j++) { + outside_point.x = MAX(r[j].x, outside_point.x); + outside_point.y = MAX(r[j].y, outside_point.y); + } + } + + outside_point += Vector2(0.7239784, 0.819238); //avoid precision issues + + for (int i = 0; i < outlines.size(); i++) { + Vector<Vector2> ol = outlines[i]; + int olsize = ol.size(); + if (olsize < 3) { + continue; + } + const Vector2 *r = ol.ptr(); + + int interscount = 0; + //test if this is an outer outline + for (int k = 0; k < outlines.size(); k++) { + if (i == k) { + continue; //no self intersect + } + + Vector<Vector2> ol2 = outlines[k]; + int olsize2 = ol2.size(); + if (olsize2 < 3) { + continue; + } + const Vector2 *r2 = ol2.ptr(); + + for (int l = 0; l < olsize2; l++) { + if (Geometry2D::segment_intersects_segment(r[0], outside_point, r2[l], r2[(l + 1) % olsize2], nullptr)) { + interscount++; + } + } + } + + bool outer = (interscount % 2) == 0; + + TPPLPoly tp; + tp.Init(olsize); + for (int j = 0; j < olsize; j++) { + tp[j] = r[j]; + } + + if (outer) { + tp.SetOrientation(TPPL_ORIENTATION_CCW); + } else { + tp.SetOrientation(TPPL_ORIENTATION_CW); + tp.SetHole(true); + } + + in_poly.push_back(tp); + } + + TPPLPartition tpart; + if (tpart.ConvexPartition_HM(&in_poly, &out_poly) == 0) { //failed! + ERR_PRINT("NavigationPolygon: Convex partition failed! Failed to convert outlines to a valid NavigationMesh." + "\nNavigationPolygon outlines can not overlap vertices or edges inside same outline or with other outlines or have any intersections." + "\nAdd the outmost and largest outline first. To add holes inside this outline add the smaller outlines with opposite winding order."); + return; + } + + polygons.clear(); + vertices.clear(); + + HashMap<Vector2, int> points; + for (List<TPPLPoly>::Element *I = out_poly.front(); I; I = I->next()) { + TPPLPoly &tp = I->get(); + + struct Polygon p; + + for (int64_t i = 0; i < tp.GetNumPoints(); i++) { + HashMap<Vector2, int>::Iterator E = points.find(tp[i]); + if (!E) { + E = points.insert(tp[i], vertices.size()); + vertices.push_back(tp[i]); + } + p.indices.push_back(E->value); + } + + polygons.push_back(p); + } + + emit_signal(CoreStringNames::get_singleton()->changed); +} + +void NavigationPolygon::_bind_methods() { + ClassDB::bind_method(D_METHOD("set_vertices", "vertices"), &NavigationPolygon::set_vertices); + ClassDB::bind_method(D_METHOD("get_vertices"), &NavigationPolygon::get_vertices); + + ClassDB::bind_method(D_METHOD("add_polygon", "polygon"), &NavigationPolygon::add_polygon); + ClassDB::bind_method(D_METHOD("get_polygon_count"), &NavigationPolygon::get_polygon_count); + ClassDB::bind_method(D_METHOD("get_polygon", "idx"), &NavigationPolygon::get_polygon); + ClassDB::bind_method(D_METHOD("clear_polygons"), &NavigationPolygon::clear_polygons); + ClassDB::bind_method(D_METHOD("get_navigation_mesh"), &NavigationPolygon::get_navigation_mesh); + + ClassDB::bind_method(D_METHOD("add_outline", "outline"), &NavigationPolygon::add_outline); + ClassDB::bind_method(D_METHOD("add_outline_at_index", "outline", "index"), &NavigationPolygon::add_outline_at_index); + ClassDB::bind_method(D_METHOD("get_outline_count"), &NavigationPolygon::get_outline_count); + ClassDB::bind_method(D_METHOD("set_outline", "idx", "outline"), &NavigationPolygon::set_outline); + ClassDB::bind_method(D_METHOD("get_outline", "idx"), &NavigationPolygon::get_outline); + ClassDB::bind_method(D_METHOD("remove_outline", "idx"), &NavigationPolygon::remove_outline); + ClassDB::bind_method(D_METHOD("clear_outlines"), &NavigationPolygon::clear_outlines); + ClassDB::bind_method(D_METHOD("make_polygons_from_outlines"), &NavigationPolygon::make_polygons_from_outlines); + + ClassDB::bind_method(D_METHOD("_set_polygons", "polygons"), &NavigationPolygon::_set_polygons); + ClassDB::bind_method(D_METHOD("_get_polygons"), &NavigationPolygon::_get_polygons); + + ClassDB::bind_method(D_METHOD("_set_outlines", "outlines"), &NavigationPolygon::_set_outlines); + ClassDB::bind_method(D_METHOD("_get_outlines"), &NavigationPolygon::_get_outlines); + + ADD_PROPERTY(PropertyInfo(Variant::PACKED_VECTOR2_ARRAY, "vertices", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "set_vertices", "get_vertices"); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "polygons", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "_set_polygons", "_get_polygons"); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "outlines", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NO_EDITOR | PROPERTY_USAGE_INTERNAL), "_set_outlines", "_get_outlines"); +} diff --git a/scene/resources/navigation_polygon.h b/scene/resources/navigation_polygon.h new file mode 100644 index 0000000000..e943cff04e --- /dev/null +++ b/scene/resources/navigation_polygon.h @@ -0,0 +1,94 @@ +/*************************************************************************/ +/* navigation_polygon.h */ +/*************************************************************************/ +/* This file is part of: */ +/* GODOT ENGINE */ +/* https://godotengine.org */ +/*************************************************************************/ +/* Copyright (c) 2007-2022 Juan Linietsky, Ariel Manzur. */ +/* Copyright (c) 2014-2022 Godot Engine contributors (cf. AUTHORS.md). */ +/* */ +/* Permission is hereby granted, free of charge, to any person obtaining */ +/* a copy of this software and associated documentation files (the */ +/* "Software"), to deal in the Software without restriction, including */ +/* without limitation the rights to use, copy, modify, merge, publish, */ +/* distribute, sublicense, and/or sell copies of the Software, and to */ +/* permit persons to whom the Software is furnished to do so, subject to */ +/* the following conditions: */ +/* */ +/* The above copyright notice and this permission notice shall be */ +/* included in all copies or substantial portions of the Software. */ +/* */ +/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */ +/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */ +/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.*/ +/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */ +/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */ +/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */ +/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */ +/*************************************************************************/ + +#ifndef NAVIGATION_POLYGON_H +#define NAVIGATION_POLYGON_H + +#include "scene/2d/node_2d.h" +#include "scene/resources/navigation_mesh.h" + +class NavigationPolygon : public Resource { + GDCLASS(NavigationPolygon, Resource); + + Vector<Vector2> vertices; + struct Polygon { + Vector<int> indices; + }; + Vector<Polygon> polygons; + Vector<Vector<Vector2>> outlines; + + mutable Rect2 item_rect; + mutable bool rect_cache_dirty = true; + + Mutex navigation_mesh_generation; + // Navigation mesh + Ref<NavigationMesh> navigation_mesh; + +protected: + static void _bind_methods(); + + void _set_polygons(const TypedArray<Vector<int32_t>> &p_array); + TypedArray<Vector<int32_t>> _get_polygons() const; + + void _set_outlines(const TypedArray<Vector<Vector2>> &p_array); + TypedArray<Vector<Vector2>> _get_outlines() const; + +public: +#ifdef TOOLS_ENABLED + Rect2 _edit_get_rect() const; + bool _edit_is_selected_on_click(const Point2 &p_point, double p_tolerance) const; +#endif + + void set_vertices(const Vector<Vector2> &p_vertices); + Vector<Vector2> get_vertices() const; + + void add_polygon(const Vector<int> &p_polygon); + int get_polygon_count() const; + + void add_outline(const Vector<Vector2> &p_outline); + void add_outline_at_index(const Vector<Vector2> &p_outline, int p_index); + void set_outline(int p_idx, const Vector<Vector2> &p_outline); + Vector<Vector2> get_outline(int p_idx) const; + void remove_outline(int p_idx); + int get_outline_count() const; + + void clear_outlines(); + void make_polygons_from_outlines(); + + Vector<int> get_polygon(int p_idx); + void clear_polygons(); + + Ref<NavigationMesh> get_navigation_mesh(); + + NavigationPolygon() {} + ~NavigationPolygon() {} +}; + +#endif // NAVIGATION_POLYGON_H diff --git a/scene/resources/packed_scene.cpp b/scene/resources/packed_scene.cpp index f4b7f3d0b2..5316b524ba 100644 --- a/scene/resources/packed_scene.cpp +++ b/scene/resources/packed_scene.cpp @@ -450,7 +450,7 @@ Node *SceneState::instantiate(GenEditState p_edit_state) const { callable = callable.bindp(argptrs, binds.size()); } - cfrom->connect(snames[c.signal], callable, CONNECT_PERSIST | c.flags); + cfrom->connect(snames[c.signal], callable, CONNECT_PERSIST | c.flags | (p_edit_state == GEN_EDIT_STATE_MAIN ? 0 : CONNECT_INHERITED)); } //Node *s = ret_nodes[0]; diff --git a/scene/resources/primitive_meshes.cpp b/scene/resources/primitive_meshes.cpp index 2e8fcb3717..54d3676c15 100644 --- a/scene/resources/primitive_meshes.cpp +++ b/scene/resources/primitive_meshes.cpp @@ -2171,6 +2171,24 @@ int TubeTrailMesh::get_section_rings() const { return section_rings; } +void TubeTrailMesh::set_cap_top(bool p_cap_top) { + cap_top = p_cap_top; + _request_update(); +} + +bool TubeTrailMesh::is_cap_top() const { + return cap_top; +} + +void TubeTrailMesh::set_cap_bottom(bool p_cap_bottom) { + cap_bottom = p_cap_bottom; + _request_update(); +} + +bool TubeTrailMesh::is_cap_bottom() const { + return cap_bottom; +} + void TubeTrailMesh::set_curve(const Ref<Curve> &p_curve) { if (curve == p_curve) { return; @@ -2284,49 +2302,21 @@ void TubeTrailMesh::_create_mesh_array(Array &p_arr) const { thisrow = point; } - // add top - float scale_pos = 1.0; - if (curve.is_valid() && curve->get_point_count() > 0) { - scale_pos = curve->sample_baked(0); - } - - if (scale_pos > CMP_EPSILON) { - float y = depth * 0.5; - - thisrow = point; - points.push_back(Vector3(0.0, y, 0)); - normals.push_back(Vector3(0.0, 1.0, 0.0)); - ADD_TANGENT(1.0, 0.0, 0.0, 1.0) - uvs.push_back(Vector2(0.25, 0.75)); - point++; - - bone_indices.push_back(0); - bone_indices.push_back(0); - bone_indices.push_back(0); - bone_indices.push_back(0); - - bone_weights.push_back(1.0); - bone_weights.push_back(0); - bone_weights.push_back(0); - bone_weights.push_back(0); - - float rm = radius * scale_pos; - - for (int i = 0; i <= radial_steps; i++) { - float r = i; - r /= radial_steps; - - float x = sin(r * Math_TAU); - float z = cos(r * Math_TAU); + if (cap_top) { + // add top + float scale_pos = 1.0; + if (curve.is_valid() && curve->get_point_count() > 0) { + scale_pos = curve->sample_baked(0); + } - float u = ((x + 1.0) * 0.25); - float v = 0.5 + ((z + 1.0) * 0.25); + if (scale_pos > CMP_EPSILON) { + float y = depth * 0.5; - Vector3 p = Vector3(x * rm, y, z * rm); - points.push_back(p); + thisrow = point; + points.push_back(Vector3(0.0, y, 0)); normals.push_back(Vector3(0.0, 1.0, 0.0)); ADD_TANGENT(1.0, 0.0, 0.0, 1.0) - uvs.push_back(Vector2(u, v)); + uvs.push_back(Vector2(0.25, 0.75)); point++; bone_indices.push_back(0); @@ -2339,57 +2329,59 @@ void TubeTrailMesh::_create_mesh_array(Array &p_arr) const { bone_weights.push_back(0); bone_weights.push_back(0); - if (i > 0) { - indices.push_back(thisrow); - indices.push_back(point - 1); - indices.push_back(point - 2); - } - } - } + float rm = radius * scale_pos; - float scale_neg = 1.0; - if (curve.is_valid() && curve->get_point_count() > 0) { - scale_neg = curve->sample_baked(1.0); - } + for (int i = 0; i <= radial_steps; i++) { + float r = i; + r /= radial_steps; - // add bottom - if (scale_neg > CMP_EPSILON) { - float y = depth * -0.5; + float x = sin(r * Math_TAU); + float z = cos(r * Math_TAU); - thisrow = point; - points.push_back(Vector3(0.0, y, 0.0)); - normals.push_back(Vector3(0.0, -1.0, 0.0)); - ADD_TANGENT(1.0, 0.0, 0.0, 1.0) - uvs.push_back(Vector2(0.75, 0.75)); - point++; + float u = ((x + 1.0) * 0.25); + float v = 0.5 + ((z + 1.0) * 0.25); - bone_indices.push_back(sections); - bone_indices.push_back(0); - bone_indices.push_back(0); - bone_indices.push_back(0); + Vector3 p = Vector3(x * rm, y, z * rm); + points.push_back(p); + normals.push_back(Vector3(0.0, 1.0, 0.0)); + ADD_TANGENT(1.0, 0.0, 0.0, 1.0) + uvs.push_back(Vector2(u, v)); + point++; - bone_weights.push_back(1.0); - bone_weights.push_back(0); - bone_weights.push_back(0); - bone_weights.push_back(0); + bone_indices.push_back(0); + bone_indices.push_back(0); + bone_indices.push_back(0); + bone_indices.push_back(0); - float rm = radius * scale_neg; + bone_weights.push_back(1.0); + bone_weights.push_back(0); + bone_weights.push_back(0); + bone_weights.push_back(0); - for (int i = 0; i <= radial_steps; i++) { - float r = i; - r /= radial_steps; + if (i > 0) { + indices.push_back(thisrow); + indices.push_back(point - 1); + indices.push_back(point - 2); + } + } + } + } - float x = sin(r * Math_TAU); - float z = cos(r * Math_TAU); + if (cap_bottom) { + float scale_neg = 1.0; + if (curve.is_valid() && curve->get_point_count() > 0) { + scale_neg = curve->sample_baked(1.0); + } - float u = 0.5 + ((x + 1.0) * 0.25); - float v = 1.0 - ((z + 1.0) * 0.25); + if (scale_neg > CMP_EPSILON) { + // add bottom + float y = depth * -0.5; - Vector3 p = Vector3(x * rm, y, z * rm); - points.push_back(p); + thisrow = point; + points.push_back(Vector3(0.0, y, 0.0)); normals.push_back(Vector3(0.0, -1.0, 0.0)); ADD_TANGENT(1.0, 0.0, 0.0, 1.0) - uvs.push_back(Vector2(u, v)); + uvs.push_back(Vector2(0.75, 0.75)); point++; bone_indices.push_back(sections); @@ -2402,10 +2394,40 @@ void TubeTrailMesh::_create_mesh_array(Array &p_arr) const { bone_weights.push_back(0); bone_weights.push_back(0); - if (i > 0) { - indices.push_back(thisrow); - indices.push_back(point - 2); - indices.push_back(point - 1); + float rm = radius * scale_neg; + + for (int i = 0; i <= radial_steps; i++) { + float r = i; + r /= radial_steps; + + float x = sin(r * Math_TAU); + float z = cos(r * Math_TAU); + + float u = 0.5 + ((x + 1.0) * 0.25); + float v = 1.0 - ((z + 1.0) * 0.25); + + Vector3 p = Vector3(x * rm, y, z * rm); + points.push_back(p); + normals.push_back(Vector3(0.0, -1.0, 0.0)); + ADD_TANGENT(1.0, 0.0, 0.0, 1.0) + uvs.push_back(Vector2(u, v)); + point++; + + bone_indices.push_back(sections); + bone_indices.push_back(0); + bone_indices.push_back(0); + bone_indices.push_back(0); + + bone_weights.push_back(1.0); + bone_weights.push_back(0); + bone_weights.push_back(0); + bone_weights.push_back(0); + + if (i > 0) { + indices.push_back(thisrow); + indices.push_back(point - 2); + indices.push_back(point - 1); + } } } } @@ -2435,6 +2457,12 @@ void TubeTrailMesh::_bind_methods() { ClassDB::bind_method(D_METHOD("set_section_rings", "section_rings"), &TubeTrailMesh::set_section_rings); ClassDB::bind_method(D_METHOD("get_section_rings"), &TubeTrailMesh::get_section_rings); + ClassDB::bind_method(D_METHOD("set_cap_top", "cap_top"), &TubeTrailMesh::set_cap_top); + ClassDB::bind_method(D_METHOD("is_cap_top"), &TubeTrailMesh::is_cap_top); + + ClassDB::bind_method(D_METHOD("set_cap_bottom", "cap_bottom"), &TubeTrailMesh::set_cap_bottom); + ClassDB::bind_method(D_METHOD("is_cap_bottom"), &TubeTrailMesh::is_cap_bottom); + ClassDB::bind_method(D_METHOD("set_curve", "curve"), &TubeTrailMesh::set_curve); ClassDB::bind_method(D_METHOD("get_curve"), &TubeTrailMesh::get_curve); @@ -2447,13 +2475,16 @@ void TubeTrailMesh::_bind_methods() { ADD_PROPERTY(PropertyInfo(Variant::INT, "section_rings", PROPERTY_HINT_RANGE, "1,128,1"), "set_section_rings", "get_section_rings"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "cap_top"), "set_cap_top", "is_cap_top"); + ADD_PROPERTY(PropertyInfo(Variant::BOOL, "cap_bottom"), "set_cap_bottom", "is_cap_bottom"); + ADD_PROPERTY(PropertyInfo(Variant::OBJECT, "curve", PROPERTY_HINT_RESOURCE_TYPE, "Curve"), "set_curve", "get_curve"); } TubeTrailMesh::TubeTrailMesh() { } -// TUBE TRAIL +// RIBBON TRAIL void RibbonTrailMesh::set_shape(Shape p_shape) { shape = p_shape; diff --git a/scene/resources/primitive_meshes.h b/scene/resources/primitive_meshes.h index 06f9781b84..5cef042a18 100644 --- a/scene/resources/primitive_meshes.h +++ b/scene/resources/primitive_meshes.h @@ -431,6 +431,8 @@ private: int sections = 5; float section_length = 0.2; int section_rings = 3; + bool cap_top = true; + bool cap_bottom = true; Ref<Curve> curve; @@ -456,6 +458,12 @@ public: void set_section_rings(const int p_section_rings); int get_section_rings() const; + void set_cap_top(bool p_cap_top); + bool is_cap_top() const; + + void set_cap_bottom(bool p_cap_bottom); + bool is_cap_bottom() const; + void set_curve(const Ref<Curve> &p_curve); Ref<Curve> get_curve() const; diff --git a/scene/resources/resource_format_text.cpp b/scene/resources/resource_format_text.cpp index 36e4a8ea37..092f672cba 100644 --- a/scene/resources/resource_format_text.cpp +++ b/scene/resources/resource_format_text.cpp @@ -836,7 +836,8 @@ void ResourceLoaderText::set_translation_remapped(bool p_remapped) { translation_remapped = p_remapped; } -ResourceLoaderText::ResourceLoaderText() {} +ResourceLoaderText::ResourceLoaderText() : + stream(false) {} void ResourceLoaderText::get_dependencies(Ref<FileAccess> p_f, List<String> *p_dependencies, bool p_add_types) { open(p_f); @@ -981,15 +982,26 @@ Error ResourceLoaderText::rename_dependencies(Ref<FileAccess> p_f, const String f->seek(tag_end); - uint8_t c = f->get_8(); - if (c == '\n' && !f->eof_reached()) { - // Skip first newline character since we added one - c = f->get_8(); + const uint32_t buffer_size = 2048; + uint8_t *buffer = (uint8_t *)alloca(buffer_size); + uint32_t num_read; + + num_read = f->get_buffer(buffer, buffer_size); + ERR_FAIL_COND_V_MSG(num_read == UINT32_MAX, ERR_CANT_CREATE, "Failed to allocate memory for buffer."); + ERR_FAIL_COND_V(num_read == 0, ERR_FILE_CORRUPT); + + if (*buffer == '\n') { + // Skip first newline character since we added one. + if (num_read > 1) { + fw->store_buffer(buffer + 1, num_read - 1); + } + } else { + fw->store_buffer(buffer, num_read); } while (!f->eof_reached()) { - fw->store_8(c); - c = f->get_8(); + num_read = f->get_buffer(buffer, buffer_size); + fw->store_buffer(buffer, num_read); } bool all_ok = fw->get_error() == OK; diff --git a/scene/resources/text_line.cpp b/scene/resources/text_line.cpp index afab44834d..d094563e6a 100644 --- a/scene/resources/text_line.cpp +++ b/scene/resources/text_line.cpp @@ -56,8 +56,8 @@ void TextLine::_bind_methods() { ClassDB::bind_method(D_METHOD("set_bidi_override", "override"), &TextLine::set_bidi_override); ClassDB::bind_method(D_METHOD("add_string", "text", "font", "font_size", "language", "meta"), &TextLine::add_string, DEFVAL(""), DEFVAL(Variant())); - ClassDB::bind_method(D_METHOD("add_object", "key", "size", "inline_align", "length"), &TextLine::add_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(1)); - ClassDB::bind_method(D_METHOD("resize_object", "key", "size", "inline_align"), &TextLine::resize_object, DEFVAL(INLINE_ALIGNMENT_CENTER)); + ClassDB::bind_method(D_METHOD("add_object", "key", "size", "inline_align", "length", "baseline"), &TextLine::add_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(1), DEFVAL(0.0)); + ClassDB::bind_method(D_METHOD("resize_object", "key", "size", "inline_align", "baseline"), &TextLine::resize_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(0.0)); ClassDB::bind_method(D_METHOD("set_width", "width"), &TextLine::set_width); ClassDB::bind_method(D_METHOD("get_width"), &TextLine::get_width); @@ -202,15 +202,15 @@ bool TextLine::add_string(const String &p_text, const Ref<Font> &p_font, int p_f return res; } -bool TextLine::add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align, int p_length) { - bool res = TS->shaped_text_add_object(rid, p_key, p_size, p_inline_align, p_length); +bool TextLine::add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align, int p_length, float p_baseline) { + bool res = TS->shaped_text_add_object(rid, p_key, p_size, p_inline_align, p_length, p_baseline); dirty = true; return res; } -bool TextLine::resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align) { +bool TextLine::resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align, float p_baseline) { const_cast<TextLine *>(this)->_shape(); - return TS->shaped_text_resize_object(rid, p_key, p_size, p_inline_align); + return TS->shaped_text_resize_object(rid, p_key, p_size, p_inline_align, p_baseline); } Array TextLine::get_objects() const { diff --git a/scene/resources/text_line.h b/scene/resources/text_line.h index e70e82cf2b..801a8a8c11 100644 --- a/scene/resources/text_line.h +++ b/scene/resources/text_line.h @@ -76,8 +76,8 @@ public: bool get_preserve_control() const; bool add_string(const String &p_text, const Ref<Font> &p_font, int p_font_size, const String &p_language = "", const Variant &p_meta = Variant()); - bool add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int p_length = 1); - bool resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER); + bool add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int p_length = 1, float p_baseline = 0.0); + bool resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, float p_baseline = 0.0); void set_horizontal_alignment(HorizontalAlignment p_alignment); HorizontalAlignment get_horizontal_alignment() const; diff --git a/scene/resources/text_paragraph.cpp b/scene/resources/text_paragraph.cpp index 59bb24c8b8..d2e85d28e6 100644 --- a/scene/resources/text_paragraph.cpp +++ b/scene/resources/text_paragraph.cpp @@ -64,8 +64,8 @@ void TextParagraph::_bind_methods() { ClassDB::bind_method(D_METHOD("clear_dropcap"), &TextParagraph::clear_dropcap); ClassDB::bind_method(D_METHOD("add_string", "text", "font", "font_size", "language", "meta"), &TextParagraph::add_string, DEFVAL(""), DEFVAL(Variant())); - ClassDB::bind_method(D_METHOD("add_object", "key", "size", "inline_align", "length"), &TextParagraph::add_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(1)); - ClassDB::bind_method(D_METHOD("resize_object", "key", "size", "inline_align"), &TextParagraph::resize_object, DEFVAL(INLINE_ALIGNMENT_CENTER)); + ClassDB::bind_method(D_METHOD("add_object", "key", "size", "inline_align", "length", "baseline"), &TextParagraph::add_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(1), DEFVAL(0.0)); + ClassDB::bind_method(D_METHOD("resize_object", "key", "size", "inline_align", "baseline"), &TextParagraph::resize_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(0.0)); ClassDB::bind_method(D_METHOD("set_alignment", "alignment"), &TextParagraph::set_alignment); ClassDB::bind_method(D_METHOD("get_alignment"), &TextParagraph::get_alignment); @@ -385,18 +385,18 @@ void TextParagraph::set_bidi_override(const Array &p_override) { lines_dirty = true; } -bool TextParagraph::add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align, int p_length) { +bool TextParagraph::add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align, int p_length, float p_baseline) { _THREAD_SAFE_METHOD_ - bool res = TS->shaped_text_add_object(rid, p_key, p_size, p_inline_align, p_length); + bool res = TS->shaped_text_add_object(rid, p_key, p_size, p_inline_align, p_length, p_baseline); lines_dirty = true; return res; } -bool TextParagraph::resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align) { +bool TextParagraph::resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align, float p_baseline) { _THREAD_SAFE_METHOD_ - bool res = TS->shaped_text_resize_object(rid, p_key, p_size, p_inline_align); + bool res = TS->shaped_text_resize_object(rid, p_key, p_size, p_inline_align, p_baseline); lines_dirty = true; return res; } diff --git a/scene/resources/text_paragraph.h b/scene/resources/text_paragraph.h index 0fe82b4364..dced278db4 100644 --- a/scene/resources/text_paragraph.h +++ b/scene/resources/text_paragraph.h @@ -95,8 +95,8 @@ public: void clear_dropcap(); bool add_string(const String &p_text, const Ref<Font> &p_font, int p_font_size, const String &p_language = "", const Variant &p_meta = Variant()); - bool add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int p_length = 1); - bool resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER); + bool add_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int p_length = 1, float p_baseline = 0.0); + bool resize_object(Variant p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, float p_baseline = 0.0); void set_alignment(HorizontalAlignment p_alignment); HorizontalAlignment get_alignment() const; diff --git a/scene/resources/texture.cpp b/scene/resources/texture.cpp index 2106619a6b..18915e294e 100644 --- a/scene/resources/texture.cpp +++ b/scene/resources/texture.cpp @@ -1591,35 +1591,28 @@ bool AtlasTexture::get_rect_region(const Rect2 &p_rect, const Rect2 &p_src_rect, return false; } - Rect2 rc = region; - Rect2 src = p_src_rect; if (src.size == Size2()) { - src.size = rc.size; + src.size = region.size; } Vector2 scale = p_rect.size / src.size; - src.position += (rc.position - margin.position); - Rect2 src_c = rc.intersection(src); - if (src_c.size == Size2()) { + src.position += (region.position - margin.position); + Rect2 src_clipped = region.intersection(src); + if (src_clipped.size == Size2()) { return false; } - Vector2 ofs = (src_c.position - src.position); + Vector2 ofs = (src_clipped.position - src.position); if (scale.x < 0) { - float mx = (margin.size.width - margin.position.x); - mx -= margin.position.x; - ofs.x = -(ofs.x + mx); + ofs.x += (src_clipped.size.x - src.size.x); } if (scale.y < 0) { - float my = margin.size.height - margin.position.y; - my -= margin.position.y; - ofs.y = -(ofs.y + my); + ofs.y += (src_clipped.size.y - src.size.y); } - Rect2 dr(p_rect.position + ofs * scale, src_c.size * scale); - r_rect = dr; - r_src_rect = src_c; + r_rect = Rect2(p_rect.position + ofs * scale, src_clipped.size * scale); + r_src_rect = src_clipped; return true; } diff --git a/scene/resources/tile_set.cpp b/scene/resources/tile_set.cpp index 9d2537bb4d..0b0461432b 100644 --- a/scene/resources/tile_set.cpp +++ b/scene/resources/tile_set.cpp @@ -35,7 +35,6 @@ #include "core/math/geometry_2d.h" #include "core/templates/local_vector.h" #include "core/templates/rb_set.h" -#include "scene/2d/navigation_region_2d.h" #include "scene/gui/control.h" #include "scene/resources/convex_polygon_shape_2d.h" #include "servers/navigation_server_2d.h" @@ -477,7 +476,7 @@ int TileSet::add_source(Ref<TileSetSource> p_tile_set_source, int p_atlas_source int new_source_id = p_atlas_source_id_override >= 0 ? p_atlas_source_id_override : next_source_id; sources[new_source_id] = p_tile_set_source; - source_ids.append(new_source_id); + source_ids.push_back(new_source_id); source_ids.sort(); p_tile_set_source->set_tile_set(this); _compute_next_source_id(); @@ -517,7 +516,7 @@ void TileSet::set_source_id(int p_source_id, int p_new_source_id) { sources.erase(p_source_id); source_ids.erase(p_source_id); - source_ids.append(p_new_source_id); + source_ids.push_back(p_new_source_id); source_ids.sort(); _compute_next_source_id(); @@ -1297,7 +1296,7 @@ void TileSet::cleanup_invalid_tile_proxies() { Vector<int> source_to_remove; for (const KeyValue<int, int> &E : source_level_proxies) { if (has_source(E.key)) { - source_to_remove.append(E.key); + source_to_remove.push_back(E.key); } } for (int i = 0; i < source_to_remove.size(); i++) { @@ -1309,7 +1308,7 @@ void TileSet::cleanup_invalid_tile_proxies() { for (const KeyValue<Array, Array> &E : coords_level_proxies) { Array a = E.key; if (has_source(a[0]) && get_source(a[0])->has_tile(a[1])) { - coords_to_remove.append(a); + coords_to_remove.push_back(a); } } for (int i = 0; i < coords_to_remove.size(); i++) { @@ -1322,7 +1321,7 @@ void TileSet::cleanup_invalid_tile_proxies() { for (const KeyValue<Array, Array> &E : alternative_level_proxies) { Array a = E.key; if (has_source(a[0]) && get_source(a[0])->has_tile(a[1]) && get_source(a[0])->has_alternative_tile(a[1], a[2])) { - alternative_to_remove.append(a); + alternative_to_remove.push_back(a); } } for (int i = 0; i < alternative_to_remove.size(); i++) { @@ -1439,16 +1438,18 @@ TileMapCell TileSet::get_random_tile_from_terrains_pattern(int p_terrain_set, Ti Vector<Vector2> TileSet::get_tile_shape_polygon() { Vector<Vector2> points; if (tile_shape == TileSet::TILE_SHAPE_SQUARE) { - points.append(Vector2(-0.5, -0.5)); - points.append(Vector2(0.5, -0.5)); - points.append(Vector2(0.5, 0.5)); - points.append(Vector2(-0.5, 0.5)); + points.push_back(Vector2(-0.5, -0.5)); + points.push_back(Vector2(0.5, -0.5)); + points.push_back(Vector2(0.5, 0.5)); + points.push_back(Vector2(-0.5, 0.5)); + } else if (tile_shape == TileSet::TILE_SHAPE_ISOMETRIC) { + points.push_back(Vector2(0.0, -0.5)); + points.push_back(Vector2(-0.5, 0.0)); + points.push_back(Vector2(0.0, 0.5)); + points.push_back(Vector2(0.5, 0.0)); } else { float overlap = 0.0; switch (tile_shape) { - case TileSet::TILE_SHAPE_ISOMETRIC: - overlap = 0.5; - break; case TileSet::TILE_SHAPE_HEXAGON: overlap = 0.25; break; @@ -1459,12 +1460,13 @@ Vector<Vector2> TileSet::get_tile_shape_polygon() { break; } - points.append(Vector2(0.0, -0.5)); - points.append(Vector2(-0.5, overlap - 0.5)); - points.append(Vector2(-0.5, 0.5 - overlap)); - points.append(Vector2(0.0, 0.5)); - points.append(Vector2(0.5, 0.5 - overlap)); - points.append(Vector2(0.5, overlap - 0.5)); + points.push_back(Vector2(0.0, -0.5)); + points.push_back(Vector2(-0.5, overlap - 0.5)); + points.push_back(Vector2(-0.5, 0.5 - overlap)); + points.push_back(Vector2(0.0, 0.5)); + points.push_back(Vector2(0.5, 0.5 - overlap)); + points.push_back(Vector2(0.5, overlap - 0.5)); + if (get_tile_offset_axis() == TileSet::TILE_OFFSET_AXIS_VERTICAL) { for (int i = 0; i < points.size(); i++) { points.write[i] = Vector2(points[i].y, points[i].x); @@ -3854,7 +3856,7 @@ bool TileSetAtlasSource::_set(const StringName &p_name, const Variant &p_value) tiles[coords].alternatives[alternative_id] = memnew(TileData); tiles[coords].alternatives[alternative_id]->set_tile_set(tile_set); tiles[coords].alternatives[alternative_id]->set_allow_transform(alternative_id > 0); - tiles[coords].alternatives_ids.append(alternative_id); + tiles[coords].alternatives_ids.push_back(alternative_id); } if (components.size() >= 3) { bool valid; @@ -4028,11 +4030,11 @@ void TileSetAtlasSource::create_tile(const Vector2i p_atlas_coords, const Vector tad.alternatives[0]->set_allow_transform(false); tad.alternatives[0]->connect("changed", callable_mp((Resource *)this, &TileSetAtlasSource::emit_changed)); tad.alternatives[0]->notify_property_list_changed(); - tad.alternatives_ids.append(0); + tad.alternatives_ids.push_back(0); // Create and resize the tile. tiles.insert(p_atlas_coords, tad); - tiles_ids.append(p_atlas_coords); + tiles_ids.push_back(p_atlas_coords); tiles_ids.sort(); _create_coords_mapping_cache(p_atlas_coords); @@ -4343,7 +4345,7 @@ void TileSetAtlasSource::move_tile_in_atlas(Vector2i p_atlas_coords, Vector2i p_ tiles.erase(p_atlas_coords); tiles_ids.erase(p_atlas_coords); - tiles_ids.append(new_atlas_coords); + tiles_ids.push_back(new_atlas_coords); tiles_ids.sort(); } tiles[new_atlas_coords].size_in_atlas = new_size; @@ -4365,7 +4367,7 @@ int TileSetAtlasSource::create_alternative_tile(const Vector2i p_atlas_coords, i tiles[p_atlas_coords].alternatives[new_alternative_id]->set_allow_transform(true); tiles[p_atlas_coords].alternatives[new_alternative_id]->connect("changed", callable_mp((Resource *)this, &TileSetAtlasSource::emit_changed)); tiles[p_atlas_coords].alternatives[new_alternative_id]->notify_property_list_changed(); - tiles[p_atlas_coords].alternatives_ids.append(new_alternative_id); + tiles[p_atlas_coords].alternatives_ids.push_back(new_alternative_id); tiles[p_atlas_coords].alternatives_ids.sort(); _compute_next_alternative_id(p_atlas_coords); @@ -4395,7 +4397,7 @@ void TileSetAtlasSource::set_alternative_tile_id(const Vector2i p_atlas_coords, ERR_FAIL_COND_MSG(tiles[p_atlas_coords].alternatives.has(p_new_id), vformat("TileSetAtlasSource has already an alternative with id %d at %s.", p_new_id, String(p_atlas_coords))); tiles[p_atlas_coords].alternatives[p_new_id] = tiles[p_atlas_coords].alternatives[p_alternative_tile]; - tiles[p_atlas_coords].alternatives_ids.append(p_new_id); + tiles[p_atlas_coords].alternatives_ids.push_back(p_new_id); tiles[p_atlas_coords].alternatives.erase(p_alternative_tile); tiles[p_atlas_coords].alternatives_ids.erase(p_alternative_tile); @@ -4683,7 +4685,7 @@ int TileSetScenesCollectionSource::create_scene_tile(Ref<PackedScene> p_packed_s int new_scene_id = p_id_override >= 0 ? p_id_override : next_scene_id; scenes[new_scene_id] = SceneData(); - scenes_ids.append(new_scene_id); + scenes_ids.push_back(new_scene_id); scenes_ids.sort(); set_scene_tile_scene(new_scene_id, p_packed_scene); _compute_next_alternative_id(); @@ -4700,7 +4702,7 @@ void TileSetScenesCollectionSource::set_scene_tile_id(int p_id, int p_new_id) { scenes[p_new_id] = SceneData(); scenes[p_new_id] = scenes[p_id]; - scenes_ids.append(p_new_id); + scenes_ids.push_back(p_new_id); scenes_ids.sort(); _compute_next_alternative_id(); diff --git a/scene/resources/tile_set.h b/scene/resources/tile_set.h index 9f465a17e9..88bbbd157a 100644 --- a/scene/resources/tile_set.h +++ b/scene/resources/tile_set.h @@ -36,10 +36,10 @@ #include "core/templates/local_vector.h" #include "core/templates/rb_set.h" #include "scene/2d/light_occluder_2d.h" -#include "scene/2d/navigation_region_2d.h" #include "scene/main/canvas_item.h" #include "scene/resources/concave_polygon_shape_2d.h" #include "scene/resources/convex_polygon_shape_2d.h" +#include "scene/resources/navigation_polygon.h" #include "scene/resources/packed_scene.h" #include "scene/resources/physics_material.h" #include "scene/resources/shape_2d.h" diff --git a/scene/resources/visual_shader.cpp b/scene/resources/visual_shader.cpp index 461dccfbdd..6b8f8097a8 100644 --- a/scene/resources/visual_shader.cpp +++ b/scene/resources/visual_shader.cpp @@ -2066,10 +2066,9 @@ Error VisualShader::_write_node(Type type, StringBuilder *p_global_code, StringB } if (!node_code.is_empty()) { - r_code += "\n"; + r_code += "\n\n"; } - r_code += "\n"; // r_processed.insert(p_node); return OK; @@ -2366,71 +2365,62 @@ void VisualShader::_update_shader() const { String global_compute_code; if (shader_mode == Shader::MODE_PARTICLES) { - bool has_start = !code_map[TYPE_START].is_empty(); bool has_start_custom = !code_map[TYPE_START_CUSTOM].is_empty(); bool has_process = !code_map[TYPE_PROCESS].is_empty(); bool has_process_custom = !code_map[TYPE_PROCESS_CUSTOM].is_empty(); bool has_collide = !code_map[TYPE_COLLIDE].is_empty(); shader_code += "void start() {\n"; - if (has_start || has_start_custom) { - shader_code += " uint __seed = __hash(NUMBER + uint(1) + RANDOM_SEED);\n"; - shader_code += " vec3 __diff = TRANSFORM[3].xyz - EMISSION_TRANSFORM[3].xyz;\n"; - shader_code += " float __radians;\n"; - shader_code += " vec3 __vec3_buff1;\n"; - shader_code += " vec3 __vec3_buff2;\n"; - shader_code += " float __scalar_buff1;\n"; - shader_code += " float __scalar_buff2;\n"; - shader_code += " int __scalar_ibuff;\n"; - shader_code += " vec4 __vec4_buff;\n"; - shader_code += " vec3 __ndiff = normalize(__diff);\n\n"; - } - if (has_start) { - shader_code += " {\n"; - shader_code += code_map[TYPE_START].replace("\n ", "\n "); - shader_code += " }\n"; - if (has_start_custom) { - shader_code += " \n"; - } - } + shader_code += " uint __seed = __hash(NUMBER + uint(1) + RANDOM_SEED);\n"; + shader_code += "\n"; + shader_code += " {\n"; + shader_code += code_map[TYPE_START].replace("\n ", "\n "); + shader_code += " }\n"; if (has_start_custom) { + shader_code += " \n"; shader_code += " {\n"; shader_code += code_map[TYPE_START_CUSTOM].replace("\n ", "\n "); shader_code += " }\n"; } shader_code += "}\n\n"; - shader_code += "void process() {\n"; + if (has_process || has_process_custom || has_collide) { + shader_code += "void process() {\n"; shader_code += " uint __seed = __hash(NUMBER + uint(1) + RANDOM_SEED);\n"; - shader_code += " vec3 __vec3_buff1;\n"; - shader_code += " vec3 __diff = TRANSFORM[3].xyz - EMISSION_TRANSFORM[3].xyz;\n"; - shader_code += " vec3 __ndiff = normalize(__diff);\n\n"; - } - shader_code += " {\n"; - String tab = " "; - if (has_collide) { - shader_code += " if (COLLIDED) {\n\n"; - shader_code += code_map[TYPE_COLLIDE].replace("\n ", "\n "); + shader_code += "\n"; + if (has_process || has_collide) { + shader_code += " {\n"; + } + String tab = " "; + if (has_collide) { + shader_code += " if (COLLIDED) {\n\n"; + shader_code += code_map[TYPE_COLLIDE].replace("\n ", "\n "); + if (has_process) { + shader_code += " } else {\n\n"; + tab += " "; + } + } if (has_process) { - shader_code += " } else {\n\n"; - tab += " "; + shader_code += code_map[TYPE_PROCESS].replace("\n ", "\n " + tab); + } + if (has_collide) { + shader_code += " }\n"; + } + if (has_process || has_collide) { + shader_code += " }\n"; } - } - if (has_process) { - shader_code += code_map[TYPE_PROCESS].replace("\n ", "\n " + tab); - } - if (has_collide) { - shader_code += " }\n"; - } - shader_code += " }\n"; - if (has_process_custom) { - shader_code += " {\n\n"; - shader_code += code_map[TYPE_PROCESS_CUSTOM].replace("\n ", "\n "); - shader_code += " }\n"; - } + if (has_process_custom) { + if (has_process || has_collide) { + shader_code += " \n"; + } + shader_code += " {\n"; + shader_code += code_map[TYPE_PROCESS_CUSTOM].replace("\n ", "\n "); + shader_code += " }\n"; + } - shader_code += "}\n\n"; + shader_code += "}\n\n"; + } global_compute_code += "float __rand_from_seed(inout uint seed) {\n"; global_compute_code += " int k;\n"; diff --git a/scene/resources/visual_shader_particle_nodes.cpp b/scene/resources/visual_shader_particle_nodes.cpp index f125b05a26..d61a343688 100644 --- a/scene/resources/visual_shader_particle_nodes.cpp +++ b/scene/resources/visual_shader_particle_nodes.cpp @@ -374,13 +374,13 @@ String VisualShaderNodeParticleMeshEmitter::_generate_code(VisualShader::Type p_ if (is_output_port_connected(p_index)) { switch (p_port_type) { case PORT_TYPE_VECTOR_2D: { - code += vformat(" %s = texelFetch(%s, ivec2(__scalar_ibuff, 0), 0).xy;\n", p_output_vars[p_index], make_unique_id(p_type, p_id, p_texture_name)); + code += vformat(" %s = texelFetch(%s, ivec2(__scalar_ibuff, 0), 0).xy;\n", p_output_vars[p_index], make_unique_id(p_type, p_id, p_texture_name)); } break; case PORT_TYPE_VECTOR_3D: { if (mode_2d) { - code += vformat(" %s = texelFetch(%s, ivec2(__scalar_ibuff, 0), 0).xy;\n", p_output_vars[p_index], make_unique_id(p_type, p_id, p_texture_name)); + code += vformat(" %s = texelFetch(%s, ivec2(__scalar_ibuff, 0), 0).xy;\n", p_output_vars[p_index], make_unique_id(p_type, p_id, p_texture_name)); } else { - code += vformat(" %s = texelFetch(%s, ivec2(__scalar_ibuff, 0), 0).xyz;\n", p_output_vars[p_index], make_unique_id(p_type, p_id, p_texture_name)); + code += vformat(" %s = texelFetch(%s, ivec2(__scalar_ibuff, 0), 0).xyz;\n", p_output_vars[p_index], make_unique_id(p_type, p_id, p_texture_name)); } } break; default: @@ -392,25 +392,27 @@ String VisualShaderNodeParticleMeshEmitter::_generate_code(VisualShader::Type p_ String VisualShaderNodeParticleMeshEmitter::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { String code; - code += " __scalar_ibuff = int(__rand_from_seed(__seed) * 65535.0) % " + itos(position_texture->get_width()) + ";\n"; + code += " {\n"; + code += " int __scalar_ibuff = int(__rand_from_seed(__seed) * 65535.0) % " + itos(position_texture->get_width()) + ";\n"; code += _generate_code(p_type, p_id, p_output_vars, 0, "mesh_vx", VisualShaderNode::PORT_TYPE_VECTOR_3D); code += _generate_code(p_type, p_id, p_output_vars, 1, "mesh_nm", VisualShaderNode::PORT_TYPE_VECTOR_3D); if (is_output_port_connected(2) || is_output_port_connected(3)) { - code += vformat(" __vec4_buff = texelFetch(%s, ivec2(__scalar_ibuff, 0), 0);\n", make_unique_id(p_type, p_id, "mesh_col")); + code += vformat(" vec4 __vec4_buff = texelFetch(%s, ivec2(__scalar_ibuff, 0), 0);\n", make_unique_id(p_type, p_id, "mesh_col")); if (is_output_port_connected(2)) { - code += " " + p_output_vars[2] + " = __vec4_buff.rgb;\n"; + code += " " + p_output_vars[2] + " = __vec4_buff.rgb;\n"; } if (is_output_port_connected(3)) { - code += " " + p_output_vars[3] + " = __vec4_buff.a;\n"; + code += " " + p_output_vars[3] + " = __vec4_buff.a;\n"; } } code += _generate_code(p_type, p_id, p_output_vars, 4, "mesh_uv", VisualShaderNode::PORT_TYPE_VECTOR_2D); code += _generate_code(p_type, p_id, p_output_vars, 5, "mesh_uv2", VisualShaderNode::PORT_TYPE_VECTOR_2D); + code += " }\n"; return code; } @@ -737,6 +739,8 @@ VisualShaderNodeParticleMeshEmitter::VisualShaderNodeParticleMeshEmitter() { color_texture.instantiate(); uv_texture.instantiate(); uv2_texture.instantiate(); + + simple_decl = false; } // VisualShaderNodeParticleMultiplyByAxisAngle @@ -879,22 +883,26 @@ bool VisualShaderNodeParticleConeVelocity::has_output_port_preview(int p_port) c String VisualShaderNodeParticleConeVelocity::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { String code; - code += " __radians = radians(" + (p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]) + ");\n"; - code += " __scalar_buff1 = __rand_from_seed_m1_p1(__seed) * __radians;\n"; - code += " __scalar_buff2 = __rand_from_seed_m1_p1(__seed) * __radians;\n"; - code += " __vec3_buff1 = " + (p_input_vars[0].is_empty() ? "vec3" + (String)get_input_port_default_value(0) : p_input_vars[0]) + ";\n"; - code += " __scalar_buff1 += __vec3_buff1.z != 0.0 ? atan(__vec3_buff1.x, __vec3_buff1.z) : sign(__vec3_buff1.x) * (PI / 2.0);\n"; - code += " __scalar_buff2 += __vec3_buff1.z != 0.0 ? atan(__vec3_buff1.y, abs(__vec3_buff1.z)) : (__vec3_buff1.x != 0.0 ? atan(__vec3_buff1.y, abs(__vec3_buff1.x)) : sign(__vec3_buff1.y) * (PI / 2.0));\n"; - code += " __vec3_buff1 = vec3(sin(__scalar_buff1), 0.0, cos(__scalar_buff1));\n"; - code += " __vec3_buff2 = vec3(0.0, sin(__scalar_buff2), cos(__scalar_buff2));\n"; - code += " __vec3_buff2.z = __vec3_buff2.z / max(0.0001, sqrt(abs(__vec3_buff2.z)));\n"; - code += " " + p_output_vars[0] + " = normalize(vec3(__vec3_buff1.x * __vec3_buff2.z, __vec3_buff2.y, __vec3_buff1.z * __vec3_buff2.z));\n"; + code += " {\n"; + code += " float __radians = radians(" + (p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]) + ");\n"; + code += " float __scalar_buff1 = __rand_from_seed_m1_p1(__seed) * __radians;\n"; + code += " float __scalar_buff2 = __rand_from_seed_m1_p1(__seed) * __radians;\n"; + code += " vec3 __vec3_buff1 = " + (p_input_vars[0].is_empty() ? "vec3" + (String)get_input_port_default_value(0) : p_input_vars[0]) + ";\n"; + code += " __scalar_buff1 += __vec3_buff1.z != 0.0 ? atan(__vec3_buff1.x, __vec3_buff1.z) : sign(__vec3_buff1.x) * (PI / 2.0);\n"; + code += " __scalar_buff2 += __vec3_buff1.z != 0.0 ? atan(__vec3_buff1.y, abs(__vec3_buff1.z)) : (__vec3_buff1.x != 0.0 ? atan(__vec3_buff1.y, abs(__vec3_buff1.x)) : sign(__vec3_buff1.y) * (PI / 2.0));\n"; + code += " __vec3_buff1 = vec3(sin(__scalar_buff1), 0.0, cos(__scalar_buff1));\n"; + code += " vec3 __vec3_buff2 = vec3(0.0, sin(__scalar_buff2), cos(__scalar_buff2));\n"; + code += " __vec3_buff2.z = __vec3_buff2.z / max(0.0001, sqrt(abs(__vec3_buff2.z)));\n"; + code += " " + p_output_vars[0] + " = normalize(vec3(__vec3_buff1.x * __vec3_buff2.z, __vec3_buff2.y, __vec3_buff1.z * __vec3_buff2.z));\n"; + code += " }\n"; return code; } VisualShaderNodeParticleConeVelocity::VisualShaderNodeParticleConeVelocity() { set_input_port_default_value(0, Vector3(1, 0, 0)); set_input_port_default_value(1, 45.0); + + simple_decl = false; } // VisualShaderNodeParticleRandomness @@ -1086,21 +1094,26 @@ String VisualShaderNodeParticleAccelerator::get_input_port_name(int p_port) cons String VisualShaderNodeParticleAccelerator::generate_code(Shader::Mode p_mode, VisualShader::Type p_type, int p_id, const String *p_input_vars, const String *p_output_vars, bool p_for_preview) const { String code; + code += " {\n"; switch (mode) { case MODE_LINEAR: - code += " " + p_output_vars[0] + " = length(VELOCITY) > 0.0 ? " + "normalize(VELOCITY) * " + (p_input_vars[0].is_empty() ? "vec3" + (String)get_input_port_default_value(0) : p_input_vars[0]) + " * mix(1.0, __rand_from_seed(__seed), " + (p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]) + ") : vec3(0.0);\n"; + code += " " + p_output_vars[0] + " = length(VELOCITY) > 0.0 ? " + "normalize(VELOCITY) * " + (p_input_vars[0].is_empty() ? "vec3" + (String)get_input_port_default_value(0) : p_input_vars[0]) + " * mix(1.0, __rand_from_seed(__seed), " + (p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]) + ") : vec3(0.0);\n"; break; case MODE_RADIAL: - code += " " + p_output_vars[0] + " = length(__diff) > 0.0 ? __ndiff * " + (p_input_vars[0].is_empty() ? "vec3" + (String)get_input_port_default_value(0) : p_input_vars[0]) + " * mix(1.0, __rand_from_seed(__seed), " + (p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]) + ") : vec3(0.0);\n"; + code += " vec3 __diff = TRANSFORM[3].xyz - EMISSION_TRANSFORM[3].xyz;\n"; + code += " vec3 __ndiff = normalize(__diff);\n\n"; + code += " " + p_output_vars[0] + " = length(__diff) > 0.0 ? __ndiff * " + (p_input_vars[0].is_empty() ? "vec3" + (String)get_input_port_default_value(0) : p_input_vars[0]) + " * mix(1.0, __rand_from_seed(__seed), " + (p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]) + ") : vec3(0.0);\n"; break; case MODE_TANGENTIAL: - code += " __vec3_buff1 = cross(__ndiff, normalize(" + (p_input_vars[2].is_empty() ? "vec3" + (String)get_input_port_default_value(2) : p_input_vars[2]) + "));\n"; - code += " " + p_output_vars[0] + " = length(__vec3_buff1) > 0.0 ? normalize(__vec3_buff1) * (" + (p_input_vars[0].is_empty() ? "vec3" + (String)get_input_port_default_value(0) : p_input_vars[0]) + " * mix(1.0, __rand_from_seed(__seed), " + (p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]) + ")) : vec3(0.0);\n"; + code += " vec3 __diff = TRANSFORM[3].xyz - EMISSION_TRANSFORM[3].xyz;\n"; + code += " vec3 __ndiff = normalize(__diff);\n\n"; + code += " vec3 __vec3_buff1 = cross(__ndiff, normalize(" + (p_input_vars[2].is_empty() ? "vec3" + (String)get_input_port_default_value(2) : p_input_vars[2]) + "));\n"; + code += " " + p_output_vars[0] + " = length(__vec3_buff1) > 0.0 ? normalize(__vec3_buff1) * (" + (p_input_vars[0].is_empty() ? "vec3" + (String)get_input_port_default_value(0) : p_input_vars[0]) + " * mix(1.0, __rand_from_seed(__seed), " + (p_input_vars[1].is_empty() ? (String)get_input_port_default_value(1) : p_input_vars[1]) + ")) : vec3(0.0);\n"; break; default: break; } - + code += " }\n"; return code; } @@ -1125,6 +1138,8 @@ VisualShaderNodeParticleAccelerator::VisualShaderNodeParticleAccelerator() { set_input_port_default_value(0, Vector3(1, 1, 1)); set_input_port_default_value(1, 0.0); set_input_port_default_value(2, Vector3(0, -9.8, 0)); + + simple_decl = false; } // VisualShaderNodeParticleOutput diff --git a/scene/theme/theme_db.cpp b/scene/theme/theme_db.cpp index 0268a685fe..ae64313741 100644 --- a/scene/theme/theme_db.cpp +++ b/scene/theme/theme_db.cpp @@ -70,7 +70,9 @@ void ThemeDB::initialize_theme() { Ref<Font> font; if (!font_path.is_empty()) { font = ResourceLoader::load(font_path); - if (!font.is_valid()) { + if (font.is_valid()) { + set_fallback_font(font); + } else { ERR_PRINT("Error loading custom font '" + font_path + "'"); } } @@ -84,9 +86,6 @@ void ThemeDB::initialize_theme() { Ref<Theme> theme = ResourceLoader::load(theme_path); if (theme.is_valid()) { set_project_theme(theme); - if (font.is_valid()) { - set_fallback_font(font); - } } else { ERR_PRINT("Error loading custom theme '" + theme_path + "'"); } diff --git a/scene/theme/theme_owner.cpp b/scene/theme/theme_owner.cpp index e89aa1b28d..44e0c5d0c8 100644 --- a/scene/theme/theme_owner.cpp +++ b/scene/theme/theme_owner.cpp @@ -205,16 +205,7 @@ Variant ThemeOwner::get_theme_item_in_types(Theme::DataType p_data_type, const S while (owner_node) { // For each theme resource check the theme types provided and see if p_name exists with any of them. for (const StringName &E : p_theme_types) { - Ref<Theme> owner_theme; - - Control *owner_c = Object::cast_to<Control>(owner_node); - if (owner_c) { - owner_theme = owner_c->get_theme(); - } - Window *owner_w = Object::cast_to<Window>(owner_node); - if (owner_w) { - owner_theme = owner_w->get_theme(); - } + Ref<Theme> owner_theme = _get_owner_node_theme(owner_node); if (owner_theme.is_valid() && owner_theme->has_theme_item(p_data_type, p_name, E)) { return owner_theme->get_theme_item(p_data_type, p_name, E); @@ -254,16 +245,7 @@ bool ThemeOwner::has_theme_item_in_types(Theme::DataType p_data_type, const Stri while (owner_node) { // For each theme resource check the theme types provided and see if p_name exists with any of them. for (const StringName &E : p_theme_types) { - Ref<Theme> owner_theme; - - Control *owner_c = Object::cast_to<Control>(owner_node); - if (owner_c) { - owner_theme = owner_c->get_theme(); - } - Window *owner_w = Object::cast_to<Window>(owner_node); - if (owner_w) { - owner_theme = owner_w->get_theme(); - } + Ref<Theme> owner_theme = _get_owner_node_theme(owner_node); if (owner_theme.is_valid() && owner_theme->has_theme_item(p_data_type, p_name, E)) { return true; @@ -299,16 +281,7 @@ float ThemeOwner::get_theme_default_base_scale() { Node *owner_node = get_owner_node(); while (owner_node) { - Ref<Theme> owner_theme; - - Control *owner_c = Object::cast_to<Control>(owner_node); - if (owner_c) { - owner_theme = owner_c->get_theme(); - } - Window *owner_w = Object::cast_to<Window>(owner_node); - if (owner_w) { - owner_theme = owner_w->get_theme(); - } + Ref<Theme> owner_theme = _get_owner_node_theme(owner_node); if (owner_theme.is_valid() && owner_theme->has_default_base_scale()) { return owner_theme->get_default_base_scale(); @@ -338,16 +311,7 @@ Ref<Font> ThemeOwner::get_theme_default_font() { Node *owner_node = get_owner_node(); while (owner_node) { - Ref<Theme> owner_theme; - - Control *owner_c = Object::cast_to<Control>(owner_node); - if (owner_c) { - owner_theme = owner_c->get_theme(); - } - Window *owner_w = Object::cast_to<Window>(owner_node); - if (owner_w) { - owner_theme = owner_w->get_theme(); - } + Ref<Theme> owner_theme = _get_owner_node_theme(owner_node); if (owner_theme.is_valid() && owner_theme->has_default_font()) { return owner_theme->get_default_font(); @@ -377,16 +341,7 @@ int ThemeOwner::get_theme_default_font_size() { Node *owner_node = get_owner_node(); while (owner_node) { - Ref<Theme> owner_theme; - - Control *owner_c = Object::cast_to<Control>(owner_node); - if (owner_c) { - owner_theme = owner_c->get_theme(); - } - Window *owner_w = Object::cast_to<Window>(owner_node); - if (owner_w) { - owner_theme = owner_w->get_theme(); - } + Ref<Theme> owner_theme = _get_owner_node_theme(owner_node); if (owner_theme.is_valid() && owner_theme->has_default_font_size()) { return owner_theme->get_default_font_size(); @@ -408,3 +363,17 @@ int ThemeOwner::get_theme_default_font_size() { } return ThemeDB::get_singleton()->get_fallback_font_size(); } + +Ref<Theme> ThemeOwner::_get_owner_node_theme(Node *p_owner_node) const { + const Control *owner_c = Object::cast_to<Control>(p_owner_node); + if (owner_c) { + return owner_c->get_theme(); + } + + const Window *owner_w = Object::cast_to<Window>(p_owner_node); + if (owner_w) { + return owner_w->get_theme(); + } + + return Ref<Theme>(); +} diff --git a/scene/theme/theme_owner.h b/scene/theme/theme_owner.h index 59b72c1627..60d60f525c 100644 --- a/scene/theme/theme_owner.h +++ b/scene/theme/theme_owner.h @@ -43,6 +43,7 @@ class ThemeOwner : public Object { Window *owner_window = nullptr; Node *_get_next_owner_node(Node *p_from_node) const; + Ref<Theme> _get_owner_node_theme(Node *p_owner_node) const; public: // Theme owner node. diff --git a/servers/audio/audio_effect.h b/servers/audio/audio_effect.h index 653d04595e..93f10c156a 100644 --- a/servers/audio/audio_effect.h +++ b/servers/audio/audio_effect.h @@ -41,7 +41,7 @@ class AudioEffectInstance : public RefCounted { GDCLASS(AudioEffectInstance, RefCounted); protected: - GDVIRTUAL3(_process, GDNativeConstPtr<AudioFrame>, GDNativePtr<AudioFrame>, int) + GDVIRTUAL3(_process, GDExtensionConstPtr<AudioFrame>, GDExtensionPtr<AudioFrame>, int) GDVIRTUAL0RC(bool, _process_silence) static void _bind_methods(); diff --git a/servers/audio/audio_stream.cpp b/servers/audio/audio_stream.cpp index 4b68515e18..84c21f7cd6 100644 --- a/servers/audio/audio_stream.cpp +++ b/servers/audio/audio_stream.cpp @@ -410,12 +410,12 @@ AudioStreamPlaybackMicrophone::AudioStreamPlaybackMicrophone() { //////////////////////////////// -void AudioStreamRandomizer::add_stream(int p_index) { +void AudioStreamRandomizer::add_stream(int p_index, Ref<AudioStream> p_stream, float p_weight) { if (p_index < 0) { p_index = audio_stream_pool.size(); } ERR_FAIL_COND(p_index > audio_stream_pool.size()); - PoolEntry entry{ nullptr, 1.0f }; + PoolEntry entry{ p_stream, p_weight }; audio_stream_pool.insert(p_index, entry); emit_signal(SNAME("changed")); notify_property_list_changed(); @@ -555,8 +555,9 @@ Ref<AudioStreamPlayback> AudioStreamRandomizer::instance_playback_no_repeats() { } } if (local_pool.is_empty()) { + // There is only one sound to choose from. + // Always play a random sound while allowing repeats (which always plays the same sound). playback = instance_playback_random(); - WARN_PRINT("Playback stream pool is too small to prevent repeats."); return playback; } @@ -708,7 +709,7 @@ void AudioStreamRandomizer::_get_property_list(List<PropertyInfo> *p_list) const } void AudioStreamRandomizer::_bind_methods() { - ClassDB::bind_method(D_METHOD("add_stream", "index"), &AudioStreamRandomizer::add_stream); + ClassDB::bind_method(D_METHOD("add_stream", "index", "stream", "weight"), &AudioStreamRandomizer::add_stream, DEFVAL(1.0)); ClassDB::bind_method(D_METHOD("move_stream", "index_from", "index_to"), &AudioStreamRandomizer::move_stream); ClassDB::bind_method(D_METHOD("remove_stream", "index"), &AudioStreamRandomizer::remove_stream); diff --git a/servers/audio/audio_stream.h b/servers/audio/audio_stream.h index c41475010c..0d3f7bca04 100644 --- a/servers/audio/audio_stream.h +++ b/servers/audio/audio_stream.h @@ -53,7 +53,7 @@ protected: GDVIRTUAL0RC(int, _get_loop_count) GDVIRTUAL0RC(double, _get_playback_position) GDVIRTUAL1(_seek, double) - GDVIRTUAL3R(int, _mix, GDNativePtr<AudioFrame>, float, int) + GDVIRTUAL3R(int, _mix, GDExtensionPtr<AudioFrame>, float, int) GDVIRTUAL0(_tag_used_streams) public: virtual void start(double p_from_pos = 0.0); @@ -91,7 +91,7 @@ protected: virtual int _mix_internal(AudioFrame *p_buffer, int p_frames); virtual float get_stream_sampling_rate(); - GDVIRTUAL2R(int, _mix_resampled, GDNativePtr<AudioFrame>, int) + GDVIRTUAL2R(int, _mix_resampled, GDExtensionPtr<AudioFrame>, int) GDVIRTUAL0RC(float, _get_stream_sampling_rate) static void _bind_methods(); @@ -241,7 +241,7 @@ protected: void _get_property_list(List<PropertyInfo> *p_list) const; public: - void add_stream(int p_index); + void add_stream(int p_index, Ref<AudioStream> p_stream, float p_weight = 1.0); void move_stream(int p_index_from, int p_index_to); void remove_stream(int p_index); diff --git a/servers/audio_server.cpp b/servers/audio_server.cpp index e657570f9b..c7d626c159 100644 --- a/servers/audio_server.cpp +++ b/servers/audio_server.cpp @@ -449,12 +449,8 @@ void AudioServer::_mix_step() { case AudioStreamPlaybackListNode::AWAITING_DELETION: case AudioStreamPlaybackListNode::FADE_OUT_TO_DELETION: playback_list.erase(playback, [](AudioStreamPlaybackListNode *p) { - if (p->prev_bus_details) { - delete p->prev_bus_details; - } - if (p->bus_details) { - delete p->bus_details; - } + delete p->prev_bus_details; + delete p->bus_details; p->stream_playback.unref(); delete p; }); diff --git a/servers/display_server.cpp b/servers/display_server.cpp index 52d7f66203..523cc714f0 100644 --- a/servers/display_server.cpp +++ b/servers/display_server.cpp @@ -367,8 +367,7 @@ float DisplayServer::screen_get_scale(int p_screen) const { return 1.0f; }; -bool DisplayServer::screen_is_touchscreen(int p_screen) const { - //return false; +bool DisplayServer::is_touchscreen_available() const { return Input::get_singleton() && Input::get_singleton()->is_emulating_touch_from_mouse(); } @@ -618,7 +617,7 @@ void DisplayServer::_bind_methods() { ClassDB::bind_method(D_METHOD("screen_get_usable_rect", "screen"), &DisplayServer::screen_get_usable_rect, DEFVAL(SCREEN_OF_MAIN_WINDOW)); ClassDB::bind_method(D_METHOD("screen_get_dpi", "screen"), &DisplayServer::screen_get_dpi, DEFVAL(SCREEN_OF_MAIN_WINDOW)); ClassDB::bind_method(D_METHOD("screen_get_scale", "screen"), &DisplayServer::screen_get_scale, DEFVAL(SCREEN_OF_MAIN_WINDOW)); - ClassDB::bind_method(D_METHOD("screen_is_touchscreen", "screen"), &DisplayServer::screen_is_touchscreen, DEFVAL(SCREEN_OF_MAIN_WINDOW)); + ClassDB::bind_method(D_METHOD("is_touchscreen_available"), &DisplayServer::is_touchscreen_available, DEFVAL(SCREEN_OF_MAIN_WINDOW)); ClassDB::bind_method(D_METHOD("screen_get_max_scale"), &DisplayServer::screen_get_max_scale); ClassDB::bind_method(D_METHOD("screen_get_refresh_rate", "screen"), &DisplayServer::screen_get_refresh_rate, DEFVAL(SCREEN_OF_MAIN_WINDOW)); @@ -643,6 +642,7 @@ void DisplayServer::_bind_methods() { ClassDB::bind_method(D_METHOD("window_set_current_screen", "screen", "window_id"), &DisplayServer::window_set_current_screen, DEFVAL(MAIN_WINDOW_ID)); ClassDB::bind_method(D_METHOD("window_get_position", "window_id"), &DisplayServer::window_get_position, DEFVAL(MAIN_WINDOW_ID)); + ClassDB::bind_method(D_METHOD("window_get_position_with_decorations", "window_id"), &DisplayServer::window_get_position_with_decorations, DEFVAL(MAIN_WINDOW_ID)); ClassDB::bind_method(D_METHOD("window_set_position", "position", "window_id"), &DisplayServer::window_set_position, DEFVAL(MAIN_WINDOW_ID)); ClassDB::bind_method(D_METHOD("window_get_size", "window_id"), &DisplayServer::window_get_size, DEFVAL(MAIN_WINDOW_ID)); @@ -661,7 +661,7 @@ void DisplayServer::_bind_methods() { ClassDB::bind_method(D_METHOD("window_get_min_size", "window_id"), &DisplayServer::window_get_min_size, DEFVAL(MAIN_WINDOW_ID)); ClassDB::bind_method(D_METHOD("window_set_min_size", "min_size", "window_id"), &DisplayServer::window_set_min_size, DEFVAL(MAIN_WINDOW_ID)); - ClassDB::bind_method(D_METHOD("window_get_real_size", "window_id"), &DisplayServer::window_get_real_size, DEFVAL(MAIN_WINDOW_ID)); + ClassDB::bind_method(D_METHOD("window_get_size_with_decorations", "window_id"), &DisplayServer::window_get_size_with_decorations, DEFVAL(MAIN_WINDOW_ID)); ClassDB::bind_method(D_METHOD("window_get_mode", "window_id"), &DisplayServer::window_get_mode, DEFVAL(MAIN_WINDOW_ID)); ClassDB::bind_method(D_METHOD("window_set_mode", "mode", "window_id"), &DisplayServer::window_set_mode, DEFVAL(MAIN_WINDOW_ID)); diff --git a/servers/display_server.h b/servers/display_server.h index a796377f88..4c36b0acb9 100644 --- a/servers/display_server.h +++ b/servers/display_server.h @@ -262,7 +262,7 @@ public: return scale; } virtual float screen_get_refresh_rate(int p_screen = SCREEN_OF_MAIN_WINDOW) const = 0; - virtual bool screen_is_touchscreen(int p_screen = SCREEN_OF_MAIN_WINDOW) const; + virtual bool is_touchscreen_available() const; // Keep the ScreenOrientation enum values in sync with the `display/window/handheld/orientation` // project setting hint. @@ -353,6 +353,7 @@ public: virtual void window_set_current_screen(int p_screen, WindowID p_window = MAIN_WINDOW_ID) = 0; virtual Point2i window_get_position(WindowID p_window = MAIN_WINDOW_ID) const = 0; + virtual Point2i window_get_position_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const = 0; virtual void window_set_position(const Point2i &p_position, WindowID p_window = MAIN_WINDOW_ID) = 0; virtual void window_set_transient(WindowID p_window, WindowID p_parent) = 0; @@ -366,7 +367,7 @@ public: virtual void window_set_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID) = 0; virtual Size2i window_get_size(WindowID p_window = MAIN_WINDOW_ID) const = 0; - virtual Size2i window_get_real_size(WindowID p_window = MAIN_WINDOW_ID) const = 0; // FIXME: Find clearer name for this. + virtual Size2i window_get_size_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const = 0; virtual void window_set_mode(WindowMode p_mode, WindowID p_window = MAIN_WINDOW_ID) = 0; virtual WindowMode window_get_mode(WindowID p_window = MAIN_WINDOW_ID) const = 0; diff --git a/servers/display_server_headless.h b/servers/display_server_headless.h index e1a27b6137..94b5f3c1e9 100644 --- a/servers/display_server_headless.h +++ b/servers/display_server_headless.h @@ -90,6 +90,7 @@ public: void window_set_current_screen(int p_screen, WindowID p_window = MAIN_WINDOW_ID) override {} Point2i window_get_position(WindowID p_window = MAIN_WINDOW_ID) const override { return Point2i(); } + Point2i window_get_position_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override { return Point2i(); } void window_set_position(const Point2i &p_position, WindowID p_window = MAIN_WINDOW_ID) override {} void window_set_transient(WindowID p_window, WindowID p_parent) override {} @@ -102,7 +103,7 @@ public: void window_set_size(const Size2i p_size, WindowID p_window = MAIN_WINDOW_ID) override {} Size2i window_get_size(WindowID p_window = MAIN_WINDOW_ID) const override { return Size2i(); } - Size2i window_get_real_size(WindowID p_window = MAIN_WINDOW_ID) const override { return Size2i(); } + Size2i window_get_size_with_decorations(WindowID p_window = MAIN_WINDOW_ID) const override { return Size2i(); } void window_set_mode(WindowMode p_mode, WindowID p_window = MAIN_WINDOW_ID) override {} WindowMode window_get_mode(WindowID p_window = MAIN_WINDOW_ID) const override { return WINDOW_MODE_MINIMIZED; } diff --git a/servers/extensions/physics_server_2d_extension.h b/servers/extensions/physics_server_2d_extension.h index 573b51ee12..7a7a3c5cba 100644 --- a/servers/extensions/physics_server_2d_extension.h +++ b/servers/extensions/physics_server_2d_extension.h @@ -126,12 +126,12 @@ protected: static void _bind_methods(); bool is_body_excluded_from_query(const RID &p_body) const; - GDVIRTUAL7R(bool, _intersect_ray, const Vector2 &, const Vector2 &, uint32_t, bool, bool, bool, GDNativePtr<PhysicsServer2DExtensionRayResult>) - GDVIRTUAL7R(int, _intersect_point, const Vector2 &, ObjectID, uint32_t, bool, bool, GDNativePtr<PhysicsServer2DExtensionShapeResult>, int) - GDVIRTUAL9R(int, _intersect_shape, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDNativePtr<PhysicsServer2DExtensionShapeResult>, int) - GDVIRTUAL9R(bool, _cast_motion, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDNativePtr<real_t>, GDNativePtr<real_t>) - GDVIRTUAL10R(bool, _collide_shape, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDNativePtr<Vector2>, int, GDNativePtr<int>) - GDVIRTUAL8R(bool, _rest_info, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDNativePtr<PhysicsServer2DExtensionShapeRestInfo>) + GDVIRTUAL7R(bool, _intersect_ray, const Vector2 &, const Vector2 &, uint32_t, bool, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionRayResult>) + GDVIRTUAL7R(int, _intersect_point, const Vector2 &, ObjectID, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionShapeResult>, int) + GDVIRTUAL9R(int, _intersect_shape, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionShapeResult>, int) + GDVIRTUAL9R(bool, _cast_motion, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<real_t>, GDExtensionPtr<real_t>) + GDVIRTUAL10R(bool, _collide_shape, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<Vector2>, int, GDExtensionPtr<int>) + GDVIRTUAL8R(bool, _rest_info, RID, const Transform2D &, const Vector2 &, real_t, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionShapeRestInfo>) public: virtual bool intersect_ray(const RayParameters &p_parameters, RayResult &r_result) override { @@ -190,9 +190,9 @@ class PhysicsServer2DExtension : public PhysicsServer2D { protected: static void _bind_methods(); - GDVIRTUAL9R(bool, _shape_collide, RID, const Transform2D &, const Vector2 &, RID, const Transform2D &, const Vector2 &, GDNativePtr<Vector2>, int, GDNativePtr<int>) + GDVIRTUAL9R(bool, _shape_collide, RID, const Transform2D &, const Vector2 &, RID, const Transform2D &, const Vector2 &, GDExtensionPtr<Vector2>, int, GDExtensionPtr<int>) - GDVIRTUAL8R(bool, _body_collide_shape, RID, int, RID, const Transform2D &, const Vector2 &, GDNativePtr<Vector2>, int, GDNativePtr<int>) + GDVIRTUAL8R(bool, _body_collide_shape, RID, int, RID, const Transform2D &, const Vector2 &, GDExtensionPtr<Vector2>, int, GDExtensionPtr<int>) public: // The warning is valid, but unavoidable. If the function is not overridden it will error anyway. @@ -385,7 +385,7 @@ public: EXBIND1R(PhysicsDirectBodyState2D *, body_get_direct_state, RID) - GDVIRTUAL7RC(bool, _body_test_motion, RID, const Transform2D &, const Vector2 &, real_t, bool, bool, GDNativePtr<PhysicsServer2DExtensionMotionResult>) + GDVIRTUAL7RC(bool, _body_test_motion, RID, const Transform2D &, const Vector2 &, real_t, bool, bool, GDExtensionPtr<PhysicsServer2DExtensionMotionResult>) thread_local static const HashSet<RID> *exclude_bodies; thread_local static const HashSet<ObjectID> *exclude_objects; diff --git a/servers/extensions/physics_server_3d_extension.h b/servers/extensions/physics_server_3d_extension.h index 57f2a2d790..a85df0683c 100644 --- a/servers/extensions/physics_server_3d_extension.h +++ b/servers/extensions/physics_server_3d_extension.h @@ -128,12 +128,12 @@ protected: static void _bind_methods(); bool is_body_excluded_from_query(const RID &p_body) const; - GDVIRTUAL8R(bool, _intersect_ray, const Vector3 &, const Vector3 &, uint32_t, bool, bool, bool, bool, GDNativePtr<PhysicsServer3DExtensionRayResult>) - GDVIRTUAL6R(int, _intersect_point, const Vector3 &, uint32_t, bool, bool, GDNativePtr<PhysicsServer3DExtensionShapeResult>, int) - GDVIRTUAL9R(int, _intersect_shape, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDNativePtr<PhysicsServer3DExtensionShapeResult>, int) - GDVIRTUAL10R(bool, _cast_motion, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDNativePtr<real_t>, GDNativePtr<real_t>, GDNativePtr<PhysicsServer3DExtensionShapeRestInfo>) - GDVIRTUAL10R(bool, _collide_shape, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDNativePtr<Vector3>, int, GDNativePtr<int>) - GDVIRTUAL8R(bool, _rest_info, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDNativePtr<PhysicsServer3DExtensionShapeRestInfo>) + GDVIRTUAL8R(bool, _intersect_ray, const Vector3 &, const Vector3 &, uint32_t, bool, bool, bool, bool, GDExtensionPtr<PhysicsServer3DExtensionRayResult>) + GDVIRTUAL6R(int, _intersect_point, const Vector3 &, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer3DExtensionShapeResult>, int) + GDVIRTUAL9R(int, _intersect_shape, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer3DExtensionShapeResult>, int) + GDVIRTUAL10R(bool, _cast_motion, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDExtensionPtr<real_t>, GDExtensionPtr<real_t>, GDExtensionPtr<PhysicsServer3DExtensionShapeRestInfo>) + GDVIRTUAL10R(bool, _collide_shape, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDExtensionPtr<Vector3>, int, GDExtensionPtr<int>) + GDVIRTUAL8R(bool, _rest_info, RID, const Transform3D &, const Vector3 &, real_t, uint32_t, bool, bool, GDExtensionPtr<PhysicsServer3DExtensionShapeRestInfo>) GDVIRTUAL2RC(Vector3, _get_closest_point_to_object_volume, RID, const Vector3 &) public: @@ -382,7 +382,7 @@ public: EXBIND2(body_set_ray_pickable, RID, bool) - GDVIRTUAL7RC(bool, _body_test_motion, RID, const Transform3D &, const Vector3 &, real_t, int, bool, GDNativePtr<PhysicsServer3DExtensionMotionResult>) + GDVIRTUAL7RC(bool, _body_test_motion, RID, const Transform3D &, const Vector3 &, real_t, int, bool, GDExtensionPtr<PhysicsServer3DExtensionMotionResult>) thread_local static const HashSet<RID> *exclude_bodies; thread_local static const HashSet<ObjectID> *exclude_objects; diff --git a/servers/movie_writer/movie_writer.h b/servers/movie_writer/movie_writer.h index 7877a60715..fffc43459d 100644 --- a/servers/movie_writer/movie_writer.h +++ b/servers/movie_writer/movie_writer.h @@ -67,7 +67,7 @@ protected: GDVIRTUAL0RC(Vector<String>, _get_supported_extensions) GDVIRTUAL3R(Error, _write_begin, const Size2i &, uint32_t, const String &) - GDVIRTUAL2R(Error, _write_frame, const Ref<Image> &, GDNativeConstPtr<int32_t>) + GDVIRTUAL2R(Error, _write_frame, const Ref<Image> &, GDExtensionConstPtr<int32_t>) GDVIRTUAL0(_write_end) static void _bind_methods(); diff --git a/servers/navigation/navigation_path_query_parameters_2d.cpp b/servers/navigation/navigation_path_query_parameters_2d.cpp index 574af90be1..717ada3834 100644 --- a/servers/navigation/navigation_path_query_parameters_2d.cpp +++ b/servers/navigation/navigation_path_query_parameters_2d.cpp @@ -105,11 +105,19 @@ Vector2 NavigationPathQueryParameters2D::get_target_position() const { void NavigationPathQueryParameters2D::set_navigation_layers(uint32_t p_navigation_layers) { parameters.navigation_layers = p_navigation_layers; -}; +} uint32_t NavigationPathQueryParameters2D::get_navigation_layers() const { return parameters.navigation_layers; -}; +} + +void NavigationPathQueryParameters2D::set_metadata_flags(BitField<NavigationPathQueryParameters2D::PathMetadataFlags> p_flags) { + parameters.metadata_flags = (int64_t)p_flags; +} + +BitField<NavigationPathQueryParameters2D::PathMetadataFlags> NavigationPathQueryParameters2D::get_metadata_flags() const { + return (int64_t)parameters.metadata_flags; +} void NavigationPathQueryParameters2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_pathfinding_algorithm", "pathfinding_algorithm"), &NavigationPathQueryParameters2D::set_pathfinding_algorithm); @@ -130,15 +138,25 @@ void NavigationPathQueryParameters2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_navigation_layers", "navigation_layers"), &NavigationPathQueryParameters2D::set_navigation_layers); ClassDB::bind_method(D_METHOD("get_navigation_layers"), &NavigationPathQueryParameters2D::get_navigation_layers); + ClassDB::bind_method(D_METHOD("set_metadata_flags", "flags"), &NavigationPathQueryParameters2D::set_metadata_flags); + ClassDB::bind_method(D_METHOD("get_metadata_flags"), &NavigationPathQueryParameters2D::get_metadata_flags); + ADD_PROPERTY(PropertyInfo(Variant::RID, "map"), "set_map", "get_map"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "start_position"), "set_start_position", "get_start_position"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR2, "target_position"), "set_target_position", "get_target_position"); ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_2D_NAVIGATION), "set_navigation_layers", "get_navigation_layers"); ADD_PROPERTY(PropertyInfo(Variant::INT, "pathfinding_algorithm", PROPERTY_HINT_ENUM, "AStar"), "set_pathfinding_algorithm", "get_pathfinding_algorithm"); ADD_PROPERTY(PropertyInfo(Variant::INT, "path_postprocessing", PROPERTY_HINT_ENUM, "Corridorfunnel,Edgecentered"), "set_path_postprocessing", "get_path_postprocessing"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "metadata_flags", PROPERTY_HINT_FLAGS, "Include Types,Include RIDs,Include Owners"), "set_metadata_flags", "get_metadata_flags"); BIND_ENUM_CONSTANT(PATHFINDING_ALGORITHM_ASTAR); BIND_ENUM_CONSTANT(PATH_POSTPROCESSING_CORRIDORFUNNEL); BIND_ENUM_CONSTANT(PATH_POSTPROCESSING_EDGECENTERED); + + BIND_BITFIELD_FLAG(PATH_METADATA_INCLUDE_NONE); + BIND_BITFIELD_FLAG(PATH_METADATA_INCLUDE_TYPES); + BIND_BITFIELD_FLAG(PATH_METADATA_INCLUDE_RIDS); + BIND_BITFIELD_FLAG(PATH_METADATA_INCLUDE_OWNERS); + BIND_BITFIELD_FLAG(PATH_METADATA_INCLUDE_ALL); } diff --git a/servers/navigation/navigation_path_query_parameters_2d.h b/servers/navigation/navigation_path_query_parameters_2d.h index c0ef337a27..aeabe1f690 100644 --- a/servers/navigation/navigation_path_query_parameters_2d.h +++ b/servers/navigation/navigation_path_query_parameters_2d.h @@ -52,6 +52,14 @@ public: PATH_POSTPROCESSING_EDGECENTERED, }; + enum PathMetadataFlags { + PATH_METADATA_INCLUDE_NONE = NavigationUtilities::PathMetadataFlags::PATH_INCLUDE_NONE, + PATH_METADATA_INCLUDE_TYPES = NavigationUtilities::PathMetadataFlags::PATH_INCLUDE_TYPES, + PATH_METADATA_INCLUDE_RIDS = NavigationUtilities::PathMetadataFlags::PATH_INCLUDE_RIDS, + PATH_METADATA_INCLUDE_OWNERS = NavigationUtilities::PathMetadataFlags::PATH_INCLUDE_OWNERS, + PATH_METADATA_INCLUDE_ALL = NavigationUtilities::PathMetadataFlags::PATH_INCLUDE_ALL + }; + const NavigationUtilities::PathQueryParameters &get_parameters() const { return parameters; } void set_pathfinding_algorithm(const PathfindingAlgorithm p_pathfinding_algorithm); @@ -71,9 +79,13 @@ public: void set_navigation_layers(uint32_t p_navigation_layers); uint32_t get_navigation_layers() const; + + void set_metadata_flags(BitField<NavigationPathQueryParameters2D::PathMetadataFlags> p_flags); + BitField<NavigationPathQueryParameters2D::PathMetadataFlags> get_metadata_flags() const; }; VARIANT_ENUM_CAST(NavigationPathQueryParameters2D::PathfindingAlgorithm); VARIANT_ENUM_CAST(NavigationPathQueryParameters2D::PathPostProcessing); +VARIANT_BITFIELD_CAST(NavigationPathQueryParameters2D::PathMetadataFlags); #endif // NAVIGATION_PATH_QUERY_PARAMETERS_2D_H diff --git a/servers/navigation/navigation_path_query_parameters_3d.cpp b/servers/navigation/navigation_path_query_parameters_3d.cpp index b09448e82e..180af57af5 100644 --- a/servers/navigation/navigation_path_query_parameters_3d.cpp +++ b/servers/navigation/navigation_path_query_parameters_3d.cpp @@ -111,6 +111,14 @@ uint32_t NavigationPathQueryParameters3D::get_navigation_layers() const { return parameters.navigation_layers; } +void NavigationPathQueryParameters3D::set_metadata_flags(BitField<NavigationPathQueryParameters3D::PathMetadataFlags> p_flags) { + parameters.metadata_flags = (int64_t)p_flags; +} + +BitField<NavigationPathQueryParameters3D::PathMetadataFlags> NavigationPathQueryParameters3D::get_metadata_flags() const { + return (int64_t)parameters.metadata_flags; +} + void NavigationPathQueryParameters3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_pathfinding_algorithm", "pathfinding_algorithm"), &NavigationPathQueryParameters3D::set_pathfinding_algorithm); ClassDB::bind_method(D_METHOD("get_pathfinding_algorithm"), &NavigationPathQueryParameters3D::get_pathfinding_algorithm); @@ -130,15 +138,25 @@ void NavigationPathQueryParameters3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_navigation_layers", "navigation_layers"), &NavigationPathQueryParameters3D::set_navigation_layers); ClassDB::bind_method(D_METHOD("get_navigation_layers"), &NavigationPathQueryParameters3D::get_navigation_layers); + ClassDB::bind_method(D_METHOD("set_metadata_flags", "flags"), &NavigationPathQueryParameters3D::set_metadata_flags); + ClassDB::bind_method(D_METHOD("get_metadata_flags"), &NavigationPathQueryParameters3D::get_metadata_flags); + ADD_PROPERTY(PropertyInfo(Variant::RID, "map"), "set_map", "get_map"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "start_position"), "set_start_position", "get_start_position"); ADD_PROPERTY(PropertyInfo(Variant::VECTOR3, "target_position"), "set_target_position", "get_target_position"); ADD_PROPERTY(PropertyInfo(Variant::INT, "navigation_layers", PROPERTY_HINT_LAYERS_3D_NAVIGATION), "set_navigation_layers", "get_navigation_layers"); ADD_PROPERTY(PropertyInfo(Variant::INT, "pathfinding_algorithm", PROPERTY_HINT_ENUM, "AStar"), "set_pathfinding_algorithm", "get_pathfinding_algorithm"); ADD_PROPERTY(PropertyInfo(Variant::INT, "path_postprocessing", PROPERTY_HINT_ENUM, "Corridorfunnel,Edgecentered"), "set_path_postprocessing", "get_path_postprocessing"); + ADD_PROPERTY(PropertyInfo(Variant::INT, "metadata_flags", PROPERTY_HINT_FLAGS, "Include Types,Include RIDs,Include Owners"), "set_metadata_flags", "get_metadata_flags"); BIND_ENUM_CONSTANT(PATHFINDING_ALGORITHM_ASTAR); BIND_ENUM_CONSTANT(PATH_POSTPROCESSING_CORRIDORFUNNEL); BIND_ENUM_CONSTANT(PATH_POSTPROCESSING_EDGECENTERED); + + BIND_BITFIELD_FLAG(PATH_METADATA_INCLUDE_NONE); + BIND_BITFIELD_FLAG(PATH_METADATA_INCLUDE_TYPES); + BIND_BITFIELD_FLAG(PATH_METADATA_INCLUDE_RIDS); + BIND_BITFIELD_FLAG(PATH_METADATA_INCLUDE_OWNERS); + BIND_BITFIELD_FLAG(PATH_METADATA_INCLUDE_ALL); } diff --git a/servers/navigation/navigation_path_query_parameters_3d.h b/servers/navigation/navigation_path_query_parameters_3d.h index b4cf02fc79..386c83dece 100644 --- a/servers/navigation/navigation_path_query_parameters_3d.h +++ b/servers/navigation/navigation_path_query_parameters_3d.h @@ -52,6 +52,14 @@ public: PATH_POSTPROCESSING_EDGECENTERED, }; + enum PathMetadataFlags { + PATH_METADATA_INCLUDE_NONE = NavigationUtilities::PathMetadataFlags::PATH_INCLUDE_NONE, + PATH_METADATA_INCLUDE_TYPES = NavigationUtilities::PathMetadataFlags::PATH_INCLUDE_TYPES, + PATH_METADATA_INCLUDE_RIDS = NavigationUtilities::PathMetadataFlags::PATH_INCLUDE_RIDS, + PATH_METADATA_INCLUDE_OWNERS = NavigationUtilities::PathMetadataFlags::PATH_INCLUDE_OWNERS, + PATH_METADATA_INCLUDE_ALL = NavigationUtilities::PathMetadataFlags::PATH_INCLUDE_ALL + }; + const NavigationUtilities::PathQueryParameters &get_parameters() const { return parameters; } void set_pathfinding_algorithm(const PathfindingAlgorithm p_pathfinding_algorithm); @@ -71,9 +79,13 @@ public: void set_navigation_layers(uint32_t p_navigation_layers); uint32_t get_navigation_layers() const; + + void set_metadata_flags(BitField<NavigationPathQueryParameters3D::PathMetadataFlags> p_flags); + BitField<NavigationPathQueryParameters3D::PathMetadataFlags> get_metadata_flags() const; }; VARIANT_ENUM_CAST(NavigationPathQueryParameters3D::PathfindingAlgorithm); VARIANT_ENUM_CAST(NavigationPathQueryParameters3D::PathPostProcessing); +VARIANT_BITFIELD_CAST(NavigationPathQueryParameters3D::PathMetadataFlags); #endif // NAVIGATION_PATH_QUERY_PARAMETERS_3D_H diff --git a/servers/navigation/navigation_path_query_result_2d.cpp b/servers/navigation/navigation_path_query_result_2d.cpp index 8a55451e40..e2764daa9a 100644 --- a/servers/navigation/navigation_path_query_result_2d.cpp +++ b/servers/navigation/navigation_path_query_result_2d.cpp @@ -38,15 +38,57 @@ const Vector<Vector2> &NavigationPathQueryResult2D::get_path() const { return path; } +void NavigationPathQueryResult2D::set_path_types(const Vector<int32_t> &p_path_types) { + path_types = p_path_types; +} + +const Vector<int32_t> &NavigationPathQueryResult2D::get_path_types() const { + return path_types; +} + +void NavigationPathQueryResult2D::set_path_rids(const TypedArray<RID> &p_path_rids) { + path_rids = p_path_rids; +} + +TypedArray<RID> NavigationPathQueryResult2D::get_path_rids() const { + return path_rids; +} + +void NavigationPathQueryResult2D::set_path_owner_ids(const Vector<int64_t> &p_path_owner_ids) { + path_owner_ids = p_path_owner_ids; +} + +const Vector<int64_t> &NavigationPathQueryResult2D::get_path_owner_ids() const { + return path_owner_ids; +} + void NavigationPathQueryResult2D::reset() { path.clear(); + path_types.clear(); + path_rids.clear(); + path_owner_ids.clear(); } void NavigationPathQueryResult2D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_path", "path"), &NavigationPathQueryResult2D::set_path); ClassDB::bind_method(D_METHOD("get_path"), &NavigationPathQueryResult2D::get_path); + ClassDB::bind_method(D_METHOD("set_path_types", "path_types"), &NavigationPathQueryResult2D::set_path_types); + ClassDB::bind_method(D_METHOD("get_path_types"), &NavigationPathQueryResult2D::get_path_types); + + ClassDB::bind_method(D_METHOD("set_path_rids", "path_rids"), &NavigationPathQueryResult2D::set_path_rids); + ClassDB::bind_method(D_METHOD("get_path_rids"), &NavigationPathQueryResult2D::get_path_rids); + + ClassDB::bind_method(D_METHOD("set_path_owner_ids", "path_owner_ids"), &NavigationPathQueryResult2D::set_path_owner_ids); + ClassDB::bind_method(D_METHOD("get_path_owner_ids"), &NavigationPathQueryResult2D::get_path_owner_ids); + ClassDB::bind_method(D_METHOD("reset"), &NavigationPathQueryResult2D::reset); ADD_PROPERTY(PropertyInfo(Variant::PACKED_VECTOR2_ARRAY, "path"), "set_path", "get_path"); + ADD_PROPERTY(PropertyInfo(Variant::PACKED_INT32_ARRAY, "path_types"), "set_path_types", "get_path_types"); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "path_rids", PROPERTY_HINT_ARRAY_TYPE, "RID"), "set_path_rids", "get_path_rids"); + ADD_PROPERTY(PropertyInfo(Variant::PACKED_INT64_ARRAY, "path_owner_ids"), "set_path_owner_ids", "get_path_owner_ids"); + + BIND_ENUM_CONSTANT(PATH_SEGMENT_TYPE_REGION); + BIND_ENUM_CONSTANT(PATH_SEGMENT_TYPE_LINK); } diff --git a/servers/navigation/navigation_path_query_result_2d.h b/servers/navigation/navigation_path_query_result_2d.h index da251ef32d..852a9780ef 100644 --- a/servers/navigation/navigation_path_query_result_2d.h +++ b/servers/navigation/navigation_path_query_result_2d.h @@ -38,15 +38,34 @@ class NavigationPathQueryResult2D : public RefCounted { GDCLASS(NavigationPathQueryResult2D, RefCounted); Vector<Vector2> path; + Vector<int32_t> path_types; + TypedArray<RID> path_rids; + Vector<int64_t> path_owner_ids; protected: static void _bind_methods(); public: + enum PathSegmentType { + PATH_SEGMENT_TYPE_REGION = 0, + PATH_SEGMENT_TYPE_LINK = 1, + }; + void set_path(const Vector<Vector2> &p_path); const Vector<Vector2> &get_path() const; + void set_path_types(const Vector<int32_t> &p_path_types); + const Vector<int32_t> &get_path_types() const; + + void set_path_rids(const TypedArray<RID> &p_path_rids); + TypedArray<RID> get_path_rids() const; + + void set_path_owner_ids(const Vector<int64_t> &p_path_owner_ids); + const Vector<int64_t> &get_path_owner_ids() const; + void reset(); }; +VARIANT_ENUM_CAST(NavigationPathQueryResult2D::PathSegmentType); + #endif // NAVIGATION_PATH_QUERY_RESULT_2D_H diff --git a/servers/navigation/navigation_path_query_result_3d.cpp b/servers/navigation/navigation_path_query_result_3d.cpp index 1e28352995..8218adec18 100644 --- a/servers/navigation/navigation_path_query_result_3d.cpp +++ b/servers/navigation/navigation_path_query_result_3d.cpp @@ -38,15 +38,57 @@ const Vector<Vector3> &NavigationPathQueryResult3D::get_path() const { return path; } +void NavigationPathQueryResult3D::set_path_types(const Vector<int32_t> &p_path_types) { + path_types = p_path_types; +} + +const Vector<int32_t> &NavigationPathQueryResult3D::get_path_types() const { + return path_types; +} + +void NavigationPathQueryResult3D::set_path_rids(const TypedArray<RID> &p_path_rids) { + path_rids = p_path_rids; +} + +TypedArray<RID> NavigationPathQueryResult3D::get_path_rids() const { + return path_rids; +} + +void NavigationPathQueryResult3D::set_path_owner_ids(const Vector<int64_t> &p_path_owner_ids) { + path_owner_ids = p_path_owner_ids; +} + +const Vector<int64_t> &NavigationPathQueryResult3D::get_path_owner_ids() const { + return path_owner_ids; +} + void NavigationPathQueryResult3D::reset() { path.clear(); + path_types.clear(); + path_rids.clear(); + path_owner_ids.clear(); } void NavigationPathQueryResult3D::_bind_methods() { ClassDB::bind_method(D_METHOD("set_path", "path"), &NavigationPathQueryResult3D::set_path); ClassDB::bind_method(D_METHOD("get_path"), &NavigationPathQueryResult3D::get_path); + ClassDB::bind_method(D_METHOD("set_path_types", "path_types"), &NavigationPathQueryResult3D::set_path_types); + ClassDB::bind_method(D_METHOD("get_path_types"), &NavigationPathQueryResult3D::get_path_types); + + ClassDB::bind_method(D_METHOD("set_path_rids", "path_rids"), &NavigationPathQueryResult3D::set_path_rids); + ClassDB::bind_method(D_METHOD("get_path_rids"), &NavigationPathQueryResult3D::get_path_rids); + + ClassDB::bind_method(D_METHOD("set_path_owner_ids", "path_owner_ids"), &NavigationPathQueryResult3D::set_path_owner_ids); + ClassDB::bind_method(D_METHOD("get_path_owner_ids"), &NavigationPathQueryResult3D::get_path_owner_ids); + ClassDB::bind_method(D_METHOD("reset"), &NavigationPathQueryResult3D::reset); ADD_PROPERTY(PropertyInfo(Variant::PACKED_VECTOR3_ARRAY, "path"), "set_path", "get_path"); + ADD_PROPERTY(PropertyInfo(Variant::PACKED_INT32_ARRAY, "path_types"), "set_path_types", "get_path_types"); + ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "path_rids", PROPERTY_HINT_ARRAY_TYPE, "RID"), "set_path_rids", "get_path_rids"); + ADD_PROPERTY(PropertyInfo(Variant::PACKED_INT64_ARRAY, "path_owner_ids"), "set_path_owner_ids", "get_path_owner_ids"); + + BIND_ENUM_CONSTANT(PATH_SEGMENT_TYPE_REGION); + BIND_ENUM_CONSTANT(PATH_SEGMENT_TYPE_LINK); } diff --git a/servers/navigation/navigation_path_query_result_3d.h b/servers/navigation/navigation_path_query_result_3d.h index fc143ac389..ce34e18dc1 100644 --- a/servers/navigation/navigation_path_query_result_3d.h +++ b/servers/navigation/navigation_path_query_result_3d.h @@ -32,21 +32,41 @@ #define NAVIGATION_PATH_QUERY_RESULT_3D_H #include "core/object/ref_counted.h" +#include "core/variant/typed_array.h" #include "servers/navigation/navigation_utilities.h" class NavigationPathQueryResult3D : public RefCounted { GDCLASS(NavigationPathQueryResult3D, RefCounted); Vector<Vector3> path; + Vector<int32_t> path_types; + TypedArray<RID> path_rids; + Vector<int64_t> path_owner_ids; protected: static void _bind_methods(); public: + enum PathSegmentType { + PATH_SEGMENT_TYPE_REGION = 0, + PATH_SEGMENT_TYPE_LINK = 1, + }; + void set_path(const Vector<Vector3> &p_path); const Vector<Vector3> &get_path() const; + void set_path_types(const Vector<int32_t> &p_path_types); + const Vector<int32_t> &get_path_types() const; + + void set_path_rids(const TypedArray<RID> &p_path_rids); + TypedArray<RID> get_path_rids() const; + + void set_path_owner_ids(const Vector<int64_t> &p_path_owner_ids); + const Vector<int64_t> &get_path_owner_ids() const; + void reset(); }; +VARIANT_ENUM_CAST(NavigationPathQueryResult3D::PathSegmentType); + #endif // NAVIGATION_PATH_QUERY_RESULT_3D_H diff --git a/servers/navigation/navigation_utilities.h b/servers/navigation/navigation_utilities.h index e99c139528..c22a2ed952 100644 --- a/servers/navigation/navigation_utilities.h +++ b/servers/navigation/navigation_utilities.h @@ -32,6 +32,7 @@ #define NAVIGATION_UTILITIES_H #include "core/math/vector3.h" +#include "core/variant/typed_array.h" namespace NavigationUtilities { @@ -44,6 +45,19 @@ enum PathPostProcessing { PATH_POSTPROCESSING_EDGECENTERED, }; +enum PathSegmentType { + PATH_SEGMENT_TYPE_REGION = 0, + PATH_SEGMENT_TYPE_LINK +}; + +enum PathMetadataFlags { + PATH_INCLUDE_NONE = 0, + PATH_INCLUDE_TYPES = 1, + PATH_INCLUDE_RIDS = 2, + PATH_INCLUDE_OWNERS = 4, + PATH_INCLUDE_ALL = PATH_INCLUDE_TYPES | PATH_INCLUDE_RIDS | PATH_INCLUDE_OWNERS +}; + struct PathQueryParameters { PathfindingAlgorithm pathfinding_algorithm = PATHFINDING_ALGORITHM_ASTAR; PathPostProcessing path_postprocessing = PATH_POSTPROCESSING_CORRIDORFUNNEL; @@ -51,10 +65,14 @@ struct PathQueryParameters { Vector3 start_position; Vector3 target_position; uint32_t navigation_layers = 1; + BitField<PathMetadataFlags> metadata_flags = PATH_INCLUDE_ALL; }; struct PathQueryResult { Vector<Vector3> path; + Vector<int32_t> path_types; + TypedArray<RID> path_rids; + Vector<int64_t> path_owner_ids; }; } //namespace NavigationUtilities diff --git a/servers/navigation_server_2d.cpp b/servers/navigation_server_2d.cpp index 04e5d2f6a1..6fd5f222cf 100644 --- a/servers/navigation_server_2d.cpp +++ b/servers/navigation_server_2d.cpp @@ -140,10 +140,6 @@ static Transform3D trf2_to_trf3(const Transform2D &d) { return Transform3D(b, o); } -static Object *obj_to_obj(Object *d) { - return d; -} - static StringName sn_to_sn(const StringName &d) { return d; } @@ -152,9 +148,13 @@ static Variant var_to_var(const Variant &d) { return d; } +static ObjectID id_to_id(const ObjectID &id) { + return id; +} + static Ref<NavigationMesh> poly_to_mesh(Ref<NavigationPolygon> d) { if (d.is_valid()) { - return d->get_mesh(); + return d->get_navigation_mesh(); } else { return Ref<NavigationMesh>(); } @@ -250,13 +250,15 @@ void NavigationServer2D::_bind_methods() { ClassDB::bind_method(D_METHOD("region_get_enter_cost", "region"), &NavigationServer2D::region_get_enter_cost); ClassDB::bind_method(D_METHOD("region_set_travel_cost", "region", "travel_cost"), &NavigationServer2D::region_set_travel_cost); ClassDB::bind_method(D_METHOD("region_get_travel_cost", "region"), &NavigationServer2D::region_get_travel_cost); + ClassDB::bind_method(D_METHOD("region_set_owner_id", "region", "owner_id"), &NavigationServer2D::region_set_owner_id); + ClassDB::bind_method(D_METHOD("region_get_owner_id", "region"), &NavigationServer2D::region_get_owner_id); ClassDB::bind_method(D_METHOD("region_owns_point", "region", "point"), &NavigationServer2D::region_owns_point); ClassDB::bind_method(D_METHOD("region_set_map", "region", "map"), &NavigationServer2D::region_set_map); ClassDB::bind_method(D_METHOD("region_get_map", "region"), &NavigationServer2D::region_get_map); ClassDB::bind_method(D_METHOD("region_set_navigation_layers", "region", "navigation_layers"), &NavigationServer2D::region_set_navigation_layers); ClassDB::bind_method(D_METHOD("region_get_navigation_layers", "region"), &NavigationServer2D::region_get_navigation_layers); ClassDB::bind_method(D_METHOD("region_set_transform", "region", "transform"), &NavigationServer2D::region_set_transform); - ClassDB::bind_method(D_METHOD("region_set_navpoly", "region", "nav_poly"), &NavigationServer2D::region_set_navpoly); + ClassDB::bind_method(D_METHOD("region_set_navigation_polygon", "region", "navigation_polygon"), &NavigationServer2D::region_set_navigation_polygon); ClassDB::bind_method(D_METHOD("region_get_connections_count", "region"), &NavigationServer2D::region_get_connections_count); ClassDB::bind_method(D_METHOD("region_get_connection_pathway_start", "region", "connection"), &NavigationServer2D::region_get_connection_pathway_start); ClassDB::bind_method(D_METHOD("region_get_connection_pathway_end", "region", "connection"), &NavigationServer2D::region_get_connection_pathway_end); @@ -276,6 +278,8 @@ void NavigationServer2D::_bind_methods() { ClassDB::bind_method(D_METHOD("link_get_enter_cost", "link"), &NavigationServer2D::link_get_enter_cost); ClassDB::bind_method(D_METHOD("link_set_travel_cost", "link", "travel_cost"), &NavigationServer2D::link_set_travel_cost); ClassDB::bind_method(D_METHOD("link_get_travel_cost", "link"), &NavigationServer2D::link_get_travel_cost); + ClassDB::bind_method(D_METHOD("link_set_owner_id", "link", "owner_id"), &NavigationServer2D::link_set_owner_id); + ClassDB::bind_method(D_METHOD("link_get_owner_id", "link"), &NavigationServer2D::link_get_owner_id); ClassDB::bind_method(D_METHOD("agent_create"), &NavigationServer2D::agent_create); ClassDB::bind_method(D_METHOD("agent_set_map", "agent", "map"), &NavigationServer2D::agent_set_map); @@ -289,7 +293,7 @@ void NavigationServer2D::_bind_methods() { ClassDB::bind_method(D_METHOD("agent_set_target_velocity", "agent", "target_velocity"), &NavigationServer2D::agent_set_target_velocity); ClassDB::bind_method(D_METHOD("agent_set_position", "agent", "position"), &NavigationServer2D::agent_set_position); ClassDB::bind_method(D_METHOD("agent_is_map_changed", "agent"), &NavigationServer2D::agent_is_map_changed); - ClassDB::bind_method(D_METHOD("agent_set_callback", "agent", "receiver", "method", "userdata"), &NavigationServer2D::agent_set_callback, DEFVAL(Variant())); + ClassDB::bind_method(D_METHOD("agent_set_callback", "agent", "object_id", "method", "userdata"), &NavigationServer2D::agent_set_callback, DEFVAL(Variant())); ClassDB::bind_method(D_METHOD("free_rid", "rid"), &NavigationServer2D::free); @@ -348,6 +352,8 @@ void FORWARD_2_C(region_set_enter_cost, RID, p_region, real_t, p_enter_cost, rid real_t FORWARD_1_C(region_get_enter_cost, RID, p_region, rid_to_rid); void FORWARD_2_C(region_set_travel_cost, RID, p_region, real_t, p_travel_cost, rid_to_rid, real_to_real); real_t FORWARD_1_C(region_get_travel_cost, RID, p_region, rid_to_rid); +void FORWARD_2_C(region_set_owner_id, RID, p_region, ObjectID, p_owner_id, rid_to_rid, id_to_id); +ObjectID FORWARD_1_C(region_get_owner_id, RID, p_region, rid_to_rid); bool FORWARD_2_C(region_owns_point, RID, p_region, const Vector2 &, p_point, rid_to_rid, v2_to_v3); void FORWARD_2_C(region_set_map, RID, p_region, RID, p_map, rid_to_rid, rid_to_rid); @@ -355,8 +361,8 @@ void FORWARD_2_C(region_set_navigation_layers, RID, p_region, uint32_t, p_naviga uint32_t FORWARD_1_C(region_get_navigation_layers, RID, p_region, rid_to_rid); void FORWARD_2_C(region_set_transform, RID, p_region, Transform2D, p_transform, rid_to_rid, trf2_to_trf3); -void NavigationServer2D::region_set_navpoly(RID p_region, Ref<NavigationPolygon> p_nav_mesh) const { - NavigationServer3D::get_singleton()->region_set_navmesh(p_region, poly_to_mesh(p_nav_mesh)); +void NavigationServer2D::region_set_navigation_polygon(RID p_region, Ref<NavigationPolygon> p_navigation_polygon) const { + NavigationServer3D::get_singleton()->region_set_navigation_mesh(p_region, poly_to_mesh(p_navigation_polygon)); } int FORWARD_1_C(region_get_connections_count, RID, p_region, rid_to_rid); @@ -379,6 +385,8 @@ void FORWARD_2_C(link_set_enter_cost, RID, p_link, real_t, p_enter_cost, rid_to_ real_t FORWARD_1_C(link_get_enter_cost, RID, p_link, rid_to_rid); void FORWARD_2_C(link_set_travel_cost, RID, p_link, real_t, p_travel_cost, rid_to_rid, real_to_real); real_t FORWARD_1_C(link_get_travel_cost, RID, p_link, rid_to_rid); +void FORWARD_2_C(link_set_owner_id, RID, p_link, ObjectID, p_owner_id, rid_to_rid, id_to_id); +ObjectID FORWARD_1_C(link_get_owner_id, RID, p_link, rid_to_rid); RID NavigationServer2D::agent_create() const { RID agent = NavigationServer3D::get_singleton()->agent_create(); @@ -408,7 +416,7 @@ void FORWARD_2_C(agent_set_ignore_y, RID, p_agent, bool, p_ignore, rid_to_rid, b bool FORWARD_1_C(agent_is_map_changed, RID, p_agent, rid_to_rid); -void FORWARD_4_C(agent_set_callback, RID, p_agent, Object *, p_receiver, StringName, p_method, Variant, p_udata, rid_to_rid, obj_to_obj, sn_to_sn, var_to_var); +void FORWARD_4_C(agent_set_callback, RID, p_agent, ObjectID, p_object_id, StringName, p_method, Variant, p_udata, rid_to_rid, id_to_id, sn_to_sn, var_to_var); void FORWARD_1_C(free, RID, p_object, rid_to_rid); @@ -419,4 +427,7 @@ void NavigationServer2D::query_path(const Ref<NavigationPathQueryParameters2D> & const NavigationUtilities::PathQueryResult _query_result = NavigationServer3D::get_singleton()->_query_path(p_query_parameters->get_parameters()); p_query_result->set_path(vector_v3_to_v2(_query_result.path)); + p_query_result->set_path_types(_query_result.path_types); + p_query_result->set_path_rids(_query_result.path_rids); + p_query_result->set_path_owner_ids(_query_result.path_owner_ids); } diff --git a/servers/navigation_server_2d.h b/servers/navigation_server_2d.h index 54cfc6b14e..9b921969c0 100644 --- a/servers/navigation_server_2d.h +++ b/servers/navigation_server_2d.h @@ -34,7 +34,7 @@ #include "core/object/class_db.h" #include "core/templates/rid.h" -#include "scene/2d/navigation_region_2d.h" +#include "scene/resources/navigation_polygon.h" #include "servers/navigation/navigation_path_query_parameters_2d.h" #include "servers/navigation/navigation_path_query_result_2d.h" @@ -108,6 +108,10 @@ public: virtual void region_set_travel_cost(RID p_region, real_t p_travel_cost) const; virtual real_t region_get_travel_cost(RID p_region) const; + /// Set the node which manages this region. + virtual void region_set_owner_id(RID p_region, ObjectID p_owner_id) const; + virtual ObjectID region_get_owner_id(RID p_region) const; + virtual bool region_owns_point(RID p_region, const Vector2 &p_point) const; /// Set the map of this region. @@ -122,7 +126,7 @@ public: virtual void region_set_transform(RID p_region, Transform2D p_transform) const; /// Set the navigation poly of this region. - virtual void region_set_navpoly(RID p_region, Ref<NavigationPolygon> p_nav_mesh) const; + virtual void region_set_navigation_polygon(RID p_region, Ref<NavigationPolygon> p_navigation_polygon) const; /// Get a list of a region's connection to other regions. virtual int region_get_connections_count(RID p_region) const; @@ -160,6 +164,10 @@ public: virtual void link_set_travel_cost(RID p_link, real_t p_travel_cost) const; virtual real_t link_get_travel_cost(RID p_link) const; + /// Set the node which manages this link. + virtual void link_set_owner_id(RID p_link, ObjectID p_owner_id) const; + virtual ObjectID link_get_owner_id(RID p_link) const; + /// Creates the agent. virtual RID agent_create() const; @@ -218,7 +226,7 @@ public: virtual bool agent_is_map_changed(RID p_agent) const; /// Callback called at the end of the RVO process - virtual void agent_set_callback(RID p_agent, Object *p_receiver, StringName p_method, Variant p_udata = Variant()) const; + virtual void agent_set_callback(RID p_agent, ObjectID p_object_id, StringName p_method, Variant p_udata = Variant()) const; virtual void query_path(const Ref<NavigationPathQueryParameters2D> &p_query_parameters, Ref<NavigationPathQueryResult2D> p_query_result) const; diff --git a/servers/navigation_server_3d.cpp b/servers/navigation_server_3d.cpp index cab8816747..6ad07d3053 100644 --- a/servers/navigation_server_3d.cpp +++ b/servers/navigation_server_3d.cpp @@ -69,14 +69,16 @@ void NavigationServer3D::_bind_methods() { ClassDB::bind_method(D_METHOD("region_get_enter_cost", "region"), &NavigationServer3D::region_get_enter_cost); ClassDB::bind_method(D_METHOD("region_set_travel_cost", "region", "travel_cost"), &NavigationServer3D::region_set_travel_cost); ClassDB::bind_method(D_METHOD("region_get_travel_cost", "region"), &NavigationServer3D::region_get_travel_cost); + ClassDB::bind_method(D_METHOD("region_set_owner_id", "region", "owner_id"), &NavigationServer3D::region_set_owner_id); + ClassDB::bind_method(D_METHOD("region_get_owner_id", "region"), &NavigationServer3D::region_get_owner_id); ClassDB::bind_method(D_METHOD("region_owns_point", "region", "point"), &NavigationServer3D::region_owns_point); ClassDB::bind_method(D_METHOD("region_set_map", "region", "map"), &NavigationServer3D::region_set_map); ClassDB::bind_method(D_METHOD("region_get_map", "region"), &NavigationServer3D::region_get_map); ClassDB::bind_method(D_METHOD("region_set_navigation_layers", "region", "navigation_layers"), &NavigationServer3D::region_set_navigation_layers); ClassDB::bind_method(D_METHOD("region_get_navigation_layers", "region"), &NavigationServer3D::region_get_navigation_layers); ClassDB::bind_method(D_METHOD("region_set_transform", "region", "transform"), &NavigationServer3D::region_set_transform); - ClassDB::bind_method(D_METHOD("region_set_navmesh", "region", "nav_mesh"), &NavigationServer3D::region_set_navmesh); - ClassDB::bind_method(D_METHOD("region_bake_navmesh", "mesh", "node"), &NavigationServer3D::region_bake_navmesh); + ClassDB::bind_method(D_METHOD("region_set_navigation_mesh", "region", "navigation_mesh"), &NavigationServer3D::region_set_navigation_mesh); + ClassDB::bind_method(D_METHOD("region_bake_navigation_mesh", "navigation_mesh", "root_node"), &NavigationServer3D::region_bake_navigation_mesh); ClassDB::bind_method(D_METHOD("region_get_connections_count", "region"), &NavigationServer3D::region_get_connections_count); ClassDB::bind_method(D_METHOD("region_get_connection_pathway_start", "region", "connection"), &NavigationServer3D::region_get_connection_pathway_start); ClassDB::bind_method(D_METHOD("region_get_connection_pathway_end", "region", "connection"), &NavigationServer3D::region_get_connection_pathway_end); @@ -96,6 +98,8 @@ void NavigationServer3D::_bind_methods() { ClassDB::bind_method(D_METHOD("link_get_enter_cost", "link"), &NavigationServer3D::link_get_enter_cost); ClassDB::bind_method(D_METHOD("link_set_travel_cost", "link", "travel_cost"), &NavigationServer3D::link_set_travel_cost); ClassDB::bind_method(D_METHOD("link_get_travel_cost", "link"), &NavigationServer3D::link_get_travel_cost); + ClassDB::bind_method(D_METHOD("link_set_owner_id", "link", "owner_id"), &NavigationServer3D::link_set_owner_id); + ClassDB::bind_method(D_METHOD("link_get_owner_id", "link"), &NavigationServer3D::link_get_owner_id); ClassDB::bind_method(D_METHOD("agent_create"), &NavigationServer3D::agent_create); ClassDB::bind_method(D_METHOD("agent_set_map", "agent", "map"), &NavigationServer3D::agent_set_map); @@ -109,7 +113,7 @@ void NavigationServer3D::_bind_methods() { ClassDB::bind_method(D_METHOD("agent_set_target_velocity", "agent", "target_velocity"), &NavigationServer3D::agent_set_target_velocity); ClassDB::bind_method(D_METHOD("agent_set_position", "agent", "position"), &NavigationServer3D::agent_set_position); ClassDB::bind_method(D_METHOD("agent_is_map_changed", "agent"), &NavigationServer3D::agent_is_map_changed); - ClassDB::bind_method(D_METHOD("agent_set_callback", "agent", "receiver", "method", "userdata"), &NavigationServer3D::agent_set_callback, DEFVAL(Variant())); + ClassDB::bind_method(D_METHOD("agent_set_callback", "agent", "object_id", "method", "userdata"), &NavigationServer3D::agent_set_callback, DEFVAL(Variant())); ClassDB::bind_method(D_METHOD("free_rid", "rid"), &NavigationServer3D::free); @@ -151,7 +155,7 @@ NavigationServer3D::NavigationServer3D() { debug_navigation_enable_link_connections_xray = GLOBAL_DEF("debug/shapes/navigation/enable_link_connections_xray", true); if (Engine::get_singleton()->is_editor_hint()) { - // enable NavigationServer3D when in Editor or else navmesh edge connections are invisible + // enable NavigationServer3D when in Editor or else navigation mesh edge connections are invisible // on runtime tests SceneTree has "Visible Navigation" set and main iteration takes care of this set_debug_enabled(true); } @@ -487,4 +491,7 @@ void NavigationServer3D::query_path(const Ref<NavigationPathQueryParameters3D> & const NavigationUtilities::PathQueryResult _query_result = _query_path(p_query_parameters->get_parameters()); p_query_result->set_path(_query_result.path); + p_query_result->set_path_types(_query_result.path_types); + p_query_result->set_path_rids(_query_result.path_rids); + p_query_result->set_path_owner_ids(_query_result.path_owner_ids); } diff --git a/servers/navigation_server_3d.h b/servers/navigation_server_3d.h index 0f537383a2..65d6d19073 100644 --- a/servers/navigation_server_3d.h +++ b/servers/navigation_server_3d.h @@ -120,6 +120,10 @@ public: virtual void region_set_travel_cost(RID p_region, real_t p_travel_cost) const = 0; virtual real_t region_get_travel_cost(RID p_region) const = 0; + /// Set the node which manages this region. + virtual void region_set_owner_id(RID p_region, ObjectID p_owner_id) const = 0; + virtual ObjectID region_get_owner_id(RID p_region) const = 0; + virtual bool region_owns_point(RID p_region, const Vector3 &p_point) const = 0; /// Set the map of this region. @@ -134,10 +138,10 @@ public: virtual void region_set_transform(RID p_region, Transform3D p_transform) const = 0; /// Set the navigation mesh of this region. - virtual void region_set_navmesh(RID p_region, Ref<NavigationMesh> p_nav_mesh) const = 0; + virtual void region_set_navigation_mesh(RID p_region, Ref<NavigationMesh> p_navigation_mesh) const = 0; /// Bake the navigation mesh. - virtual void region_bake_navmesh(Ref<NavigationMesh> r_mesh, Node *p_node) const = 0; + virtual void region_bake_navigation_mesh(Ref<NavigationMesh> p_navigation_mesh, Node *p_root_node) const = 0; /// Get a list of a region's connection to other regions. virtual int region_get_connections_count(RID p_region) const = 0; @@ -175,6 +179,10 @@ public: virtual void link_set_travel_cost(RID p_link, real_t p_travel_cost) const = 0; virtual real_t link_get_travel_cost(RID p_link) const = 0; + /// Set the node which manages this link. + virtual void link_set_owner_id(RID p_link, ObjectID p_owner_id) const = 0; + virtual ObjectID link_get_owner_id(RID p_link) const = 0; + /// Creates the agent. virtual RID agent_create() const = 0; @@ -233,7 +241,7 @@ public: virtual bool agent_is_map_changed(RID p_agent) const = 0; /// Callback called at the end of the RVO process - virtual void agent_set_callback(RID p_agent, Object *p_receiver, StringName p_method, Variant p_udata = Variant()) const = 0; + virtual void agent_set_callback(RID p_agent, ObjectID p_object_id, StringName p_method, Variant p_udata = Variant()) const = 0; /// Destroy the `RID` virtual void free(RID p_object) const = 0; diff --git a/servers/physics_2d/godot_body_pair_2d.cpp b/servers/physics_2d/godot_body_pair_2d.cpp index 7b7c67bbc2..1684835e76 100644 --- a/servers/physics_2d/godot_body_pair_2d.cpp +++ b/servers/physics_2d/godot_body_pair_2d.cpp @@ -161,6 +161,11 @@ void GodotBodyPair2D::_validate_contacts() { } } +// _test_ccd prevents tunneling by slowing down a high velocity body that is about to collide so that next frame it will be at an appropriate location to collide (i.e. slight overlap) +// Warning: the way velocity is adjusted down to cause a collision means the momentum will be weaker than it should for a bounce! +// Process: only proceed if body A's motion is high relative to its size. +// cast forward along motion vector to see if A is going to enter/pass B's collider next frame, only proceed if it does. +// adjust the velocity of A down so that it will just slightly intersect the collider instead of blowing right past it. bool GodotBodyPair2D::_test_ccd(real_t p_step, GodotBody2D *p_A, int p_shape_A, const Transform2D &p_xform_A, GodotBody2D *p_B, int p_shape_B, const Transform2D &p_xform_B) { Vector2 motion = p_A->get_linear_velocity() * p_step; real_t mlen = motion.length(); @@ -180,24 +185,32 @@ bool GodotBodyPair2D::_test_ccd(real_t p_step, GodotBody2D *p_A, int p_shape_A, return false; } - // Going too fast in that direction. + // A is moving fast enough that tunneling might occur. See if it's really about to collide. // Cast a segment from support in motion normal, in the same direction of motion by motion length. - // Support is the worst case collision point, so real collision happened before. + // Support point will the farthest forward collision point along the movement vector. + // i.e. the point that should hit B first if any collision does occur. + + // convert mnormal into body A's local xform because get_support requires (and returns) local coordinates. int a; Vector2 s[2]; - p_A->get_shape(p_shape_A)->get_supports(p_xform_A.basis_xform(mnormal).normalized(), s, a); + p_A->get_shape(p_shape_A)->get_supports(p_xform_A.basis_xform_inv(mnormal).normalized(), s, a); Vector2 from = p_xform_A.xform(s[0]); + // Back up 10% of the per-frame motion behind the support point and use that as the beginning of our cast. + // This should ensure the calculated new velocity will really cause a bit of overlap instead of just getting us very close. Vector2 to = from + motion; Transform2D from_inv = p_xform_B.affine_inverse(); - // Start from a little inside the bounding box. - Vector2 local_from = from_inv.xform(from - mnormal * mlen * 0.1); + // Back up 10% of the per-frame motion behind the support point and use that as the beginning of our cast. + // At high speeds, this may mean we're actually casting from well behind the body instead of inside it, which is odd. But it still works out. + Vector2 local_from = from_inv.xform(from - motion * 0.1); Vector2 local_to = from_inv.xform(to); Vector2 rpos, rnorm; if (!p_B->get_shape(p_shape_B)->intersect_segment(local_from, local_to, rpos, rnorm)) { + // there was no hit. Since the segment is the length of per-frame motion, this means the bodies will not + // actually collide yet on next frame. We'll probably check again next frame once they're closer. return false; } @@ -215,7 +228,7 @@ bool GodotBodyPair2D::_test_ccd(real_t p_step, GodotBody2D *p_A, int p_shape_A, // next frame will hit softly or soft enough. Vector2 hitpos = p_xform_B.xform(rpos); - real_t newlen = hitpos.distance_to(from) - (max - min) * 0.01; + real_t newlen = hitpos.distance_to(from) + (max - min) * 0.01; // adding 1% of body length to the distance between collision and support point should cause body A's support point to arrive just within B's collider next frame. p_A->set_linear_velocity(mnormal * (newlen / p_step)); return true; diff --git a/servers/physics_2d/godot_step_2d.cpp b/servers/physics_2d/godot_step_2d.cpp index 46718c8819..b7d79bc0e3 100644 --- a/servers/physics_2d/godot_step_2d.cpp +++ b/servers/physics_2d/godot_step_2d.cpp @@ -71,7 +71,7 @@ void GodotStep2D::_populate_island(GodotBody2D *p_body, LocalVector<GodotBody2D } } -void GodotStep2D::_setup_contraint(uint32_t p_constraint_index, void *p_userdata) { +void GodotStep2D::_setup_constraint(uint32_t p_constraint_index, void *p_userdata) { GodotConstraint2D *constraint = all_constraints[p_constraint_index]; constraint->setup(delta); } @@ -238,8 +238,8 @@ void GodotStep2D::step(GodotSpace2D *p_space, real_t p_delta) { /* SETUP CONSTRAINTS / PROCESS COLLISIONS */ - uint32_t total_contraint_count = all_constraints.size(); - WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton()->add_template_group_task(this, &GodotStep2D::_setup_contraint, nullptr, total_contraint_count, -1, true, SNAME("Physics2DConstraintSetup")); + uint32_t total_constraint_count = all_constraints.size(); + WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton()->add_template_group_task(this, &GodotStep2D::_setup_constraint, nullptr, total_constraint_count, -1, true, SNAME("Physics2DConstraintSetup")); WorkerThreadPool::get_singleton()->wait_for_group_task_completion(group_task); { //profile diff --git a/servers/physics_2d/godot_step_2d.h b/servers/physics_2d/godot_step_2d.h index 9f8fdd6ce3..4b3b6fc966 100644 --- a/servers/physics_2d/godot_step_2d.h +++ b/servers/physics_2d/godot_step_2d.h @@ -47,7 +47,7 @@ class GodotStep2D { LocalVector<GodotConstraint2D *> all_constraints; void _populate_island(GodotBody2D *p_body, LocalVector<GodotBody2D *> &p_body_island, LocalVector<GodotConstraint2D *> &p_constraint_island); - void _setup_contraint(uint32_t p_constraint_index, void *p_userdata = nullptr); + void _setup_constraint(uint32_t p_constraint_index, void *p_userdata = nullptr); void _pre_solve_island(LocalVector<GodotConstraint2D *> &p_constraint_island) const; void _solve_island(uint32_t p_island_index, void *p_userdata = nullptr) const; void _check_suspend(LocalVector<GodotBody2D *> &p_body_island) const; diff --git a/servers/physics_3d/godot_body_pair_3d.cpp b/servers/physics_3d/godot_body_pair_3d.cpp index 7e6cc6f834..00b7941292 100644 --- a/servers/physics_3d/godot_body_pair_3d.cpp +++ b/servers/physics_3d/godot_body_pair_3d.cpp @@ -161,6 +161,11 @@ void GodotBodyPair3D::validate_contacts() { } } +// _test_ccd prevents tunneling by slowing down a high velocity body that is about to collide so that next frame it will be at an appropriate location to collide (i.e. slight overlap) +// Warning: the way velocity is adjusted down to cause a collision means the momentum will be weaker than it should for a bounce! +// Process: only proceed if body A's motion is high relative to its size. +// cast forward along motion vector to see if A is going to enter/pass B's collider next frame, only proceed if it does. +// adjust the velocity of A down so that it will just slightly intersect the collider instead of blowing right past it. bool GodotBodyPair3D::_test_ccd(real_t p_step, GodotBody3D *p_A, int p_shape_A, const Transform3D &p_xform_A, GodotBody3D *p_B, int p_shape_B, const Transform3D &p_xform_B) { Vector3 motion = p_A->get_linear_velocity() * p_step; real_t mlen = motion.length(); @@ -177,33 +182,39 @@ bool GodotBodyPair3D::_test_ccd(real_t p_step, GodotBody3D *p_A, int p_shape_A, // Let's say it should move more than 1/3 the size of the object in that axis. bool fast_object = mlen > (max - min) * 0.3; if (!fast_object) { - return false; + return false; // moving slow enough that there's no chance of tunneling. } - // Going too fast in that direction. + // A is moving fast enough that tunneling might occur. See if it's really about to collide. // Cast a segment from support in motion normal, in the same direction of motion by motion length. - // Support is the worst case collision point, so real collision happened before. - Vector3 s = p_A->get_shape(p_shape_A)->get_support(p_xform_A.basis.xform(mnormal).normalized()); + // Support point will the farthest forward collision point along the movement vector. + // i.e. the point that should hit B first if any collision does occur. + + // convert mnormal into body A's local xform because get_support requires (and returns) local coordinates. + Vector3 s = p_A->get_shape(p_shape_A)->get_support(p_xform_A.basis.xform_inv(mnormal).normalized()); Vector3 from = p_xform_A.xform(s); Vector3 to = from + motion; Transform3D from_inv = p_xform_B.affine_inverse(); - // Start from a little inside the bounding box. - Vector3 local_from = from_inv.xform(from - mnormal * mlen * 0.1); + // Back up 10% of the per-frame motion behind the support point and use that as the beginning of our cast. + // At high speeds, this may mean we're actually casting from well behind the body instead of inside it, which is odd. But it still works out. + Vector3 local_from = from_inv.xform(from - motion * 0.1); Vector3 local_to = from_inv.xform(to); Vector3 rpos, rnorm; if (!p_B->get_shape(p_shape_B)->intersect_segment(local_from, local_to, rpos, rnorm, true)) { + // there was no hit. Since the segment is the length of per-frame motion, this means the bodies will not + // actually collide yet on next frame. We'll probably check again next frame once they're closer. return false; } - // Shorten the linear velocity so it does not hit, but gets close enough, - // next frame will hit softly or soft enough. + // Shorten the linear velocity so it will collide next frame. Vector3 hitpos = p_xform_B.xform(rpos); - real_t newlen = hitpos.distance_to(from) - (max - min) * 0.01; + real_t newlen = hitpos.distance_to(from) + (max - min) * 0.01; // adding 1% of body length to the distance between collision and support point should cause body A's support point to arrive just within B's collider next frame. + p_A->set_linear_velocity((mnormal * newlen) / p_step); return true; diff --git a/servers/physics_3d/godot_shape_3d.cpp b/servers/physics_3d/godot_shape_3d.cpp index 22553bd3d8..1a016fbc72 100644 --- a/servers/physics_3d/godot_shape_3d.cpp +++ b/servers/physics_3d/godot_shape_3d.cpp @@ -1996,7 +1996,7 @@ void GodotHeightMapShape3D::_get_cell(const Vector3 &p_point, int &r_x, int &r_y Vector3 clamped_point(p_point); clamped_point.x = CLAMP(p_point.x, pos_local.x, pos_local.x + shape_aabb.size.x); clamped_point.y = CLAMP(p_point.y, pos_local.y, pos_local.y + shape_aabb.size.y); - clamped_point.z = CLAMP(p_point.z, pos_local.z, pos_local.x + shape_aabb.size.z); + clamped_point.z = CLAMP(p_point.z, pos_local.z, pos_local.z + shape_aabb.size.z); r_x = (clamped_point.x < 0.0) ? (clamped_point.x - 0.5) : (clamped_point.x + 0.5); r_y = (clamped_point.y < 0.0) ? (clamped_point.y - 0.5) : (clamped_point.y + 0.5); diff --git a/servers/physics_3d/godot_step_3d.cpp b/servers/physics_3d/godot_step_3d.cpp index bfedcd29c0..634523d0b9 100644 --- a/servers/physics_3d/godot_step_3d.cpp +++ b/servers/physics_3d/godot_step_3d.cpp @@ -111,7 +111,7 @@ void GodotStep3D::_populate_island_soft_body(GodotSoftBody3D *p_soft_body, Local } } -void GodotStep3D::_setup_contraint(uint32_t p_constraint_index, void *p_userdata) { +void GodotStep3D::_setup_constraint(uint32_t p_constraint_index, void *p_userdata) { GodotConstraint3D *constraint = all_constraints[p_constraint_index]; constraint->setup(delta); } @@ -342,8 +342,8 @@ void GodotStep3D::step(GodotSpace3D *p_space, real_t p_delta) { /* SETUP CONSTRAINTS / PROCESS COLLISIONS */ - uint32_t total_contraint_count = all_constraints.size(); - WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton()->add_template_group_task(this, &GodotStep3D::_setup_contraint, nullptr, total_contraint_count, -1, true, SNAME("Physics3DConstraintSetup")); + uint32_t total_constraint_count = all_constraints.size(); + WorkerThreadPool::GroupID group_task = WorkerThreadPool::get_singleton()->add_template_group_task(this, &GodotStep3D::_setup_constraint, nullptr, total_constraint_count, -1, true, SNAME("Physics3DConstraintSetup")); WorkerThreadPool::get_singleton()->wait_for_group_task_completion(group_task); { //profile diff --git a/servers/physics_3d/godot_step_3d.h b/servers/physics_3d/godot_step_3d.h index 189487757f..a0854a720c 100644 --- a/servers/physics_3d/godot_step_3d.h +++ b/servers/physics_3d/godot_step_3d.h @@ -48,7 +48,7 @@ class GodotStep3D { void _populate_island(GodotBody3D *p_body, LocalVector<GodotBody3D *> &p_body_island, LocalVector<GodotConstraint3D *> &p_constraint_island); void _populate_island_soft_body(GodotSoftBody3D *p_soft_body, LocalVector<GodotBody3D *> &p_body_island, LocalVector<GodotConstraint3D *> &p_constraint_island); - void _setup_contraint(uint32_t p_constraint_index, void *p_userdata = nullptr); + void _setup_constraint(uint32_t p_constraint_index, void *p_userdata = nullptr); void _pre_solve_island(LocalVector<GodotConstraint3D *> &p_constraint_island) const; void _solve_island(uint32_t p_island_index, void *p_userdata = nullptr); void _check_suspend(const LocalVector<GodotBody3D *> &p_body_island) const; diff --git a/servers/physics_server_3d.h b/servers/physics_server_3d.h index 5335bc3109..ca1ff57c99 100644 --- a/servers/physics_server_3d.h +++ b/servers/physics_server_3d.h @@ -210,8 +210,8 @@ public: class PhysicsServer3DRenderingServerHandler : public Object { GDCLASS(PhysicsServer3DRenderingServerHandler, Object) protected: - GDVIRTUAL2(_set_vertex, int, GDNativeConstPtr<void>) - GDVIRTUAL2(_set_normal, int, GDNativeConstPtr<void>) + GDVIRTUAL2(_set_vertex, int, GDExtensionConstPtr<void>) + GDVIRTUAL2(_set_normal, int, GDExtensionConstPtr<void>) GDVIRTUAL1(_set_aabb, const AABB &) static void _bind_methods(); diff --git a/servers/rendering/dummy/rasterizer_scene_dummy.h b/servers/rendering/dummy/rasterizer_scene_dummy.h index bc8f7c523b..3937362920 100644 --- a/servers/rendering/dummy/rasterizer_scene_dummy.h +++ b/servers/rendering/dummy/rasterizer_scene_dummy.h @@ -112,7 +112,6 @@ public: /* ENVIRONMENT API */ void environment_glow_set_use_bicubic_upscale(bool p_enable) override {} - void environment_glow_set_use_high_quality(bool p_enable) override {} void environment_set_ssr_roughness_quality(RS::EnvironmentSSRRoughnessQuality p_quality) override {} diff --git a/servers/rendering/renderer_canvas_cull.cpp b/servers/rendering/renderer_canvas_cull.cpp index 33f1f38bf5..6be0419d98 100644 --- a/servers/rendering/renderer_canvas_cull.cpp +++ b/servers/rendering/renderer_canvas_cull.cpp @@ -1185,7 +1185,7 @@ void RendererCanvasCull::canvas_item_add_texture_rect(RID p_item, const Rect2 &p rect->texture = p_texture; } -void RendererCanvasCull::canvas_item_add_msdf_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate, int p_outline_size, float p_px_range) { +void RendererCanvasCull::canvas_item_add_msdf_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate, int p_outline_size, float p_px_range, float p_scale) { Item *canvas_item = canvas_item_owner.get_or_null(p_item); ERR_FAIL_COND(!canvas_item); @@ -1215,7 +1215,7 @@ void RendererCanvasCull::canvas_item_add_msdf_texture_rect_region(RID p_item, co rect->flags ^= RendererCanvasRender::CANVAS_RECT_FLIP_V; rect->source.size.y = -rect->source.size.y; } - rect->outline = p_outline_size; + rect->outline = (float)p_outline_size / p_scale / 4.0; rect->px_range = p_px_range; } diff --git a/servers/rendering/renderer_canvas_cull.h b/servers/rendering/renderer_canvas_cull.h index 198e1020f0..808c0acc35 100644 --- a/servers/rendering/renderer_canvas_cull.h +++ b/servers/rendering/renderer_canvas_cull.h @@ -228,7 +228,7 @@ public: void canvas_item_add_circle(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color); void canvas_item_add_texture_rect(RID p_item, const Rect2 &p_rect, RID p_texture, bool p_tile = false, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false); void canvas_item_add_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false, bool p_clip_uv = false); - void canvas_item_add_msdf_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, float p_px_range = 1.0); + void canvas_item_add_msdf_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, float p_px_range = 1.0, float p_scale = 1.0); void canvas_item_add_lcd_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1)); void canvas_item_add_nine_patch(RID p_item, const Rect2 &p_rect, const Rect2 &p_source, RID p_texture, const Vector2 &p_topleft, const Vector2 &p_bottomright, RS::NinePatchAxisMode p_x_axis_mode = RS::NINE_PATCH_STRETCH, RS::NinePatchAxisMode p_y_axis_mode = RS::NINE_PATCH_STRETCH, bool p_draw_center = true, const Color &p_modulate = Color(1, 1, 1)); void canvas_item_add_primitive(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, RID p_texture, float p_width = 1.0); diff --git a/servers/rendering/renderer_rd/SCsub b/servers/rendering/renderer_rd/SCsub index 10b83dca11..a27439e931 100644 --- a/servers/rendering/renderer_rd/SCsub +++ b/servers/rendering/renderer_rd/SCsub @@ -9,4 +9,5 @@ SConscript("environment/SCsub") SConscript("forward_clustered/SCsub") SConscript("forward_mobile/SCsub") SConscript("shaders/SCsub") +SConscript("spirv-reflect/SCsub") SConscript("storage_rd/SCsub") diff --git a/servers/rendering/renderer_rd/effects/copy_effects.cpp b/servers/rendering/renderer_rd/effects/copy_effects.cpp index f94abd66d7..9fda54a34d 100644 --- a/servers/rendering/renderer_rd/effects/copy_effects.cpp +++ b/servers/rendering/renderer_rd/effects/copy_effects.cpp @@ -628,7 +628,7 @@ void CopyEffects::copy_raster(RID p_source_texture, RID p_dest_framebuffer) { RD::get_singleton()->draw_list_end(); } -void CopyEffects::gaussian_blur(RID p_source_rd_texture, RID p_texture, const Rect2i &p_region, bool p_8bit_dst) { +void CopyEffects::gaussian_blur(RID p_source_rd_texture, RID p_texture, const Rect2i &p_region, const Size2i &p_size, bool p_8bit_dst) { ERR_FAIL_COND_MSG(prefer_raster_effects, "Can't use the compute version of the gaussian blur with the mobile renderer."); UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); @@ -640,8 +640,10 @@ void CopyEffects::gaussian_blur(RID p_source_rd_texture, RID p_texture, const Re copy.push_constant.section[0] = p_region.position.x; copy.push_constant.section[1] = p_region.position.y; - copy.push_constant.section[2] = p_region.size.width; - copy.push_constant.section[3] = p_region.size.height; + copy.push_constant.target[0] = p_region.position.x; + copy.push_constant.target[1] = p_region.position.y; + copy.push_constant.section[2] = p_size.width; + copy.push_constant.section[3] = p_size.height; // setup our uniforms RID default_sampler = material_storage->sampler_rd_get_default(RS::CANVAS_ITEM_TEXTURE_FILTER_LINEAR, RS::CANVAS_ITEM_TEXTURE_REPEAT_DISABLED); @@ -702,7 +704,7 @@ void CopyEffects::gaussian_blur_raster(RID p_source_rd_texture, RID p_dest_textu RD::get_singleton()->draw_list_end(); } -void CopyEffects::gaussian_glow(RID p_source_rd_texture, RID p_back_texture, const Size2i &p_size, float p_strength, bool p_high_quality, bool p_first_pass, float p_luminance_cap, float p_exposure, float p_bloom, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, RID p_auto_exposure, float p_auto_exposure_scale) { +void CopyEffects::gaussian_glow(RID p_source_rd_texture, RID p_back_texture, const Size2i &p_size, float p_strength, bool p_first_pass, float p_luminance_cap, float p_exposure, float p_bloom, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, RID p_auto_exposure, float p_auto_exposure_scale) { ERR_FAIL_COND_MSG(prefer_raster_effects, "Can't use the compute version of the gaussian glow with the mobile renderer."); UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); @@ -746,14 +748,14 @@ void CopyEffects::gaussian_glow(RID p_source_rd_texture, RID p_back_texture, con RD::get_singleton()->compute_list_bind_uniform_set(compute_list, uniform_set_cache->get_cache(shader, 1, u_auto_exposure), 1); } - copy.push_constant.flags = base_flags | (p_first_pass ? COPY_FLAG_GLOW_FIRST_PASS : 0) | (p_high_quality ? COPY_FLAG_HIGH_QUALITY_GLOW : 0); + copy.push_constant.flags = base_flags | (p_first_pass ? COPY_FLAG_GLOW_FIRST_PASS : 0); RD::get_singleton()->compute_list_set_push_constant(compute_list, ©.push_constant, sizeof(CopyPushConstant)); RD::get_singleton()->compute_list_dispatch_threads(compute_list, p_size.width, p_size.height, 1); RD::get_singleton()->compute_list_end(); } -void CopyEffects::gaussian_glow_raster(RID p_source_rd_texture, RID p_half_texture, RID p_dest_texture, float p_luminance_multiplier, const Size2i &p_size, float p_strength, bool p_high_quality, bool p_first_pass, float p_luminance_cap, float p_exposure, float p_bloom, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, RID p_auto_exposure, float p_auto_exposure_scale) { +void CopyEffects::gaussian_glow_raster(RID p_source_rd_texture, RID p_half_texture, RID p_dest_texture, float p_luminance_multiplier, const Size2i &p_size, float p_strength, bool p_first_pass, float p_luminance_cap, float p_exposure, float p_bloom, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, RID p_auto_exposure, float p_auto_exposure_scale) { ERR_FAIL_COND_MSG(!prefer_raster_effects, "Can't use the raster version of the gaussian glow with the clustered renderer."); UniformSetCacheRD *uniform_set_cache = UniformSetCacheRD::get_singleton(); diff --git a/servers/rendering/renderer_rd/effects/copy_effects.h b/servers/rendering/renderer_rd/effects/copy_effects.h index 83f7a51a36..a0904f0b8e 100644 --- a/servers/rendering/renderer_rd/effects/copy_effects.h +++ b/servers/rendering/renderer_rd/effects/copy_effects.h @@ -132,8 +132,7 @@ private: COPY_FLAG_FLIP_Y = (1 << 5), COPY_FLAG_FORCE_LUMINANCE = (1 << 6), COPY_FLAG_ALL_SOURCE = (1 << 7), - COPY_FLAG_HIGH_QUALITY_GLOW = (1 << 8), - COPY_FLAG_ALPHA_TO_ONE = (1 << 9), + COPY_FLAG_ALPHA_TO_ONE = (1 << 8), }; struct CopyPushConstant { @@ -331,10 +330,10 @@ public: void copy_to_atlas_fb(RID p_source_rd_texture, RID p_dest_framebuffer, const Rect2 &p_uv_rect, RD::DrawListID p_draw_list, bool p_flip_y = false, bool p_panorama = false); void copy_raster(RID p_source_texture, RID p_dest_framebuffer); - void gaussian_blur(RID p_source_rd_texture, RID p_texture, const Rect2i &p_region, bool p_8bit_dst = false); + void gaussian_blur(RID p_source_rd_texture, RID p_texture, const Rect2i &p_region, const Size2i &p_size, bool p_8bit_dst = false); void gaussian_blur_raster(RID p_source_rd_texture, RID p_dest_texture, const Rect2i &p_region, const Size2i &p_size); - void gaussian_glow(RID p_source_rd_texture, RID p_back_texture, const Size2i &p_size, float p_strength = 1.0, bool p_high_quality = false, bool p_first_pass = false, float p_luminance_cap = 16.0, float p_exposure = 1.0, float p_bloom = 0.0, float p_hdr_bleed_threshold = 1.0, float p_hdr_bleed_scale = 1.0, RID p_auto_exposure = RID(), float p_auto_exposure_scale = 1.0); - void gaussian_glow_raster(RID p_source_rd_texture, RID p_half_texture, RID p_dest_texture, float p_luminance_multiplier, const Size2i &p_size, float p_strength = 1.0, bool p_high_quality = false, bool p_first_pass = false, float p_luminance_cap = 16.0, float p_exposure = 1.0, float p_bloom = 0.0, float p_hdr_bleed_threshold = 1.0, float p_hdr_bleed_scale = 1.0, RID p_auto_exposure = RID(), float p_auto_exposure_scale = 1.0); + void gaussian_glow(RID p_source_rd_texture, RID p_back_texture, const Size2i &p_size, float p_strength = 1.0, bool p_first_pass = false, float p_luminance_cap = 16.0, float p_exposure = 1.0, float p_bloom = 0.0, float p_hdr_bleed_threshold = 1.0, float p_hdr_bleed_scale = 1.0, RID p_auto_exposure = RID(), float p_auto_exposure_scale = 1.0); + void gaussian_glow_raster(RID p_source_rd_texture, RID p_half_texture, RID p_dest_texture, float p_luminance_multiplier, const Size2i &p_size, float p_strength = 1.0, bool p_first_pass = false, float p_luminance_cap = 16.0, float p_exposure = 1.0, float p_bloom = 0.0, float p_hdr_bleed_threshold = 1.0, float p_hdr_bleed_scale = 1.0, RID p_auto_exposure = RID(), float p_auto_exposure_scale = 1.0); void make_mipmap(RID p_source_rd_texture, RID p_dest_texture, const Size2i &p_size); void make_mipmap_raster(RID p_source_rd_texture, RID p_dest_texture, const Size2i &p_size); diff --git a/servers/rendering/renderer_rd/environment/fog.cpp b/servers/rendering/renderer_rd/environment/fog.cpp index eece195946..38066b6613 100644 --- a/servers/rendering/renderer_rd/environment/fog.cpp +++ b/servers/rendering/renderer_rd/environment/fog.cpp @@ -319,10 +319,6 @@ void Fog::free_fog_shader() { material_storage->material_free(volumetric_fog.default_material); } -void Fog::FogShaderData::set_path_hint(const String &p_path) { - path = p_path; -} - void Fog::FogShaderData::set_code(const String &p_code) { //compile @@ -366,83 +362,6 @@ void Fog::FogShaderData::set_code(const String &p_code) { valid = true; } -void Fog::FogShaderData::set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) { - if (!p_texture.is_valid()) { - if (default_texture_params.has(p_name) && default_texture_params[p_name].has(p_index)) { - default_texture_params[p_name].erase(p_index); - - if (default_texture_params[p_name].is_empty()) { - default_texture_params.erase(p_name); - } - } - } else { - if (!default_texture_params.has(p_name)) { - default_texture_params[p_name] = HashMap<int, RID>(); - } - default_texture_params[p_name][p_index] = p_texture; - } -} - -void Fog::FogShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { - RBMap<int, StringName> order; - - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_GLOBAL || E.value.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - if (E.value.texture_order >= 0) { - order[E.value.texture_order + 100000] = E.key; - } else { - order[E.value.order] = E.key; - } - } - - String last_group; - for (const KeyValue<int, StringName> &E : order) { - String group = uniforms[E.value].group; - if (!uniforms[E.value].subgroup.is_empty()) { - group += "::" + uniforms[E.value].subgroup; - } - - if (group != last_group) { - PropertyInfo pi; - pi.usage = PROPERTY_USAGE_GROUP; - pi.name = group; - p_param_list->push_back(pi); - - last_group = group; - } - - PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniforms[E.value]); - pi.name = E.value; - p_param_list->push_back(pi); - } -} - -void Fog::FogShaderData::get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const { - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - RendererMaterialStorage::InstanceShaderParam p; - p.info = ShaderLanguage::uniform_to_property_info(E.value); - p.info.name = E.key; //supply name - p.index = E.value.instance_index; - p.default_value = ShaderLanguage::constant_value_to_variant(E.value.default_value, E.value.type, E.value.array_size, E.value.hint); - p_param_list->push_back(p); - } -} - -bool Fog::FogShaderData::is_parameter_texture(const StringName &p_param) const { - if (!uniforms.has(p_param)) { - return false; - } - - return uniforms[p_param].texture_order >= 0; -} - bool Fog::FogShaderData::is_animated() const { return false; } @@ -451,15 +370,6 @@ bool Fog::FogShaderData::casts_shadows() const { return false; } -Variant Fog::FogShaderData::get_default_parameter(const StringName &p_parameter) const { - if (uniforms.has(p_parameter)) { - ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter]; - Vector<ShaderLanguage::ConstantNode::Value> default_value = uniform.default_value; - return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint); - } - return Variant(); -} - RS::ShaderNativeSourceCode Fog::FogShaderData::get_native_source_code() const { Fog *fog_singleton = Fog::get_singleton(); @@ -789,6 +699,7 @@ void Fog::volumetric_fog_update(const VolumetricFogSettings &p_settings, const P RD::get_singleton()->compute_list_bind_uniform_set(compute_list, volumetric_fog.base_uniform_set, VolumetricFogShader::FogSet::FOG_SET_BASE); if (material->uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(material->uniform_set)) { // Material may not have a uniform set. RD::get_singleton()->compute_list_bind_uniform_set(compute_list, material->uniform_set, VolumetricFogShader::FogSet::FOG_SET_MATERIAL); + material->set_as_used(); } RD::get_singleton()->compute_list_dispatch_threads(compute_list, kernel_size.x, kernel_size.y, kernel_size.z); diff --git a/servers/rendering/renderer_rd/environment/fog.h b/servers/rendering/renderer_rd/environment/fog.h index 0ade995758..a5f06a129d 100644 --- a/servers/rendering/renderer_rd/environment/fog.h +++ b/servers/rendering/renderer_rd/environment/fog.h @@ -188,27 +188,18 @@ private: RID version; RID pipeline; - HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms; Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms; Vector<uint32_t> ubo_offsets; uint32_t ubo_size = 0; - String path; String code; - HashMap<StringName, HashMap<int, RID>> default_texture_params; bool uses_time = false; - virtual void set_path_hint(const String &p_hint); virtual void set_code(const String &p_Code); - virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index); - virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; - virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; - virtual bool is_parameter_texture(const StringName &p_param) const; virtual bool is_animated() const; virtual bool casts_shadows() const; - virtual Variant get_default_parameter(const StringName &p_parameter) const; virtual RS::ShaderNativeSourceCode get_native_source_code() const; FogShaderData() {} diff --git a/servers/rendering/renderer_rd/environment/gi.cpp b/servers/rendering/renderer_rd/environment/gi.cpp index 550fe27e4c..61b7dd4504 100644 --- a/servers/rendering/renderer_rd/environment/gi.cpp +++ b/servers/rendering/renderer_rd/environment/gi.cpp @@ -3496,6 +3496,10 @@ void GI::init(SkyRD *p_sky) { { //calculate tables String defines = "\n#define SDFGI_OCT_SIZE " + itos(SDFGI::LIGHTPROBE_OCT_SIZE) + "\n"; + if (RendererSceneRenderRD::get_singleton()->is_vrs_supported()) { + defines += "\n#define USE_VRS\n"; + } + Vector<String> gi_modes; gi_modes.push_back("\n#define USE_VOXEL_GI_INSTANCES\n"); // MODE_VOXEL_GI @@ -4011,7 +4015,7 @@ void GI::process_gi(Ref<RenderSceneBuffersRD> p_render_buffers, const RID *p_nor u.append_id(rbgi->scene_data_ubo); uniforms.push_back(u); } - { + if (RendererSceneRenderRD::get_singleton()->is_vrs_supported()) { RD::Uniform u; u.uniform_type = RD::UNIFORM_TYPE_IMAGE; u.binding = 19; diff --git a/servers/rendering/renderer_rd/environment/sky.cpp b/servers/rendering/renderer_rd/environment/sky.cpp index 36d26ad783..40f68eb118 100644 --- a/servers/rendering/renderer_rd/environment/sky.cpp +++ b/servers/rendering/renderer_rd/environment/sky.cpp @@ -45,10 +45,6 @@ using namespace RendererRD; //////////////////////////////////////////////////////////////////////////////// // SKY SHADER -void SkyRD::SkyShaderData::set_path_hint(const String &p_path) { - path = p_path; -} - void SkyRD::SkyShaderData::set_code(const String &p_code) { //compile @@ -152,82 +148,6 @@ void SkyRD::SkyShaderData::set_code(const String &p_code) { valid = true; } -void SkyRD::SkyShaderData::set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) { - if (!p_texture.is_valid()) { - if (default_texture_params.has(p_name) && default_texture_params[p_name].has(p_index)) { - default_texture_params[p_name].erase(p_index); - - if (default_texture_params[p_name].is_empty()) { - default_texture_params.erase(p_name); - } - } - } else { - if (!default_texture_params.has(p_name)) { - default_texture_params[p_name] = HashMap<int, RID>(); - } - default_texture_params[p_name][p_index] = p_texture; - } -} - -void SkyRD::SkyShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { - HashMap<int, StringName> order; - - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_GLOBAL || E.value.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - if (E.value.texture_order >= 0) { - order[E.value.texture_order + 100000] = E.key; - } else { - order[E.value.order] = E.key; - } - } - String last_group; - for (const KeyValue<int, StringName> &E : order) { - String group = uniforms[E.value].group; - if (!uniforms[E.value].subgroup.is_empty()) { - group += "::" + uniforms[E.value].subgroup; - } - - if (group != last_group) { - PropertyInfo pi; - pi.usage = PROPERTY_USAGE_GROUP; - pi.name = group; - p_param_list->push_back(pi); - - last_group = group; - } - - PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniforms[E.value]); - pi.name = E.value; - p_param_list->push_back(pi); - } -} - -void SkyRD::SkyShaderData::get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const { - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - RendererMaterialStorage::InstanceShaderParam p; - p.info = ShaderLanguage::uniform_to_property_info(E.value); - p.info.name = E.key; //supply name - p.index = E.value.instance_index; - p.default_value = ShaderLanguage::constant_value_to_variant(E.value.default_value, E.value.type, E.value.array_size, E.value.hint); - p_param_list->push_back(p); - } -} - -bool SkyRD::SkyShaderData::is_parameter_texture(const StringName &p_param) const { - if (!uniforms.has(p_param)) { - return false; - } - - return uniforms[p_param].texture_order >= 0; -} - bool SkyRD::SkyShaderData::is_animated() const { return false; } @@ -236,15 +156,6 @@ bool SkyRD::SkyShaderData::casts_shadows() const { return false; } -Variant SkyRD::SkyShaderData::get_default_parameter(const StringName &p_parameter) const { - if (uniforms.has(p_parameter)) { - ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter]; - Vector<ShaderLanguage::ConstantNode::Value> default_value = uniform.default_value; - return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint); - } - return Variant(); -} - RS::ShaderNativeSourceCode SkyRD::SkyShaderData::get_native_source_code() const { RendererSceneRenderRD *scene_singleton = static_cast<RendererSceneRenderRD *>(RendererSceneRenderRD::singleton); @@ -1142,6 +1053,8 @@ void SkyRD::setup(RID p_env, Ref<RenderSceneBuffersRD> p_render_buffers, const P ERR_FAIL_COND(!shader_data); + material->set_as_used(); + // Invalidate supbass buffers if screen size changes if (sky->screen_size != p_screen_size) { sky->screen_size = p_screen_size; @@ -1542,6 +1455,8 @@ void SkyRD::draw(RID p_env, bool p_can_continue_color, bool p_can_continue_depth ERR_FAIL_COND(!shader_data); + material->set_as_used(); + Basis sky_transform = RendererSceneRenderRD::get_singleton()->environment_get_sky_orientation(p_env); sky_transform.invert(); @@ -1639,6 +1554,8 @@ void SkyRD::update_res_buffers(RID p_env, uint32_t p_view_count, const Projectio ERR_FAIL_COND(!shader_data); + material->set_as_used(); + Basis sky_transform = RendererSceneRenderRD::get_singleton()->environment_get_sky_orientation(p_env); sky_transform.invert(); @@ -1732,6 +1649,8 @@ void SkyRD::draw(RD::DrawListID p_draw_list, RID p_env, RID p_fb, uint32_t p_vie ERR_FAIL_COND(!shader_data); + material->set_as_used(); + Basis sky_transform = RendererSceneRenderRD::get_singleton()->environment_get_sky_orientation(p_env); sky_transform.invert(); diff --git a/servers/rendering/renderer_rd/environment/sky.h b/servers/rendering/renderer_rd/environment/sky.h index 45c4f9bda7..607339b24e 100644 --- a/servers/rendering/renderer_rd/environment/sky.h +++ b/servers/rendering/renderer_rd/environment/sky.h @@ -112,15 +112,12 @@ private: RID version; PipelineCacheRD pipelines[SKY_VERSION_MAX]; - HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms; Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms; Vector<uint32_t> ubo_offsets; uint32_t ubo_size = 0; - String path; String code; - HashMap<StringName, HashMap<int, RID>> default_texture_params; bool uses_time = false; bool uses_position = false; @@ -129,14 +126,8 @@ private: bool uses_light = false; virtual void set_code(const String &p_Code); - virtual void set_path_hint(const String &p_hint); - virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index); - virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; - virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; - virtual bool is_parameter_texture(const StringName &p_param) const; virtual bool is_animated() const; virtual bool casts_shadows() const; - virtual Variant get_default_parameter(const StringName &p_parameter) const; virtual RS::ShaderNativeSourceCode get_native_source_code() const; SkyShaderData() {} diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp index 3d1e04fe99..c853ae6c69 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.cpp @@ -348,6 +348,7 @@ void RenderForwardClustered::_render_list_template(RenderingDevice::DrawListID p #endif material_uniform_set = surf->material_uniform_set; shader = surf->shader; + surf->material->set_as_used(); #ifdef DEBUG_ENABLED } #endif @@ -1622,7 +1623,7 @@ void RenderForwardClustered::_render_scene(RenderDataRD *p_render_data, const Co bool using_ssr = false; bool using_sdfgi = false; bool using_voxelgi = false; - bool reverse_cull = false; + bool reverse_cull = p_render_data->scene_data->cam_transform.basis.determinant() < 0; bool using_ssil = p_render_data->environment.is_valid() && environment_get_ssil_enabled(p_render_data->environment); if (rb.is_valid()) { @@ -3378,6 +3379,7 @@ void RenderForwardClustered::_geometry_instance_add_surface_with_material(Geomet sdcache->flags = flags; sdcache->shader = p_material->shader_data; + sdcache->material = p_material; sdcache->material_uniform_set = p_material->uniform_set; sdcache->surface = mesh_storage->mesh_get_surface(p_mesh, p_surface); sdcache->primitive = mesh_storage->mesh_surface_get_primitive(sdcache->surface); diff --git a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h index d9145b5818..a5e8bb76d9 100644 --- a/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h +++ b/servers/rendering/renderer_rd/forward_clustered/render_forward_clustered.h @@ -441,6 +441,7 @@ class RenderForwardClustered : public RendererSceneRenderRD { void *surface = nullptr; RID material_uniform_set; SceneShaderForwardClustered::ShaderData *shader = nullptr; + SceneShaderForwardClustered::MaterialData *material = nullptr; void *surface_shadow = nullptr; RID material_uniform_set_shadow; diff --git a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp index b5d4098e65..6abf41a76f 100644 --- a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp +++ b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.cpp @@ -37,10 +37,6 @@ using namespace RendererSceneRenderImplementation; -void SceneShaderForwardClustered::ShaderData::set_path_hint(const String &p_path) { - path = p_path; -} - void SceneShaderForwardClustered::ShaderData::set_code(const String &p_code) { //compile @@ -380,87 +376,6 @@ void SceneShaderForwardClustered::ShaderData::set_code(const String &p_code) { valid = true; } -void SceneShaderForwardClustered::ShaderData::set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) { - if (!p_texture.is_valid()) { - if (default_texture_params.has(p_name) && default_texture_params[p_name].has(p_index)) { - default_texture_params[p_name].erase(p_index); - - if (default_texture_params[p_name].is_empty()) { - default_texture_params.erase(p_name); - } - } - } else { - if (!default_texture_params.has(p_name)) { - default_texture_params[p_name] = HashMap<int, RID>(); - } - default_texture_params[p_name][p_index] = p_texture; - } -} - -void SceneShaderForwardClustered::ShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { - HashMap<int, StringName> order; - - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_LOCAL || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_SCREEN_TEXTURE || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL_ROUGHNESS_TEXTURE || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_DEPTH_TEXTURE) { - // Don't expose any of these. - continue; - } - - if (E.value.texture_order >= 0) { - order[E.value.texture_order + 100000] = E.key; - } else { - order[E.value.order] = E.key; - } - } - - String last_group; - for (const KeyValue<int, StringName> &E : order) { - String group = uniforms[E.value].group; - if (!uniforms[E.value].subgroup.is_empty()) { - group += "::" + uniforms[E.value].subgroup; - } - - if (group != last_group) { - PropertyInfo pi; - pi.usage = PROPERTY_USAGE_GROUP; - pi.name = group; - p_param_list->push_back(pi); - - last_group = group; - } - - PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniforms[E.value]); - pi.name = E.value; - p_param_list->push_back(pi); - } -} - -void SceneShaderForwardClustered::ShaderData::get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const { - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - RendererMaterialStorage::InstanceShaderParam p; - p.info = ShaderLanguage::uniform_to_property_info(E.value); - p.info.name = E.key; //supply name - p.index = E.value.instance_index; - p.default_value = ShaderLanguage::constant_value_to_variant(E.value.default_value, E.value.type, E.value.array_size, E.value.hint); - p_param_list->push_back(p); - } -} - -bool SceneShaderForwardClustered::ShaderData::is_parameter_texture(const StringName &p_param) const { - if (!uniforms.has(p_param)) { - return false; - } - - return uniforms[p_param].texture_order >= 0; -} - bool SceneShaderForwardClustered::ShaderData::is_animated() const { return (uses_fragment_time && uses_discard) || (uses_vertex_time && uses_vertex); } @@ -473,15 +388,6 @@ bool SceneShaderForwardClustered::ShaderData::casts_shadows() const { return !has_alpha || (uses_depth_pre_pass && !(depth_draw == DEPTH_DRAW_DISABLED || depth_test == DEPTH_TEST_DISABLED)); } -Variant SceneShaderForwardClustered::ShaderData::get_default_parameter(const StringName &p_parameter) const { - if (uniforms.has(p_parameter)) { - ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter]; - Vector<ShaderLanguage::ConstantNode::Value> default_value = uniform.default_value; - return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint); - } - return Variant(); -} - RS::ShaderNativeSourceCode SceneShaderForwardClustered::ShaderData::get_native_source_code() const { SceneShaderForwardClustered *shader_singleton = (SceneShaderForwardClustered *)SceneShaderForwardClustered::singleton; diff --git a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h index 194edf2dcb..51e4dd44d5 100644 --- a/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h +++ b/servers/rendering/renderer_rd/forward_clustered/scene_shader_forward_clustered.h @@ -139,16 +139,12 @@ public: PipelineCacheRD pipelines[CULL_VARIANT_MAX][RS::PRIMITIVE_MAX][PIPELINE_VERSION_MAX]; PipelineCacheRD color_pipelines[CULL_VARIANT_MAX][RS::PRIMITIVE_MAX][PIPELINE_COLOR_PASS_FLAG_COUNT]; - String path; - - HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms; Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms; Vector<uint32_t> ubo_offsets; uint32_t ubo_size = 0; String code; - HashMap<StringName, HashMap<int, RID>> default_texture_params; DepthDraw depth_draw = DEPTH_DRAW_OPAQUE; DepthTest depth_test = DEPTH_TEST_ENABLED; @@ -183,15 +179,9 @@ public: uint32_t index = 0; virtual void set_code(const String &p_Code); - virtual void set_path_hint(const String &p_path); - virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index); - virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; - void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; - virtual bool is_parameter_texture(const StringName &p_param) const; virtual bool is_animated() const; virtual bool casts_shadows() const; - virtual Variant get_default_parameter(const StringName &p_parameter) const; virtual RS::ShaderNativeSourceCode get_native_source_code() const; SelfList<ShaderData> shader_list_element; diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp index f860bab15e..b60396c7af 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.cpp @@ -70,17 +70,17 @@ void RenderForwardMobile::ForwardIDStorageMobile::map_forward_id(RendererRD::For void RenderForwardMobile::ForwardIDStorageMobile::fill_push_constant_instance_indices(GeometryInstanceForwardMobile::PushConstant *p_push_constant, uint32_t &spec_constants, const GeometryInstanceForwardMobile *p_instance) { // first zero out our indices - p_push_constant->omni_lights[0] = 0xFFFF; - p_push_constant->omni_lights[1] = 0xFFFF; + p_push_constant->omni_lights[0] = 0xFFFFFFFF; + p_push_constant->omni_lights[1] = 0xFFFFFFFF; - p_push_constant->spot_lights[0] = 0xFFFF; - p_push_constant->spot_lights[1] = 0xFFFF; + p_push_constant->spot_lights[0] = 0xFFFFFFFF; + p_push_constant->spot_lights[1] = 0xFFFFFFFF; - p_push_constant->decals[0] = 0xFFFF; - p_push_constant->decals[1] = 0xFFFF; + p_push_constant->decals[0] = 0xFFFFFFFF; + p_push_constant->decals[1] = 0xFFFFFFFF; - p_push_constant->reflection_probes[0] = 0xFFFF; - p_push_constant->reflection_probes[1] = 0xFFFF; + p_push_constant->reflection_probes[0] = 0xFFFFFFFF; + p_push_constant->reflection_probes[1] = 0xFFFFFFFF; if (p_instance->omni_light_count == 0) { spec_constants |= 1 << SPEC_CONSTANT_DISABLE_OMNI_LIGHTS; @@ -154,8 +154,8 @@ void RenderForwardMobile::RenderBufferDataForwardMobile::configure(RenderSceneBu render_buffers->create_texture(RB_SCOPE_MOBILE, RB_TEX_COLOR_MSAA, format, usage_bits, texture_samples); - format = RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_D24_UNORM_S8_UINT, RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT) ? RD::DATA_FORMAT_D24_UNORM_S8_UINT : RD::DATA_FORMAT_D32_SFLOAT_S8_UINT; usage_bits = RD::TEXTURE_USAGE_DEPTH_STENCIL_ATTACHMENT_BIT | RD::TEXTURE_USAGE_CAN_COPY_FROM_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT; + format = RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_D24_UNORM_S8_UINT, usage_bits) ? RD::DATA_FORMAT_D24_UNORM_S8_UINT : RD::DATA_FORMAT_D32_SFLOAT_S8_UINT; render_buffers->create_texture(RB_SCOPE_MOBILE, RB_TEX_DEPTH_MSAA, format, usage_bits, texture_samples); } @@ -673,7 +673,7 @@ void RenderForwardMobile::_render_scene(RenderDataRD *p_render_data, const Color Size2i screen_size; RID framebuffer; - bool reverse_cull = false; + bool reverse_cull = p_render_data->scene_data->cam_transform.basis.determinant() < 0; bool using_subpass_transparent = true; bool using_subpass_post_process = true; @@ -2092,6 +2092,7 @@ void RenderForwardMobile::_render_list_template(RenderingDevice::DrawListID p_dr #endif material_uniform_set = surf->material_uniform_set; shader = surf->shader; + surf->material->set_as_used(); #ifdef DEBUG_ENABLED } #endif @@ -2407,6 +2408,7 @@ void RenderForwardMobile::_geometry_instance_add_surface_with_material(GeometryI sdcache->flags = flags; sdcache->shader = p_material->shader_data; + sdcache->material = p_material; sdcache->material_uniform_set = p_material->uniform_set; sdcache->surface = mesh_storage->mesh_get_surface(p_mesh, p_surface); sdcache->primitive = mesh_storage->mesh_surface_get_primitive(sdcache->surface); diff --git a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h index 6c85e1cffc..0f5a229d61 100644 --- a/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h +++ b/servers/rendering/renderer_rd/forward_mobile/render_forward_mobile.h @@ -440,6 +440,7 @@ protected: void *surface = nullptr; RID material_uniform_set; SceneShaderForwardMobile::ShaderData *shader = nullptr; + SceneShaderForwardMobile::MaterialData *material = nullptr; void *surface_shadow = nullptr; RID material_uniform_set_shadow; diff --git a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp index 2d80cffdad..224bb34189 100644 --- a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp +++ b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.cpp @@ -39,10 +39,6 @@ using namespace RendererSceneRenderImplementation; /* ShaderData */ -void SceneShaderForwardMobile::ShaderData::set_path_hint(const String &p_path) { - path = p_path; -} - void SceneShaderForwardMobile::ShaderData::set_code(const String &p_code) { //compile @@ -336,86 +332,6 @@ void SceneShaderForwardMobile::ShaderData::set_code(const String &p_code) { valid = true; } -void SceneShaderForwardMobile::ShaderData::set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) { - if (!p_texture.is_valid()) { - if (default_texture_params.has(p_name) && default_texture_params[p_name].has(p_index)) { - default_texture_params[p_name].erase(p_index); - - if (default_texture_params[p_name].is_empty()) { - default_texture_params.erase(p_name); - } - } - } else { - if (!default_texture_params.has(p_name)) { - default_texture_params[p_name] = HashMap<int, RID>(); - } - default_texture_params[p_name][p_index] = p_texture; - } -} - -void SceneShaderForwardMobile::ShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { - HashMap<int, StringName> order; - - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_LOCAL || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_SCREEN_TEXTURE || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL_ROUGHNESS_TEXTURE || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_DEPTH_TEXTURE) { - continue; - } - - if (E.value.texture_order >= 0) { - order[E.value.texture_order + 100000] = E.key; - } else { - order[E.value.order] = E.key; - } - } - - String last_group; - for (const KeyValue<int, StringName> &E : order) { - String group = uniforms[E.value].group; - if (!uniforms[E.value].subgroup.is_empty()) { - group += "::" + uniforms[E.value].subgroup; - } - - if (group != last_group) { - PropertyInfo pi; - pi.usage = PROPERTY_USAGE_GROUP; - pi.name = group; - p_param_list->push_back(pi); - - last_group = group; - } - - PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniforms[E.value]); - pi.name = E.value; - p_param_list->push_back(pi); - } -} - -void SceneShaderForwardMobile::ShaderData::get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const { - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - RendererMaterialStorage::InstanceShaderParam p; - p.info = ShaderLanguage::uniform_to_property_info(E.value); - p.info.name = E.key; //supply name - p.index = E.value.instance_index; - p.default_value = ShaderLanguage::constant_value_to_variant(E.value.default_value, E.value.type, E.value.array_size, E.value.hint); - p_param_list->push_back(p); - } -} - -bool SceneShaderForwardMobile::ShaderData::is_parameter_texture(const StringName &p_param) const { - if (!uniforms.has(p_param)) { - return false; - } - - return uniforms[p_param].texture_order >= 0; -} - bool SceneShaderForwardMobile::ShaderData::is_animated() const { return (uses_fragment_time && uses_discard) || (uses_vertex_time && uses_vertex); } @@ -428,15 +344,6 @@ bool SceneShaderForwardMobile::ShaderData::casts_shadows() const { return !has_alpha || (uses_depth_pre_pass && !(depth_draw == DEPTH_DRAW_DISABLED || depth_test == DEPTH_TEST_DISABLED)); } -Variant SceneShaderForwardMobile::ShaderData::get_default_parameter(const StringName &p_parameter) const { - if (uniforms.has(p_parameter)) { - ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter]; - Vector<ShaderLanguage::ConstantNode::Value> default_value = uniform.default_value; - return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint); - } - return Variant(); -} - RS::ShaderNativeSourceCode SceneShaderForwardMobile::ShaderData::get_native_source_code() const { SceneShaderForwardMobile *shader_singleton = (SceneShaderForwardMobile *)SceneShaderForwardMobile::singleton; diff --git a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h index 5b51cfc8c3..18a897a9e9 100644 --- a/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h +++ b/servers/rendering/renderer_rd/forward_mobile/scene_shader_forward_mobile.h @@ -100,16 +100,12 @@ public: uint32_t vertex_input_mask = 0; PipelineCacheRD pipelines[CULL_VARIANT_MAX][RS::PRIMITIVE_MAX][SHADER_VERSION_MAX]; - String path; - - HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms; Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms; Vector<uint32_t> ubo_offsets; uint32_t ubo_size = 0; String code; - HashMap<StringName, HashMap<int, RID>> default_texture_params; DepthDraw depth_draw; DepthTest depth_test; @@ -141,16 +137,8 @@ public: uint32_t index = 0; virtual void set_code(const String &p_Code); - virtual void set_path_hint(const String &p_path); - - virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index); - virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; - void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; - - virtual bool is_parameter_texture(const StringName &p_param) const; virtual bool is_animated() const; virtual bool casts_shadows() const; - virtual Variant get_default_parameter(const StringName &p_parameter) const; virtual RS::ShaderNativeSourceCode get_native_source_code() const; SelfList<ShaderData> shader_list_element; diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp index cc8238a8dd..f7302adbf6 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -398,7 +398,7 @@ void RendererCanvasRenderRD::_bind_canvas_texture(RD::DrawListID p_draw_list, RI r_last_texture = p_texture; } -void RendererCanvasRenderRD::_render_item(RD::DrawListID p_draw_list, RID p_render_target, const Item *p_item, RD::FramebufferFormatID p_framebuffer_format, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, Light *p_lights, PipelineVariants *p_pipeline_variants) { +void RendererCanvasRenderRD::_render_item(RD::DrawListID p_draw_list, RID p_render_target, const Item *p_item, RD::FramebufferFormatID p_framebuffer_format, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, Light *p_lights, PipelineVariants *p_pipeline_variants, bool &r_sdf_used) { //create an empty push constant RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); RendererRD::MeshStorage *mesh_storage = RendererRD::MeshStorage::get_singleton(); @@ -833,6 +833,9 @@ void RendererCanvasRenderRD::_render_item(RD::DrawListID p_draw_list, RID p_rend } else { particles_storage->particles_set_canvas_sdf_collision(pt->particles, false, Transform2D(), Rect2(), RID()); } + + // Signal that SDF texture needs to be updated. + r_sdf_used |= particles_storage->particles_has_collision(pt->particles); } if (mesh.is_null()) { @@ -1045,7 +1048,7 @@ RID RendererCanvasRenderRD::_create_base_uniform_set(RID p_to_render_target, boo return uniform_set; } -void RendererCanvasRenderRD::_render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, bool p_to_backbuffer) { +void RendererCanvasRenderRD::_render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, bool &r_sdf_used, bool p_to_backbuffer) { RendererRD::MaterialStorage *material_storage = RendererRD::MaterialStorage::get_singleton(); RendererRD::TextureStorage *texture_storage = RendererRD::TextureStorage::get_singleton(); @@ -1133,6 +1136,7 @@ void RendererCanvasRenderRD::_render_items(RID p_to_render_target, int p_item_co // Update uniform set. if (material_data->uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(material_data->uniform_set)) { // Material may not have a uniform set. RD::get_singleton()->draw_list_bind_uniform_set(draw_list, material_data->uniform_set, MATERIAL_UNIFORM_SET); + material_data->set_as_used(); } } else { pipeline_variants = &shader.pipeline_variants; @@ -1142,7 +1146,7 @@ void RendererCanvasRenderRD::_render_items(RID p_to_render_target, int p_item_co } } - _render_item(draw_list, p_to_render_target, ci, fb_format, canvas_transform_inverse, current_clip, p_lights, pipeline_variants); + _render_item(draw_list, p_to_render_target, ci, fb_format, canvas_transform_inverse, current_clip, p_lights, pipeline_variants, r_sdf_used); prev_material = material; } @@ -1440,7 +1444,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p update_skeletons = false; } - _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list); + _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used); item_count = 0; if (ci->canvas_group_owner->canvas_group->mode != RS::CANVAS_GROUP_MODE_TRANSPARENT) { @@ -1472,7 +1476,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p update_skeletons = false; } - _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, true); + _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, true); item_count = 0; if (ci->canvas_group->blur_mipmaps) { @@ -1491,7 +1495,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p update_skeletons = false; } - _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list); + _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used); item_count = 0; texture_storage->render_target_copy_to_back_buffer(p_to_render_target, back_buffer_rect, backbuffer_gen_mipmaps); @@ -1517,7 +1521,7 @@ void RendererCanvasRenderRD::canvas_render_items(RID p_to_render_target, Item *p update_skeletons = false; } - _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list); + _render_items(p_to_render_target, item_count, canvas_transform_inverse, p_light_list, r_sdf_used, false); //then reset item_count = 0; } @@ -1998,10 +2002,6 @@ void RendererCanvasRenderRD::occluder_polygon_set_cull_mode(RID p_occluder, RS:: oc->cull_mode = p_mode; } -void RendererCanvasRenderRD::CanvasShaderData::set_path_hint(const String &p_path) { - path = p_path; -} - void RendererCanvasRenderRD::CanvasShaderData::set_code(const String &p_code) { //compile @@ -2213,86 +2213,6 @@ void RendererCanvasRenderRD::CanvasShaderData::set_code(const String &p_code) { valid = true; } -void RendererCanvasRenderRD::CanvasShaderData::set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) { - if (!p_texture.is_valid()) { - if (default_texture_params.has(p_name) && default_texture_params[p_name].has(p_index)) { - default_texture_params[p_name].erase(p_index); - - if (default_texture_params[p_name].is_empty()) { - default_texture_params.erase(p_name); - } - } - } else { - if (!default_texture_params.has(p_name)) { - default_texture_params[p_name] = HashMap<int, RID>(); - } - default_texture_params[p_name][p_index] = p_texture; - } -} - -void RendererCanvasRenderRD::CanvasShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { - HashMap<int, StringName> order; - - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_LOCAL || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_SCREEN_TEXTURE || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_NORMAL_ROUGHNESS_TEXTURE || - E.value.hint == ShaderLanguage::ShaderNode::Uniform::HINT_DEPTH_TEXTURE) { - // Don't expose any of these. - continue; - } - if (E.value.texture_order >= 0) { - order[E.value.texture_order + 100000] = E.key; - } else { - order[E.value.order] = E.key; - } - } - - String last_group; - for (const KeyValue<int, StringName> &E : order) { - String group = uniforms[E.value].group; - if (!uniforms[E.value].subgroup.is_empty()) { - group += "::" + uniforms[E.value].subgroup; - } - - if (group != last_group) { - PropertyInfo pi; - pi.usage = PROPERTY_USAGE_GROUP; - pi.name = group; - p_param_list->push_back(pi); - - last_group = group; - } - - PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniforms[E.value]); - pi.name = E.value; - p_param_list->push_back(pi); - } -} - -void RendererCanvasRenderRD::CanvasShaderData::get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const { - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - RendererMaterialStorage::InstanceShaderParam p; - p.info = ShaderLanguage::uniform_to_property_info(E.value); - p.info.name = E.key; //supply name - p.index = E.value.instance_index; - p.default_value = ShaderLanguage::constant_value_to_variant(E.value.default_value, E.value.type, E.value.array_size, E.value.hint); - p_param_list->push_back(p); - } -} - -bool RendererCanvasRenderRD::CanvasShaderData::is_parameter_texture(const StringName &p_param) const { - if (!uniforms.has(p_param)) { - return false; - } - - return uniforms[p_param].texture_order >= 0; -} - bool RendererCanvasRenderRD::CanvasShaderData::is_animated() const { return false; } @@ -2301,15 +2221,6 @@ bool RendererCanvasRenderRD::CanvasShaderData::casts_shadows() const { return false; } -Variant RendererCanvasRenderRD::CanvasShaderData::get_default_parameter(const StringName &p_parameter) const { - if (uniforms.has(p_parameter)) { - ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter]; - Vector<ShaderLanguage::ConstantNode::Value> default_value = uniform.default_value; - return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint); - } - return Variant(); -} - RS::ShaderNativeSourceCode RendererCanvasRenderRD::CanvasShaderData::get_native_source_code() const { RendererCanvasRenderRD *canvas_singleton = static_cast<RendererCanvasRenderRD *>(RendererCanvasRender::singleton); return canvas_singleton->shader.canvas_shader.version_get_native_source_code(version); diff --git a/servers/rendering/renderer_rd/renderer_canvas_render_rd.h b/servers/rendering/renderer_rd/renderer_canvas_render_rd.h index 3fff574098..f809c7f046 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.h +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.h @@ -160,16 +160,13 @@ class RendererCanvasRenderRD : public RendererCanvasRender { bool valid = false; RID version; PipelineVariants pipeline_variants; - String path; - HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms; Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms; Vector<uint32_t> ubo_offsets; uint32_t ubo_size = 0; String code; - HashMap<StringName, HashMap<int, RID>> default_texture_params; bool uses_screen_texture = false; bool uses_screen_texture_mipmaps = false; @@ -177,15 +174,8 @@ class RendererCanvasRenderRD : public RendererCanvasRender { bool uses_time = false; virtual void set_code(const String &p_Code); - virtual void set_path_hint(const String &p_path); - virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index); - virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; - virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; - - virtual bool is_parameter_texture(const StringName &p_param) const; virtual bool is_animated() const; virtual bool casts_shadows() const; - virtual Variant get_default_parameter(const StringName &p_parameter) const; virtual RS::ShaderNativeSourceCode get_native_source_code() const; CanvasShaderData() {} @@ -421,8 +411,8 @@ class RendererCanvasRenderRD : public RendererCanvasRender { RID _create_base_uniform_set(RID p_to_render_target, bool p_backbuffer); inline void _bind_canvas_texture(RD::DrawListID p_draw_list, RID p_texture, RS::CanvasItemTextureFilter p_base_filter, RS::CanvasItemTextureRepeat p_base_repeat, RID &r_last_texture, PushConstant &push_constant, Size2 &r_texpixel_size); //recursive, so regular inline used instead. - void _render_item(RenderingDevice::DrawListID p_draw_list, RID p_render_target, const Item *p_item, RenderingDevice::FramebufferFormatID p_framebuffer_format, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, Light *p_lights, PipelineVariants *p_pipeline_variants); - void _render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, bool p_to_backbuffer = false); + void _render_item(RenderingDevice::DrawListID p_draw_list, RID p_render_target, const Item *p_item, RenderingDevice::FramebufferFormatID p_framebuffer_format, const Transform2D &p_canvas_transform_inverse, Item *¤t_clip, Light *p_lights, PipelineVariants *p_pipeline_variants, bool &r_sdf_used); + void _render_items(RID p_to_render_target, int p_item_count, const Transform2D &p_canvas_transform_inverse, Light *p_lights, bool &r_sdf_used, bool p_to_backbuffer = false); _FORCE_INLINE_ void _update_transform_2d_to_mat2x4(const Transform2D &p_transform, float *p_mat2x4); _FORCE_INLINE_ void _update_transform_2d_to_mat2x3(const Transform2D &p_transform, float *p_mat2x3); diff --git a/servers/rendering/renderer_rd/renderer_compositor_rd.cpp b/servers/rendering/renderer_rd/renderer_compositor_rd.cpp index 3289bfb0ea..f488fd63fe 100644 --- a/servers/rendering/renderer_rd/renderer_compositor_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_compositor_rd.cpp @@ -174,13 +174,19 @@ void RendererCompositorRD::set_boot_image(const Ref<Image> &p_image, const Color texture_storage->texture_2d_initialize(texture, p_image); RID rd_texture = texture_storage->texture_get_rd_texture(texture); + RD::SamplerState sampler_state; + sampler_state.min_filter = p_use_filter ? RD::SAMPLER_FILTER_LINEAR : RD::SAMPLER_FILTER_NEAREST; + sampler_state.mag_filter = p_use_filter ? RD::SAMPLER_FILTER_LINEAR : RD::SAMPLER_FILTER_NEAREST; + sampler_state.max_lod = 0; + RID sampler = RD::get_singleton()->sampler_create(sampler_state); + RID uset; { Vector<RD::Uniform> uniforms; RD::Uniform u; u.uniform_type = RD::UNIFORM_TYPE_SAMPLER_WITH_TEXTURE; u.binding = 0; - u.append_id(blit.sampler); + u.append_id(sampler); u.append_id(rd_texture); uniforms.push_back(u); uset = RD::get_singleton()->uniform_set_create(uniforms, blit.shader.version_get_shader(blit.shader_version, BLIT_MODE_NORMAL), 0); @@ -241,6 +247,7 @@ void RendererCompositorRD::set_boot_image(const Ref<Image> &p_image, const Color RD::get_singleton()->swap_buffers(); texture_storage->texture_free(texture); + RD::get_singleton()->free(sampler); } RendererCompositorRD *RendererCompositorRD::singleton = nullptr; diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp index 0f4dda3f11..3d84d47333 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.cpp @@ -171,10 +171,6 @@ void RendererSceneRenderRD::environment_glow_set_use_bicubic_upscale(bool p_enab glow_bicubic_upscale = p_enable; } -void RendererSceneRenderRD::environment_glow_set_use_high_quality(bool p_enable) { - glow_high_quality = p_enable; -} - void RendererSceneRenderRD::environment_set_volumetric_fog_volume_size(int p_size, int p_depth) { volumetric_fog_size = p_size; volumetric_fog_depth = p_depth; @@ -599,20 +595,20 @@ void RendererSceneRenderRD::_render_buffers_post_process_and_tonemap(const Rende RID source = rb->get_internal_texture(l); RID dest = rb->get_texture_slice(RB_SCOPE_BUFFERS, RB_TEX_BLUR_1, l, i); if (can_use_storage) { - copy_effects->gaussian_glow(source, dest, vp_size, environment_get_glow_strength(p_render_data->environment), glow_high_quality, true, environment_get_glow_hdr_luminance_cap(p_render_data->environment), environment_get_exposure(p_render_data->environment), environment_get_glow_bloom(p_render_data->environment), environment_get_glow_hdr_bleed_threshold(p_render_data->environment), environment_get_glow_hdr_bleed_scale(p_render_data->environment), luminance_texture, auto_exposure_scale); + copy_effects->gaussian_glow(source, dest, vp_size, environment_get_glow_strength(p_render_data->environment), true, environment_get_glow_hdr_luminance_cap(p_render_data->environment), environment_get_exposure(p_render_data->environment), environment_get_glow_bloom(p_render_data->environment), environment_get_glow_hdr_bleed_threshold(p_render_data->environment), environment_get_glow_hdr_bleed_scale(p_render_data->environment), luminance_texture, auto_exposure_scale); } else { RID half = rb->get_texture_slice(RB_SCOPE_BUFFERS, RB_TEX_HALF_BLUR, 0, i); // we can reuse this for each view - copy_effects->gaussian_glow_raster(source, half, dest, luminance_multiplier, vp_size, environment_get_glow_strength(p_render_data->environment), glow_high_quality, true, environment_get_glow_hdr_luminance_cap(p_render_data->environment), environment_get_exposure(p_render_data->environment), environment_get_glow_bloom(p_render_data->environment), environment_get_glow_hdr_bleed_threshold(p_render_data->environment), environment_get_glow_hdr_bleed_scale(p_render_data->environment), luminance_texture, auto_exposure_scale); + copy_effects->gaussian_glow_raster(source, half, dest, luminance_multiplier, vp_size, environment_get_glow_strength(p_render_data->environment), true, environment_get_glow_hdr_luminance_cap(p_render_data->environment), environment_get_exposure(p_render_data->environment), environment_get_glow_bloom(p_render_data->environment), environment_get_glow_hdr_bleed_threshold(p_render_data->environment), environment_get_glow_hdr_bleed_scale(p_render_data->environment), luminance_texture, auto_exposure_scale); } } else { RID source = rb->get_texture_slice(RB_SCOPE_BUFFERS, RB_TEX_BLUR_1, l, i - 1); RID dest = rb->get_texture_slice(RB_SCOPE_BUFFERS, RB_TEX_BLUR_1, l, i); if (can_use_storage) { - copy_effects->gaussian_glow(source, dest, vp_size, environment_get_glow_strength(p_render_data->environment), glow_high_quality); + copy_effects->gaussian_glow(source, dest, vp_size, environment_get_glow_strength(p_render_data->environment)); } else { RID half = rb->get_texture_slice(RB_SCOPE_BUFFERS, RB_TEX_HALF_BLUR, 0, i); // we can reuse this for each view - copy_effects->gaussian_glow_raster(source, half, dest, luminance_multiplier, vp_size, environment_get_glow_strength(p_render_data->environment), glow_high_quality); + copy_effects->gaussian_glow_raster(source, half, dest, luminance_multiplier, vp_size, environment_get_glow_strength(p_render_data->environment)); } } } @@ -1401,7 +1397,6 @@ void RendererSceneRenderRD::init() { screen_space_roughness_limiter_amount = GLOBAL_GET("rendering/anti_aliasing/screen_space_roughness_limiter/amount"); screen_space_roughness_limiter_limit = GLOBAL_GET("rendering/anti_aliasing/screen_space_roughness_limiter/limit"); glow_bicubic_upscale = int(GLOBAL_GET("rendering/environment/glow/upscale_mode")) > 0; - glow_high_quality = GLOBAL_GET("rendering/environment/glow/use_high_quality"); directional_penumbra_shadow_kernel = memnew_arr(float, 128); directional_soft_shadow_kernel = memnew_arr(float, 128); @@ -1419,10 +1414,13 @@ void RendererSceneRenderRD::init() { cull_argument.set_page_pool(&cull_argument_pool); bool can_use_storage = _render_buffers_can_be_storage(); + bool can_use_vrs = is_vrs_supported(); bokeh_dof = memnew(RendererRD::BokehDOF(!can_use_storage)); copy_effects = memnew(RendererRD::CopyEffects(!can_use_storage)); tone_mapper = memnew(RendererRD::ToneMapper); - vrs = memnew(RendererRD::VRS); + if (can_use_vrs) { + vrs = memnew(RendererRD::VRS); + } if (can_use_storage) { fsr = memnew(RendererRD::FSR); } diff --git a/servers/rendering/renderer_rd/renderer_scene_render_rd.h b/servers/rendering/renderer_rd/renderer_scene_render_rd.h index 2312603829..d813d96f77 100644 --- a/servers/rendering/renderer_rd/renderer_scene_render_rd.h +++ b/servers/rendering/renderer_rd/renderer_scene_render_rd.h @@ -114,7 +114,6 @@ protected: /* ENVIRONMENT */ bool glow_bicubic_upscale = false; - bool glow_high_quality = false; bool use_physical_light_units = false; @@ -239,7 +238,6 @@ public: /* ENVIRONMENT API */ virtual void environment_glow_set_use_bicubic_upscale(bool p_enable) override; - virtual void environment_glow_set_use_high_quality(bool p_enable) override; virtual void environment_set_volumetric_fog_volume_size(int p_size, int p_depth) override; virtual void environment_set_volumetric_fog_filter_active(bool p_enable) override; diff --git a/servers/rendering/renderer_rd/shaders/effects/copy.glsl b/servers/rendering/renderer_rd/shaders/effects/copy.glsl index 5cc2ed7622..3a82861057 100644 --- a/servers/rendering/renderer_rd/shaders/effects/copy.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/copy.glsl @@ -14,8 +14,7 @@ layout(local_size_x = 8, local_size_y = 8, local_size_z = 1) in; #define FLAG_FLIP_Y (1 << 5) #define FLAG_FORCE_LUMINANCE (1 << 6) #define FLAG_COPY_ALL_SOURCE (1 << 7) -#define FLAG_HIGH_QUALITY_GLOW (1 << 8) -#define FLAG_ALPHA_TO_ONE (1 << 9) +#define FLAG_ALPHA_TO_ONE (1 << 8) layout(push_constant, std430) uniform Params { ivec4 section; @@ -93,25 +92,14 @@ void main() { #ifdef MODE_GAUSSIAN_BLUR // First pass copy texture into 16x16 local memory for every 8x8 thread block - vec2 quad_center_uv = clamp(vec2(gl_GlobalInvocationID.xy + gl_LocalInvocationID.xy - 3.5) / params.section.zw, vec2(0.5 / params.section.zw), vec2(1.0 - 1.5 / params.section.zw)); + vec2 quad_center_uv = clamp(vec2(params.section.xy + gl_GlobalInvocationID.xy + gl_LocalInvocationID.xy - 3.5) / params.section.zw, vec2(0.5 / params.section.zw), vec2(1.0 - 1.5 / params.section.zw)); uint dest_index = gl_LocalInvocationID.x * 2 + gl_LocalInvocationID.y * 2 * 16; -#ifdef MODE_GLOW - if (bool(params.flags & FLAG_HIGH_QUALITY_GLOW)) { - vec2 quad_offset_uv = clamp((vec2(gl_GlobalInvocationID.xy + gl_LocalInvocationID.xy - 3.0)) / params.section.zw, vec2(0.5 / params.section.zw), vec2(1.0 - 1.5 / params.section.zw)); - - local_cache[dest_index] = (textureLod(source_color, quad_center_uv, 0) + textureLod(source_color, quad_offset_uv, 0)) * 0.5; - local_cache[dest_index + 1] = (textureLod(source_color, quad_center_uv + vec2(1.0 / params.section.z, 0.0), 0) + textureLod(source_color, quad_offset_uv + vec2(1.0 / params.section.z, 0.0), 0)) * 0.5; - local_cache[dest_index + 16] = (textureLod(source_color, quad_center_uv + vec2(0.0, 1.0 / params.section.w), 0) + textureLod(source_color, quad_offset_uv + vec2(0.0, 1.0 / params.section.w), 0)) * 0.5; - local_cache[dest_index + 16 + 1] = (textureLod(source_color, quad_center_uv + vec2(1.0 / params.section.zw), 0) + textureLod(source_color, quad_offset_uv + vec2(1.0 / params.section.zw), 0)) * 0.5; - } else -#endif - { - local_cache[dest_index] = textureLod(source_color, quad_center_uv, 0); - local_cache[dest_index + 1] = textureLod(source_color, quad_center_uv + vec2(1.0 / params.section.z, 0.0), 0); - local_cache[dest_index + 16] = textureLod(source_color, quad_center_uv + vec2(0.0, 1.0 / params.section.w), 0); - local_cache[dest_index + 16 + 1] = textureLod(source_color, quad_center_uv + vec2(1.0 / params.section.zw), 0); - } + local_cache[dest_index] = textureLod(source_color, quad_center_uv, 0); + local_cache[dest_index + 1] = textureLod(source_color, quad_center_uv + vec2(1.0 / params.section.z, 0.0), 0); + local_cache[dest_index + 16] = textureLod(source_color, quad_center_uv + vec2(0.0, 1.0 / params.section.w), 0); + local_cache[dest_index + 16 + 1] = textureLod(source_color, quad_center_uv + vec2(1.0 / params.section.zw), 0); + #ifdef MODE_GLOW if (bool(params.flags & FLAG_GLOW_FIRST_PASS)) { // Tonemap initial samples to reduce weight of fireflies: https://graphicrants.blogspot.com/2013/12/tone-mapping.html diff --git a/servers/rendering/renderer_rd/shaders/effects/copy_to_fb.glsl b/servers/rendering/renderer_rd/shaders/effects/copy_to_fb.glsl index 46bb99794d..6137224162 100644 --- a/servers/rendering/renderer_rd/shaders/effects/copy_to_fb.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/copy_to_fb.glsl @@ -88,6 +88,7 @@ layout(push_constant, std430) uniform Params { } params; +#ifndef MODE_SET_COLOR #ifdef MULTIVIEW layout(location = 0) in vec3 uv_interp; #else @@ -106,6 +107,7 @@ layout(set = 0, binding = 0) uniform sampler2D source_color; layout(set = 1, binding = 0) uniform sampler2D source_color2; #endif /* MODE_TWO_SOURCES */ #endif /* MULTIVIEW */ +#endif /* !SET_COLOR */ layout(location = 0) out vec4 frag_color; diff --git a/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl b/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl index 9d8294a7da..631d1968b0 100644 --- a/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl +++ b/servers/rendering/renderer_rd/shaders/effects/screen_space_reflection.glsl @@ -66,6 +66,19 @@ void main() { vec4 normal_roughness = imageLoad(source_normal_roughness, ssC); vec3 normal = normal_roughness.xyz * 2.0 - 1.0; + float roughness = normal_roughness.w; + + // The roughness cutoff of 0.6 is chosen to match the roughness fadeout from GH-69828. + if (roughness > 0.6) { + // Do not compute SSR for rough materials to improve performance at the cost of + // subtle artifacting. +#ifdef MODE_ROUGH + imageStore(blur_radius_image, ssC, vec4(0.0)); +#endif + imageStore(ssr_image, ssC, vec4(0.0)); + return; + } + normal = normalize(normal); normal.y = -normal.y; //because this code reads flipped @@ -81,8 +94,6 @@ void main() { imageStore(ssr_image, ssC, vec4(0.0)); return; } - //ray_dir = normalize(view_dir - normal * dot(normal,view_dir) * 2.0); - //ray_dir = normalize(vec3(1.0, 1.0, -1.0)); //////////////// @@ -212,6 +223,9 @@ void main() { float grad = (steps_taken + 1.0) / float(params.num_steps); float initial_fade = params.curve_fade_in == 0.0 ? 1.0 : pow(clamp(grad, 0.0, 1.0), params.curve_fade_in); float fade = pow(clamp(1.0 - grad, 0.0, 1.0), params.distance_fade) * initial_fade; + // This is an ad-hoc term to fade out the SSR as roughness increases. Values used + // are meant to match the visual appearance of a ReflectionProbe. + float roughness_fade = smoothstep(0.4, 0.7, 1.0 - normal_roughness.w); final_pos = pos; vec4 final_color; @@ -220,7 +234,6 @@ void main() { // if roughness is enabled, do screen space cone tracing float blur_radius = 0.0; - float roughness = normal_roughness.w; if (roughness > 0.001) { float cone_angle = min(roughness, 0.999) * M_PI * 0.5; @@ -246,7 +259,7 @@ void main() { #endif // MODE_ROUGH - final_color = vec4(imageLoad(source_diffuse, ivec2(final_pos - 0.5)).rgb, fade * margin_blend); + final_color = vec4(imageLoad(source_diffuse, ivec2(final_pos - 0.5)).rgb, fade * margin_blend * roughness_fade); // Schlick term. float metallic = texelFetch(source_metallic, ssC << 1, 0).w; diff --git a/servers/rendering/renderer_rd/shaders/environment/gi.glsl b/servers/rendering/renderer_rd/shaders/environment/gi.glsl index ab927df678..459c4dcb1d 100644 --- a/servers/rendering/renderer_rd/shaders/environment/gi.glsl +++ b/servers/rendering/renderer_rd/shaders/environment/gi.glsl @@ -108,7 +108,9 @@ layout(set = 0, binding = 18, std140) uniform SceneData { } scene_data; +#ifdef USE_VRS layout(r8ui, set = 0, binding = 19) uniform restrict readonly uimage2D vrs_buffer; +#endif layout(push_constant, std430) uniform Params { uint max_voxel_gi_instances; @@ -661,6 +663,7 @@ void main() { ivec2 pos = ivec2(gl_GlobalInvocationID.xy); uint vrs_x, vrs_y; +#ifdef USE_VRS if (sc_use_vrs) { ivec2 vrs_pos; @@ -684,6 +687,7 @@ void main() { return; } } +#endif if (sc_half_res) { pos <<= 1; @@ -708,6 +712,7 @@ void main() { imageStore(ambient_buffer, pos, ambient_light); imageStore(reflection_buffer, pos, reflection_light); +#ifdef USE_VRS if (sc_use_vrs) { if (vrs_x > 1) { imageStore(ambient_buffer, pos + ivec2(1, 0), ambient_light); @@ -766,4 +771,5 @@ void main() { imageStore(reflection_buffer, pos + ivec2(3, 3), reflection_light); } } +#endif } diff --git a/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl b/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl index ba31b9c6dd..b30b0c8169 100644 --- a/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl +++ b/servers/rendering/renderer_rd/shaders/scene_forward_lights_inc.glsl @@ -134,7 +134,8 @@ void light_compute(vec3 N, vec3 L, vec3 V, float A, vec3 light_color, float atte #endif #if defined(LIGHT_RIM_USED) - float rim_light = pow(max(0.0, 1.0 - cNdotV), max(0.0, (1.0 - roughness) * 16.0)); + // Epsilon min to prevent pow(0, 0) singularity which results in undefined behavior. + float rim_light = pow(max(1e-4, 1.0 - cNdotV), max(0.0, (1.0 - roughness) * 16.0)); diffuse_light += rim_light * rim * mix(vec3(1.0), albedo, rim_tint) * light_color; #endif diff --git a/drivers/spirv-reflect/SCsub b/servers/rendering/renderer_rd/spirv-reflect/SCsub index 1e7b3de0e6..4c27e5bef7 100644 --- a/drivers/spirv-reflect/SCsub +++ b/servers/rendering/renderer_rd/spirv-reflect/SCsub @@ -14,4 +14,4 @@ thirdparty_sources = [thirdparty_dir + file for file in thirdparty_sources] env_thirdparty = env.Clone() env_thirdparty.disable_warnings() -env_thirdparty.add_source_files(env.drivers_sources, thirdparty_sources) +env_thirdparty.add_source_files(env.servers_sources, thirdparty_sources) diff --git a/servers/rendering/renderer_rd/storage_rd/light_storage.cpp b/servers/rendering/renderer_rd/storage_rd/light_storage.cpp index 1dd95969e6..ff882c1992 100644 --- a/servers/rendering/renderer_rd/storage_rd/light_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/light_storage.cpp @@ -1726,13 +1726,13 @@ void LightStorage::lightmap_set_textures(RID p_lightmap, RID p_light, bool p_use //erase lightmap users if (lm->light_texture.is_valid()) { - TextureStorage::Texture *t = texture_storage->get_singleton()->get_texture(lm->light_texture); + TextureStorage::Texture *t = texture_storage->get_texture(lm->light_texture); if (t) { t->lightmap_users.erase(p_lightmap); } } - TextureStorage::Texture *t = texture_storage->get_singleton()->get_texture(p_light); + TextureStorage::Texture *t = texture_storage->get_texture(p_light); lm->light_texture = p_light; lm->uses_spherical_harmonics = p_uses_spherical_haromics; diff --git a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp index 6703d8e7d0..709e4b449f 100644 --- a/servers/rendering/renderer_rd/storage_rd/material_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/material_storage.cpp @@ -928,6 +928,104 @@ _FORCE_INLINE_ static void _fill_std140_ubo_empty(ShaderLanguage::DataType type, } /////////////////////////////////////////////////////////////////////////// +// MaterialStorage::ShaderData + +void MaterialStorage::ShaderData::set_path_hint(const String &p_hint) { + path = p_hint; +} + +void MaterialStorage::ShaderData::set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) { + if (!p_texture.is_valid()) { + if (default_texture_params.has(p_name) && default_texture_params[p_name].has(p_index)) { + default_texture_params[p_name].erase(p_index); + + if (default_texture_params[p_name].is_empty()) { + default_texture_params.erase(p_name); + } + } + } else { + if (!default_texture_params.has(p_name)) { + default_texture_params[p_name] = HashMap<int, RID>(); + } + default_texture_params[p_name][p_index] = p_texture; + } +} + +Variant MaterialStorage::ShaderData::get_default_parameter(const StringName &p_parameter) const { + if (uniforms.has(p_parameter)) { + ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter]; + Vector<ShaderLanguage::ConstantNode::Value> default_value = uniform.default_value; + return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint); + } + return Variant(); +} + +void MaterialStorage::ShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { + SortArray<Pair<StringName, int>, ShaderLanguage::UniformOrderComparator> sorter; + LocalVector<Pair<StringName, int>> filtered_uniforms; + + for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { + if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_LOCAL) { + continue; + } + if (E.value.texture_order >= 0) { + filtered_uniforms.push_back(Pair<StringName, int>(E.key, E.value.texture_order + 100000)); + } else { + filtered_uniforms.push_back(Pair<StringName, int>(E.key, E.value.order)); + } + } + int uniform_count = filtered_uniforms.size(); + sorter.sort(filtered_uniforms.ptr(), uniform_count); + + String last_group; + for (int i = 0; i < uniform_count; i++) { + const StringName &uniform_name = filtered_uniforms[i].first; + const ShaderLanguage::ShaderNode::Uniform &uniform = uniforms[uniform_name]; + + String group = uniform.group; + if (!uniform.subgroup.is_empty()) { + group += "::" + uniform.subgroup; + } + + if (group != last_group) { + PropertyInfo pi; + pi.usage = PROPERTY_USAGE_GROUP; + pi.name = group; + p_param_list->push_back(pi); + + last_group = group; + } + + PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniform); + pi.name = uniform_name; + p_param_list->push_back(pi); + } +} + +void MaterialStorage::ShaderData::get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const { + for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { + if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { + continue; + } + + RendererMaterialStorage::InstanceShaderParam p; + p.info = ShaderLanguage::uniform_to_property_info(E.value); + p.info.name = E.key; //supply name + p.index = E.value.instance_index; + p.default_value = ShaderLanguage::constant_value_to_variant(E.value.default_value, E.value.type, E.value.array_size, E.value.hint); + p_param_list->push_back(p); + } +} + +bool MaterialStorage::ShaderData::is_parameter_texture(const StringName &p_param) const { + if (!uniforms.has(p_param)) { + return false; + } + + return uniforms[p_param].texture_order >= 0; +} + +/////////////////////////////////////////////////////////////////////////// // MaterialStorage::MaterialData void MaterialStorage::MaterialData::update_uniform_buffer(const HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> &p_uniforms, const uint32_t *p_uniform_offsets, const HashMap<StringName, Variant> &p_parameters, uint8_t *p_buffer, uint32_t p_buffer_size, bool p_use_linear_color) { @@ -1221,6 +1319,10 @@ void MaterialStorage::MaterialData::update_textures(const HashMap<StringName, Va roughness_detect_texture = tex; roughness_channel = RS::TextureDetectRoughnessChannel(p_texture_uniforms[i].hint - ShaderLanguage::ShaderNode::Uniform::HINT_ROUGHNESS_R); } + if (tex->render_target) { + tex->render_target->was_used = true; + render_target_cache.push_back(tex->render_target); + } #endif } if (rd_texture.is_null()) { @@ -1307,6 +1409,7 @@ bool MaterialStorage::MaterialData::update_parameters_uniform_set(const HashMap< if ((uint32_t)texture_cache.size() != tex_uniform_count || p_textures_dirty) { texture_cache.resize(tex_uniform_count); + render_target_cache.clear(); p_textures_dirty = true; //clear previous uniform set @@ -1367,6 +1470,12 @@ bool MaterialStorage::MaterialData::update_parameters_uniform_set(const HashMap< return true; } +void MaterialStorage::MaterialData::set_as_used() { + for (int i = 0; i < render_target_cache.size(); i++) { + render_target_cache[i]->was_used = true; + } +} + /////////////////////////////////////////////////////////////////////////// // MaterialStorage diff --git a/servers/rendering/renderer_rd/storage_rd/material_storage.h b/servers/rendering/renderer_rd/storage_rd/material_storage.h index a96fc847e1..989a0f7b45 100644 --- a/servers/rendering/renderer_rd/storage_rd/material_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/material_storage.h @@ -31,6 +31,8 @@ #ifndef MATERIAL_STORAGE_RD_H #define MATERIAL_STORAGE_RD_H +#include "texture_storage.h" + #include "core/math/projection.h" #include "core/templates/local_vector.h" #include "core/templates/rid_owner.h" @@ -54,24 +56,30 @@ public: }; struct ShaderData { - virtual void set_code(const String &p_Code) = 0; - virtual void set_path_hint(const String &p_hint) = 0; - virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) = 0; - virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const = 0; + String path; + HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms; + HashMap<StringName, HashMap<int, RID>> default_texture_params; - virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const = 0; - virtual bool is_parameter_texture(const StringName &p_param) const = 0; + virtual void set_path_hint(const String &p_hint); + virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index); + virtual Variant get_default_parameter(const StringName &p_parameter) const; + virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; + virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; + virtual bool is_parameter_texture(const StringName &p_param) const; + + virtual void set_code(const String &p_Code) = 0; virtual bool is_animated() const = 0; virtual bool casts_shadows() const = 0; - virtual Variant get_default_parameter(const StringName &p_parameter) const = 0; virtual RS::ShaderNativeSourceCode get_native_source_code() const { return RS::ShaderNativeSourceCode(); } virtual ~ShaderData() {} }; struct MaterialData { + Vector<RendererRD::TextureStorage::RenderTarget *> render_target_cache; void update_uniform_buffer(const HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> &p_uniforms, const uint32_t *p_uniform_offsets, const HashMap<StringName, Variant> &p_parameters, uint8_t *p_buffer, uint32_t p_buffer_size, bool p_use_linear_color); void update_textures(const HashMap<StringName, Variant> &p_parameters, const HashMap<StringName, HashMap<int, RID>> &p_default_textures, const Vector<ShaderCompiler::GeneratedCode::Texture> &p_texture_uniforms, RID *p_textures, bool p_use_linear_color); + void set_as_used(); virtual void set_render_priority(int p_priority) = 0; virtual void set_next_pass(RID p_pass) = 0; diff --git a/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp b/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp index 503a25184e..35fa3931f8 100644 --- a/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/mesh_storage.cpp @@ -434,27 +434,8 @@ void MeshStorage::mesh_add_surface(RID p_mesh, const RS::SurfaceData &p_surface) } if (mesh->surface_count == 0) { - mesh->bone_aabbs = p_surface.bone_aabbs; mesh->aabb = p_surface.aabb; } else { - if (mesh->bone_aabbs.size() < p_surface.bone_aabbs.size()) { - // ArrayMesh::_surface_set_data only allocates bone_aabbs up to max_bone - // Each surface may affect different numbers of bones. - mesh->bone_aabbs.resize(p_surface.bone_aabbs.size()); - } - for (int i = 0; i < p_surface.bone_aabbs.size(); i++) { - const AABB &bone = p_surface.bone_aabbs[i]; - if (bone.has_volume()) { - AABB &mesh_bone = mesh->bone_aabbs.write[i]; - if (mesh_bone != AABB()) { - // Already initialized, merge AABBs. - mesh_bone.merge_with(bone); - } else { - // Not yet initialized, copy the bone AABB. - mesh_bone = bone; - } - } - } mesh->aabb.merge_with(p_surface.aabb); } @@ -715,6 +696,8 @@ AABB MeshStorage::mesh_get_aabb(RID p_mesh, RID p_skeleton) { } } + mesh->aabb = aabb; + mesh->skeleton_aabb_version = skeleton->version; return aabb; } diff --git a/servers/rendering/renderer_rd/storage_rd/mesh_storage.h b/servers/rendering/renderer_rd/storage_rd/mesh_storage.h index 27c82213e4..a8feddc3b9 100644 --- a/servers/rendering/renderer_rd/storage_rd/mesh_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/mesh_storage.h @@ -138,8 +138,6 @@ private: Surface **surfaces = nullptr; uint32_t surface_count = 0; - Vector<AABB> bone_aabbs; - bool has_bone_weights = false; AABB aabb; diff --git a/servers/rendering/renderer_rd/storage_rd/particles_storage.cpp b/servers/rendering/renderer_rd/storage_rd/particles_storage.cpp index 51aa81745b..1e91982fe1 100644 --- a/servers/rendering/renderer_rd/storage_rd/particles_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/particles_storage.cpp @@ -810,6 +810,15 @@ void ParticlesStorage::_particles_process(Particles *p_particles, double p_delta //2D collision Transform2D xform = p_particles->sdf_collision_transform; //will use dotproduct manually so invert beforehand + + if (!p_particles->use_local_coords) { + Transform2D emission; + emission.columns[0] = Vector2(p_particles->emission_transform.basis.get_column(0).x, p_particles->emission_transform.basis.get_column(0).y); + emission.columns[1] = Vector2(p_particles->emission_transform.basis.get_column(1).x, p_particles->emission_transform.basis.get_column(1).y); + emission.set_origin(Vector2(p_particles->emission_transform.origin.x, p_particles->emission_transform.origin.y)); + xform = xform * emission.affine_inverse(); + } + Transform2D revert = xform.affine_inverse(); frame_params.collider_count = 1; frame_params.colliders[0].transform[0] = xform.columns[0][0]; @@ -1107,6 +1116,7 @@ void ParticlesStorage::_particles_process(Particles *p_particles, double p_delta if (m->uniform_set.is_valid() && RD::get_singleton()->uniform_set_is_valid(m->uniform_set)) { RD::get_singleton()->compute_list_bind_uniform_set(compute_list, m->uniform_set, 3); + m->set_as_used(); } RD::get_singleton()->compute_list_set_push_constant(compute_list, &push_constant, sizeof(ParticlesShader::PushConstant)); @@ -1534,9 +1544,6 @@ bool ParticlesStorage::particles_is_inactive(RID p_particles) const { /* Particles SHADER */ -void ParticlesStorage::ParticlesShaderData::set_path_hint(const String &p_path) { - path = p_path; -} void ParticlesStorage::ParticlesShaderData::set_code(const String &p_code) { ParticlesStorage *particles_storage = ParticlesStorage::get_singleton(); //compile @@ -1602,83 +1609,6 @@ void ParticlesStorage::ParticlesShaderData::set_code(const String &p_code) { valid = true; } -void ParticlesStorage::ParticlesShaderData::set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index) { - if (!p_texture.is_valid()) { - if (default_texture_params.has(p_name) && default_texture_params[p_name].has(p_index)) { - default_texture_params[p_name].erase(p_index); - - if (default_texture_params[p_name].is_empty()) { - default_texture_params.erase(p_name); - } - } - } else { - if (!default_texture_params.has(p_name)) { - default_texture_params[p_name] = HashMap<int, RID>(); - } - default_texture_params[p_name][p_index] = p_texture; - } -} - -void ParticlesStorage::ParticlesShaderData::get_shader_uniform_list(List<PropertyInfo> *p_param_list) const { - HashMap<int, StringName> order; - - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_GLOBAL || E.value.scope == ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - if (E.value.texture_order >= 0) { - order[E.value.texture_order + 100000] = E.key; - } else { - order[E.value.order] = E.key; - } - } - - String last_group; - for (const KeyValue<int, StringName> &E : order) { - String group = uniforms[E.value].group; - if (!uniforms[E.value].subgroup.is_empty()) { - group += "::" + uniforms[E.value].subgroup; - } - - if (group != last_group) { - PropertyInfo pi; - pi.usage = PROPERTY_USAGE_GROUP; - pi.name = group; - p_param_list->push_back(pi); - - last_group = group; - } - - PropertyInfo pi = ShaderLanguage::uniform_to_property_info(uniforms[E.value]); - pi.name = E.value; - p_param_list->push_back(pi); - } -} - -void ParticlesStorage::ParticlesShaderData::get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const { - for (const KeyValue<StringName, ShaderLanguage::ShaderNode::Uniform> &E : uniforms) { - if (E.value.scope != ShaderLanguage::ShaderNode::Uniform::SCOPE_INSTANCE) { - continue; - } - - RendererMaterialStorage::InstanceShaderParam p; - p.info = ShaderLanguage::uniform_to_property_info(E.value); - p.info.name = E.key; //supply name - p.index = E.value.instance_index; - p.default_value = ShaderLanguage::constant_value_to_variant(E.value.default_value, E.value.type, E.value.array_size, E.value.hint); - p_param_list->push_back(p); - } -} - -bool ParticlesStorage::ParticlesShaderData::is_parameter_texture(const StringName &p_param) const { - if (!uniforms.has(p_param)) { - return false; - } - - return uniforms[p_param].texture_order >= 0; -} - bool ParticlesStorage::ParticlesShaderData::is_animated() const { return false; } @@ -1687,15 +1617,6 @@ bool ParticlesStorage::ParticlesShaderData::casts_shadows() const { return false; } -Variant ParticlesStorage::ParticlesShaderData::get_default_parameter(const StringName &p_parameter) const { - if (uniforms.has(p_parameter)) { - ShaderLanguage::ShaderNode::Uniform uniform = uniforms[p_parameter]; - Vector<ShaderLanguage::ConstantNode::Value> default_value = uniform.default_value; - return ShaderLanguage::constant_value_to_variant(default_value, uniform.type, uniform.array_size, uniform.hint); - } - return Variant(); -} - RS::ShaderNativeSourceCode ParticlesStorage::ParticlesShaderData::get_native_source_code() const { return ParticlesStorage::get_singleton()->particles_shader.shader.version_get_native_source_code(version); } diff --git a/servers/rendering/renderer_rd/storage_rd/particles_storage.h b/servers/rendering/renderer_rd/storage_rd/particles_storage.h index 49a8444e2f..ef3299ba1e 100644 --- a/servers/rendering/renderer_rd/storage_rd/particles_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/particles_storage.h @@ -313,15 +313,12 @@ private: RID version; bool uses_collision = false; - HashMap<StringName, ShaderLanguage::ShaderNode::Uniform> uniforms; Vector<ShaderCompiler::GeneratedCode::Texture> texture_uniforms; Vector<uint32_t> ubo_offsets; uint32_t ubo_size = 0; - String path; String code; - HashMap<StringName, HashMap<int, RID>> default_texture_params; RID pipeline; @@ -331,14 +328,8 @@ private: uint32_t userdata_count = 0; virtual void set_code(const String &p_Code); - virtual void set_path_hint(const String &p_hint); - virtual void set_default_texture_parameter(const StringName &p_name, RID p_texture, int p_index); - virtual void get_shader_uniform_list(List<PropertyInfo> *p_param_list) const; - virtual void get_instance_param_list(List<RendererMaterialStorage::InstanceShaderParam> *p_param_list) const; - virtual bool is_parameter_texture(const StringName &p_param) const; virtual bool is_animated() const; virtual bool casts_shadows() const; - virtual Variant get_default_parameter(const StringName &p_parameter) const; virtual RS::ShaderNativeSourceCode get_native_source_code() const; ParticlesShaderData() {} diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp index 15c5687665..6a4359faf3 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.cpp @@ -419,11 +419,12 @@ TextureStorage::TextureStorage() { tformat.format = RD::DATA_FORMAT_R8_UINT; tformat.width = 4; tformat.height = 4; - tformat.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_CAN_UPDATE_BIT; - if (RD::get_singleton()->has_feature(RD::SUPPORTS_ATTACHMENT_VRS)) { - tformat.usage_bits |= RD::TEXTURE_USAGE_VRS_ATTACHMENT_BIT; - } + tformat.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_CAN_UPDATE_BIT | RD::TEXTURE_USAGE_VRS_ATTACHMENT_BIT; tformat.texture_type = RD::TEXTURE_TYPE_2D; + if (!RD::get_singleton()->has_feature(RD::SUPPORTS_ATTACHMENT_VRS)) { + tformat.usage_bits = RD::TEXTURE_USAGE_COLOR_ATTACHMENT_BIT | RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_STORAGE_BIT | RD::TEXTURE_USAGE_CAN_UPDATE_BIT; + tformat.format = RD::DATA_FORMAT_R8_UNORM; + } Vector<uint8_t> pv; pv.resize(4 * 4); @@ -581,6 +582,9 @@ bool TextureStorage::canvas_texture_get_uniform_set(RID p_texture, RS::CanvasIte } ct = t->canvas_texture; + if (t->render_target) { + t->render_target->was_used = true; + } } else { ct = canvas_texture_owner.get_or_null(p_texture); } @@ -611,6 +615,9 @@ bool TextureStorage::canvas_texture_get_uniform_set(RID p_texture, RS::CanvasIte } else { u.append_id(t->rd_texture); ct->size_cache = Size2i(t->width_2d, t->height_2d); + if (t->render_target) { + t->render_target->was_used = true; + } } uniforms.push_back(u); } @@ -626,6 +633,9 @@ bool TextureStorage::canvas_texture_get_uniform_set(RID p_texture, RS::CanvasIte } else { u.append_id(t->rd_texture); ct->use_normal_cache = true; + if (t->render_target) { + t->render_target->was_used = true; + } } uniforms.push_back(u); } @@ -641,6 +651,9 @@ bool TextureStorage::canvas_texture_get_uniform_set(RID p_texture, RS::CanvasIte } else { u.append_id(t->rd_texture); ct->use_specular_cache = true; + if (t->render_target) { + t->render_target->was_used = true; + } } uniforms.push_back(u); } @@ -1764,6 +1777,46 @@ Ref<Image> TextureStorage::_validate_texture_format(const Ref<Image> &p_image, T r_format.swizzle_b = RD::TEXTURE_SWIZZLE_ZERO; r_format.swizzle_a = RD::TEXTURE_SWIZZLE_ONE; } break; + case Image::FORMAT_ASTC_4x4: + case Image::FORMAT_ASTC_4x4_HDR: { + if (RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_ASTC_4x4_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_UPDATE_BIT)) { + r_format.format = RD::DATA_FORMAT_ASTC_4x4_UNORM_BLOCK; + if (p_image->get_format() == Image::FORMAT_ASTC_4x4) { + r_format.format_srgb = RD::DATA_FORMAT_ASTC_4x4_SRGB_BLOCK; + } + } else { + //not supported, reconvert + r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM; + r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB; + image->decompress(); + image->convert(Image::FORMAT_RGBA8); + } + r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R; + r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G; + r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B; + r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A; + + } break; // astc 4x4 + case Image::FORMAT_ASTC_8x8: + case Image::FORMAT_ASTC_8x8_HDR: { + if (RD::get_singleton()->texture_is_format_supported_for_usage(RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK, RD::TEXTURE_USAGE_SAMPLING_BIT | RD::TEXTURE_USAGE_CAN_UPDATE_BIT)) { + r_format.format = RD::DATA_FORMAT_ASTC_8x8_UNORM_BLOCK; + if (p_image->get_format() == Image::FORMAT_ASTC_8x8) { + r_format.format_srgb = RD::DATA_FORMAT_ASTC_8x8_SRGB_BLOCK; + } + } else { + //not supported, reconvert + r_format.format = RD::DATA_FORMAT_R8G8B8A8_UNORM; + r_format.format_srgb = RD::DATA_FORMAT_R8G8B8A8_SRGB; + image->decompress(); + image->convert(Image::FORMAT_RGBA8); + } + r_format.swizzle_r = RD::TEXTURE_SWIZZLE_R; + r_format.swizzle_g = RD::TEXTURE_SWIZZLE_G; + r_format.swizzle_b = RD::TEXTURE_SWIZZLE_B; + r_format.swizzle_a = RD::TEXTURE_SWIZZLE_A; + + } break; // astc 8x8 default: { } @@ -2398,6 +2451,10 @@ void TextureStorage::_clear_render_target(RenderTarget *rt) { rt->color = RID(); rt->color_multisample = RID(); + if (rt->texture.is_valid()) { + Texture *tex = get_texture(rt->texture); + tex->render_target = nullptr; + } } void TextureStorage::_update_render_target(RenderTarget *rt) { @@ -2478,6 +2535,7 @@ void TextureStorage::_update_render_target(RenderTarget *rt) { tex->rd_texture = RID(); tex->rd_texture_srgb = RID(); + tex->render_target = rt; //create shared textures to the color buffer, //so transparent can be supported @@ -3140,13 +3198,13 @@ void TextureStorage::render_target_copy_to_back_buffer(RID p_render_target, cons region.position.y >>= 1; region.size.x = MAX(1, region.size.x >> 1); region.size.y = MAX(1, region.size.y >> 1); + texture_size.x = MAX(1, texture_size.x >> 1); + texture_size.y = MAX(1, texture_size.y >> 1); RID mipmap = rt->backbuffer_mipmaps[i]; if (RendererSceneRenderRD::get_singleton()->_render_buffers_can_be_storage()) { - copy_effects->gaussian_blur(prev_texture, mipmap, region, true); + copy_effects->gaussian_blur(prev_texture, mipmap, region, texture_size, true); } else { - texture_size.x = MAX(1, texture_size.x >> 1); - texture_size.y = MAX(1, texture_size.y >> 1); copy_effects->gaussian_blur_raster(prev_texture, mipmap, region, texture_size); } prev_texture = mipmap; @@ -3179,7 +3237,7 @@ void TextureStorage::render_target_clear_back_buffer(RID p_render_target, const if (RendererSceneRenderRD::get_singleton()->_render_buffers_can_be_storage()) { copy_effects->set_color(rt->backbuffer_mipmap0, p_color, region, true); } else { - copy_effects->set_color(rt->backbuffer_mipmap0, p_color, region, true); + copy_effects->set_color_raster(rt->backbuffer_mipmap0, p_color, region); } } @@ -3213,14 +3271,14 @@ void TextureStorage::render_target_gen_back_buffer_mipmaps(RID p_render_target, region.position.y >>= 1; region.size.x = MAX(1, region.size.x >> 1); region.size.y = MAX(1, region.size.y >> 1); + texture_size.x = MAX(1, texture_size.x >> 1); + texture_size.y = MAX(1, texture_size.y >> 1); RID mipmap = rt->backbuffer_mipmaps[i]; if (RendererSceneRenderRD::get_singleton()->_render_buffers_can_be_storage()) { - copy_effects->gaussian_blur(prev_texture, mipmap, region, true); + copy_effects->gaussian_blur(prev_texture, mipmap, region, texture_size, true); } else { - texture_size.x = MAX(1, texture_size.x >> 1); - texture_size.y = MAX(1, texture_size.y >> 1); copy_effects->gaussian_blur_raster(prev_texture, mipmap, region, texture_size); } prev_texture = mipmap; diff --git a/servers/rendering/renderer_rd/storage_rd/texture_storage.h b/servers/rendering/renderer_rd/storage_rd/texture_storage.h index f4737eb63d..0c70d3f938 100644 --- a/servers/rendering/renderer_rd/storage_rd/texture_storage.h +++ b/servers/rendering/renderer_rd/storage_rd/texture_storage.h @@ -108,6 +108,8 @@ private: /* Texture API */ + struct RenderTarget; + class Texture { public: TextureType type; @@ -141,6 +143,7 @@ private: Vector<BufferSlice3D> buffer_slices_3d; uint32_t buffer_size_3d = 0; + RenderTarget *render_target = nullptr; bool is_render_target; bool is_proxy; diff --git a/servers/rendering/renderer_scene_cull.h b/servers/rendering/renderer_scene_cull.h index d085b84a8c..51f800381b 100644 --- a/servers/rendering/renderer_scene_cull.h +++ b/servers/rendering/renderer_scene_cull.h @@ -476,6 +476,7 @@ public: Instance *instance = (Instance *)tracker->userdata; switch (p_notification) { case Dependency::DEPENDENCY_CHANGED_SKELETON_DATA: + case Dependency::DEPENDENCY_CHANGED_SKELETON_BONES: case Dependency::DEPENDENCY_CHANGED_AABB: { singleton->_instance_queue_update(instance, true, false); @@ -491,8 +492,7 @@ public: case Dependency::DEPENDENCY_CHANGED_REFLECTION_PROBE: { singleton->_instance_queue_update(instance, true, true); } break; - case Dependency::DEPENDENCY_CHANGED_MULTIMESH_VISIBLE_INSTANCES: - case Dependency::DEPENDENCY_CHANGED_SKELETON_BONES: { + case Dependency::DEPENDENCY_CHANGED_MULTIMESH_VISIBLE_INSTANCES: { //ignored } break; case Dependency::DEPENDENCY_CHANGED_LIGHT_SOFT_SHADOW_AND_PROJECTOR: { @@ -1173,7 +1173,6 @@ public: PASS1RC(RID, environment_get_glow_map, RID) PASS1(environment_glow_set_use_bicubic_upscale, bool) - PASS1(environment_glow_set_use_high_quality, bool) // SSR PASS6(environment_set_ssr, RID, bool, int, float, float, float) diff --git a/servers/rendering/renderer_scene_render.h b/servers/rendering/renderer_scene_render.h index 2c2d5a5a9e..71f0a78ef3 100644 --- a/servers/rendering/renderer_scene_render.h +++ b/servers/rendering/renderer_scene_render.h @@ -162,7 +162,6 @@ public: RID environment_get_glow_map(RID p_env) const; virtual void environment_glow_set_use_bicubic_upscale(bool p_enable) = 0; - virtual void environment_glow_set_use_high_quality(bool p_enable) = 0; // SSR void environment_set_ssr(RID p_env, bool p_enable, int p_max_steps, float p_fade_int, float p_fade_out, float p_depth_tolerance); diff --git a/servers/rendering/rendering_device.cpp b/servers/rendering/rendering_device.cpp index 23070fb7c0..28408ddb8e 100644 --- a/servers/rendering/rendering_device.cpp +++ b/servers/rendering/rendering_device.cpp @@ -32,8 +32,18 @@ #include "rendering_device_binds.h" +#include "thirdparty/spirv-reflect/spirv_reflect.h" + RenderingDevice *RenderingDevice::singleton = nullptr; +const char *RenderingDevice::shader_stage_names[RenderingDevice::SHADER_STAGE_MAX] = { + "Vertex", + "Fragment", + "TesselationControl", + "TesselationEvaluation", + "Compute", +}; + RenderingDevice *RenderingDevice::get_singleton() { return singleton; } @@ -286,7 +296,7 @@ static Vector<RenderingDevice::PipelineSpecializationConstant> _get_spec_constan return ret; } -RID RenderingDevice::_render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const Ref<RDPipelineRasterizationState> &p_rasterization_state, const Ref<RDPipelineMultisampleState> &p_multisample_state, const Ref<RDPipelineDepthStencilState> &p_depth_stencil_state, const Ref<RDPipelineColorBlendState> &p_blend_state, int p_dynamic_state_flags, uint32_t p_for_render_pass, const TypedArray<RDPipelineSpecializationConstant> &p_specialization_constants) { +RID RenderingDevice::_render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const Ref<RDPipelineRasterizationState> &p_rasterization_state, const Ref<RDPipelineMultisampleState> &p_multisample_state, const Ref<RDPipelineDepthStencilState> &p_depth_stencil_state, const Ref<RDPipelineColorBlendState> &p_blend_state, BitField<PipelineDynamicStateFlags> p_dynamic_state_flags, uint32_t p_for_render_pass, const TypedArray<RDPipelineSpecializationConstant> &p_specialization_constants) { PipelineRasterizationState rasterization_state; if (p_rasterization_state.is_valid()) { rasterization_state = p_rasterization_state->base; @@ -368,6 +378,323 @@ void RenderingDevice::_compute_list_set_push_constant(ComputeListID p_list, cons compute_list_set_push_constant(p_list, p_data.ptr(), p_data_size); } +Error RenderingDevice::_reflect_spirv(const Vector<ShaderStageSPIRVData> &p_spirv, SpirvReflectionData &r_reflection_data) { + r_reflection_data = {}; + + for (int i = 0; i < p_spirv.size(); i++) { + ShaderStage stage = p_spirv[i].shader_stage; + ShaderStage stage_flag = (ShaderStage)(1 << p_spirv[i].shader_stage); + + if (p_spirv[i].shader_stage == SHADER_STAGE_COMPUTE) { + r_reflection_data.is_compute = true; + ERR_FAIL_COND_V_MSG(p_spirv.size() != 1, FAILED, + "Compute shaders can only receive one stage, dedicated to compute."); + } + ERR_FAIL_COND_V_MSG(r_reflection_data.stages_mask.has_flag(stage_flag), FAILED, + "Stage " + String(shader_stage_names[p_spirv[i].shader_stage]) + " submitted more than once."); + + { + SpvReflectShaderModule module; + const uint8_t *spirv = p_spirv[i].spir_v.ptr(); + SpvReflectResult result = spvReflectCreateShaderModule(p_spirv[i].spir_v.size(), spirv, &module); + ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, FAILED, + "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed parsing shader."); + + if (r_reflection_data.is_compute) { + r_reflection_data.compute_local_size[0] = module.entry_points->local_size.x; + r_reflection_data.compute_local_size[1] = module.entry_points->local_size.y; + r_reflection_data.compute_local_size[2] = module.entry_points->local_size.z; + } + uint32_t binding_count = 0; + result = spvReflectEnumerateDescriptorBindings(&module, &binding_count, nullptr); + ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, FAILED, + "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed enumerating descriptor bindings."); + + if (binding_count > 0) { + // Parse bindings. + + Vector<SpvReflectDescriptorBinding *> bindings; + bindings.resize(binding_count); + result = spvReflectEnumerateDescriptorBindings(&module, &binding_count, bindings.ptrw()); + + ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, FAILED, + "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed getting descriptor bindings."); + + for (uint32_t j = 0; j < binding_count; j++) { + const SpvReflectDescriptorBinding &binding = *bindings[j]; + + SpirvReflectionData::Uniform info{}; + + bool need_array_dimensions = false; + bool need_block_size = false; + bool may_be_writable = false; + + switch (binding.descriptor_type) { + case SPV_REFLECT_DESCRIPTOR_TYPE_SAMPLER: { + info.type = UNIFORM_TYPE_SAMPLER; + need_array_dimensions = true; + } break; + case SPV_REFLECT_DESCRIPTOR_TYPE_COMBINED_IMAGE_SAMPLER: { + info.type = UNIFORM_TYPE_SAMPLER_WITH_TEXTURE; + need_array_dimensions = true; + } break; + case SPV_REFLECT_DESCRIPTOR_TYPE_SAMPLED_IMAGE: { + info.type = UNIFORM_TYPE_TEXTURE; + need_array_dimensions = true; + } break; + case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_IMAGE: { + info.type = UNIFORM_TYPE_IMAGE; + need_array_dimensions = true; + may_be_writable = true; + } break; + case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_TEXEL_BUFFER: { + info.type = UNIFORM_TYPE_TEXTURE_BUFFER; + need_array_dimensions = true; + } break; + case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_TEXEL_BUFFER: { + info.type = UNIFORM_TYPE_IMAGE_BUFFER; + need_array_dimensions = true; + may_be_writable = true; + } break; + case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_BUFFER: { + info.type = UNIFORM_TYPE_UNIFORM_BUFFER; + need_block_size = true; + } break; + case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER: { + info.type = UNIFORM_TYPE_STORAGE_BUFFER; + need_block_size = true; + may_be_writable = true; + } break; + case SPV_REFLECT_DESCRIPTOR_TYPE_UNIFORM_BUFFER_DYNAMIC: { + ERR_PRINT("Dynamic uniform buffer not supported."); + continue; + } break; + case SPV_REFLECT_DESCRIPTOR_TYPE_STORAGE_BUFFER_DYNAMIC: { + ERR_PRINT("Dynamic storage buffer not supported."); + continue; + } break; + case SPV_REFLECT_DESCRIPTOR_TYPE_INPUT_ATTACHMENT: { + info.type = UNIFORM_TYPE_INPUT_ATTACHMENT; + need_array_dimensions = true; + } break; + case SPV_REFLECT_DESCRIPTOR_TYPE_ACCELERATION_STRUCTURE_KHR: { + ERR_PRINT("Acceleration structure not supported."); + continue; + } break; + } + + if (need_array_dimensions) { + if (binding.array.dims_count == 0) { + info.length = 1; + } else { + for (uint32_t k = 0; k < binding.array.dims_count; k++) { + if (k == 0) { + info.length = binding.array.dims[0]; + } else { + info.length *= binding.array.dims[k]; + } + } + } + + } else if (need_block_size) { + info.length = binding.block.size; + } else { + info.length = 0; + } + + if (may_be_writable) { + info.writable = !(binding.type_description->decoration_flags & SPV_REFLECT_DECORATION_NON_WRITABLE) && !(binding.block.decoration_flags & SPV_REFLECT_DECORATION_NON_WRITABLE); + } else { + info.writable = false; + } + + info.binding = binding.binding; + uint32_t set = binding.set; + + ERR_FAIL_COND_V_MSG(set >= MAX_UNIFORM_SETS, FAILED, + "On shader stage '" + String(shader_stage_names[stage]) + "', uniform '" + binding.name + "' uses a set (" + itos(set) + ") index larger than what is supported (" + itos(MAX_UNIFORM_SETS) + ")."); + + if (set < (uint32_t)r_reflection_data.uniforms.size()) { + // Check if this already exists. + bool exists = false; + for (int k = 0; k < r_reflection_data.uniforms[set].size(); k++) { + if (r_reflection_data.uniforms[set][k].binding == (uint32_t)info.binding) { + // Already exists, verify that it's the same type. + ERR_FAIL_COND_V_MSG(r_reflection_data.uniforms[set][k].type != info.type, FAILED, + "On shader stage '" + String(shader_stage_names[stage]) + "', uniform '" + binding.name + "' trying to re-use location for set=" + itos(set) + ", binding=" + itos(info.binding) + " with different uniform type."); + + // Also, verify that it's the same size. + ERR_FAIL_COND_V_MSG(r_reflection_data.uniforms[set][k].length != info.length, FAILED, + "On shader stage '" + String(shader_stage_names[stage]) + "', uniform '" + binding.name + "' trying to re-use location for set=" + itos(set) + ", binding=" + itos(info.binding) + " with different uniform size."); + + // Also, verify that it has the same writability. + ERR_FAIL_COND_V_MSG(r_reflection_data.uniforms[set][k].writable != info.writable, FAILED, + "On shader stage '" + String(shader_stage_names[stage]) + "', uniform '" + binding.name + "' trying to re-use location for set=" + itos(set) + ", binding=" + itos(info.binding) + " with different writability."); + + // Just append stage mask and return. + r_reflection_data.uniforms.write[set].write[k].stages_mask.set_flag(stage_flag); + exists = true; + break; + } + } + + if (exists) { + continue; // Merged. + } + } + + info.stages_mask.set_flag(stage_flag); + + if (set >= (uint32_t)r_reflection_data.uniforms.size()) { + r_reflection_data.uniforms.resize(set + 1); + } + + r_reflection_data.uniforms.write[set].push_back(info); + } + } + + { + // Specialization constants. + + uint32_t sc_count = 0; + result = spvReflectEnumerateSpecializationConstants(&module, &sc_count, nullptr); + ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, FAILED, + "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed enumerating specialization constants."); + + if (sc_count) { + Vector<SpvReflectSpecializationConstant *> spec_constants; + spec_constants.resize(sc_count); + + result = spvReflectEnumerateSpecializationConstants(&module, &sc_count, spec_constants.ptrw()); + ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, FAILED, + "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed obtaining specialization constants."); + + for (uint32_t j = 0; j < sc_count; j++) { + int32_t existing = -1; + SpirvReflectionData::SpecializationConstant sconst{}; + SpvReflectSpecializationConstant *spc = spec_constants[j]; + + sconst.constant_id = spc->constant_id; + sconst.int_value = 0; // Clear previous value JIC. + switch (spc->constant_type) { + case SPV_REFLECT_SPECIALIZATION_CONSTANT_BOOL: { + sconst.type = PIPELINE_SPECIALIZATION_CONSTANT_TYPE_BOOL; + sconst.bool_value = spc->default_value.int_bool_value != 0; + } break; + case SPV_REFLECT_SPECIALIZATION_CONSTANT_INT: { + sconst.type = PIPELINE_SPECIALIZATION_CONSTANT_TYPE_INT; + sconst.int_value = spc->default_value.int_bool_value; + } break; + case SPV_REFLECT_SPECIALIZATION_CONSTANT_FLOAT: { + sconst.type = PIPELINE_SPECIALIZATION_CONSTANT_TYPE_FLOAT; + sconst.float_value = spc->default_value.float_value; + } break; + } + sconst.stages_mask.set_flag(stage_flag); + + for (int k = 0; k < r_reflection_data.specialization_constants.size(); k++) { + if (r_reflection_data.specialization_constants[k].constant_id == sconst.constant_id) { + ERR_FAIL_COND_V_MSG(r_reflection_data.specialization_constants[k].type != sconst.type, FAILED, "More than one specialization constant used for id (" + itos(sconst.constant_id) + "), but their types differ."); + ERR_FAIL_COND_V_MSG(r_reflection_data.specialization_constants[k].int_value != sconst.int_value, FAILED, "More than one specialization constant used for id (" + itos(sconst.constant_id) + "), but their default values differ."); + existing = k; + break; + } + } + + if (existing > 0) { + r_reflection_data.specialization_constants.write[existing].stages_mask.set_flag(stage_flag); + } else { + r_reflection_data.specialization_constants.push_back(sconst); + } + } + } + } + + if (stage == SHADER_STAGE_VERTEX) { + uint32_t iv_count = 0; + result = spvReflectEnumerateInputVariables(&module, &iv_count, nullptr); + ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, FAILED, + "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed enumerating input variables."); + + if (iv_count) { + Vector<SpvReflectInterfaceVariable *> input_vars; + input_vars.resize(iv_count); + + result = spvReflectEnumerateInputVariables(&module, &iv_count, input_vars.ptrw()); + ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, FAILED, + "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed obtaining input variables."); + + for (uint32_t j = 0; j < iv_count; j++) { + if (input_vars[j] && input_vars[j]->decoration_flags == 0) { // Regular input. + r_reflection_data.vertex_input_mask |= (1 << uint32_t(input_vars[j]->location)); + } + } + } + } + + if (stage == SHADER_STAGE_FRAGMENT) { + uint32_t ov_count = 0; + result = spvReflectEnumerateOutputVariables(&module, &ov_count, nullptr); + ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, FAILED, + "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed enumerating output variables."); + + if (ov_count) { + Vector<SpvReflectInterfaceVariable *> output_vars; + output_vars.resize(ov_count); + + result = spvReflectEnumerateOutputVariables(&module, &ov_count, output_vars.ptrw()); + ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, FAILED, + "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed obtaining output variables."); + + for (uint32_t j = 0; j < ov_count; j++) { + const SpvReflectInterfaceVariable *refvar = output_vars[j]; + if (refvar != nullptr && refvar->built_in != SpvBuiltInFragDepth) { + r_reflection_data.fragment_output_mask |= 1 << refvar->location; + } + } + } + } + + uint32_t pc_count = 0; + result = spvReflectEnumeratePushConstantBlocks(&module, &pc_count, nullptr); + ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, FAILED, + "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed enumerating push constants."); + + if (pc_count) { + ERR_FAIL_COND_V_MSG(pc_count > 1, FAILED, + "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "': Only one push constant is supported, which should be the same across shader stages."); + + Vector<SpvReflectBlockVariable *> pconstants; + pconstants.resize(pc_count); + result = spvReflectEnumeratePushConstantBlocks(&module, &pc_count, pconstants.ptrw()); + ERR_FAIL_COND_V_MSG(result != SPV_REFLECT_RESULT_SUCCESS, FAILED, + "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "' failed obtaining push constants."); +#if 0 + if (pconstants[0] == nullptr) { + Ref<FileAccess> f = FileAccess::open("res://popo.spv", FileAccess::WRITE); + f->store_buffer((const uint8_t *)&SpirV[0], SpirV.size() * sizeof(uint32_t)); + } +#endif + + ERR_FAIL_COND_V_MSG(r_reflection_data.push_constant_size && r_reflection_data.push_constant_size != pconstants[0]->size, FAILED, + "Reflection of SPIR-V shader stage '" + String(shader_stage_names[p_spirv[i].shader_stage]) + "': Push constant block must be the same across shader stages."); + + r_reflection_data.push_constant_size = pconstants[0]->size; + r_reflection_data.push_constant_stages_mask.set_flag(stage_flag); + + //print_line("Stage: " + String(shader_stage_names[stage]) + " push constant of size=" + itos(push_constant.push_constant_size)); + } + + // Destroy the reflection data when no longer required. + spvReflectDestroyShaderModule(&module); + } + + r_reflection_data.stages_mask.set_flag(stage_flag); + } + + return OK; +} + void RenderingDevice::_bind_methods() { ClassDB::bind_method(D_METHOD("texture_create", "format", "view", "data"), &RenderingDevice::_texture_create, DEFVAL(Array())); ClassDB::bind_method(D_METHOD("texture_create_shared", "view", "with_texture"), &RenderingDevice::_texture_create_shared); @@ -806,7 +1133,7 @@ void RenderingDevice::_bind_methods() { BIND_ENUM_CONSTANT(INDEX_BUFFER_FORMAT_UINT16); BIND_ENUM_CONSTANT(INDEX_BUFFER_FORMAT_UINT32); - BIND_ENUM_CONSTANT(STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT); + BIND_BITFIELD_FLAG(STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT); BIND_ENUM_CONSTANT(UNIFORM_TYPE_SAMPLER); //for sampling only (sampler GLSL type) BIND_ENUM_CONSTANT(UNIFORM_TYPE_SAMPLER_WITH_TEXTURE); // for sampling only); but includes a texture); (samplerXX GLSL type)); first a sampler then a texture @@ -906,13 +1233,13 @@ void RenderingDevice::_bind_methods() { BIND_ENUM_CONSTANT(BLEND_OP_MAXIMUM); BIND_ENUM_CONSTANT(BLEND_OP_MAX); - BIND_ENUM_CONSTANT(DYNAMIC_STATE_LINE_WIDTH); - BIND_ENUM_CONSTANT(DYNAMIC_STATE_DEPTH_BIAS); - BIND_ENUM_CONSTANT(DYNAMIC_STATE_BLEND_CONSTANTS); - BIND_ENUM_CONSTANT(DYNAMIC_STATE_DEPTH_BOUNDS); - BIND_ENUM_CONSTANT(DYNAMIC_STATE_STENCIL_COMPARE_MASK); - BIND_ENUM_CONSTANT(DYNAMIC_STATE_STENCIL_WRITE_MASK); - BIND_ENUM_CONSTANT(DYNAMIC_STATE_STENCIL_REFERENCE); + BIND_BITFIELD_FLAG(DYNAMIC_STATE_LINE_WIDTH); + BIND_BITFIELD_FLAG(DYNAMIC_STATE_DEPTH_BIAS); + BIND_BITFIELD_FLAG(DYNAMIC_STATE_BLEND_CONSTANTS); + BIND_BITFIELD_FLAG(DYNAMIC_STATE_DEPTH_BOUNDS); + BIND_BITFIELD_FLAG(DYNAMIC_STATE_STENCIL_COMPARE_MASK); + BIND_BITFIELD_FLAG(DYNAMIC_STATE_STENCIL_WRITE_MASK); + BIND_BITFIELD_FLAG(DYNAMIC_STATE_STENCIL_REFERENCE); BIND_ENUM_CONSTANT(INITIAL_ACTION_CLEAR); //start rendering and clear the framebuffer (supply params) BIND_ENUM_CONSTANT(INITIAL_ACTION_CLEAR_REGION); //start rendering and clear the framebuffer (supply params) diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h index 0b43b73042..0adc78894a 100644 --- a/servers/rendering/rendering_device.h +++ b/servers/rendering/rendering_device.h @@ -749,11 +749,11 @@ public: }; enum StorageBufferUsage { - STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT = 1 + STORAGE_BUFFER_USAGE_DISPATCH_INDIRECT = 1, }; virtual RID uniform_buffer_create(uint32_t p_size_bytes, const Vector<uint8_t> &p_data = Vector<uint8_t>()) = 0; - virtual RID storage_buffer_create(uint32_t p_size, const Vector<uint8_t> &p_data = Vector<uint8_t>(), uint32_t p_usage = 0) = 0; + virtual RID storage_buffer_create(uint32_t p_size, const Vector<uint8_t> &p_data = Vector<uint8_t>(), BitField<StorageBufferUsage> p_usage = 0) = 0; virtual RID texture_buffer_create(uint32_t p_size_elements, DataFormat p_format, const Vector<uint8_t> &p_data = Vector<uint8_t>()) = 0; struct Uniform { @@ -1112,7 +1112,7 @@ public: }; virtual bool render_pipeline_is_valid(RID p_pipeline) = 0; - virtual RID render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const PipelineRasterizationState &p_rasterization_state, const PipelineMultisampleState &p_multisample_state, const PipelineDepthStencilState &p_depth_stencil_state, const PipelineColorBlendState &p_blend_state, int p_dynamic_state_flags = 0, uint32_t p_for_render_pass = 0, const Vector<PipelineSpecializationConstant> &p_specialization_constants = Vector<PipelineSpecializationConstant>()) = 0; + virtual RID render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const PipelineRasterizationState &p_rasterization_state, const PipelineMultisampleState &p_multisample_state, const PipelineDepthStencilState &p_depth_stencil_state, const PipelineColorBlendState &p_blend_state, BitField<PipelineDynamicStateFlags> p_dynamic_state_flags = 0, uint32_t p_for_render_pass = 0, const Vector<PipelineSpecializationConstant> &p_specialization_constants = Vector<PipelineSpecializationConstant>()) = 0; /**************************/ /**** COMPUTE PIPELINE ****/ @@ -1301,6 +1301,10 @@ public: RenderingDevice(); protected: + static const char *shader_stage_names[RenderingDevice::SHADER_STAGE_MAX]; + + static const uint32_t MAX_UNIFORM_SETS = 16; + //binders to script API RID _texture_create(const Ref<RDTextureFormat> &p_format, const Ref<RDTextureView> &p_view, const TypedArray<PackedByteArray> &p_data = Array()); RID _texture_create_shared(const Ref<RDTextureView> &p_view, RID p_with_texture); @@ -1322,13 +1326,46 @@ protected: Error _buffer_update(RID p_buffer, uint32_t p_offset, uint32_t p_size, const Vector<uint8_t> &p_data, BitField<BarrierMask> p_post_barrier = BARRIER_MASK_ALL_BARRIERS); - RID _render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const Ref<RDPipelineRasterizationState> &p_rasterization_state, const Ref<RDPipelineMultisampleState> &p_multisample_state, const Ref<RDPipelineDepthStencilState> &p_depth_stencil_state, const Ref<RDPipelineColorBlendState> &p_blend_state, int p_dynamic_state_flags, uint32_t p_for_render_pass, const TypedArray<RDPipelineSpecializationConstant> &p_specialization_constants); + RID _render_pipeline_create(RID p_shader, FramebufferFormatID p_framebuffer_format, VertexFormatID p_vertex_format, RenderPrimitive p_render_primitive, const Ref<RDPipelineRasterizationState> &p_rasterization_state, const Ref<RDPipelineMultisampleState> &p_multisample_state, const Ref<RDPipelineDepthStencilState> &p_depth_stencil_state, const Ref<RDPipelineColorBlendState> &p_blend_state, BitField<PipelineDynamicStateFlags> p_dynamic_state_flags, uint32_t p_for_render_pass, const TypedArray<RDPipelineSpecializationConstant> &p_specialization_constants); RID _compute_pipeline_create(RID p_shader, const TypedArray<RDPipelineSpecializationConstant> &p_specialization_constants); Vector<int64_t> _draw_list_begin_split(RID p_framebuffer, uint32_t p_splits, InitialAction p_initial_color_action, FinalAction p_final_color_action, InitialAction p_initial_depth_action, FinalAction p_final_depth_action, const Vector<Color> &p_clear_color_values = Vector<Color>(), float p_clear_depth = 1.0, uint32_t p_clear_stencil = 0, const Rect2 &p_region = Rect2(), const TypedArray<RID> &p_storage_textures = TypedArray<RID>()); void _draw_list_set_push_constant(DrawListID p_list, const Vector<uint8_t> &p_data, uint32_t p_data_size); void _compute_list_set_push_constant(ComputeListID p_list, const Vector<uint8_t> &p_data, uint32_t p_data_size); Vector<int64_t> _draw_list_switch_to_next_pass_split(uint32_t p_splits); + + struct SpirvReflectionData { + BitField<ShaderStage> stages_mask; + uint32_t vertex_input_mask; + uint32_t fragment_output_mask; + bool is_compute; + uint32_t compute_local_size[3]; + uint32_t push_constant_size; + BitField<ShaderStage> push_constant_stages_mask; + + struct Uniform { + UniformType type; + uint32_t binding; + BitField<ShaderStage> stages_mask; + uint32_t length; // Size of arrays (in total elements), or ubos (in bytes * total elements). + bool writable; + }; + Vector<Vector<Uniform>> uniforms; + + struct SpecializationConstant { + PipelineSpecializationConstantType type; + uint32_t constant_id; + union { + uint32_t int_value; + float float_value; + bool bool_value; + }; + BitField<ShaderStage> stages_mask; + }; + Vector<SpecializationConstant> specialization_constants; + }; + + Error _reflect_spirv(const Vector<ShaderStageSPIRVData> &p_spirv, SpirvReflectionData &r_reflection_data); }; VARIANT_ENUM_CAST(RenderingDevice::DeviceType) @@ -1348,7 +1385,7 @@ VARIANT_ENUM_CAST(RenderingDevice::SamplerRepeatMode) VARIANT_ENUM_CAST(RenderingDevice::SamplerBorderColor) VARIANT_ENUM_CAST(RenderingDevice::VertexFrequency) VARIANT_ENUM_CAST(RenderingDevice::IndexBufferFormat) -VARIANT_ENUM_CAST(RenderingDevice::StorageBufferUsage) +VARIANT_BITFIELD_CAST(RenderingDevice::StorageBufferUsage) VARIANT_ENUM_CAST(RenderingDevice::UniformType) VARIANT_ENUM_CAST(RenderingDevice::RenderPrimitive) VARIANT_ENUM_CAST(RenderingDevice::PolygonCullMode) @@ -1357,7 +1394,7 @@ VARIANT_ENUM_CAST(RenderingDevice::StencilOperation) VARIANT_ENUM_CAST(RenderingDevice::LogicOperation) VARIANT_ENUM_CAST(RenderingDevice::BlendFactor) VARIANT_ENUM_CAST(RenderingDevice::BlendOperation) -VARIANT_ENUM_CAST(RenderingDevice::PipelineDynamicStateFlags) +VARIANT_BITFIELD_CAST(RenderingDevice::PipelineDynamicStateFlags) VARIANT_ENUM_CAST(RenderingDevice::PipelineSpecializationConstantType) VARIANT_ENUM_CAST(RenderingDevice::InitialAction) VARIANT_ENUM_CAST(RenderingDevice::FinalAction) diff --git a/servers/rendering/rendering_method.h b/servers/rendering/rendering_method.h index c4d9e25ecd..51b9cb2bcf 100644 --- a/servers/rendering/rendering_method.h +++ b/servers/rendering/rendering_method.h @@ -203,7 +203,6 @@ public: virtual RID environment_get_glow_map(RID p_env) const = 0; virtual void environment_glow_set_use_bicubic_upscale(bool p_enable) = 0; - virtual void environment_glow_set_use_high_quality(bool p_enable) = 0; // SSR diff --git a/servers/rendering/rendering_server_default.h b/servers/rendering/rendering_server_default.h index b77b95bb62..3de5083a8b 100644 --- a/servers/rendering/rendering_server_default.h +++ b/servers/rendering/rendering_server_default.h @@ -698,7 +698,6 @@ public: FUNC13(environment_set_glow, RID, bool, Vector<float>, float, float, float, float, EnvironmentGlowBlendMode, float, float, float, float, RID) FUNC1(environment_glow_set_use_bicubic_upscale, bool) - FUNC1(environment_glow_set_use_high_quality, bool) FUNC4(environment_set_tonemap, RID, EnvironmentToneMapper, float, float) @@ -851,7 +850,7 @@ public: FUNC4(canvas_item_add_circle, RID, const Point2 &, float, const Color &) FUNC6(canvas_item_add_texture_rect, RID, const Rect2 &, RID, bool, const Color &, bool) FUNC7(canvas_item_add_texture_rect_region, RID, const Rect2 &, RID, const Rect2 &, const Color &, bool, bool) - FUNC7(canvas_item_add_msdf_texture_rect_region, RID, const Rect2 &, RID, const Rect2 &, const Color &, int, float) + FUNC8(canvas_item_add_msdf_texture_rect_region, RID, const Rect2 &, RID, const Rect2 &, const Color &, int, float, float) FUNC5(canvas_item_add_lcd_texture_rect_region, RID, const Rect2 &, RID, const Rect2 &, const Color &) FUNC10(canvas_item_add_nine_patch, RID, const Rect2 &, const Rect2 &, RID, const Vector2 &, const Vector2 &, NinePatchAxisMode, NinePatchAxisMode, bool, const Color &) FUNC6(canvas_item_add_primitive, RID, const Vector<Point2> &, const Vector<Color> &, const Vector<Point2> &, RID, float) diff --git a/servers/rendering/shader_compiler.cpp b/servers/rendering/shader_compiler.cpp index 7ccf3af6eb..3604756fd8 100644 --- a/servers/rendering/shader_compiler.cpp +++ b/servers/rendering/shader_compiler.cpp @@ -1287,7 +1287,7 @@ String ShaderCompiler::_dump_node_code(const SL::Node *p_node, int p_level, Gene } code += ")"; if (is_screen_texture && actions.apply_luminance_multiplier) { - code = "(" + code + " / vec4(vec3(sc_luminance_multiplier), 1.0))"; + code = "(" + code + " * vec4(vec3(sc_luminance_multiplier), 1.0))"; } } break; case SL::OP_INDEX: { diff --git a/servers/rendering/shader_language.cpp b/servers/rendering/shader_language.cpp index e451fb35c2..512995dd83 100644 --- a/servers/rendering/shader_language.cpp +++ b/servers/rendering/shader_language.cpp @@ -4417,7 +4417,7 @@ bool ShaderLanguage::_is_operator_assign(Operator p_op) const { } bool ShaderLanguage::_validate_varying_assign(ShaderNode::Varying &p_varying, String *r_message) { - if (current_function != String("vertex") && current_function != String("fragment")) { + if (current_function != "vertex" && current_function != "fragment") { *r_message = vformat(RTR("Varying may not be assigned in the '%s' function."), current_function); return false; } diff --git a/servers/rendering/shader_language.h b/servers/rendering/shader_language.h index 2534d1f252..9c3cc9c5cd 100644 --- a/servers/rendering/shader_language.h +++ b/servers/rendering/shader_language.h @@ -720,6 +720,12 @@ public: Node(TYPE_SHADER) {} }; + struct UniformOrderComparator { + _FORCE_INLINE_ bool operator()(const Pair<StringName, int> &A, const Pair<StringName, int> &B) const { + return A.second < B.second; + } + }; + struct Expression { bool is_op; union { diff --git a/servers/rendering/storage/environment_storage.cpp b/servers/rendering/storage/environment_storage.cpp index 9b1842f1d9..78ce4eb4d0 100644 --- a/servers/rendering/storage/environment_storage.cpp +++ b/servers/rendering/storage/environment_storage.cpp @@ -283,7 +283,7 @@ void RendererEnvironmentStorage::environment_set_volumetric_fog(RID p_env, bool env->volumetric_fog_scattering = p_albedo; env->volumetric_fog_emission = p_emission; env->volumetric_fog_emission_energy = p_emission_energy; - env->volumetric_fog_anisotropy = p_anisotropy, + env->volumetric_fog_anisotropy = p_anisotropy; env->volumetric_fog_length = p_length; env->volumetric_fog_detail_spread = p_detail_spread; env->volumetric_fog_gi_inject = p_gi_inject; diff --git a/servers/rendering_server.cpp b/servers/rendering_server.cpp index 9551b983fc..49af56830a 100644 --- a/servers/rendering_server.cpp +++ b/servers/rendering_server.cpp @@ -2353,7 +2353,6 @@ void RenderingServer::_bind_methods() { ClassDB::bind_method(D_METHOD("environment_set_volumetric_fog", "env", "enable", "density", "albedo", "emission", "emission_energy", "anisotropy", "length", "p_detail_spread", "gi_inject", "temporal_reprojection", "temporal_reprojection_amount", "ambient_inject", "sky_affect"), &RenderingServer::environment_set_volumetric_fog); ClassDB::bind_method(D_METHOD("environment_glow_set_use_bicubic_upscale", "enable"), &RenderingServer::environment_glow_set_use_bicubic_upscale); - ClassDB::bind_method(D_METHOD("environment_glow_set_use_high_quality", "enable"), &RenderingServer::environment_glow_set_use_high_quality); ClassDB::bind_method(D_METHOD("environment_set_ssr_roughness_quality", "quality"), &RenderingServer::environment_set_ssr_roughness_quality); ClassDB::bind_method(D_METHOD("environment_set_ssao_quality", "quality", "half_size", "adaptive_target", "blur_passes", "fadeout_from", "fadeout_to"), &RenderingServer::environment_set_ssao_quality); ClassDB::bind_method(D_METHOD("environment_set_ssil_quality", "quality", "half_size", "adaptive_target", "blur_passes", "fadeout_from", "fadeout_to"), &RenderingServer::environment_set_ssil_quality); @@ -2597,7 +2596,7 @@ void RenderingServer::_bind_methods() { ClassDB::bind_method(D_METHOD("canvas_item_add_rect", "item", "rect", "color"), &RenderingServer::canvas_item_add_rect); ClassDB::bind_method(D_METHOD("canvas_item_add_circle", "item", "pos", "radius", "color"), &RenderingServer::canvas_item_add_circle); ClassDB::bind_method(D_METHOD("canvas_item_add_texture_rect", "item", "rect", "texture", "tile", "modulate", "transpose"), &RenderingServer::canvas_item_add_texture_rect, DEFVAL(false), DEFVAL(Color(1, 1, 1)), DEFVAL(false)); - ClassDB::bind_method(D_METHOD("canvas_item_add_msdf_texture_rect_region", "item", "rect", "texture", "src_rect", "modulate", "outline_size", "px_range"), &RenderingServer::canvas_item_add_msdf_texture_rect_region, DEFVAL(Color(1, 1, 1)), DEFVAL(0), DEFVAL(1.0)); + ClassDB::bind_method(D_METHOD("canvas_item_add_msdf_texture_rect_region", "item", "rect", "texture", "src_rect", "modulate", "outline_size", "px_range", "scale"), &RenderingServer::canvas_item_add_msdf_texture_rect_region, DEFVAL(Color(1, 1, 1)), DEFVAL(0), DEFVAL(1.0), DEFVAL(1.0)); ClassDB::bind_method(D_METHOD("canvas_item_add_lcd_texture_rect_region", "item", "rect", "texture", "src_rect", "modulate"), &RenderingServer::canvas_item_add_lcd_texture_rect_region); ClassDB::bind_method(D_METHOD("canvas_item_add_texture_rect_region", "item", "rect", "texture", "src_rect", "modulate", "transpose", "clip_uv"), &RenderingServer::canvas_item_add_texture_rect_region, DEFVAL(Color(1, 1, 1)), DEFVAL(false), DEFVAL(true)); ClassDB::bind_method(D_METHOD("canvas_item_add_nine_patch", "item", "rect", "source", "texture", "topleft", "bottomright", "x_axis_mode", "y_axis_mode", "draw_center", "modulate"), &RenderingServer::canvas_item_add_nine_patch, DEFVAL(NINE_PATCH_STRETCH), DEFVAL(NINE_PATCH_STRETCH), DEFVAL(true), DEFVAL(Color(1, 1, 1))); @@ -2987,7 +2986,6 @@ void RenderingServer::init() { GLOBAL_DEF("rendering/environment/glow/upscale_mode", 1); ProjectSettings::get_singleton()->set_custom_property_info("rendering/environment/glow/upscale_mode", PropertyInfo(Variant::INT, "rendering/environment/glow/upscale_mode", PROPERTY_HINT_ENUM, "Linear (Fast),Bicubic (Slow)")); GLOBAL_DEF("rendering/environment/glow/upscale_mode.mobile", 0); - GLOBAL_DEF("rendering/environment/glow/use_high_quality", false); GLOBAL_DEF("rendering/environment/screen_space_reflection/roughness_quality", 1); ProjectSettings::get_singleton()->set_custom_property_info("rendering/environment/screen_space_reflection/roughness_quality", PropertyInfo(Variant::INT, "rendering/environment/screen_space_reflection/roughness_quality", PROPERTY_HINT_ENUM, "Disabled (Fastest),Low (Fast),Medium (Average),High (Slow)")); diff --git a/servers/rendering_server.h b/servers/rendering_server.h index 1d364dfcff..5bdbf33c28 100644 --- a/servers/rendering_server.h +++ b/servers/rendering_server.h @@ -1038,7 +1038,6 @@ public: virtual void environment_set_glow(RID p_env, bool p_enable, Vector<float> p_levels, float p_intensity, float p_strength, float p_mix, float p_bloom_threshold, EnvironmentGlowBlendMode p_blend_mode, float p_hdr_bleed_threshold, float p_hdr_bleed_scale, float p_hdr_luminance_cap, float p_glow_map_strength, RID p_glow_map) = 0; virtual void environment_glow_set_use_bicubic_upscale(bool p_enable) = 0; - virtual void environment_glow_set_use_high_quality(bool p_enable) = 0; enum EnvironmentToneMapper { ENV_TONE_MAPPER_LINEAR, @@ -1340,7 +1339,7 @@ public: virtual void canvas_item_add_circle(RID p_item, const Point2 &p_pos, float p_radius, const Color &p_color) = 0; virtual void canvas_item_add_texture_rect(RID p_item, const Rect2 &p_rect, RID p_texture, bool p_tile = false, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false) = 0; virtual void canvas_item_add_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), bool p_transpose = false, bool p_clip_uv = false) = 0; - virtual void canvas_item_add_msdf_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, float p_px_range = 1.0) = 0; + virtual void canvas_item_add_msdf_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1), int p_outline_size = 0, float p_px_range = 1.0, float p_scale = 1.0) = 0; virtual void canvas_item_add_lcd_texture_rect_region(RID p_item, const Rect2 &p_rect, RID p_texture, const Rect2 &p_src_rect, const Color &p_modulate = Color(1, 1, 1)) = 0; virtual void canvas_item_add_nine_patch(RID p_item, const Rect2 &p_rect, const Rect2 &p_source, RID p_texture, const Vector2 &p_topleft, const Vector2 &p_bottomright, NinePatchAxisMode p_x_axis_mode = NINE_PATCH_STRETCH, NinePatchAxisMode p_y_axis_mode = NINE_PATCH_STRETCH, bool p_draw_center = true, const Color &p_modulate = Color(1, 1, 1)) = 0; virtual void canvas_item_add_primitive(RID p_item, const Vector<Point2> &p_points, const Vector<Color> &p_colors, const Vector<Point2> &p_uvs, RID p_texture, float p_width = 1.0) = 0; diff --git a/servers/text/text_server_extension.cpp b/servers/text/text_server_extension.cpp index 64e8b1b5f7..4baa1db9bf 100644 --- a/servers/text/text_server_extension.cpp +++ b/servers/text/text_server_extension.cpp @@ -240,8 +240,8 @@ void TextServerExtension::_bind_methods() { GDVIRTUAL_BIND(_shaped_text_get_spacing, "shaped", "spacing"); GDVIRTUAL_BIND(_shaped_text_add_string, "shaped", "text", "fonts", "size", "opentype_features", "language", "meta"); - GDVIRTUAL_BIND(_shaped_text_add_object, "shaped", "key", "size", "inline_align", "length"); - GDVIRTUAL_BIND(_shaped_text_resize_object, "shaped", "key", "size", "inline_align"); + GDVIRTUAL_BIND(_shaped_text_add_object, "shaped", "key", "size", "inline_align", "length", "baseline"); + GDVIRTUAL_BIND(_shaped_text_resize_object, "shaped", "key", "size", "inline_align", "baseline"); GDVIRTUAL_BIND(_shaped_get_span_count, "shaped"); GDVIRTUAL_BIND(_shaped_get_span_meta, "shaped", "index"); @@ -308,7 +308,7 @@ void TextServerExtension::_bind_methods() { GDVIRTUAL_BIND(_strip_diacritics, "string"); GDVIRTUAL_BIND(_is_valid_identifier, "string"); - GDVIRTUAL_BIND(_string_get_word_breaks, "string", "language"); + GDVIRTUAL_BIND(_string_get_word_breaks, "string", "language", "chars_per_line"); GDVIRTUAL_BIND(_is_confusable, "string", "dict"); GDVIRTUAL_BIND(_spoof_check, "string"); @@ -1041,15 +1041,15 @@ bool TextServerExtension::shaped_text_add_string(const RID &p_shaped, const Stri return ret; } -bool TextServerExtension::shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length) { +bool TextServerExtension::shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, int64_t p_length, float p_baseline) { bool ret = false; - GDVIRTUAL_CALL(_shaped_text_add_object, p_shaped, p_key, p_size, p_inline_align, p_length, ret); + GDVIRTUAL_CALL(_shaped_text_add_object, p_shaped, p_key, p_size, p_inline_align, p_length, p_baseline, ret); return ret; } -bool TextServerExtension::shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align) { +bool TextServerExtension::shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align, float p_baseline) { bool ret = false; - GDVIRTUAL_CALL(_shaped_text_resize_object, p_shaped, p_key, p_size, p_inline_align, ret); + GDVIRTUAL_CALL(_shaped_text_resize_object, p_shaped, p_key, p_size, p_inline_align, p_baseline, ret); return ret; } @@ -1118,13 +1118,13 @@ bool TextServerExtension::shaped_text_is_ready(const RID &p_shaped) const { } const Glyph *TextServerExtension::shaped_text_get_glyphs(const RID &p_shaped) const { - GDNativeConstPtr<const Glyph> ret; + GDExtensionConstPtr<const Glyph> ret; GDVIRTUAL_CALL(_shaped_text_get_glyphs, p_shaped, ret); return ret; } const Glyph *TextServerExtension::shaped_text_sort_logical(const RID &p_shaped) { - GDNativeConstPtr<const Glyph> ret; + GDExtensionConstPtr<const Glyph> ret; GDVIRTUAL_CALL(_shaped_text_sort_logical, p_shaped, ret); return ret; } @@ -1178,7 +1178,7 @@ int64_t TextServerExtension::shaped_text_get_ellipsis_pos(const RID &p_shaped) c } const Glyph *TextServerExtension::shaped_text_get_ellipsis_glyphs(const RID &p_shaped) const { - GDNativeConstPtr<const Glyph> ret; + GDExtensionConstPtr<const Glyph> ret; GDVIRTUAL_CALL(_shaped_text_get_ellipsis_glyphs, p_shaped, ret); return ret; } @@ -1379,9 +1379,9 @@ TypedArray<Vector2i> TextServerExtension::parse_structured_text(StructuredTextPa return ret; } -PackedInt32Array TextServerExtension::string_get_word_breaks(const String &p_string, const String &p_language) const { +PackedInt32Array TextServerExtension::string_get_word_breaks(const String &p_string, const String &p_language, int p_chars_per_line) const { PackedInt32Array ret; - GDVIRTUAL_CALL(_string_get_word_breaks, p_string, p_language, ret); + GDVIRTUAL_CALL(_string_get_word_breaks, p_string, p_language, p_chars_per_line, ret); return ret; } diff --git a/servers/text/text_server_extension.h b/servers/text/text_server_extension.h index 46ed43e9c8..551e4e9087 100644 --- a/servers/text/text_server_extension.h +++ b/servers/text/text_server_extension.h @@ -84,7 +84,7 @@ public: virtual void font_set_data(const RID &p_font_rid, const PackedByteArray &p_data) override; virtual void font_set_data_ptr(const RID &p_font_rid, const uint8_t *p_data_ptr, int64_t p_data_size) override; GDVIRTUAL2(_font_set_data, RID, const PackedByteArray &); - GDVIRTUAL3(_font_set_data_ptr, RID, GDNativeConstPtr<const uint8_t>, int64_t); + GDVIRTUAL3(_font_set_data_ptr, RID, GDExtensionConstPtr<const uint8_t>, int64_t); virtual void font_set_face_index(const RID &p_font_rid, int64_t p_index) override; virtual int64_t font_get_face_index(const RID &p_font_rid) const override; @@ -395,11 +395,11 @@ public: GDVIRTUAL2RC(int64_t, _shaped_text_get_spacing, RID, SpacingType); virtual bool shaped_text_add_string(const RID &p_shaped, const String &p_text, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features = Dictionary(), const String &p_language = "", const Variant &p_meta = Variant()) override; - virtual bool shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int64_t p_length = 1) override; - virtual bool shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER) override; + virtual bool shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int64_t p_length = 1, float p_baseline = 0.0) override; + virtual bool shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, float p_baseline = 0.0) override; GDVIRTUAL7R(bool, _shaped_text_add_string, RID, const String &, const TypedArray<RID> &, int64_t, const Dictionary &, const String &, const Variant &); - GDVIRTUAL5R(bool, _shaped_text_add_object, RID, const Variant &, const Size2 &, InlineAlignment, int64_t); - GDVIRTUAL4R(bool, _shaped_text_resize_object, RID, const Variant &, const Size2 &, InlineAlignment); + GDVIRTUAL6R(bool, _shaped_text_add_object, RID, const Variant &, const Size2 &, InlineAlignment, int64_t, float); + GDVIRTUAL5R(bool, _shaped_text_resize_object, RID, const Variant &, const Size2 &, InlineAlignment, float); virtual int64_t shaped_get_span_count(const RID &p_shaped) const override; virtual Variant shaped_get_span_meta(const RID &p_shaped, int64_t p_index) const override; @@ -431,8 +431,8 @@ public: virtual const Glyph *shaped_text_get_glyphs(const RID &p_shaped) const override; virtual const Glyph *shaped_text_sort_logical(const RID &p_shaped) override; virtual int64_t shaped_text_get_glyph_count(const RID &p_shaped) const override; - GDVIRTUAL1RC(GDNativeConstPtr<const Glyph>, _shaped_text_get_glyphs, RID); - GDVIRTUAL1R(GDNativeConstPtr<const Glyph>, _shaped_text_sort_logical, RID); + GDVIRTUAL1RC(GDExtensionConstPtr<const Glyph>, _shaped_text_get_glyphs, RID); + GDVIRTUAL1R(GDExtensionConstPtr<const Glyph>, _shaped_text_sort_logical, RID); GDVIRTUAL1RC(int64_t, _shaped_text_get_glyph_count, RID); virtual Vector2i shaped_text_get_range(const RID &p_shaped) const override; @@ -451,7 +451,7 @@ public: virtual int64_t shaped_text_get_ellipsis_glyph_count(const RID &p_shaped) const override; GDVIRTUAL1RC(int64_t, _shaped_text_get_trim_pos, RID); GDVIRTUAL1RC(int64_t, _shaped_text_get_ellipsis_pos, RID); - GDVIRTUAL1RC(GDNativeConstPtr<const Glyph>, _shaped_text_get_ellipsis_glyphs, RID); + GDVIRTUAL1RC(GDExtensionConstPtr<const Glyph>, _shaped_text_get_ellipsis_glyphs, RID); GDVIRTUAL1RC(int64_t, _shaped_text_get_ellipsis_glyph_count, RID); virtual void shaped_text_overrun_trim_to_width(const RID &p_shaped, double p_width, BitField<TextServer::TextOverrunFlag> p_trim_flags) override; @@ -480,7 +480,7 @@ public: virtual CaretInfo shaped_text_get_carets(const RID &p_shaped, int64_t p_position) const override; virtual Vector<Vector2> shaped_text_get_selection(const RID &p_shaped, int64_t p_start, int64_t p_end) const override; - GDVIRTUAL3C(_shaped_text_get_carets, RID, int64_t, GDNativePtr<CaretInfo>); + GDVIRTUAL3C(_shaped_text_get_carets, RID, int64_t, GDExtensionPtr<CaretInfo>); GDVIRTUAL3RC(Vector<Vector2>, _shaped_text_get_selection, RID, int64_t, int64_t); virtual int64_t shaped_text_hit_test_grapheme(const RID &p_shaped, double p_coords) const override; @@ -510,8 +510,8 @@ public: virtual String strip_diacritics(const String &p_string) const override; GDVIRTUAL1RC(String, _strip_diacritics, const String &); - virtual PackedInt32Array string_get_word_breaks(const String &p_string, const String &p_language = "") const override; - GDVIRTUAL2RC(PackedInt32Array, _string_get_word_breaks, const String &, const String &); + virtual PackedInt32Array string_get_word_breaks(const String &p_string, const String &p_language = "", int p_chars_per_line = 0) const override; + GDVIRTUAL3RC(PackedInt32Array, _string_get_word_breaks, const String &, const String &, int); virtual bool is_valid_identifier(const String &p_string) const override; GDVIRTUAL1RC(bool, _is_valid_identifier, const String &); diff --git a/servers/text_server.cpp b/servers/text_server.cpp index 1b9cd28cfb..c0f235fe50 100644 --- a/servers/text_server.cpp +++ b/servers/text_server.cpp @@ -394,8 +394,8 @@ void TextServer::_bind_methods() { ClassDB::bind_method(D_METHOD("shaped_text_get_spacing", "shaped", "spacing"), &TextServer::shaped_text_get_spacing); ClassDB::bind_method(D_METHOD("shaped_text_add_string", "shaped", "text", "fonts", "size", "opentype_features", "language", "meta"), &TextServer::shaped_text_add_string, DEFVAL(Dictionary()), DEFVAL(""), DEFVAL(Variant())); - ClassDB::bind_method(D_METHOD("shaped_text_add_object", "shaped", "key", "size", "inline_align", "length"), &TextServer::shaped_text_add_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(1)); - ClassDB::bind_method(D_METHOD("shaped_text_resize_object", "shaped", "key", "size", "inline_align"), &TextServer::shaped_text_resize_object, DEFVAL(INLINE_ALIGNMENT_CENTER)); + ClassDB::bind_method(D_METHOD("shaped_text_add_object", "shaped", "key", "size", "inline_align", "length", "baseline"), &TextServer::shaped_text_add_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(1), DEFVAL(0.0)); + ClassDB::bind_method(D_METHOD("shaped_text_resize_object", "shaped", "key", "size", "inline_align", "baseline"), &TextServer::shaped_text_resize_object, DEFVAL(INLINE_ALIGNMENT_CENTER), DEFVAL(0.0)); ClassDB::bind_method(D_METHOD("shaped_get_span_count", "shaped"), &TextServer::shaped_get_span_count); ClassDB::bind_method(D_METHOD("shaped_get_span_meta", "shaped", "index"), &TextServer::shaped_get_span_meta); @@ -454,7 +454,7 @@ void TextServer::_bind_methods() { ClassDB::bind_method(D_METHOD("parse_number", "number", "language"), &TextServer::parse_number, DEFVAL("")); ClassDB::bind_method(D_METHOD("percent_sign", "language"), &TextServer::percent_sign, DEFVAL("")); - ClassDB::bind_method(D_METHOD("string_get_word_breaks", "string", "language"), &TextServer::string_get_word_breaks, DEFVAL("")); + ClassDB::bind_method(D_METHOD("string_get_word_breaks", "string", "language", "chars_per_line"), &TextServer::string_get_word_breaks, DEFVAL(""), DEFVAL(0)); ClassDB::bind_method(D_METHOD("is_confusable", "string", "dict"), &TextServer::is_confusable); ClassDB::bind_method(D_METHOD("spoof_check", "string"), &TextServer::spoof_check); diff --git a/servers/text_server.h b/servers/text_server.h index 5da38a627a..0d94f45b79 100644 --- a/servers/text_server.h +++ b/servers/text_server.h @@ -420,8 +420,8 @@ public: virtual int64_t shaped_text_get_spacing(const RID &p_shaped, SpacingType p_spacing) const = 0; virtual bool shaped_text_add_string(const RID &p_shaped, const String &p_text, const TypedArray<RID> &p_fonts, int64_t p_size, const Dictionary &p_opentype_features = Dictionary(), const String &p_language = "", const Variant &p_meta = Variant()) = 0; - virtual bool shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int64_t p_length = 1) = 0; - virtual bool shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER) = 0; + virtual bool shaped_text_add_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, int64_t p_length = 1, float p_baseline = 0.0) = 0; + virtual bool shaped_text_resize_object(const RID &p_shaped, const Variant &p_key, const Size2 &p_size, InlineAlignment p_inline_align = INLINE_ALIGNMENT_CENTER, float p_baseline = 0.0) = 0; virtual int64_t shaped_get_span_count(const RID &p_shaped) const = 0; virtual Variant shaped_get_span_meta(const RID &p_shaped, int64_t p_index) const = 0; @@ -493,7 +493,7 @@ public: virtual String percent_sign(const String &p_language = "") const = 0; // String functions. - virtual PackedInt32Array string_get_word_breaks(const String &p_string, const String &p_language = "") const = 0; + virtual PackedInt32Array string_get_word_breaks(const String &p_string, const String &p_language = "", int p_chars_per_line = 0) const = 0; virtual int64_t is_confusable(const String &p_string, const PackedStringArray &p_dict) const { return -1; }; virtual bool spoof_check(const String &p_string) const { return false; }; diff --git a/tests/core/variant/test_dictionary.h b/tests/core/variant/test_dictionary.h index c98434d42c..0c87f11ed7 100644 --- a/tests/core/variant/test_dictionary.h +++ b/tests/core/variant/test_dictionary.h @@ -64,6 +64,19 @@ TEST_CASE("[Dictionary] Assignment using bracket notation ([])") { map["World!"] = 4; CHECK(int(map["World!"]) == 4); + map[StringName("HelloName")] = 6; + CHECK(int(map[StringName("HelloName")]) == 6); + // Check that StringName key is converted to String. + CHECK(int(map.find_key(6).get_type()) == Variant::STRING); + map[StringName("HelloName")] = 7; + CHECK(int(map[StringName("HelloName")]) == 7); + + // Test String and StringName are equivalent. + map[StringName("Hello")] = 8; + CHECK(int(map["Hello"]) == 8); + map["Hello"] = 9; + CHECK(int(map[StringName("Hello")]) == 9); + // Test non-string keys, since keys can be of any Variant type. map[12345] = -5; CHECK(int(map[12345]) == -5); diff --git a/tests/scene/test_arraymesh.h b/tests/scene/test_arraymesh.h index fc23adcd06..a11916fbd0 100644 --- a/tests/scene/test_arraymesh.h +++ b/tests/scene/test_arraymesh.h @@ -82,7 +82,9 @@ TEST_CASE("[SceneTree][ArrayMesh] Adding and modifying blendshapes.") { cylinder->create_mesh_array(cylinder_array, 3.f, 3.f, 5.f); mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, cylinder_array); + ERR_PRINT_OFF mesh->add_blend_shape(name_a); + ERR_PRINT_ON CHECK(mesh->get_blend_shape_count() == 0); } @@ -121,7 +123,9 @@ TEST_CASE("[SceneTree][ArrayMesh] Adding and modifying blendshapes.") { cylinder->create_mesh_array(cylinder_array, 3.f, 3.f, 5.f); mesh->add_surface_from_arrays(Mesh::PRIMITIVE_TRIANGLES, cylinder_array); + ERR_PRINT_OFF mesh->clear_blend_shapes(); + ERR_PRINT_ON CHECK(mesh->get_blend_shape_count() == 2); } diff --git a/tests/scene/test_bit_map.h b/tests/scene/test_bit_map.h index dc47bd7863..a8ee7505ec 100644 --- a/tests/scene/test_bit_map.h +++ b/tests/scene/test_bit_map.h @@ -49,6 +49,8 @@ TEST_CASE("[BitMap] Create bit map") { CHECK(bit_map.get_size() == Size2i(256, 512)); CHECK_MESSAGE(bit_map.get_true_bit_count() == 0, "This will go through the entire bitmask inside of bitmap, thus hopefully checking if the bitmask was correctly set up."); + ERR_PRINT_OFF + dim = Size2i(0, 256); bit_map.create(dim); CHECK_MESSAGE(bit_map.get_size() == Size2i(256, 512), "We should still have the same dimensions as before, because the new dimension is invalid."); @@ -60,6 +62,8 @@ TEST_CASE("[BitMap] Create bit map") { dim = Size2i(46341, 46341); bit_map.create(dim); CHECK_MESSAGE(bit_map.get_size() == Size2i(256, 512), "We should still have the same dimensions as before, because the new dimension is too large (46341*46341=2147488281)."); + + ERR_PRINT_ON } TEST_CASE("[BitMap] Create bit map from image alpha") { @@ -67,6 +71,8 @@ TEST_CASE("[BitMap] Create bit map from image alpha") { BitMap bit_map{}; bit_map.create(dim); + ERR_PRINT_OFF + const Ref<Image> null_img = nullptr; bit_map.create_from_image_alpha(null_img); CHECK_MESSAGE(bit_map.get_size() == Size2i(256, 256), "Bitmap should have its old values because bitmap creation from a nullptr should fail."); @@ -80,6 +86,8 @@ TEST_CASE("[BitMap] Create bit map from image alpha") { bit_map.create_from_image_alpha(wrong_format_img); CHECK_MESSAGE(bit_map.get_size() == Size2i(256, 256), "Bitmap should have its old values because converting from a compressed image should fail."); + ERR_PRINT_ON + Ref<Image> img = Image::create_empty(3, 3, false, Image::Format::FORMAT_RGBA8); img->set_pixel(0, 0, Color(0, 0, 0, 0)); img->set_pixel(0, 1, Color(0, 0, 0, 0.09f)); @@ -105,6 +113,8 @@ TEST_CASE("[BitMap] Set bit") { BitMap bit_map{}; // Setting a point before a bit map is created should not crash, because there are checks to see if we are out of bounds. + ERR_PRINT_OFF + bit_map.set_bitv(Point2i(128, 128), true); bit_map.create(dim); @@ -120,12 +130,16 @@ TEST_CASE("[BitMap] Set bit") { bit_map.create(dim); bit_map.set_bitv(Point2i(512, 512), true); CHECK_MESSAGE(bit_map.get_true_bit_count() == 0, "Nothing should change as we were trying to edit a bit outside of the correct range."); + + ERR_PRINT_ON } TEST_CASE("[BitMap] Get bit") { const Size2i dim{ 256, 256 }; BitMap bit_map{}; + ERR_PRINT_OFF + CHECK_MESSAGE(bit_map.get_bitv(Point2i(128, 128)) == false, "Trying to access a bit outside of the BitMap's range should always return false"); bit_map.create(dim); @@ -140,6 +154,8 @@ TEST_CASE("[BitMap] Get bit") { CHECK(bit_map.get_bitv(Point2i(255, 255)) == true); CHECK(bit_map.get_bitv(Point2i(256, 256)) == false); CHECK(bit_map.get_bitv(Point2i(257, 257)) == false); + + ERR_PRINT_ON } TEST_CASE("[BitMap] Set bit rect") { @@ -158,6 +174,9 @@ TEST_CASE("[BitMap] Set bit rect") { reset_bit_map(bit_map); // Checking out of bounds handling. + + ERR_PRINT_OFF + bit_map.set_bit_rect(Rect2i{ 128, 128, 256, 256 }, true); CHECK(bit_map.get_true_bit_count() == 16384); @@ -170,6 +189,8 @@ TEST_CASE("[BitMap] Set bit rect") { bit_map.set_bit_rect(Rect2i{ -128, -128, 512, 512 }, true); CHECK(bit_map.get_true_bit_count() == 65536); + + ERR_PRINT_ON } TEST_CASE("[BitMap] Get true bit count") { @@ -197,7 +218,9 @@ TEST_CASE("[BitMap] Get size") { bit_map.create(dim); CHECK(bit_map.get_size() == Size2i(256, 256)); + ERR_PRINT_OFF bit_map.create(Size2i(-1, 0)); + ERR_PRINT_ON CHECK_MESSAGE(bit_map.get_size() == Size2i(256, 256), "Invalid size should not be accepted by create"); bit_map.create(Size2i(256, 128)); @@ -219,7 +242,9 @@ TEST_CASE("[BitMap] Resize") { CHECK_MESSAGE(bit_map.get_true_bit_count() == 50, "There should be 25 bits in the top left corner, and 25 bits in the bottom right corner"); bit_map.create(dim); + ERR_PRINT_OFF bit_map.resize(Size2i(-1, 128)); + ERR_PRINT_ON CHECK_MESSAGE(bit_map.get_size() == Size2i(128, 128), "When an invalid size is given the bit map will keep its size"); bit_map.create(dim); @@ -234,7 +259,9 @@ TEST_CASE("[BitMap] Resize") { TEST_CASE("[BitMap] Grow and shrink mask") { const Size2i dim{ 256, 256 }; BitMap bit_map{}; + ERR_PRINT_OFF bit_map.grow_mask(100, Rect2i(0, 0, 128, 128)); // Check if method does not crash when working with an uninitialized bit map. + ERR_PRINT_ON CHECK_MESSAGE(bit_map.get_size() == Size2i(0, 0), "Size should still be equal to 0x0"); bit_map.create(dim); @@ -331,7 +358,9 @@ TEST_CASE("[BitMap] Blit") { Ref<BitMap> blit_bit_map{}; // Testing null reference to blit bit map. + ERR_PRINT_OFF bit_map.blit(blit_pos, blit_bit_map); + ERR_PRINT_ON blit_bit_map.instantiate(); @@ -378,7 +407,9 @@ TEST_CASE("[BitMap] Convert to image") { BitMap bit_map{}; Ref<Image> img; + ERR_PRINT_OFF img = bit_map.convert_to_image(); + ERR_PRINT_ON CHECK_MESSAGE(img.is_valid(), "We should receive a valid Image Object even if BitMap is not created yet"); CHECK_MESSAGE(img->get_format() == Image::FORMAT_L8, "We should receive a valid Image Object even if BitMap is not created yet"); CHECK_MESSAGE(img->get_size() == (Size2i(0, 0)), "Image should have no width or height, because BitMap has not yet been created"); @@ -392,7 +423,7 @@ TEST_CASE("[BitMap] Convert to image") { bit_map.set_bit_rect(Rect2i(0, 0, 128, 128), true); img = bit_map.convert_to_image(); CHECK_MESSAGE(img->get_pixel(0, 0).is_equal_approx(Color(1, 1, 1)), "BitMap's top-left quadrant is all 1's, so Image should be white"); - CHECK_MESSAGE(img->get_pixel(256, 256).is_equal_approx(Color(0, 0, 0)), "All other quadrants were 0's, so these should be black"); + CHECK_MESSAGE(img->get_pixel(255, 255).is_equal_approx(Color(0, 0, 0)), "All other quadrants were 0's, so these should be black"); } TEST_CASE("[BitMap] Clip to polygon") { @@ -400,7 +431,9 @@ TEST_CASE("[BitMap] Clip to polygon") { BitMap bit_map{}; Vector<Vector<Vector2>> polygons; + ERR_PRINT_OFF polygons = bit_map.clip_opaque_to_polygons(Rect2i(0, 0, 128, 128)); + ERR_PRINT_ON CHECK_MESSAGE(polygons.size() == 0, "We should have no polygons, because the BitMap was not initialized"); bit_map.create(dim); diff --git a/tests/scene/test_code_edit.h b/tests/scene/test_code_edit.h index 3940bdb37a..fa31a3a461 100644 --- a/tests/scene/test_code_edit.h +++ b/tests/scene/test_code_edit.h @@ -2871,6 +2871,89 @@ TEST_CASE("[SceneTree][CodeEdit] completion") { CHECK(code_edit->get_text() == "\'\'\'"); } + SUBCASE("[CodeEdit] autocomplete with brace completion") { + code_edit->set_auto_brace_completion_enabled(true); + CHECK(code_edit->is_auto_brace_completion_enabled()); + + code_edit->insert_text_at_caret("(te)"); + code_edit->set_caret_column(3); + + // Full completion. + code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_FUNCTION, "test()", "test()"); + code_edit->update_code_completion_options(); + code_edit->confirm_code_completion(); + CHECK(code_edit->get_line(0) == "(test())"); + CHECK(code_edit->get_caret_column() == 7); + code_edit->undo(); + + // With "arg". + code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_FUNCTION, "test(", "test("); + code_edit->update_code_completion_options(); + code_edit->confirm_code_completion(); + CHECK(code_edit->get_line(0) == "(test())"); + CHECK(code_edit->get_caret_column() == 6); + code_edit->undo(); + + // brace completion disbaled + code_edit->set_auto_brace_completion_enabled(false); + + // Full completion. + code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_FUNCTION, "test()", "test()"); + code_edit->update_code_completion_options(); + code_edit->confirm_code_completion(); + CHECK(code_edit->get_line(0) == "(test())"); + CHECK(code_edit->get_caret_column() == 7); + code_edit->undo(); + + // With "arg". + code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_FUNCTION, "test(", "test("); + code_edit->update_code_completion_options(); + code_edit->confirm_code_completion(); + CHECK(code_edit->get_line(0) == "(test()"); + CHECK(code_edit->get_caret_column() == 6); + + // String + code_edit->set_auto_brace_completion_enabled(true); + code_edit->clear(); + code_edit->insert_text_at_caret("\"\""); + code_edit->set_caret_column(1); + + // Full completion. + code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_NODE_PATH, "\"test\"", "\"test\""); + code_edit->update_code_completion_options(); + code_edit->confirm_code_completion(); + CHECK(code_edit->get_line(0) == "\"test\""); + CHECK(code_edit->get_caret_column() == 6); + code_edit->undo(); + + // With "arg". + code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_NODE_PATH, "\"test", "\"test"); + code_edit->update_code_completion_options(); + code_edit->confirm_code_completion(); + CHECK(code_edit->get_line(0) == "\"\"test\"\""); + CHECK(code_edit->get_caret_column() == 7); + code_edit->undo(); + + // brace completion disbaled + code_edit->set_auto_brace_completion_enabled(false); + + // Full completion. + code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_NODE_PATH, "\"test\"", "\"test\""); + code_edit->update_code_completion_options(); + code_edit->confirm_code_completion(); + CHECK(code_edit->get_line(0) == "\"test\""); + CHECK(code_edit->get_caret_column() == 6); + code_edit->undo(); + + // With "arg". + code_edit->add_code_completion_option(CodeEdit::CodeCompletionKind::KIND_NODE_PATH, "\"test", "\"test"); + code_edit->update_code_completion_options(); + code_edit->confirm_code_completion(); + CHECK(code_edit->get_line(0) == "\"\"test\""); + CHECK(code_edit->get_caret_column() == 7); + code_edit->undo(); + } + SUBCASE("[CodeEdit] autocomplete") { code_edit->set_code_completion_enabled(true); CHECK(code_edit->is_code_completion_enabled()); @@ -3027,7 +3110,7 @@ TEST_CASE("[SceneTree][CodeEdit] completion") { CHECK(code_edit->get_code_completion_selected_index() == 0); Point2 caret_pos = code_edit->get_caret_draw_pos(); - caret_pos.y -= code_edit->get_line_height(); + caret_pos.y += code_edit->get_line_height(); SEND_GUI_MOUSE_BUTTON_EVENT(code_edit, caret_pos, MouseButton::WHEEL_DOWN, MouseButton::NONE, Key::NONE); CHECK(code_edit->get_code_completion_selected_index() == 1); @@ -3035,6 +3118,7 @@ TEST_CASE("[SceneTree][CodeEdit] completion") { CHECK(code_edit->get_code_completion_selected_index() == 0); /* Single click selects. */ + caret_pos.y += code_edit->get_line_height() * 2; SEND_GUI_MOUSE_BUTTON_EVENT(code_edit, caret_pos, MouseButton::LEFT, MouseButton::MASK_LEFT, Key::NONE); CHECK(code_edit->get_code_completion_selected_index() == 2); diff --git a/tests/scene/test_curve.h b/tests/scene/test_curve.h index 4afd5b293f..4f95568b4a 100644 --- a/tests/scene/test_curve.h +++ b/tests/scene/test_curve.h @@ -240,8 +240,9 @@ TEST_CASE("[Curve3D] Linear sampling should return exact value") { curve->add_point(Vector3(0, 0, 0)); curve->add_point(Vector3(len, 0, 0)); - + ERR_PRINT_OFF real_t baked_length = curve->get_baked_length(); + ERR_PRINT_ON CHECK(len == baked_length); for (int i = 0; i < len; i++) { diff --git a/tests/servers/test_text_server.h b/tests/servers/test_text_server.h index 297f7d2068..b3c120e0ba 100644 --- a/tests/servers/test_text_server.h +++ b/tests/servers/test_text_server.h @@ -593,12 +593,18 @@ TEST_SUITE("[TextServer]") { String text1 = U"linguistically similar and effectively form"; // 14^ 22^ 26^ 38^ PackedInt32Array breaks = ts->string_get_word_breaks(text1, "en"); - CHECK(breaks.size() == 4); - if (breaks.size() == 4) { - CHECK(breaks[0] == 14); - CHECK(breaks[1] == 22); - CHECK(breaks[2] == 26); - CHECK(breaks[3] == 38); + CHECK(breaks.size() == 10); + if (breaks.size() == 10) { + CHECK(breaks[0] == 0); + CHECK(breaks[1] == 14); + CHECK(breaks[2] == 15); + CHECK(breaks[3] == 22); + CHECK(breaks[4] == 23); + CHECK(breaks[5] == 26); + CHECK(breaks[6] == 27); + CHECK(breaks[7] == 38); + CHECK(breaks[8] == 39); + CHECK(breaks[9] == 43); } } @@ -608,16 +614,26 @@ TEST_SUITE("[TextServer]") { // 3^ 7^ 13^ 16^ 20^ 25^ 29^ 32^ PackedInt32Array breaks = ts->string_get_word_breaks(text2, "th"); - CHECK(breaks.size() == 8); - if (breaks.size() == 8) { - CHECK(breaks[0] == 3); - CHECK(breaks[1] == 7); - CHECK(breaks[2] == 13); - CHECK(breaks[3] == 16); - CHECK(breaks[4] == 20); - CHECK(breaks[5] == 25); - CHECK(breaks[6] == 29); - CHECK(breaks[7] == 32); + CHECK(breaks.size() == 18); + if (breaks.size() == 18) { + CHECK(breaks[0] == 0); + CHECK(breaks[1] == 4); + CHECK(breaks[2] == 4); + CHECK(breaks[3] == 8); + CHECK(breaks[4] == 8); + CHECK(breaks[5] == 14); + CHECK(breaks[6] == 14); + CHECK(breaks[7] == 17); + CHECK(breaks[8] == 17); + CHECK(breaks[9] == 21); + CHECK(breaks[10] == 21); + CHECK(breaks[11] == 26); + CHECK(breaks[12] == 26); + CHECK(breaks[13] == 30); + CHECK(breaks[14] == 30); + CHECK(breaks[15] == 33); + CHECK(breaks[16] == 33); + CHECK(breaks[17] == 42); } } } diff --git a/thirdparty/README.md b/thirdparty/README.md index 937d149747..017dabe9e5 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -20,7 +20,7 @@ Files extracted from upstream source: ## basis_universal - Upstream: https://github.com/BinomialLLC/basis_universal -- Version: git (1531cfaf9ed5232248a0a45736686a849ca3befc, 2022) +- Version: git (a91e94c8495d7f470d3df326a364d49324cfd4a3, 2022) - License: Apache 2.0 Files extracted from upstream source: @@ -217,8 +217,8 @@ Files extracted from upstream source: ## graphite - Upstream: https://github.com/silnrsi/graphite -- Version: 1.3.14 (80c52493ef42e6fe605a69dcddd2a691cd8a1380, 2021) -- License: MPL-2.0 +- Version: 1.3.14 (27572742003b93dc53dc02c01c237b72c6c25f54, 2022) +- License: MIT Files extracted from upstream source: @@ -230,7 +230,7 @@ Files extracted from upstream source: ## harfbuzz - Upstream: https://github.com/harfbuzz/harfbuzz -- Version: 5.3.1 (970321db7bddbe8c579b73751fc655a924ea3ce6, 2022) +- Version: 6.0.0 (afcae83a064843d71d47624bc162e121cc56c08b, 2022) - License: MIT Files extracted from upstream source: @@ -345,7 +345,7 @@ Files extracted from upstream source: ## mbedtls - Upstream: https://github.com/Mbed-TLS/mbedtls -- Version: 2.18.1 (dd79db10014d85b26d11fe57218431f2e5ede6f2, 2022) +- Version: 2.18.2 (89f040a5c938985c5f30728baed21e49d0846a53, 2022) - License: Apache 2.0 File extracted from upstream release tarball: @@ -355,12 +355,10 @@ File extracted from upstream release tarball: - The `LICENSE` file. - Applied the patch in `patches/1453.diff` (upstream PR: https://github.com/ARMmbed/mbedtls/pull/1453). + Applied the patch in `patches/windows-arm64-hardclock.diff` - Added 2 files `godot_core_mbedtls_platform.c` and `godot_core_mbedtls_config.h` providing configuration for light bundling with core. -Some changes have been made in order to fix Windows on ARM build errors. -They are marked with `// -- GODOT start --` and `// -- GODOT end --` - ## meshoptimizer @@ -548,7 +546,7 @@ Patch files are provided in `oidn/patches/`. ## openxr - Upstream: https://github.com/KhronosGroup/OpenXR-SDK -- Version: 1.0.25 (c16a18c99740ea5dd251e3af117e0e5aea4ceaa9, 2022) +- Version: 1.0.26 (e2da9ce83a4388c9622da328bf48548471261290, 2022) - License: Apache 2.0 Files extracted from upstream source: diff --git a/thirdparty/basis_universal/encoder/basisu_comp.cpp b/thirdparty/basis_universal/encoder/basisu_comp.cpp index 166a1c4fe0..41eae2b78a 100644 --- a/thirdparty/basis_universal/encoder/basisu_comp.cpp +++ b/thirdparty/basis_universal/encoder/basisu_comp.cpp @@ -1501,7 +1501,8 @@ namespace basisu if (m_params.m_compute_stats) { - printf("Slice: %u\n", slice_index); + if (m_params.m_print_stats) + printf("Slice: %u\n", slice_index); image_stats& s = m_stats[slice_index]; @@ -1511,81 +1512,100 @@ namespace basisu // ---- .basis stats em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 0, 3); - em.print(".basis RGB Avg: "); + if (m_params.m_print_stats) + em.print(".basis RGB Avg: "); s.m_basis_rgb_avg_psnr = em.m_psnr; em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 0, 4); - em.print(".basis RGBA Avg: "); + if (m_params.m_print_stats) + em.print(".basis RGBA Avg: "); s.m_basis_rgba_avg_psnr = em.m_psnr; em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 0, 1); - em.print(".basis R Avg: "); + if (m_params.m_print_stats) + em.print(".basis R Avg: "); em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 1, 1); - em.print(".basis G Avg: "); + if (m_params.m_print_stats) + em.print(".basis G Avg: "); em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 2, 1); - em.print(".basis B Avg: "); + if (m_params.m_print_stats) + em.print(".basis B Avg: "); if (m_params.m_uastc) { em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 3, 1); - em.print(".basis A Avg: "); + if (m_params.m_print_stats) + em.print(".basis A Avg: "); s.m_basis_a_avg_psnr = em.m_psnr; } em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 0, 0); - em.print(".basis 709 Luma: "); + if (m_params.m_print_stats) + em.print(".basis 709 Luma: "); s.m_basis_luma_709_psnr = static_cast<float>(em.m_psnr); s.m_basis_luma_709_ssim = static_cast<float>(em.m_ssim); em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked[slice_index], 0, 0, true, true); - em.print(".basis 601 Luma: "); + if (m_params.m_print_stats) + em.print(".basis 601 Luma: "); s.m_basis_luma_601_psnr = static_cast<float>(em.m_psnr); if (m_slice_descs.size() == 1) { const uint32_t output_size = comp_size ? (uint32_t)comp_size : (uint32_t)comp_data.size(); - debug_printf(".basis RGB PSNR per bit/texel*10000: %3.3f\n", 10000.0f * s.m_basis_rgb_avg_psnr / ((output_size * 8.0f) / (slice_desc.m_orig_width * slice_desc.m_orig_height))); - debug_printf(".basis Luma 709 PSNR per bit/texel*10000: %3.3f\n", 10000.0f * s.m_basis_luma_709_psnr / ((output_size * 8.0f) / (slice_desc.m_orig_width * slice_desc.m_orig_height))); + if (m_params.m_print_stats) + { + debug_printf(".basis RGB PSNR per bit/texel*10000: %3.3f\n", 10000.0f * s.m_basis_rgb_avg_psnr / ((output_size * 8.0f) / (slice_desc.m_orig_width * slice_desc.m_orig_height))); + debug_printf(".basis Luma 709 PSNR per bit/texel*10000: %3.3f\n", 10000.0f * s.m_basis_luma_709_psnr / ((output_size * 8.0f) / (slice_desc.m_orig_width * slice_desc.m_orig_height))); + } } if (m_decoded_output_textures_unpacked_bc7[slice_index].get_width()) { // ---- BC7 stats em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 0, 3); - em.print("BC7 RGB Avg: "); + if (m_params.m_print_stats) + em.print("BC7 RGB Avg: "); s.m_bc7_rgb_avg_psnr = em.m_psnr; em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 0, 4); - em.print("BC7 RGBA Avg: "); + if (m_params.m_print_stats) + em.print("BC7 RGBA Avg: "); s.m_bc7_rgba_avg_psnr = em.m_psnr; em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 0, 1); - em.print("BC7 R Avg: "); + if (m_params.m_print_stats) + em.print("BC7 R Avg: "); em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 1, 1); - em.print("BC7 G Avg: "); + if (m_params.m_print_stats) + em.print("BC7 G Avg: "); em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 2, 1); - em.print("BC7 B Avg: "); + if (m_params.m_print_stats) + em.print("BC7 B Avg: "); if (m_params.m_uastc) { em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 3, 1); - em.print("BC7 A Avg: "); + if (m_params.m_print_stats) + em.print("BC7 A Avg: "); s.m_bc7_a_avg_psnr = em.m_psnr; } em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 0, 0); - em.print("BC7 709 Luma: "); + if (m_params.m_print_stats) + em.print("BC7 709 Luma: "); s.m_bc7_luma_709_psnr = static_cast<float>(em.m_psnr); s.m_bc7_luma_709_ssim = static_cast<float>(em.m_ssim); em.calc(m_slice_images[slice_index], m_decoded_output_textures_unpacked_bc7[slice_index], 0, 0, true, true); - em.print("BC7 601 Luma: "); + if (m_params.m_print_stats) + em.print("BC7 601 Luma: "); s.m_bc7_luma_601_psnr = static_cast<float>(em.m_psnr); } @@ -1593,16 +1613,19 @@ namespace basisu { // ---- Nearly best possible ETC1S stats em.calc(m_slice_images[slice_index], m_best_etc1s_images_unpacked[slice_index], 0, 3); - em.print("Unquantized ETC1S RGB Avg: "); + if (m_params.m_print_stats) + em.print("Unquantized ETC1S RGB Avg: "); s.m_best_etc1s_rgb_avg_psnr = static_cast<float>(em.m_psnr); em.calc(m_slice_images[slice_index], m_best_etc1s_images_unpacked[slice_index], 0, 0); - em.print("Unquantized ETC1S 709 Luma: "); + if (m_params.m_print_stats) + em.print("Unquantized ETC1S 709 Luma: "); s.m_best_etc1s_luma_709_psnr = static_cast<float>(em.m_psnr); s.m_best_etc1s_luma_709_ssim = static_cast<float>(em.m_ssim); em.calc(m_slice_images[slice_index], m_best_etc1s_images_unpacked[slice_index], 0, 0, true, true); - em.print("Unquantized ETC1S 601 Luma: "); + if (m_params.m_print_stats) + em.print("Unquantized ETC1S 601 Luma: "); s.m_best_etc1s_luma_601_psnr = static_cast<float>(em.m_psnr); } } @@ -2311,6 +2334,8 @@ namespace basisu } comp_params.m_compute_stats = (pStats != nullptr); + comp_params.m_print_stats = (flags_and_quality & cFlagPrintStats) != 0; + comp_params.m_status_output = (flags_and_quality & cFlagPrintStatus) != 0; // Create the compressor, initialize it, and process the input basis_compressor comp; @@ -2328,6 +2353,11 @@ namespace basisu return nullptr; } + if ((pStats) && (comp.get_opencl_failed())) + { + pStats->m_opencl_failed = true; + } + // Get the output file data and return it to the caller void* pFile_data = nullptr; const uint8_vec* pFile_data_vec = comp_params.m_create_ktx2_file ? &comp.get_output_ktx2_file() : &comp.get_output_basis_file(); @@ -2388,4 +2418,108 @@ namespace basisu free(p); } + bool basis_benchmark_etc1s_opencl(bool* pOpenCL_failed) + { + if (pOpenCL_failed) + *pOpenCL_failed = false; + + if (!opencl_is_available()) + { + error_printf("basis_benchmark_etc1s_opencl: OpenCL support must be enabled first!\n"); + return false; + } + + const uint32_t W = 1024, H = 1024; + basisu::vector<image> images; + image& img = images.enlarge(1)->resize(W, H); + + const uint32_t NUM_RAND_LETTERS = 6000;// 40000; + + rand r; + r.seed(200); + + for (uint32_t i = 0; i < NUM_RAND_LETTERS; i++) + { + uint32_t x = r.irand(0, W - 1), y = r.irand(0, H - 1); + uint32_t sx = r.irand(1, 4), sy = r.irand(1, 4); + color_rgba c(r.byte(), r.byte(), r.byte(), 255); + + img.debug_text(x, y, sx, sy, c, nullptr, false, "%c", static_cast<char>(r.irand(32, 127))); + } + + //save_png("test.png", img); + + image_stats stats; + + uint32_t flags_and_quality = cFlagSRGB | cFlagThreaded | 255; + size_t comp_size = 0; + + double best_cpu_time = 1e+9f, best_gpu_time = 1e+9f; + + const uint32_t TIMES_TO_ENCODE = 2; + interval_timer tm; + + for (uint32_t i = 0; i < TIMES_TO_ENCODE; i++) + { + tm.start(); + void* pComp_data = basis_compress( + images, + flags_and_quality, 1.0f, + &comp_size, + &stats); + double cpu_time = tm.get_elapsed_secs(); + if (!pComp_data) + { + error_printf("basis_benchmark_etc1s_opencl: basis_compress() failed (CPU)!\n"); + return false; + } + + best_cpu_time = minimum(best_cpu_time, cpu_time); + + basis_free_data(pComp_data); + } + + printf("Best CPU time: %3.3f\n", best_cpu_time); + + for (uint32_t i = 0; i < TIMES_TO_ENCODE; i++) + { + tm.start(); + void* pComp_data = basis_compress( + images, + flags_and_quality | cFlagUseOpenCL, 1.0f, + &comp_size, + &stats); + + if (stats.m_opencl_failed) + { + error_printf("basis_benchmark_etc1s_opencl: OpenCL failed!\n"); + + basis_free_data(pComp_data); + + if (pOpenCL_failed) + *pOpenCL_failed = true; + + return false; + } + + double gpu_time = tm.get_elapsed_secs(); + if (!pComp_data) + { + error_printf("basis_benchmark_etc1s_opencl: basis_compress() failed (GPU)!\n"); + return false; + } + + best_gpu_time = minimum(best_gpu_time, gpu_time); + + basis_free_data(pComp_data); + } + + printf("Best GPU time: %3.3f\n", best_gpu_time); + + return best_gpu_time < best_cpu_time; + } + } // namespace basisu + + + diff --git a/thirdparty/basis_universal/encoder/basisu_comp.h b/thirdparty/basis_universal/encoder/basisu_comp.h index aa5ea6fec3..b6c9fef9e2 100644 --- a/thirdparty/basis_universal/encoder/basisu_comp.h +++ b/thirdparty/basis_universal/encoder/basisu_comp.h @@ -92,6 +92,8 @@ namespace basisu m_best_etc1s_luma_709_psnr = 0.0f; m_best_etc1s_luma_601_psnr = 0.0f; m_best_etc1s_luma_709_ssim = 0.0f; + + m_opencl_failed = false; } std::string m_filename; @@ -119,6 +121,8 @@ namespace basisu float m_best_etc1s_luma_709_psnr; float m_best_etc1s_luma_601_psnr; float m_best_etc1s_luma_709_ssim; + + bool m_opencl_failed; }; template<bool def> @@ -255,6 +259,7 @@ namespace basisu m_write_output_basis_files.clear(); m_compression_level.clear(); m_compute_stats.clear(); + m_print_stats.clear(); m_check_for_alpha.clear(); m_force_alpha.clear(); m_multithreading.clear(); @@ -373,6 +378,9 @@ namespace basisu // Compute and display image metrics bool_param<false> m_compute_stats; + + // Print stats to stdout, if m_compute_stats is true. + bool_param<true> m_print_stats; // Check to see if any input image has an alpha channel, if so then the output basis file will have alpha channels bool_param<true> m_check_for_alpha; @@ -583,11 +591,16 @@ namespace basisu cFlagYFlip = 1 << 16, // flip source image on Y axis before compression cFlagUASTC = 1 << 17, // use UASTC compression vs. ETC1S - cFlagUASTCRDO = 1 << 18 // use RDO postprocessing when generating UASTC files (must set uastc_rdo_quality to the quality scalar) + cFlagUASTCRDO = 1 << 18, // use RDO postprocessing when generating UASTC files (must set uastc_rdo_quality to the quality scalar) + + cFlagPrintStats = 1 << 19, // print image stats to stdout + cFlagPrintStatus = 1 << 20 // print status to stdout }; // This function accepts an array of source images. // If more than one image is provided, it's assumed the images form a mipmap pyramid and automatic mipmap generation is disabled. + // Returns a pointer to the compressed .basis or .ktx2 file data. *pSize is the size of the compressed data. The returned block must be freed using basis_free_data(). + // basisu_encoder_init() MUST be called first! void* basis_compress( const basisu::vector<image> &source_images, uint32_t flags_and_quality, float uastc_rdo_quality, @@ -604,6 +617,12 @@ namespace basisu // Frees the dynamically allocated file data returned by basis_compress(). void basis_free_data(void* p); + // Runs a short benchmark using synthetic image data to time OpenCL encoding vs. CPU encoding, with multithreading enabled. + // Returns true if opencl is worth using on this system, otherwise false. + // If pOpenCL_failed is not null, it will be set to true if OpenCL encoding failed *on this particular machine/driver/BasisU version* and the encoder falled back to CPU encoding. + // basisu_encoder_init() MUST be called first. If OpenCL support wasn't enabled this always returns false. + bool basis_benchmark_etc1s_opencl(bool *pOpenCL_failed = nullptr); + // Parallel compression API struct parallel_results { diff --git a/thirdparty/basis_universal/encoder/basisu_enc.cpp b/thirdparty/basis_universal/encoder/basisu_enc.cpp index b427215ee3..c431ceaf12 100644 --- a/thirdparty/basis_universal/encoder/basisu_enc.cpp +++ b/thirdparty/basis_universal/encoder/basisu_enc.cpp @@ -187,6 +187,8 @@ namespace basisu opencl_init(opencl_force_serialization); } + interval_timer::init(); // make sure interval_timer globals are initialized from main thread to avoid TSAN reports + g_library_initialized = true; } @@ -227,7 +229,7 @@ namespace basisu { QueryPerformanceFrequency(reinterpret_cast<LARGE_INTEGER*>(pTicks)); } -#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) +#elif defined(__APPLE__) || defined(__FreeBSD__) || defined(__OpenBSD__) || defined(__EMSCRIPTEN__) #include <sys/time.h> inline void query_counter(timer_ticks* pTicks) { diff --git a/thirdparty/basis_universal/encoder/basisu_frontend.cpp b/thirdparty/basis_universal/encoder/basisu_frontend.cpp index 00210e6679..1f30a33c70 100644 --- a/thirdparty/basis_universal/encoder/basisu_frontend.cpp +++ b/thirdparty/basis_universal/encoder/basisu_frontend.cpp @@ -2328,8 +2328,6 @@ namespace basisu m_optimized_cluster_selectors.resize(total_selector_clusters); - uint32_t total_clusters_processed = 0; - // For each selector codebook entry, and for each of the 4x4 selectors, determine which selector minimizes the error across all the blocks that use that quantized selector. const uint32_t N = 256; for (uint32_t cluster_index_iter = 0; cluster_index_iter < total_selector_clusters; cluster_index_iter += N) @@ -2338,7 +2336,7 @@ namespace basisu const uint32_t last_index = minimum<uint32_t>((uint32_t)total_selector_clusters, cluster_index_iter + N); #ifndef __EMSCRIPTEN__ - m_params.m_pJob_pool->add_job([this, first_index, last_index, &total_clusters_processed, &total_selector_clusters] { + m_params.m_pJob_pool->add_job([this, first_index, last_index] { #endif for (uint32_t cluster_index = first_index; cluster_index < last_index; cluster_index++) diff --git a/thirdparty/basis_universal/transcoder/basisu_transcoder.cpp b/thirdparty/basis_universal/transcoder/basisu_transcoder.cpp index 630731900f..3aeba0ee7a 100644 --- a/thirdparty/basis_universal/transcoder/basisu_transcoder.cpp +++ b/thirdparty/basis_universal/transcoder/basisu_transcoder.cpp @@ -16867,7 +16867,7 @@ namespace basist { m_format = basist::basis_tex_format::cETC1S; - // 3.10.2: "Whether the image has 1 or 2 slices can be determined from the DFD’s sample count." + // 3.10.2: "Whether the image has 1 or 2 slices can be determined from the DFD's sample count." // If m_has_alpha is true it may be 2-channel RRRG or 4-channel RGBA, but we let the caller deal with that. m_has_alpha = (m_header.m_dfd_byte_length == 60); diff --git a/thirdparty/embree/common/sys/sysinfo.cpp b/thirdparty/embree/common/sys/sysinfo.cpp index c98f61fa53..7f7a009a1e 100644 --- a/thirdparty/embree/common/sys/sysinfo.cpp +++ b/thirdparty/embree/common/sys/sysinfo.cpp @@ -640,6 +640,12 @@ namespace embree #if defined(__EMSCRIPTEN__) #include <emscripten.h> + +// -- GODOT start -- +extern "C" { +extern int godot_js_os_hw_concurrency_get(); +} +// -- GODOT end -- #endif namespace embree @@ -653,21 +659,9 @@ namespace embree nThreads = sysconf(_SC_NPROCESSORS_ONLN); // does not work in Linux LXC container assert(nThreads); #elif defined(__EMSCRIPTEN__) - // WebAssembly supports pthreads, but not pthread_getaffinity_np. Get the number of logical - // threads from the browser or Node.js using JavaScript. - nThreads = MAIN_THREAD_EM_ASM_INT({ - const isBrowser = typeof window !== 'undefined'; - const isNode = typeof process !== 'undefined' && process.versions != null && - process.versions.node != null; - if (isBrowser) { - // Return 1 if the browser does not expose hardwareConcurrency. - return window.navigator.hardwareConcurrency || 1; - } else if (isNode) { - return require('os').cpus().length; - } else { - return 1; - } - }); + // -- GODOT start -- + nThreads = godot_js_os_hw_concurrency_get(); + // -- GODOT end -- #else cpu_set_t set; if (pthread_getaffinity_np(pthread_self(), sizeof(set), &set) == 0) diff --git a/thirdparty/embree/patches/emscripten-nthreads.patch b/thirdparty/embree/patches/emscripten-nthreads.patch new file mode 100644 index 0000000000..e42f203475 --- /dev/null +++ b/thirdparty/embree/patches/emscripten-nthreads.patch @@ -0,0 +1,42 @@ +diff --git a/thirdparty/embree/common/sys/sysinfo.cpp b/thirdparty/embree/common/sys/sysinfo.cpp +index c98f61fa53..7f7a009a1e 100644 +--- a/thirdparty/embree/common/sys/sysinfo.cpp ++++ b/thirdparty/embree/common/sys/sysinfo.cpp +@@ -640,6 +640,12 @@ namespace embree + + #if defined(__EMSCRIPTEN__) + #include <emscripten.h> ++ ++// -- GODOT start -- ++extern "C" { ++extern int godot_js_os_hw_concurrency_get(); ++} ++// -- GODOT end -- + #endif + + namespace embree +@@ -653,21 +659,9 @@ namespace embree + nThreads = sysconf(_SC_NPROCESSORS_ONLN); // does not work in Linux LXC container + assert(nThreads); + #elif defined(__EMSCRIPTEN__) +- // WebAssembly supports pthreads, but not pthread_getaffinity_np. Get the number of logical +- // threads from the browser or Node.js using JavaScript. +- nThreads = MAIN_THREAD_EM_ASM_INT({ +- const isBrowser = typeof window !== 'undefined'; +- const isNode = typeof process !== 'undefined' && process.versions != null && +- process.versions.node != null; +- if (isBrowser) { +- // Return 1 if the browser does not expose hardwareConcurrency. +- return window.navigator.hardwareConcurrency || 1; +- } else if (isNode) { +- return require('os').cpus().length; +- } else { +- return 1; +- } +- }); ++ // -- GODOT start -- ++ nThreads = godot_js_os_hw_concurrency_get(); ++ // -- GODOT end -- + #else + cpu_set_t set; + if (pthread_getaffinity_np(pthread_self(), sizeof(set), &set) == 0) diff --git a/thirdparty/graphite/include/graphite2/Font.h b/thirdparty/graphite/include/graphite2/Font.h index fe569295a5..b0a1e36370 100644 --- a/thirdparty/graphite/include/graphite2/Font.h +++ b/thirdparty/graphite/include/graphite2/Font.h @@ -1,29 +1,5 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - - Alternatively, the contents of this file may be used under the terms - of the Mozilla Public License (http://mozilla.org/MPL) or the GNU - General Public License, as published by the Free Software Foundation, - either version 2 of the License or (at your option) any later version. -*/ +/* SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later */ +/* Copyright 2010, SIL International, All rights reserved. */ #pragma once #include "graphite2/Types.h" diff --git a/thirdparty/graphite/include/graphite2/Log.h b/thirdparty/graphite/include/graphite2/Log.h index a5a6947fab..d83b1b90e7 100644 --- a/thirdparty/graphite/include/graphite2/Log.h +++ b/thirdparty/graphite/include/graphite2/Log.h @@ -1,29 +1,5 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - - Alternatively, the contents of this file may be used under the terms - of the Mozilla Public License (http://mozilla.org/MPL) or the GNU - General Public License, as published by the Free Software Foundation, - either version 2 of the License or (at your option) any later version. -*/ +/* SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later */ +/* Copyright 2010, SIL International, All rights reserved. */ #pragma once #include <graphite2/Types.h> diff --git a/thirdparty/graphite/include/graphite2/Segment.h b/thirdparty/graphite/include/graphite2/Segment.h index 0e24f5d795..9969b4eb45 100644 --- a/thirdparty/graphite/include/graphite2/Segment.h +++ b/thirdparty/graphite/include/graphite2/Segment.h @@ -1,29 +1,5 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - - Alternatively, the contents of this file may be used under the terms - of the Mozilla Public License (http://mozilla.org/MPL) or the GNU - General Public License, as published by the Free Software Foundation, - either version 2 of the License or (at your option) any later version. -*/ +/* SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later */ +/* Copyright 2010, SIL International, All rights reserved. */ #pragma once #include "graphite2/Types.h" diff --git a/thirdparty/graphite/include/graphite2/Types.h b/thirdparty/graphite/include/graphite2/Types.h index 916c91191b..32236a6195 100644 --- a/thirdparty/graphite/include/graphite2/Types.h +++ b/thirdparty/graphite/include/graphite2/Types.h @@ -1,29 +1,5 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - - Alternatively, the contents of this file may be used under the terms - of the Mozilla Public License (http://mozilla.org/MPL) or the GNU - General Public License, as published by the Free Software Foundation, - either version 2 of the License or (at your option) any later version. -*/ +/* SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later */ +/* Copyright 2010, SIL International, All rights reserved. */ #pragma once #include <stddef.h> diff --git a/thirdparty/graphite/src/CmapCache.cpp b/thirdparty/graphite/src/CmapCache.cpp index d070019a34..ac860e9ee2 100644 --- a/thirdparty/graphite/src/CmapCache.cpp +++ b/thirdparty/graphite/src/CmapCache.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #include "inc/Main.h" #include "inc/CmapCache.h" diff --git a/thirdparty/graphite/src/Code.cpp b/thirdparty/graphite/src/Code.cpp index ec5ab298ca..4a53ae871b 100644 --- a/thirdparty/graphite/src/Code.cpp +++ b/thirdparty/graphite/src/Code.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + // This class represents loaded graphite stack machine code. It performs // basic sanity checks, on the incoming code to prevent more obvious problems // from crashing graphite. diff --git a/thirdparty/graphite/src/Collider.cpp b/thirdparty/graphite/src/Collider.cpp index 1929b39a58..ca36d4550a 100644 --- a/thirdparty/graphite/src/Collider.cpp +++ b/thirdparty/graphite/src/Collider.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #include <algorithm> #include <limits> #include <cmath> diff --git a/thirdparty/graphite/src/Decompressor.cpp b/thirdparty/graphite/src/Decompressor.cpp index 42dc9113e5..f9f1e28e5b 100644 --- a/thirdparty/graphite/src/Decompressor.cpp +++ b/thirdparty/graphite/src/Decompressor.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2015, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2015, SIL International, All rights reserved. + #include <cassert> #include "inc/Decompressor.h" diff --git a/thirdparty/graphite/src/Face.cpp b/thirdparty/graphite/src/Face.cpp index 3e106050d7..4dd5a780cf 100644 --- a/thirdparty/graphite/src/Face.cpp +++ b/thirdparty/graphite/src/Face.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #include <cstring> #include "graphite2/Segment.h" #include "inc/CmapCache.h" diff --git a/thirdparty/graphite/src/FeatureMap.cpp b/thirdparty/graphite/src/FeatureMap.cpp index 014a88fd08..992be05540 100644 --- a/thirdparty/graphite/src/FeatureMap.cpp +++ b/thirdparty/graphite/src/FeatureMap.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #include <cstring> #include "inc/Main.h" diff --git a/thirdparty/graphite/src/FileFace.cpp b/thirdparty/graphite/src/FileFace.cpp index 7e663876a7..2e41044688 100644 --- a/thirdparty/graphite/src/FileFace.cpp +++ b/thirdparty/graphite/src/FileFace.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2012, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2012, SIL International, All rights reserved. + #include <cstring> #include "inc/FileFace.h" diff --git a/thirdparty/graphite/src/Font.cpp b/thirdparty/graphite/src/Font.cpp index faf3715f9d..bffb4223d5 100644 --- a/thirdparty/graphite/src/Font.cpp +++ b/thirdparty/graphite/src/Font.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #include "inc/Face.h" #include "inc/Font.h" #include "inc/GlyphCache.h" diff --git a/thirdparty/graphite/src/GlyphCache.cpp b/thirdparty/graphite/src/GlyphCache.cpp index 282bdc18fd..30479bdc4d 100644 --- a/thirdparty/graphite/src/GlyphCache.cpp +++ b/thirdparty/graphite/src/GlyphCache.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2012, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2012, SIL International, All rights reserved. + #include "graphite2/Font.h" #include "inc/Main.h" @@ -44,12 +21,18 @@ namespace // variable length structures. template<typename W> - class _glat_iterator : public std::iterator<std::input_iterator_tag, std::pair<sparse::key_type, sparse::mapped_type> > + class _glat_iterator { unsigned short key() const { return uint16(be::peek<W>(_e) + _n); } unsigned int run() const { return be::peek<W>(_e+sizeof(W)); } void advance_entry() { _n = 0; _e = _v; be::skip<W>(_v,2); } public: + using iterator_category = std::input_iterator_tag; + using value_type = std::pair<sparse::key_type, sparse::mapped_type>; + using difference_type = ptrdiff_t; + using pointer = value_type *; + using reference = value_type &; + _glat_iterator(const void * glat=0) : _e(reinterpret_cast<const byte *>(glat)), _v(_e+2*sizeof(W)), _n(0) {} _glat_iterator<W> & operator ++ () { diff --git a/thirdparty/graphite/src/GlyphFace.cpp b/thirdparty/graphite/src/GlyphFace.cpp index bc5e63a9f0..d9408f556b 100644 --- a/thirdparty/graphite/src/GlyphFace.cpp +++ b/thirdparty/graphite/src/GlyphFace.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #include "inc/GlyphFace.h" diff --git a/thirdparty/graphite/src/Intervals.cpp b/thirdparty/graphite/src/Intervals.cpp index 0fe99a127a..b223a67f56 100644 --- a/thirdparty/graphite/src/Intervals.cpp +++ b/thirdparty/graphite/src/Intervals.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #include <algorithm> #include <cmath> #include <limits> diff --git a/thirdparty/graphite/src/Justifier.cpp b/thirdparty/graphite/src/Justifier.cpp index 78c11e6a51..0bb18225b9 100644 --- a/thirdparty/graphite/src/Justifier.cpp +++ b/thirdparty/graphite/src/Justifier.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2012, SIL International, All rights reserved. - Copyright 2012, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #include "inc/Segment.h" #include "graphite2/Font.h" diff --git a/thirdparty/graphite/src/NameTable.cpp b/thirdparty/graphite/src/NameTable.cpp index d42b7f95bd..85892f179c 100644 --- a/thirdparty/graphite/src/NameTable.cpp +++ b/thirdparty/graphite/src/NameTable.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #include "inc/Main.h" #include "inc/Endian.h" diff --git a/thirdparty/graphite/src/Pass.cpp b/thirdparty/graphite/src/Pass.cpp index 47ae2064f7..986fed83b1 100644 --- a/thirdparty/graphite/src/Pass.cpp +++ b/thirdparty/graphite/src/Pass.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #include "inc/Main.h" #include "inc/debug.h" #include "inc/Endian.h" @@ -194,7 +171,7 @@ bool Pass::readPass(const byte * const pass_start, size_t pass_length, size_t su m_cPConstraint = vm::Machine::Code(true, pcCode, pcCode + pass_constraint_len, precontext[0], be::peek<uint16>(sort_keys), *m_silf, face, PASS_TYPE_UNKNOWN); if (e.test(!m_cPConstraint, E_OUTOFMEM) - || e.test(m_cPConstraint.status() != Code::loaded, m_cPConstraint.status() + E_CODEFAILURE)) + || e.test(m_cPConstraint.status() != Code::loaded, int(m_cPConstraint.status()) + E_CODEFAILURE)) return face.error(e); face.error_context(face.error_context() - 1); } @@ -266,8 +243,8 @@ bool Pass::readRules(const byte * rule_map, const size_t num_entries, r->constraint = new (m_codes+n*2-1) vm::Machine::Code(true, rc_begin, rc_end, r->preContext, r->sort, *m_silf, face, pt, &prog_pool_free); if (e.test(!r->action || !r->constraint, E_OUTOFMEM) - || e.test(r->action->status() != Code::loaded, r->action->status() + E_CODEFAILURE) - || e.test(r->constraint->status() != Code::loaded, r->constraint->status() + E_CODEFAILURE) + || e.test(r->action->status() != Code::loaded, int(r->action->status()) + E_CODEFAILURE) + || e.test(r->constraint->status() != Code::loaded, int(r->constraint->status()) + E_CODEFAILURE) || e.test(!r->constraint->immutable(), E_MUTABLECCODE)) return face.error(e); } diff --git a/thirdparty/graphite/src/Position.cpp b/thirdparty/graphite/src/Position.cpp index d2fdbd4e7c..a727f61664 100644 --- a/thirdparty/graphite/src/Position.cpp +++ b/thirdparty/graphite/src/Position.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #include "inc/Position.h" #include <cmath> diff --git a/thirdparty/graphite/src/Segment.cpp b/thirdparty/graphite/src/Segment.cpp index 62edd4250f..7bb3d132fa 100644 --- a/thirdparty/graphite/src/Segment.cpp +++ b/thirdparty/graphite/src/Segment.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #include "inc/UtfCodec.h" #include <cstring> #include <cstdlib> diff --git a/thirdparty/graphite/src/Silf.cpp b/thirdparty/graphite/src/Silf.cpp index 44d3c96171..51a7473627 100644 --- a/thirdparty/graphite/src/Silf.cpp +++ b/thirdparty/graphite/src/Silf.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #include <cstdlib> #include "graphite2/Segment.h" #include "inc/debug.h" diff --git a/thirdparty/graphite/src/Slot.cpp b/thirdparty/graphite/src/Slot.cpp index 0fdb098952..040e90d109 100644 --- a/thirdparty/graphite/src/Slot.cpp +++ b/thirdparty/graphite/src/Slot.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #include "inc/Segment.h" #include "inc/Slot.h" #include "inc/Silf.h" diff --git a/thirdparty/graphite/src/Sparse.cpp b/thirdparty/graphite/src/Sparse.cpp index aa43113669..746dfc9522 100644 --- a/thirdparty/graphite/src/Sparse.cpp +++ b/thirdparty/graphite/src/Sparse.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2011, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2011, SIL International, All rights reserved. + #include <cassert> #include "inc/Sparse.h" #include "inc/bits.h" diff --git a/thirdparty/graphite/src/TtfUtil.cpp b/thirdparty/graphite/src/TtfUtil.cpp index 2eb46a11fb..47940112ee 100644 --- a/thirdparty/graphite/src/TtfUtil.cpp +++ b/thirdparty/graphite/src/TtfUtil.cpp @@ -1,39 +1,14 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ -/*--------------------------------------------------------------------*//*:Ignore this sentence. +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. -File: TtfUtil.cpp +/* Responsibility: Alan Ward Last reviewed: Not yet. Description Implements the methods for TtfUtil class. This file should remain portable to any C++ environment by only using standard C++ and the TTF structurs defined in Tt.h. --------------------------------------------------------------------------------*//*:End Ignore*/ +*/ /*********************************************************************************************** diff --git a/thirdparty/graphite/src/UtfCodec.cpp b/thirdparty/graphite/src/UtfCodec.cpp index a944bbf9d0..9156bad00f 100644 --- a/thirdparty/graphite/src/UtfCodec.cpp +++ b/thirdparty/graphite/src/UtfCodec.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #include "inc/UtfCodec.h" //using namespace graphite2; diff --git a/thirdparty/graphite/src/call_machine.cpp b/thirdparty/graphite/src/call_machine.cpp index fcd8a0c2c1..7d9d1ef315 100644 --- a/thirdparty/graphite/src/call_machine.cpp +++ b/thirdparty/graphite/src/call_machine.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + // This call threaded interpreter implmentation for machine.h // Author: Tim Eves diff --git a/thirdparty/graphite/src/direct_machine.cpp b/thirdparty/graphite/src/direct_machine.cpp index 86206cfe37..e3a28fa536 100644 --- a/thirdparty/graphite/src/direct_machine.cpp +++ b/thirdparty/graphite/src/direct_machine.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + // This direct threaded interpreter implmentation for machine.h // Author: Tim Eves diff --git a/thirdparty/graphite/src/gr_char_info.cpp b/thirdparty/graphite/src/gr_char_info.cpp index 612f9ba694..1345fae847 100644 --- a/thirdparty/graphite/src/gr_char_info.cpp +++ b/thirdparty/graphite/src/gr_char_info.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #include <cassert> #include "graphite2/Segment.h" #include "inc/CharInfo.h" diff --git a/thirdparty/graphite/src/gr_face.cpp b/thirdparty/graphite/src/gr_face.cpp index baa469727b..6e80036113 100644 --- a/thirdparty/graphite/src/gr_face.cpp +++ b/thirdparty/graphite/src/gr_face.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #include "graphite2/Font.h" #include "inc/Face.h" #include "inc/FileFace.h" diff --git a/thirdparty/graphite/src/gr_features.cpp b/thirdparty/graphite/src/gr_features.cpp index a560e053f2..67208f14e6 100644 --- a/thirdparty/graphite/src/gr_features.cpp +++ b/thirdparty/graphite/src/gr_features.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #include "graphite2/Font.h" #include "inc/Face.h" #include "inc/FeatureMap.h" diff --git a/thirdparty/graphite/src/gr_font.cpp b/thirdparty/graphite/src/gr_font.cpp index 724cc83c13..fc85112e24 100644 --- a/thirdparty/graphite/src/gr_font.cpp +++ b/thirdparty/graphite/src/gr_font.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #include "graphite2/Font.h" #include "inc/Font.h" diff --git a/thirdparty/graphite/src/gr_logging.cpp b/thirdparty/graphite/src/gr_logging.cpp index 8f1e675e62..c6f03fd616 100644 --- a/thirdparty/graphite/src/gr_logging.cpp +++ b/thirdparty/graphite/src/gr_logging.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #include <cstdio> #include "graphite2/Log.h" diff --git a/thirdparty/graphite/src/gr_segment.cpp b/thirdparty/graphite/src/gr_segment.cpp index 7a27e9c562..7592296c04 100644 --- a/thirdparty/graphite/src/gr_segment.cpp +++ b/thirdparty/graphite/src/gr_segment.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #include "graphite2/Segment.h" #include "inc/UtfCodec.h" #include "inc/Segment.h" diff --git a/thirdparty/graphite/src/gr_slot.cpp b/thirdparty/graphite/src/gr_slot.cpp index a3c6b46a7f..a6adefec61 100644 --- a/thirdparty/graphite/src/gr_slot.cpp +++ b/thirdparty/graphite/src/gr_slot.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #include "graphite2/Segment.h" #include "inc/Segment.h" #include "inc/Slot.h" diff --git a/thirdparty/graphite/src/inc/CharInfo.h b/thirdparty/graphite/src/inc/CharInfo.h index 01e7e31ac9..0fbfefda4d 100644 --- a/thirdparty/graphite/src/inc/CharInfo.h +++ b/thirdparty/graphite/src/inc/CharInfo.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #pragma once #include "inc/Main.h" diff --git a/thirdparty/graphite/src/inc/CmapCache.h b/thirdparty/graphite/src/inc/CmapCache.h index 7820c958b0..b18ce2929b 100644 --- a/thirdparty/graphite/src/inc/CmapCache.h +++ b/thirdparty/graphite/src/inc/CmapCache.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #pragma once #include "inc/Main.h" diff --git a/thirdparty/graphite/src/inc/Code.h b/thirdparty/graphite/src/inc/Code.h index 3cee67c81d..24e92e429d 100644 --- a/thirdparty/graphite/src/inc/Code.h +++ b/thirdparty/graphite/src/inc/Code.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + // This class represents loaded graphite stack machine code. It performs // basic sanity checks, on the incoming code to prevent more obvious problems // from crashing graphite. diff --git a/thirdparty/graphite/src/inc/Collider.h b/thirdparty/graphite/src/inc/Collider.h index 71e8400501..3a922660d4 100644 --- a/thirdparty/graphite/src/inc/Collider.h +++ b/thirdparty/graphite/src/inc/Collider.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #pragma once #include "inc/List.h" diff --git a/thirdparty/graphite/src/inc/Compression.h b/thirdparty/graphite/src/inc/Compression.h index 9fe10e025d..4f5193b931 100644 --- a/thirdparty/graphite/src/inc/Compression.h +++ b/thirdparty/graphite/src/inc/Compression.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2015, SIL International, All rights reserved. - Copyright 2015, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #pragma once diff --git a/thirdparty/graphite/src/inc/Decompressor.h b/thirdparty/graphite/src/inc/Decompressor.h index 10f21b7af1..1113e004c1 100644 --- a/thirdparty/graphite/src/inc/Decompressor.h +++ b/thirdparty/graphite/src/inc/Decompressor.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2015, SIL International, All rights reserved. - Copyright 2015, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #pragma once diff --git a/thirdparty/graphite/src/inc/Endian.h b/thirdparty/graphite/src/inc/Endian.h index 56ecfd8667..7bd201f92b 100644 --- a/thirdparty/graphite/src/inc/Endian.h +++ b/thirdparty/graphite/src/inc/Endian.h @@ -1,30 +1,5 @@ -/* GRAPHITE2 LICENSING - - Copyright 2011, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ - +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2011, SIL International, All rights reserved. /* Description: A set of fast template based decoders for decoding values of any C integer diff --git a/thirdparty/graphite/src/inc/Error.h b/thirdparty/graphite/src/inc/Error.h index 2b7ab763a2..7e14c8e754 100644 --- a/thirdparty/graphite/src/inc/Error.h +++ b/thirdparty/graphite/src/inc/Error.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2013, SIL International, All rights reserved. - Copyright 2013, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #pragma once // numbers are explicitly assigned for future proofing @@ -38,7 +15,7 @@ public: operator bool() { return (_e != 0); } int error() { return _e; } void error(int e) { _e = e; } - bool test(bool pr, int err) { return (_e = int(pr) * err); } + bool test(bool pr, int err) { return (_e = pr ? err : 0); } private: int _e; @@ -56,7 +33,7 @@ enum errcontext { EC_ARULEMAP = 9 // in Silf %d, pass %d, state %d }; -enum errors { +enum error { E_OUTOFMEM = 1, // Out of memory E_NOGLYPHS = 2, // There are no glyphs in the font E_BADUPEM = 3, // The units per em for the font is bad (0) @@ -125,7 +102,7 @@ enum errors { E_BADJUMPCODE = 65, // Code jumps past end of op codes E_CODEBADARGS = 66, // Code arguments exhausted E_CODENORETURN = 67, // Missing return type op code at end of code - E_CODENESTEDCTXT = 68, // Nested context encountered in code + E_CODENESTEDCTXT = 68, // Nested context encountered in code // Compression errors E_BADSCHEME = 69, E_SHRINKERFAILED = 70, diff --git a/thirdparty/graphite/src/inc/Face.h b/thirdparty/graphite/src/inc/Face.h index 355c5aa0d3..fac7fd4b8e 100644 --- a/thirdparty/graphite/src/inc/Face.h +++ b/thirdparty/graphite/src/inc/Face.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #pragma once #include <cstdio> diff --git a/thirdparty/graphite/src/inc/FeatureMap.h b/thirdparty/graphite/src/inc/FeatureMap.h index 0f05e941a2..a98008f738 100644 --- a/thirdparty/graphite/src/inc/FeatureMap.h +++ b/thirdparty/graphite/src/inc/FeatureMap.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #pragma once #include "inc/Main.h" #include "inc/FeatureVal.h" diff --git a/thirdparty/graphite/src/inc/FeatureVal.h b/thirdparty/graphite/src/inc/FeatureVal.h index cd3f93b2b5..35397f0f3b 100644 --- a/thirdparty/graphite/src/inc/FeatureVal.h +++ b/thirdparty/graphite/src/inc/FeatureVal.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #pragma once #include <cstring> #include <cassert> diff --git a/thirdparty/graphite/src/inc/FileFace.h b/thirdparty/graphite/src/inc/FileFace.h index 35927847f8..521942ee85 100644 --- a/thirdparty/graphite/src/inc/FileFace.h +++ b/thirdparty/graphite/src/inc/FileFace.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2012, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2012, SIL International, All rights reserved. + #pragma once //#include "inc/FeatureMap.h" diff --git a/thirdparty/graphite/src/inc/Font.h b/thirdparty/graphite/src/inc/Font.h index 9bc9ffb510..537ad9de0e 100644 --- a/thirdparty/graphite/src/inc/Font.h +++ b/thirdparty/graphite/src/inc/Font.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #pragma once #include <cassert> #include "graphite2/Font.h" diff --git a/thirdparty/graphite/src/inc/GlyphCache.h b/thirdparty/graphite/src/inc/GlyphCache.h index 7d5324e522..5f6d3eea18 100644 --- a/thirdparty/graphite/src/inc/GlyphCache.h +++ b/thirdparty/graphite/src/inc/GlyphCache.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2012, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2012, SIL International, All rights reserved. + #pragma once diff --git a/thirdparty/graphite/src/inc/GlyphFace.h b/thirdparty/graphite/src/inc/GlyphFace.h index fc29056146..f964c0581a 100644 --- a/thirdparty/graphite/src/inc/GlyphFace.h +++ b/thirdparty/graphite/src/inc/GlyphFace.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #pragma once #include "inc/Main.h" diff --git a/thirdparty/graphite/src/inc/Intervals.h b/thirdparty/graphite/src/inc/Intervals.h index 81d23187b6..15427d428a 100644 --- a/thirdparty/graphite/src/inc/Intervals.h +++ b/thirdparty/graphite/src/inc/Intervals.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #pragma once #include <utility> diff --git a/thirdparty/graphite/src/inc/List.h b/thirdparty/graphite/src/inc/List.h index a3b7a77961..3a36c17a7a 100644 --- a/thirdparty/graphite/src/inc/List.h +++ b/thirdparty/graphite/src/inc/List.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + // designed to have a limited subset of the std::vector api #pragma once diff --git a/thirdparty/graphite/src/inc/Machine.h b/thirdparty/graphite/src/inc/Machine.h index b23819fb98..5ceedc296d 100644 --- a/thirdparty/graphite/src/inc/Machine.h +++ b/thirdparty/graphite/src/inc/Machine.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + // This general interpreter interface. // Author: Tim Eves diff --git a/thirdparty/graphite/src/inc/Main.h b/thirdparty/graphite/src/inc/Main.h index ebf02dd553..6a412efeca 100644 --- a/thirdparty/graphite/src/inc/Main.h +++ b/thirdparty/graphite/src/inc/Main.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #pragma once #include <cstdlib> diff --git a/thirdparty/graphite/src/inc/NameTable.h b/thirdparty/graphite/src/inc/NameTable.h index 0fdbeb4d85..5a7913ddc5 100644 --- a/thirdparty/graphite/src/inc/NameTable.h +++ b/thirdparty/graphite/src/inc/NameTable.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #pragma once #include <graphite2/Segment.h> diff --git a/thirdparty/graphite/src/inc/Pass.h b/thirdparty/graphite/src/inc/Pass.h index e687a87d8c..fb507e6a04 100644 --- a/thirdparty/graphite/src/inc/Pass.h +++ b/thirdparty/graphite/src/inc/Pass.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #pragma once #include <cstdlib> diff --git a/thirdparty/graphite/src/inc/Position.h b/thirdparty/graphite/src/inc/Position.h index 510e4f4c41..554acc411e 100644 --- a/thirdparty/graphite/src/inc/Position.h +++ b/thirdparty/graphite/src/inc/Position.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #pragma once namespace graphite2 { diff --git a/thirdparty/graphite/src/inc/Rule.h b/thirdparty/graphite/src/inc/Rule.h index 5964e003a6..09025dc799 100644 --- a/thirdparty/graphite/src/inc/Rule.h +++ b/thirdparty/graphite/src/inc/Rule.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2011, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2011, SIL International, All rights reserved. + #pragma once diff --git a/thirdparty/graphite/src/inc/Segment.h b/thirdparty/graphite/src/inc/Segment.h index 6cf83408d4..a3a8eef648 100644 --- a/thirdparty/graphite/src/inc/Segment.h +++ b/thirdparty/graphite/src/inc/Segment.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #pragma once #include "inc/Main.h" diff --git a/thirdparty/graphite/src/inc/Silf.h b/thirdparty/graphite/src/inc/Silf.h index edc0c3a16d..6fe2aaef1f 100644 --- a/thirdparty/graphite/src/inc/Silf.h +++ b/thirdparty/graphite/src/inc/Silf.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #pragma once #include "graphite2/Font.h" diff --git a/thirdparty/graphite/src/inc/Slot.h b/thirdparty/graphite/src/inc/Slot.h index df39d9a3bb..0d8571d336 100644 --- a/thirdparty/graphite/src/inc/Slot.h +++ b/thirdparty/graphite/src/inc/Slot.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #pragma once #include "graphite2/Types.h" diff --git a/thirdparty/graphite/src/inc/Sparse.h b/thirdparty/graphite/src/inc/Sparse.h index fcda890171..3c5d33ae5d 100644 --- a/thirdparty/graphite/src/inc/Sparse.h +++ b/thirdparty/graphite/src/inc/Sparse.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2011, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2011, SIL International, All rights reserved. + #pragma once #include <iterator> #include <utility> diff --git a/thirdparty/graphite/src/inc/TtfTypes.h b/thirdparty/graphite/src/inc/TtfTypes.h index ae67915304..e4fd49f943 100644 --- a/thirdparty/graphite/src/inc/TtfTypes.h +++ b/thirdparty/graphite/src/inc/TtfTypes.h @@ -1,39 +1,14 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ -#pragma once -/*--------------------------------------------------------------------*//*:Ignore this sentence. +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. -File: TtfTypes.h +#pragma once +/* Responsibility: Tim Eves Last reviewed: Not yet. Description: Provides types required to represent the TTF basic types. --------------------------------------------------------------------------------*//*:End Ignore*/ +*/ //********************************************************************************************** diff --git a/thirdparty/graphite/src/inc/TtfUtil.h b/thirdparty/graphite/src/inc/TtfUtil.h index 3952bc06fb..1ccab42fb8 100644 --- a/thirdparty/graphite/src/inc/TtfUtil.h +++ b/thirdparty/graphite/src/inc/TtfUtil.h @@ -1,39 +1,13 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ -#pragma once -/*--------------------------------------------------------------------*//*:Ignore this sentence. - -File: TtfUtil.h +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. +/* Responsibility: Alan Ward Last reviewed: Not yet. Description: Utility class for handling TrueType font files. -----------------------------------------------------------------------------------------------*/ +*/ +#pragma once #include <cstddef> diff --git a/thirdparty/graphite/src/inc/UtfCodec.h b/thirdparty/graphite/src/inc/UtfCodec.h index 24a343d8d9..bab652c119 100644 --- a/thirdparty/graphite/src/inc/UtfCodec.h +++ b/thirdparty/graphite/src/inc/UtfCodec.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2011, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2011, SIL International, All rights reserved. + #pragma once #include <cstdlib> diff --git a/thirdparty/graphite/src/inc/bits.h b/thirdparty/graphite/src/inc/bits.h index 9365986a10..168ff256d3 100644 --- a/thirdparty/graphite/src/inc/bits.h +++ b/thirdparty/graphite/src/inc/bits.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2012, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2012, SIL International, All rights reserved. + #pragma once namespace graphite2 diff --git a/thirdparty/graphite/src/inc/debug.h b/thirdparty/graphite/src/inc/debug.h index 97175eb2cc..5b9c63872b 100644 --- a/thirdparty/graphite/src/inc/debug.h +++ b/thirdparty/graphite/src/inc/debug.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2011, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2011, SIL International, All rights reserved. + // debug.h // // Created on: 22 Dec 2011 diff --git a/thirdparty/graphite/src/inc/json.h b/thirdparty/graphite/src/inc/json.h index 554cd9a3d1..72011ef198 100644 --- a/thirdparty/graphite/src/inc/json.h +++ b/thirdparty/graphite/src/inc/json.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2011, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2011, SIL International, All rights reserved. + // JSON pretty printer for graphite font debug output logging. // Created on: 15 Dec 2011 // Author: Tim Eves diff --git a/thirdparty/graphite/src/inc/locale2lcid.h b/thirdparty/graphite/src/inc/locale2lcid.h index 25d5c0a3c8..e591c42b28 100644 --- a/thirdparty/graphite/src/inc/locale2lcid.h +++ b/thirdparty/graphite/src/inc/locale2lcid.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ #pragma once #include <cstring> #include <cassert> diff --git a/thirdparty/graphite/src/inc/opcode_table.h b/thirdparty/graphite/src/inc/opcode_table.h index cb5acde9a4..01a84831bc 100644 --- a/thirdparty/graphite/src/inc/opcode_table.h +++ b/thirdparty/graphite/src/inc/opcode_table.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ // This file will be pulled into and integrated into a machine implmentation // DO NOT build directly #pragma once diff --git a/thirdparty/graphite/src/inc/opcodes.h b/thirdparty/graphite/src/inc/opcodes.h index ff2f1741e2..10ba177229 100644 --- a/thirdparty/graphite/src/inc/opcodes.h +++ b/thirdparty/graphite/src/inc/opcodes.h @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2010, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2010, SIL International, All rights reserved. + #pragma once // This file will be pulled into and integrated into a machine implmentation // DO NOT build directly and under no circumstances ever #include headers in diff --git a/thirdparty/graphite/src/json.cpp b/thirdparty/graphite/src/json.cpp index 25f2190f71..7990654eb8 100644 --- a/thirdparty/graphite/src/json.cpp +++ b/thirdparty/graphite/src/json.cpp @@ -1,29 +1,6 @@ -/* GRAPHITE2 LICENSING - - Copyright 2011, SIL International - All rights reserved. - - This library is free software; you can redistribute it and/or modify - it under the terms of the GNU Lesser General Public License as published - by the Free Software Foundation; either version 2.1 of License, or - (at your option) any later version. - - This program is distributed in the hope that it will be useful, - but WITHOUT ANY WARRANTY; without even the implied warranty of - MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU - Lesser General Public License for more details. - - You should also have received a copy of the GNU Lesser General Public - License along with this library in the file named "LICENSE". - If not, write to the Free Software Foundation, 51 Franklin Street, - Suite 500, Boston, MA 02110-1335, USA or visit their web page on the - internet at http://www.fsf.org/licenses/lgpl.html. - -Alternatively, the contents of this file may be used under the terms of the -Mozilla Public License (http://mozilla.org/MPL) or the GNU General Public -License, as published by the Free Software Foundation, either version 2 -of the License or (at your option) any later version. -*/ +// SPDX-License-Identifier: MIT OR MPL-2.0 OR LGPL-2.1-or-later OR GPL-2.0-or-later +// Copyright 2011, SIL International, All rights reserved. + // JSON debug logging // Author: Tim Eves diff --git a/thirdparty/harfbuzz/src/OT/Layout/Common/Coverage.hh b/thirdparty/harfbuzz/src/OT/Layout/Common/Coverage.hh index eef89a2879..fbd7c642ab 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/Common/Coverage.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/Common/Coverage.hh @@ -49,7 +49,7 @@ struct Coverage HBUINT16 format; /* Format identifier */ CoverageFormat1_3<SmallTypes> format1; CoverageFormat2_4<SmallTypes> format2; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K CoverageFormat1_3<MediumTypes>format3; CoverageFormat2_4<MediumTypes>format4; #endif @@ -65,7 +65,7 @@ struct Coverage { case 1: return_trace (u.format1.sanitize (c)); case 2: return_trace (u.format2.sanitize (c)); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: return_trace (u.format3.sanitize (c)); case 4: return_trace (u.format4.sanitize (c)); #endif @@ -74,10 +74,8 @@ struct Coverage } /* Has interface. */ - static constexpr unsigned SENTINEL = NOT_COVERED; - typedef unsigned int value_t; - value_t operator [] (hb_codepoint_t k) const { return get (k); } - bool has (hb_codepoint_t k) const { return (*this)[k] != SENTINEL; } + unsigned operator [] (hb_codepoint_t k) const { return get (k); } + bool has (hb_codepoint_t k) const { return (*this)[k] != NOT_COVERED; } /* Predicate. */ bool operator () (hb_codepoint_t k) const { return has (k); } @@ -87,7 +85,7 @@ struct Coverage switch (u.format) { case 1: return u.format1.get_coverage (glyph_id); case 2: return u.format2.get_coverage (glyph_id); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: return u.format3.get_coverage (glyph_id); case 4: return u.format4.get_coverage (glyph_id); #endif @@ -100,7 +98,7 @@ struct Coverage switch (u.format) { case 1: return u.format1.get_population (); case 2: return u.format2.get_population (); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: return u.format3.get_population (); case 4: return u.format4.get_population (); #endif @@ -127,7 +125,7 @@ struct Coverage } u.format = count <= num_ranges * 3 ? 1 : 2; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K if (count && last > 0xFFFFu) u.format += 2; #endif @@ -136,7 +134,7 @@ struct Coverage { case 1: return_trace (u.format1.serialize (c, glyphs)); case 2: return_trace (u.format2.serialize (c, glyphs)); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: return_trace (u.format3.serialize (c, glyphs)); case 4: return_trace (u.format4.serialize (c, glyphs)); #endif @@ -166,7 +164,7 @@ struct Coverage { case 1: return u.format1.intersects (glyphs); case 2: return u.format2.intersects (glyphs); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: return u.format3.intersects (glyphs); case 4: return u.format4.intersects (glyphs); #endif @@ -179,7 +177,7 @@ struct Coverage { case 1: return u.format1.intersects_coverage (glyphs, index); case 2: return u.format2.intersects_coverage (glyphs, index); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: return u.format3.intersects_coverage (glyphs, index); case 4: return u.format4.intersects_coverage (glyphs, index); #endif @@ -196,7 +194,7 @@ struct Coverage { case 1: return u.format1.collect_coverage (glyphs); case 2: return u.format2.collect_coverage (glyphs); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: return u.format3.collect_coverage (glyphs); case 4: return u.format4.collect_coverage (glyphs); #endif @@ -212,7 +210,7 @@ struct Coverage { case 1: return u.format1.intersect_set (glyphs, intersect_glyphs); case 2: return u.format2.intersect_set (glyphs, intersect_glyphs); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: return u.format3.intersect_set (glyphs, intersect_glyphs); case 4: return u.format4.intersect_set (glyphs, intersect_glyphs); #endif @@ -225,13 +223,13 @@ struct Coverage static constexpr bool is_sorted_iterator = true; iter_t (const Coverage &c_ = Null (Coverage)) { - memset (this, 0, sizeof (*this)); + hb_memset (this, 0, sizeof (*this)); format = c_.u.format; switch (format) { case 1: u.format1.init (c_.u.format1); return; case 2: u.format2.init (c_.u.format2); return; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: u.format3.init (c_.u.format3); return; case 4: u.format4.init (c_.u.format4); return; #endif @@ -244,7 +242,7 @@ struct Coverage { case 1: return u.format1.__more__ (); case 2: return u.format2.__more__ (); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: return u.format3.__more__ (); case 4: return u.format4.__more__ (); #endif @@ -257,7 +255,7 @@ struct Coverage { case 1: u.format1.__next__ (); break; case 2: u.format2.__next__ (); break; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: u.format3.__next__ (); break; case 4: u.format4.__next__ (); break; #endif @@ -273,7 +271,7 @@ struct Coverage { case 1: return u.format1.get_glyph (); case 2: return u.format2.get_glyph (); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: return u.format3.get_glyph (); case 4: return u.format4.get_glyph (); #endif @@ -287,7 +285,7 @@ struct Coverage { case 1: return u.format1 != o.u.format1; case 2: return u.format2 != o.u.format2; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: return u.format3 != o.u.format3; case 4: return u.format4 != o.u.format4; #endif @@ -302,7 +300,7 @@ struct Coverage { case 1: it.u.format1 = u.format1.__end__ (); break; case 2: it.u.format2 = u.format2.__end__ (); break; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: it.u.format3 = u.format3.__end__ (); break; case 4: it.u.format4 = u.format4.__end__ (); break; #endif @@ -314,7 +312,7 @@ struct Coverage private: unsigned int format; union { -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K CoverageFormat2_4<MediumTypes>::iter_t format4; /* Put this one first since it's larger; helps shut up compiler. */ CoverageFormat1_3<MediumTypes>::iter_t format3; #endif diff --git a/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat1.hh index 82fd48dc50..5d68e3d15e 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat1.hh @@ -77,7 +77,14 @@ struct CoverageFormat1_3 bool intersects (const hb_set_t *glyphs) const { - /* TODO Speed up, using hb_set_next() and bsearch()? */ + if (glyphArray.len > glyphs->get_population () * hb_bit_storage ((unsigned) glyphArray.len) / 2) + { + for (hb_codepoint_t g = HB_SET_VALUE_INVALID; glyphs->next (&g);) + if (get_coverage (g) != NOT_COVERED) + return true; + return false; + } + for (const auto& g : glyphArray.as_array ()) if (glyphs->has (g)) return true; diff --git a/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat2.hh b/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat2.hh index 974d094633..d7fcc35202 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat2.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/Common/CoverageFormat2.hh @@ -80,8 +80,6 @@ struct CoverageFormat2_4 TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (this))) return_trace (false); - /* TODO(iter) Write more efficiently? */ - unsigned num_ranges = 0; hb_codepoint_t last = (hb_codepoint_t) -2; for (auto g: glyphs) @@ -115,26 +113,22 @@ struct CoverageFormat2_4 bool intersects (const hb_set_t *glyphs) const { + if (rangeRecord.len > glyphs->get_population () * hb_bit_storage ((unsigned) rangeRecord.len) / 2) + { + for (hb_codepoint_t g = HB_SET_VALUE_INVALID; glyphs->next (&g);) + if (get_coverage (g) != NOT_COVERED) + return true; + return false; + } + return hb_any (+ hb_iter (rangeRecord) | hb_map ([glyphs] (const RangeRecord<Types> &range) { return range.intersects (*glyphs); })); } bool intersects_coverage (const hb_set_t *glyphs, unsigned int index) const { - auto cmp = [] (const void *pk, const void *pr) -> int - { - unsigned index = * (const unsigned *) pk; - const RangeRecord<Types> &range = * (const RangeRecord<Types> *) pr; - if (index < range.value) return -1; - if (index > (unsigned int) range.value + (range.last - range.first)) return +1; - return 0; - }; - - auto arr = rangeRecord.as_array (); - unsigned idx; - if (hb_bsearch_impl (&idx, index, - arr.arrayZ, arr.length, sizeof (arr[0]), - (int (*)(const void *_key, const void *_item)) cmp)) - return arr.arrayZ[idx].intersects (*glyphs); + auto *range = rangeRecord.as_array ().bsearch (index); + if (range) + return range->intersects (*glyphs); return false; } @@ -142,9 +136,14 @@ struct CoverageFormat2_4 hb_requires (hb_is_sink_of (IterableOut, hb_codepoint_t))> void intersect_set (const hb_set_t &glyphs, IterableOut&& intersect_glyphs) const { + /* Break out of loop for overlapping, broken, tables, + * to avoid fuzzer timouts. */ + hb_codepoint_t last = 0; for (const auto& range : rangeRecord) { - hb_codepoint_t last = range.last; + if (unlikely (range.first < last)) + break; + last = range.last; for (hb_codepoint_t g = range.first - 1; glyphs.next (&g) && g <= last;) intersect_glyphs << g; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkBasePos.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkBasePos.hh index c99b6b2e4b..edf7099c07 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkBasePos.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkBasePos.hh @@ -13,7 +13,7 @@ struct MarkBasePos union { HBUINT16 format; /* Format identifier */ MarkBasePosFormat1_2<SmallTypes> format1; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K MarkBasePosFormat1_2<MediumTypes> format2; #endif } u; @@ -26,7 +26,7 @@ struct MarkBasePos if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...)); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...)); #endif default:return_trace (c->default_return_value ()); diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkLigPos.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkLigPos.hh index 8a4de9ffaa..09152fd876 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkLigPos.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkLigPos.hh @@ -13,7 +13,7 @@ struct MarkLigPos union { HBUINT16 format; /* Format identifier */ MarkLigPosFormat1_2<SmallTypes> format1; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K MarkLigPosFormat1_2<MediumTypes> format2; #endif } u; @@ -26,7 +26,7 @@ struct MarkLigPos if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...)); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...)); #endif default:return_trace (c->default_return_value ()); diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkMarkPos.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkMarkPos.hh index 74b5105c42..4118fc304f 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkMarkPos.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/MarkMarkPos.hh @@ -13,7 +13,7 @@ struct MarkMarkPos union { HBUINT16 format; /* Format identifier */ MarkMarkPosFormat1_2<SmallTypes> format1; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K MarkMarkPosFormat1_2<MediumTypes> format2; #endif } u; @@ -26,7 +26,7 @@ struct MarkMarkPos if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...)); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...)); #endif default:return_trace (c->default_return_value ()); diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPos.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPos.hh index 72bfc43dc4..9823768cbc 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPos.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPos.hh @@ -15,7 +15,7 @@ struct PairPos HBUINT16 format; /* Format identifier */ PairPosFormat1_3<SmallTypes> format1; PairPosFormat2_4<SmallTypes> format2; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K PairPosFormat1_3<MediumTypes> format3; PairPosFormat2_4<MediumTypes> format4; #endif @@ -30,7 +30,7 @@ struct PairPos switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...)); case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...)); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...)); case 4: return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...)); #endif diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat1.hh index ddf7313f94..9c9b268889 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat1.hh @@ -51,8 +51,21 @@ struct PairPosFormat1_3 bool intersects (const hb_set_t *glyphs) const { + auto &cov = this+coverage; + + if (pairSet.len > glyphs->get_population () * hb_bit_storage ((unsigned) pairSet.len) / 4) + { + for (hb_codepoint_t g = HB_SET_VALUE_INVALID; glyphs->next (&g);) + { + unsigned i = cov.get_coverage (g); + if ((this+pairSet[i]).intersects (glyphs, valueFormat)) + return true; + } + return false; + } + return - + hb_zip (this+coverage, pairSet) + + hb_zip (cov, pairSet) | hb_filter (*glyphs, hb_first) | hb_map (hb_second) | hb_map ([glyphs, this] (const typename Types::template OffsetTo<PairSet> &_) @@ -171,12 +184,16 @@ struct PairPosFormat1_3 unsigned format1 = 0; unsigned format2 = 0; for (const auto & _ : - + hb_zip (this+coverage, pairSet) | hb_filter (glyphset, hb_first) | hb_map (hb_second)) + + hb_zip (this+coverage, pairSet) + | hb_filter (glyphset, hb_first) + | hb_map (hb_second) + ) { const PairSet& set = (this + _); const PairValueRecord *record = &set.firstPairValueRecord; - for (unsigned i = 0; i < set.len; i++) + unsigned count = set.len; + for (unsigned i = 0; i < count; i++) { if (record->intersects (glyphset)) { @@ -185,6 +202,9 @@ struct PairPosFormat1_3 } record = &StructAtOffset<const PairValueRecord> (record, record_size); } + + if (format1 == valueFormat[0] && format2 == valueFormat[1]) + break; } return hb_pair (format1, format2); diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh index 83b093b988..9c87ac2b03 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairPosFormat2.hh @@ -220,17 +220,25 @@ struct PairPosFormat2_4 if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) { c->buffer->message (c->font, - "kerning glyphs at %d,%d", + "try kerning glyphs at %d,%d", c->buffer->idx, skippy_iter.idx); } applied_first = valueFormat1.apply_value (c, this, v, buffer->cur_pos()); applied_second = valueFormat2.apply_value (c, this, v + len1, buffer->pos[skippy_iter.idx]); + if (applied_first || applied_second) + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "kerned glyphs at %d,%d", + c->buffer->idx, skippy_iter.idx); + } + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) { c->buffer->message (c->font, - "kerned glyphs at %d,%d", + "tried kerning glyphs at %d,%d", c->buffer->idx, skippy_iter.idx); } @@ -241,10 +249,15 @@ struct PairPosFormat2_4 boring: buffer->unsafe_to_concat (buffer->idx, skippy_iter.idx + 1); + if (len2) + { + skippy_iter.idx++; + // https://github.com/harfbuzz/harfbuzz/issues/3824 + // https://github.com/harfbuzz/harfbuzz/issues/3888#issuecomment-1326781116 + buffer->unsafe_to_break (buffer->idx, skippy_iter.idx + 1); + } buffer->idx = skippy_iter.idx; - if (len2) - buffer->idx++; return_trace (true); } @@ -309,6 +322,7 @@ struct PairPosFormat2_4 { unsigned len1 = valueFormat1.get_len (); unsigned len2 = valueFormat2.get_len (); + unsigned record_size = len1 + len2; unsigned format1 = 0; unsigned format2 = 0; @@ -317,10 +331,13 @@ struct PairPosFormat2_4 { for (unsigned class2_idx : + hb_range ((unsigned) class2Count) | hb_filter (klass2_map)) { - unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * (len1 + len2); + unsigned idx = (class1_idx * (unsigned) class2Count + class2_idx) * record_size; format1 = format1 | valueFormat1.get_effective_format (&values[idx]); format2 = format2 | valueFormat2.get_effective_format (&values[idx + len1]); } + + if (format1 == valueFormat1 && format2 == valueFormat2) + break; } return hb_pair (format1, format2); diff --git a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh index aa48d933c3..a318f39913 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GPOS/PairSet.hh @@ -112,24 +112,38 @@ struct PairSet if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) { c->buffer->message (c->font, - "kerning glyphs at %d,%d", + "try kerning glyphs at %d,%d", c->buffer->idx, pos); } bool applied_first = valueFormats[0].apply_value (c, this, &record->values[0], buffer->cur_pos()); bool applied_second = valueFormats[1].apply_value (c, this, &record->values[len1], buffer->pos[pos]); + if (applied_first || applied_second) + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) + { + c->buffer->message (c->font, + "kerned glyphs at %d,%d", + c->buffer->idx, pos); + } + if (HB_BUFFER_MESSAGE_MORE && c->buffer->messaging ()) { c->buffer->message (c->font, - "kerned glyphs at %d,%d", + "tried kerning glyphs at %d,%d", c->buffer->idx, pos); } if (applied_first || applied_second) buffer->unsafe_to_break (buffer->idx, pos + 1); + if (len2) - pos++; + { + pos++; + // https://github.com/harfbuzz/harfbuzz/issues/3824 + // https://github.com/harfbuzz/harfbuzz/issues/3888#issuecomment-1326781116 + buffer->unsafe_to_break (buffer->idx, pos + 1); + } buffer->idx = pos; return_trace (true); diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/AlternateSet.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/AlternateSet.hh index 4a9e9672eb..6c50c9717a 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/AlternateSet.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/AlternateSet.hh @@ -84,7 +84,7 @@ struct AlternateSet { if (alternates.len && alternate_count) { - + alternates.sub_array (start_offset, alternate_count) + + alternates.as_array ().sub_array (start_offset, alternate_count) | hb_sink (hb_array (alternate_glyphs, *alternate_count)) ; } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/AlternateSubst.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/AlternateSubst.hh index 37406179a2..9d7cd6fddf 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/AlternateSubst.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/AlternateSubst.hh @@ -14,7 +14,7 @@ struct AlternateSubst union { HBUINT16 format; /* Format identifier */ AlternateSubstFormat1_2<SmallTypes> format1; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K AlternateSubstFormat1_2<MediumTypes> format2; #endif } u; @@ -27,7 +27,7 @@ struct AlternateSubst if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...)); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...)); #endif default:return_trace (c->default_return_value ()); diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/Ligature.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/Ligature.hh index 6caa80e056..cdb35f525b 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/Ligature.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/Ligature.hh @@ -118,7 +118,7 @@ struct Ligature match_positions[i] += delta; if (i) *p++ = ','; - snprintf (p, sizeof(buf), "%u", match_positions[i]); + snprintf (p, sizeof(buf) - (p - buf), "%u", match_positions[i]); p += strlen(p); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/LigatureSubst.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/LigatureSubst.hh index 63707972a8..7ba19e844c 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/LigatureSubst.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/LigatureSubst.hh @@ -14,7 +14,7 @@ struct LigatureSubst union { HBUINT16 format; /* Format identifier */ LigatureSubstFormat1_2<SmallTypes> format1; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K LigatureSubstFormat1_2<MediumTypes> format2; #endif } u; @@ -27,7 +27,7 @@ struct LigatureSubst if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...)); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...)); #endif default:return_trace (c->default_return_value ()); diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubst.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubst.hh index 852ca3eac5..95710ed2be 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubst.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/MultipleSubst.hh @@ -14,7 +14,7 @@ struct MultipleSubst union { HBUINT16 format; /* Format identifier */ MultipleSubstFormat1_2<SmallTypes> format1; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K MultipleSubstFormat1_2<MediumTypes> format2; #endif } u; @@ -28,7 +28,7 @@ struct MultipleSubst if (unlikely (!c->may_dispatch (this, &u.format))) return_trace (c->no_dispatch_return_value ()); switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...)); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...)); #endif default:return_trace (c->default_return_value ()); diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/Sequence.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/Sequence.hh index abf1c643ff..e2190078b8 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/Sequence.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/Sequence.hh @@ -117,7 +117,7 @@ struct Sequence { if (buf < p) *p++ = ','; - snprintf (p, sizeof(buf), "%u", i); + snprintf (p, sizeof(buf) - (p - buf), "%u", i); p += strlen(p); } diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubst.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubst.hh index 6942e6997f..7da8103168 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubst.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubst.hh @@ -16,7 +16,7 @@ struct SingleSubst HBUINT16 format; /* Format identifier */ SingleSubstFormat1_3<SmallTypes> format1; SingleSubstFormat2_4<SmallTypes> format2; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K SingleSubstFormat1_3<MediumTypes> format3; SingleSubstFormat2_4<MediumTypes> format4; #endif @@ -32,7 +32,7 @@ struct SingleSubst switch (u.format) { case 1: return_trace (c->dispatch (u.format1, std::forward<Ts> (ds)...)); case 2: return_trace (c->dispatch (u.format2, std::forward<Ts> (ds)...)); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: return_trace (c->dispatch (u.format3, std::forward<Ts> (ds)...)); case 4: return_trace (c->dispatch (u.format4, std::forward<Ts> (ds)...)); #endif @@ -55,7 +55,7 @@ struct SingleSubst format = 1; hb_codepoint_t mask = 0xFFFFu; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K if (+ glyphs | hb_map_retains_sorting (hb_first) | hb_filter ([] (hb_codepoint_t gid) { return gid > 0xFFFFu; })) @@ -78,7 +78,7 @@ struct SingleSubst | hb_map_retains_sorting (hb_first), delta)); case 2: return_trace (u.format2.serialize (c, glyphs)); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: return_trace (u.format3.serialize (c, + glyphs | hb_map_retains_sorting (hb_first), diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh index 13665d7ba1..1be21b98bc 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat1.hh @@ -57,7 +57,7 @@ struct SingleSubstFormat1_3 hb_codepoint_t max_before = intersection.get_max (); hb_codepoint_t min_after = (min_before + d) & mask; hb_codepoint_t max_after = (max_before + d) & mask; - if (pop >= max_before - min_before && + if (intersection.get_population () == max_before - min_before + 1 && ((min_before <= min_after && min_after <= max_before) || (min_before <= max_after && max_after <= max_before))) return; diff --git a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh index 5416299754..01df714525 100644 --- a/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh +++ b/thirdparty/harfbuzz/src/OT/Layout/GSUB/SingleSubstFormat2.hh @@ -36,8 +36,24 @@ struct SingleSubstFormat2_4 void closure (hb_closure_context_t *c) const { - + hb_zip (this+coverage, substitute) - | hb_filter (c->parent_active_glyphs (), hb_first) + auto &cov = this+coverage; + auto &glyph_set = c->parent_active_glyphs (); + + if (substitute.len > glyph_set.get_population () * 4) + { + for (auto g : glyph_set) + { + unsigned i = cov.get_coverage (g); + if (i == NOT_COVERED || i >= substitute.len) + continue; + c->output->add (substitute.arrayZ[i]); + } + + return; + } + + + hb_zip (cov, substitute) + | hb_filter (glyph_set, hb_first) | hb_map (hb_second) | hb_sink (c->output) ; diff --git a/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh b/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh index fc8e309bc9..edf8cd8797 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/CompositeGlyph.hh @@ -3,6 +3,7 @@ #include "../../hb-open-type.hh" +#include "composite-iter.hh" namespace OT { @@ -121,7 +122,7 @@ struct CompositeGlyphRecord if (flags & ARG_1_AND_2_ARE_WORDS) { // no overflow, copy and update value with deltas - memcpy (out, this, len); + hb_memcpy (out, this, len); const HBINT16 *px = reinterpret_cast<const HBINT16 *> (p); HBINT16 *o = reinterpret_cast<HBINT16 *> (out + len_before_val); @@ -135,7 +136,7 @@ struct CompositeGlyphRecord if (new_x <= 127 && new_x >= -128 && new_y <= 127 && new_y >= -128) { - memcpy (out, this, len); + hb_memcpy (out, this, len); HBINT8 *o = reinterpret_cast<HBINT8 *> (out + len_before_val); o[0] = new_x; o[1] = new_y; @@ -143,7 +144,7 @@ struct CompositeGlyphRecord else { // int8 overflows after deltas applied - memcpy (out, this, len_before_val); + hb_memcpy (out, this, len_before_val); //update flags CompositeGlyphRecord *o = reinterpret_cast<CompositeGlyphRecord *> (out); @@ -152,14 +153,14 @@ struct CompositeGlyphRecord HBINT16 new_value; new_value = new_x; - memcpy (out, &new_value, HBINT16::static_size); + hb_memcpy (out, &new_value, HBINT16::static_size); out += HBINT16::static_size; new_value = new_y; - memcpy (out, &new_value, HBINT16::static_size); + hb_memcpy (out, &new_value, HBINT16::static_size); out += HBINT16::static_size; - memcpy (out, p+2, len - len_before_val - 2); + hb_memcpy (out, p+2, len - len_before_val - 2); len += 2; } } @@ -252,55 +253,7 @@ struct CompositeGlyphRecord DEFINE_SIZE_MIN (4); }; -struct composite_iter_t : hb_iter_with_fallback_t<composite_iter_t, const CompositeGlyphRecord &> -{ - typedef const CompositeGlyphRecord *__item_t__; - composite_iter_t (hb_bytes_t glyph_, __item_t__ current_) : - glyph (glyph_), current (nullptr), current_size (0) - { - set_current (current_); - } - - composite_iter_t () : glyph (hb_bytes_t ()), current (nullptr), current_size (0) {} - - item_t __item__ () const { return *current; } - bool __more__ () const { return current; } - void __next__ () - { - if (!current->has_more ()) { current = nullptr; return; } - - set_current (&StructAtOffset<CompositeGlyphRecord> (current, current_size)); - } - composite_iter_t __end__ () const { return composite_iter_t (); } - bool operator != (const composite_iter_t& o) const - { return current != o.current; } - - - void set_current (__item_t__ current_) - { - if (!glyph.check_range (current_, CompositeGlyphRecord::min_size)) - { - current = nullptr; - current_size = 0; - return; - } - unsigned size = current_->get_size (); - if (!glyph.check_range (current_, size)) - { - current = nullptr; - current_size = 0; - return; - } - - current = current_; - current_size = size; - } - - private: - hb_bytes_t glyph; - __item_t__ current; - unsigned current_size; -}; +using composite_iter_t = composite_iter_tmpl<CompositeGlyphRecord>; struct CompositeGlyph { @@ -382,7 +335,7 @@ struct CompositeGlyph unsigned comp_len = component.get_size (); if (component.is_anchored ()) { - memcpy (p, &component, comp_len); + hb_memcpy (p, &component, comp_len); p += comp_len; } else @@ -398,7 +351,7 @@ struct CompositeGlyph if (source_len > source_comp_len) { unsigned instr_len = source_len - source_comp_len; - memcpy (p, (const char *)c + source_comp_len, instr_len); + hb_memcpy (p, (const char *)c + source_comp_len, instr_len); p += instr_len; } diff --git a/thirdparty/harfbuzz/src/OT/glyf/Glyph.hh b/thirdparty/harfbuzz/src/OT/glyf/Glyph.hh index 0b25659acc..b7215b0170 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/Glyph.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/Glyph.hh @@ -7,6 +7,8 @@ #include "GlyphHeader.hh" #include "SimpleGlyph.hh" #include "CompositeGlyph.hh" +#include "VarCompositeGlyph.hh" +#include "coord-setter.hh" namespace OT { @@ -16,6 +18,11 @@ struct glyf_accelerator_t; namespace glyf_impl { +#ifndef HB_GLYF_MAX_POINTS +#define HB_GLYF_MAX_POINTS 10000 +#endif + + enum phantom_point_index_t { PHANTOM_LEFT = 0, @@ -27,7 +34,7 @@ enum phantom_point_index_t struct Glyph { - enum glyph_type_t { EMPTY, SIMPLE, COMPOSITE }; + enum glyph_type_t { EMPTY, SIMPLE, COMPOSITE, VAR_COMPOSITE }; public: composite_iter_t get_composite_iterator () const @@ -35,6 +42,11 @@ struct Glyph if (type != COMPOSITE) return composite_iter_t (); return CompositeGlyph (*header, bytes).iter (); } + var_composite_iter_t get_var_composite_iterator () const + { + if (type != VAR_COMPOSITE) return var_composite_iter_t (); + return VarCompositeGlyph (*header, bytes).iter (); + } const hb_bytes_t trim_padding () const { @@ -108,25 +120,25 @@ struct Glyph if (unlikely (!glyph_header)) return false; } - int xMin = 0, xMax = 0; - int yMin = 0, yMax = 0; + float xMin = 0, xMax = 0; + float yMin = 0, yMax = 0; if (all_points.length > 4) { - xMin = xMax = roundf (all_points[0].x); - yMin = yMax = roundf (all_points[0].y); + xMin = xMax = all_points[0].x; + yMin = yMax = all_points[0].y; } for (unsigned i = 1; i < all_points.length - 4; i++) { - float rounded_x = roundf (all_points[i].x); - float rounded_y = roundf (all_points[i].y); - xMin = hb_min (xMin, rounded_x); - xMax = hb_max (xMax, rounded_x); - yMin = hb_min (yMin, rounded_y); - yMax = hb_max (yMax, rounded_y); + float x = all_points[i].x; + float y = all_points[i].y; + xMin = hb_min (xMin, x); + xMax = hb_max (xMax, x); + yMin = hb_min (yMin, y); + yMax = hb_max (yMax, y); } - update_mtx (plan, xMin, yMax, all_points); + update_mtx (plan, roundf (xMin), roundf (yMax), all_points); /*for empty glyphs: all_points only include phantom points. *just update metrics and then return */ @@ -134,10 +146,10 @@ struct Glyph return true; glyph_header->numberOfContours = header->numberOfContours; - glyph_header->xMin = xMin; - glyph_header->yMin = yMin; - glyph_header->xMax = xMax; - glyph_header->yMax = yMax; + glyph_header->xMin = roundf (xMin); + glyph_header->yMin = roundf (yMin); + glyph_header->xMax = roundf (xMax); + glyph_header->yMax = roundf (yMax); dest_bytes = hb_bytes_t ((const char *)glyph_header, GlyphHeader::static_size); return true; @@ -199,15 +211,24 @@ struct Glyph bool shift_points_hori = true, bool use_my_metrics = true, bool phantom_only = false, + hb_array_t<int> coords = hb_array_t<int> (), unsigned int depth = 0) const { if (unlikely (depth > HB_MAX_NESTING_LEVEL)) return false; + + if (!coords) + coords = hb_array (font->coords, font->num_coords); + contour_point_vector_t stack_points; bool inplace = type == SIMPLE && all_points.length == 0; /* Load into all_points if it's empty, as an optimization. */ contour_point_vector_t &points = inplace ? all_points : stack_points; switch (type) { + case SIMPLE: + if (unlikely (!SimpleGlyph (*header, bytes).get_contour_points (points, phantom_only))) + return false; + break; case COMPOSITE: { /* pseudo component points for each component in composite glyph */ @@ -215,20 +236,25 @@ struct Glyph if (unlikely (!points.resize (num_points))) return false; break; } - case SIMPLE: - if (unlikely (!SimpleGlyph (*header, bytes).get_contour_points (points, phantom_only))) - return false; +#ifndef HB_NO_VAR_COMPOSITES + case VAR_COMPOSITE: + { + for (auto &item : get_var_composite_iterator ()) + if (unlikely (!item.get_points (points))) return false; + } +#endif + default: break; } /* Init phantom points */ if (unlikely (!points.resize (points.length + PHANTOM_COUNT))) return false; - hb_array_t<contour_point_t> phantoms = points.sub_array (points.length - PHANTOM_COUNT, PHANTOM_COUNT); + hb_array_t<contour_point_t> phantoms = points.as_array ().sub_array (points.length - PHANTOM_COUNT, PHANTOM_COUNT); { int lsb = 0; int h_delta = glyf_accelerator.hmtx->get_leading_bearing_without_var_unscaled (gid, &lsb) ? (int) header->xMin - lsb : 0; - int tsb = 0; + HB_UNUSED int tsb = 0; int v_orig = (int) header->yMax + #ifndef HB_NO_VERTICAL ((void) glyf_accelerator.vmtx->get_leading_bearing_without_var_unscaled (gid, &tsb), tsb) @@ -257,7 +283,9 @@ struct Glyph } #ifndef HB_NO_VAR - glyf_accelerator.gvar->apply_deltas_to_points (gid, font, points.as_array ()); + glyf_accelerator.gvar->apply_deltas_to_points (gid, + coords, + points.as_array ()); #endif // mainly used by CompositeGlyph calculating new X/Y offset value so no need to extend it @@ -283,11 +311,24 @@ struct Glyph for (auto &item : get_composite_iterator ()) { comp_points.reset (); + if (unlikely (!glyf_accelerator.glyph_for_gid (item.get_gid ()) - .get_points (font, glyf_accelerator, comp_points, - deltas, shift_points_hori, use_my_metrics, phantom_only, depth + 1))) + .get_points (font, + glyf_accelerator, + comp_points, + deltas, + shift_points_hori, + use_my_metrics, + phantom_only, + coords, + depth + 1))) return false; + /* Copy phantom points from component if USE_MY_METRICS flag set */ + if (use_my_metrics && item.is_use_my_metrics ()) + for (unsigned int i = 0; i < PHANTOM_COUNT; i++) + phantoms[i] = comp_points[comp_points.length - PHANTOM_COUNT + i]; + /* Apply component transformation & translation */ item.transform_points (comp_points); @@ -308,20 +349,63 @@ struct Glyph } } + all_points.extend (comp_points.as_array ().sub_array (0, comp_points.length - PHANTOM_COUNT)); + + if (all_points.length > HB_GLYF_MAX_POINTS) + return false; + + comp_index++; + } + + all_points.extend (phantoms); + } break; +#ifndef HB_NO_VAR_COMPOSITES + case VAR_COMPOSITE: + { + contour_point_vector_t comp_points; + hb_array_t<contour_point_t> points_left = points.as_array (); + for (auto &item : get_var_composite_iterator ()) + { + hb_array_t<contour_point_t> record_points = points_left.sub_array (0, item.get_num_points ()); + + comp_points.reset (); + + coord_setter_t coord_setter (coords); + item.set_variations (coord_setter, record_points); + + if (unlikely (!glyf_accelerator.glyph_for_gid (item.get_gid ()) + .get_points (font, + glyf_accelerator, + comp_points, + deltas, + shift_points_hori, + use_my_metrics, + phantom_only, + coord_setter.get_coords (), + depth + 1))) + return false; + + /* Apply component transformation */ + item.transform_points (record_points, comp_points); + /* Copy phantom points from component if USE_MY_METRICS flag set */ if (use_my_metrics && item.is_use_my_metrics ()) for (unsigned int i = 0; i < PHANTOM_COUNT; i++) phantoms[i] = comp_points[comp_points.length - PHANTOM_COUNT + i]; - all_points.extend (comp_points.sub_array (0, comp_points.length - PHANTOM_COUNT)); + all_points.extend (comp_points.as_array ().sub_array (0, comp_points.length - PHANTOM_COUNT)); - comp_index++; - } + if (all_points.length > HB_GLYF_MAX_POINTS) + return false; + points_left += item.get_num_points (); + } all_points.extend (phantoms); } break; +#endif default: all_points.extend (phantoms); + break; } if (depth == 0 && shift_points_hori) /* Apply at top level */ @@ -360,6 +444,7 @@ struct Glyph int num_contours = header->numberOfContours; if (unlikely (num_contours == 0)) type = EMPTY; else if (num_contours > 0) type = SIMPLE; + else if (num_contours == -2) type = VAR_COMPOSITE; else type = COMPOSITE; /* negative numbers */ } diff --git a/thirdparty/harfbuzz/src/OT/glyf/SimpleGlyph.hh b/thirdparty/harfbuzz/src/OT/glyf/SimpleGlyph.hh index d45f4eb350..2b4aa99d25 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/SimpleGlyph.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/SimpleGlyph.hh @@ -132,8 +132,8 @@ struct SimpleGlyph if (unlikely (p + 1 > end)) return false; unsigned int repeat_count = *p++; unsigned stop = hb_min (i + repeat_count, count); - for (; i < stop;) - points_.arrayZ[i++].flag = flag; + for (; i < stop; i++) + points_.arrayZ[i].flag = flag; } } return true; @@ -223,33 +223,34 @@ struct SimpleGlyph if (value > 0) flag |= same_flag; else value = -value; - coords.push ((uint8_t)value); + coords.arrayZ[coords.length++] = (uint8_t) value; } else { int16_t val = value; - coords.push (val >> 8); - coords.push (val & 0xff); + coords.arrayZ[coords.length++] = val >> 8; + coords.arrayZ[coords.length++] = val & 0xff; } } static void encode_flag (uint8_t &flag, uint8_t &repeat, - uint8_t &lastflag, + uint8_t lastflag, hb_vector_t<uint8_t> &flags /* OUT */) { if (flag == lastflag && repeat != 255) { - repeat = repeat + 1; + repeat++; if (repeat == 1) { - flags.push(flag); + /* We know there's room. */ + flags.arrayZ[flags.length++] = flag; } else { unsigned len = flags.length; - flags[len-2] = flag | FLAG_REPEAT; - flags[len-1] = repeat; + flags.arrayZ[len-2] = flag | FLAG_REPEAT; + flags.arrayZ[len-1] = repeat; } } else @@ -257,7 +258,6 @@ struct SimpleGlyph repeat = 0; flags.push (flag); } - lastflag = flag; } bool compile_bytes_with_deltas (const contour_point_vector_t &all_points, @@ -269,7 +269,6 @@ struct SimpleGlyph dest_bytes = hb_bytes_t (); return true; } - //convert absolute values to relative values unsigned num_points = all_points.length - 4; hb_vector_t<uint8_t> flags, x_coords, y_coords; @@ -277,23 +276,23 @@ struct SimpleGlyph if (unlikely (!x_coords.alloc (2*num_points))) return false; if (unlikely (!y_coords.alloc (2*num_points))) return false; - uint8_t lastflag = 0, repeat = 0; - int prev_x = 0.f, prev_y = 0.f; - + uint8_t lastflag = 255, repeat = 0; + int prev_x = 0, prev_y = 0; + for (unsigned i = 0; i < num_points; i++) { - uint8_t flag = all_points[i].flag; + uint8_t flag = all_points.arrayZ[i].flag; flag &= FLAG_ON_CURVE + FLAG_OVERLAP_SIMPLE; - float cur_x = roundf (all_points[i].x); - float cur_y = roundf (all_points[i].y); + int cur_x = roundf (all_points.arrayZ[i].x); + int cur_y = roundf (all_points.arrayZ[i].y); encode_coord (cur_x - prev_x, flag, FLAG_X_SHORT, FLAG_X_SAME, x_coords); encode_coord (cur_y - prev_y, flag, FLAG_Y_SHORT, FLAG_Y_SAME, y_coords); - if (i == 0) lastflag = flag + 1; //make lastflag != flag for the first point encode_flag (flag, repeat, lastflag, flags); prev_x = cur_x; prev_y = cur_y; + lastflag = flag; } unsigned len_before_instrs = 2 * header.numberOfContours + 2; @@ -303,29 +302,29 @@ struct SimpleGlyph if (!no_hinting) total_len += len_instrs; - char *p = (char *) hb_calloc (total_len, sizeof (char)); + char *p = (char *) hb_malloc (total_len); if (unlikely (!p)) return false; const char *src = bytes.arrayZ + GlyphHeader::static_size; char *cur = p; - memcpy (p, src, len_before_instrs); + hb_memcpy (p, src, len_before_instrs); cur += len_before_instrs; src += len_before_instrs; if (!no_hinting) { - memcpy (cur, src, len_instrs); + hb_memcpy (cur, src, len_instrs); cur += len_instrs; } - memcpy (cur, flags.arrayZ, flags.length); + hb_memcpy (cur, flags.arrayZ, flags.length); cur += flags.length; - memcpy (cur, x_coords.arrayZ, x_coords.length); + hb_memcpy (cur, x_coords.arrayZ, x_coords.length); cur += x_coords.length; - memcpy (cur, y_coords.arrayZ, y_coords.length); + hb_memcpy (cur, y_coords.arrayZ, y_coords.length); dest_bytes = hb_bytes_t (p, total_len); return true; diff --git a/thirdparty/harfbuzz/src/OT/glyf/SubsetGlyph.hh b/thirdparty/harfbuzz/src/OT/glyf/SubsetGlyph.hh index 88fc93c435..1a0370c757 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/SubsetGlyph.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/SubsetGlyph.hh @@ -21,10 +21,18 @@ struct SubsetGlyph bool serialize (hb_serialize_context_t *c, bool use_short_loca, - const hb_subset_plan_t *plan) const + const hb_subset_plan_t *plan, + hb_font_t *font) { TRACE_SERIALIZE (this); + if (font) + { + const OT::glyf_accelerator_t &glyf = *font->face->table.glyf; + if (!this->compile_bytes_with_deltas (plan, font, glyf)) + return_trace (false); + } + hb_bytes_t dest_glyph = dest_start.copy (c); dest_glyph = hb_bytes_t (&dest_glyph, dest_glyph.length + dest_end.copy (c).length); unsigned int pad_length = use_short_loca ? padding () : 0; diff --git a/thirdparty/harfbuzz/src/OT/glyf/VarCompositeGlyph.hh b/thirdparty/harfbuzz/src/OT/glyf/VarCompositeGlyph.hh new file mode 100644 index 0000000000..0f4c71c83d --- /dev/null +++ b/thirdparty/harfbuzz/src/OT/glyf/VarCompositeGlyph.hh @@ -0,0 +1,353 @@ +#ifndef OT_GLYF_VARCOMPOSITEGLYPH_HH +#define OT_GLYF_VARCOMPOSITEGLYPH_HH + + +#include "../../hb-open-type.hh" +#include "coord-setter.hh" + + +namespace OT { +namespace glyf_impl { + + +struct VarCompositeGlyphRecord +{ + protected: + enum var_composite_glyph_flag_t + { + USE_MY_METRICS = 0x0001, + AXIS_INDICES_ARE_SHORT = 0x0002, + UNIFORM_SCALE = 0x0004, + HAVE_TRANSLATE_X = 0x0008, + HAVE_TRANSLATE_Y = 0x0010, + HAVE_ROTATION = 0x0020, + HAVE_SCALE_X = 0x0040, + HAVE_SCALE_Y = 0x0080, + HAVE_SKEW_X = 0x0100, + HAVE_SKEW_Y = 0x0200, + HAVE_TCENTER_X = 0x0400, + HAVE_TCENTER_Y = 0x0800, + GID_IS_24 = 0x1000, + AXES_HAVE_VARIATION = 0x2000, + }; + + public: + + unsigned int get_size () const + { + unsigned int size = min_size; + + unsigned axis_width = (flags & AXIS_INDICES_ARE_SHORT) ? 4 : 3; + size += numAxes * axis_width; + + // gid + size += 2; + if (flags & GID_IS_24) size += 1; + + if (flags & HAVE_TRANSLATE_X) size += 2; + if (flags & HAVE_TRANSLATE_Y) size += 2; + if (flags & HAVE_ROTATION) size += 2; + if (flags & HAVE_SCALE_X) size += 2; + if (flags & HAVE_SCALE_Y) size += 2; + if (flags & HAVE_SKEW_X) size += 2; + if (flags & HAVE_SKEW_Y) size += 2; + if (flags & HAVE_TCENTER_X) size += 2; + if (flags & HAVE_TCENTER_Y) size += 2; + + return size; + } + + bool has_more () const { return true; } + + bool is_use_my_metrics () const { return flags & USE_MY_METRICS; } + + hb_codepoint_t get_gid () const + { + if (flags & GID_IS_24) + return StructAfter<const HBGlyphID24> (numAxes); + else + return StructAfter<const HBGlyphID16> (numAxes); + } + + unsigned get_numAxes () const + { + return numAxes; + } + + unsigned get_num_points () const + { + unsigned num = 0; + if (flags & AXES_HAVE_VARIATION) num += numAxes; + if (flags & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y)) num++; + if (flags & HAVE_ROTATION) num++; + if (flags & (HAVE_SCALE_X | HAVE_SCALE_Y)) num++; + if (flags & (HAVE_SKEW_X | HAVE_SKEW_Y)) num++; + if (flags & (HAVE_TCENTER_X | HAVE_TCENTER_Y)) num++; + return num; + } + + void transform_points (hb_array_t<contour_point_t> record_points, + contour_point_vector_t &points) const + { + float matrix[4]; + contour_point_t trans; + + get_transformation_from_points (record_points, matrix, trans); + + points.transform (matrix); + points.translate (trans); + } + + static inline void transform (float (&matrix)[4], contour_point_t &trans, + float (other)[6]) + { + // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L268 + float xx1 = other[0]; + float xy1 = other[1]; + float yx1 = other[2]; + float yy1 = other[3]; + float dx1 = other[4]; + float dy1 = other[5]; + float xx2 = matrix[0]; + float xy2 = matrix[1]; + float yx2 = matrix[2]; + float yy2 = matrix[3]; + float dx2 = trans.x; + float dy2 = trans.y; + + matrix[0] = xx1*xx2 + xy1*yx2; + matrix[1] = xx1*xy2 + xy1*yy2; + matrix[2] = yx1*xx2 + yy1*yx2; + matrix[3] = yx1*xy2 + yy1*yy2; + trans.x = xx2*dx1 + yx2*dy1 + dx2; + trans.y = xy2*dx1 + yy2*dy1 + dy2; + } + + static void translate (float (&matrix)[4], contour_point_t &trans, + float translateX, float translateY) + { + // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L213 + float other[6] = {1.f, 0.f, 0.f, 1.f, translateX, translateY}; + transform (matrix, trans, other); + } + + static void scale (float (&matrix)[4], contour_point_t &trans, + float scaleX, float scaleY) + { + // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L224 + float other[6] = {scaleX, 0.f, 0.f, scaleY, 0.f, 0.f}; + transform (matrix, trans, other); + } + + static void rotate (float (&matrix)[4], contour_point_t &trans, + float rotation) + { + // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L240 + rotation = rotation * float (M_PI); + float c = cosf (rotation); + float s = sinf (rotation); + float other[6] = {c, s, -s, c, 0.f, 0.f}; + transform (matrix, trans, other); + } + + static void skew (float (&matrix)[4], contour_point_t &trans, + float skewX, float skewY) + { + // https://github.com/fonttools/fonttools/blob/f66ee05f71c8b57b5f519ee975e95edcd1466e14/Lib/fontTools/misc/transform.py#L255 + skewX = skewX * float (M_PI); + skewY = skewY * float (M_PI); + float other[6] = {1.f, tanf (skewY), tanf (skewX), 1.f, 0.f, 0.f}; + transform (matrix, trans, other); + } + + bool get_points (contour_point_vector_t &points) const + { + float translateX = 0.f; + float translateY = 0.f; + float rotation = 0.f; + float scaleX = 1.f * (1 << 12); + float scaleY = 1.f * (1 << 12); + float skewX = 0.f; + float skewY = 0.f; + float tCenterX = 0.f; + float tCenterY = 0.f; + + if (unlikely (!points.resize (points.length + get_num_points ()))) return false; + + unsigned axis_width = (flags & AXIS_INDICES_ARE_SHORT) ? 2 : 1; + unsigned axes_size = numAxes * axis_width; + + const F2DOT14 *q = (const F2DOT14 *) (axes_size + + (flags & GID_IS_24 ? 3 : 2) + + &StructAfter<const HBUINT8> (numAxes)); + + hb_array_t<contour_point_t> rec_points = points.as_array ().sub_array (points.length - get_num_points ()); + + unsigned count = numAxes; + if (flags & AXES_HAVE_VARIATION) + { + for (unsigned i = 0; i < count; i++) + rec_points[i].x = *q++; + rec_points += count; + } + else + q += count; + + const HBUINT16 *p = (const HBUINT16 *) q; + + if (flags & HAVE_TRANSLATE_X) translateX = * (const FWORD *) p++; + if (flags & HAVE_TRANSLATE_Y) translateY = * (const FWORD *) p++; + if (flags & HAVE_ROTATION) rotation = * (const F2DOT14 *) p++; + if (flags & HAVE_SCALE_X) scaleX = * (const F4DOT12 *) p++; + if (flags & HAVE_SCALE_Y) scaleY = * (const F4DOT12 *) p++; + if (flags & HAVE_SKEW_X) skewX = * (const F2DOT14 *) p++; + if (flags & HAVE_SKEW_Y) skewY = * (const F2DOT14 *) p++; + if (flags & HAVE_TCENTER_X) tCenterX = * (const FWORD *) p++; + if (flags & HAVE_TCENTER_Y) tCenterY = * (const FWORD *) p++; + + if ((flags & UNIFORM_SCALE) && !(flags & HAVE_SCALE_Y)) + scaleY = scaleX; + + if (flags & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y)) + { + rec_points[0].x = translateX; + rec_points[0].y = translateY; + rec_points++; + } + if (flags & HAVE_ROTATION) + { + rec_points[0].x = rotation; + rec_points++; + } + if (flags & (HAVE_SCALE_X | HAVE_SCALE_Y)) + { + rec_points[0].x = scaleX; + rec_points[0].y = scaleY; + rec_points++; + } + if (flags & (HAVE_SKEW_X | HAVE_SKEW_Y)) + { + rec_points[0].x = skewX; + rec_points[0].y = skewY; + rec_points++; + } + if (flags & (HAVE_TCENTER_X | HAVE_TCENTER_Y)) + { + rec_points[0].x = tCenterX; + rec_points[0].y = tCenterY; + rec_points++; + } + assert (!rec_points); + + return true; + } + + void get_transformation_from_points (hb_array_t<contour_point_t> rec_points, + float (&matrix)[4], contour_point_t &trans) const + { + if (flags & AXES_HAVE_VARIATION) + rec_points += numAxes; + + matrix[0] = matrix[3] = 1.f; + matrix[1] = matrix[2] = 0.f; + trans.init (0.f, 0.f); + + float translateX = 0.f; + float translateY = 0.f; + float rotation = 0.f; + float scaleX = 1.f; + float scaleY = 1.f; + float skewX = 0.f; + float skewY = 0.f; + float tCenterX = 0.f; + float tCenterY = 0.f; + + if (flags & (HAVE_TRANSLATE_X | HAVE_TRANSLATE_Y)) + { + translateX = rec_points[0].x; + translateY = rec_points[0].y; + rec_points++; + } + if (flags & HAVE_ROTATION) + { + rotation = rec_points[0].x / (1 << 14); + rec_points++; + } + if (flags & (HAVE_SCALE_X | HAVE_SCALE_Y)) + { + scaleX = rec_points[0].x / (1 << 12); + scaleY = rec_points[0].y / (1 << 12); + rec_points++; + } + if (flags & (HAVE_SKEW_X | HAVE_SKEW_Y)) + { + skewX = rec_points[0].x / (1 << 14); + skewY = rec_points[0].y / (1 << 14); + rec_points++; + } + if (flags & (HAVE_TCENTER_X | HAVE_TCENTER_Y)) + { + tCenterX = rec_points[0].x; + tCenterY = rec_points[0].y; + rec_points++; + } + assert (!rec_points); + + translate (matrix, trans, translateX + tCenterX, translateY + tCenterY); + rotate (matrix, trans, rotation); + scale (matrix, trans, scaleX, scaleY); + skew (matrix, trans, -skewX, skewY); + translate (matrix, trans, -tCenterX, -tCenterY); + } + + void set_variations (coord_setter_t &setter, + hb_array_t<contour_point_t> rec_points) const + { + bool have_variations = flags & AXES_HAVE_VARIATION; + unsigned axis_width = (flags & AXIS_INDICES_ARE_SHORT) ? 2 : 1; + + const HBUINT8 *p = (const HBUINT8 *) (((HBUINT8 *) &numAxes) + numAxes.static_size + (flags & GID_IS_24 ? 3 : 2)); + const HBUINT16 *q = (const HBUINT16 *) (((HBUINT8 *) &numAxes) + numAxes.static_size + (flags & GID_IS_24 ? 3 : 2)); + + const F2DOT14 *a = (const F2DOT14 *) ((HBUINT8 *) (axis_width == 1 ? (p + numAxes) : (HBUINT8 *) (q + numAxes))); + + unsigned count = numAxes; + for (unsigned i = 0; i < count; i++) + { + unsigned axis_index = axis_width == 1 ? (unsigned) *p++ : (unsigned) *q++; + + signed v = have_variations ? rec_points[i].x : *a++; + + v += setter[axis_index]; + v = hb_clamp (v, -(1<<14), (1<<14)); + setter[axis_index] = v; + } + } + + protected: + HBUINT16 flags; + HBUINT8 numAxes; + public: + DEFINE_SIZE_MIN (3); +}; + +using var_composite_iter_t = composite_iter_tmpl<VarCompositeGlyphRecord>; + +struct VarCompositeGlyph +{ + const GlyphHeader &header; + hb_bytes_t bytes; + VarCompositeGlyph (const GlyphHeader &header_, hb_bytes_t bytes_) : + header (header_), bytes (bytes_) {} + + var_composite_iter_t iter () const + { return var_composite_iter_t (bytes, &StructAfter<VarCompositeGlyphRecord, GlyphHeader> (header)); } + +}; + + +} /* namespace glyf_impl */ +} /* namespace OT */ + + +#endif /* OT_GLYF_VARCOMPOSITEGLYPH_HH */ diff --git a/thirdparty/harfbuzz/src/OT/glyf/composite-iter.hh b/thirdparty/harfbuzz/src/OT/glyf/composite-iter.hh new file mode 100644 index 0000000000..d05701f3d1 --- /dev/null +++ b/thirdparty/harfbuzz/src/OT/glyf/composite-iter.hh @@ -0,0 +1,68 @@ +#ifndef OT_GLYF_COMPOSITE_ITER_HH +#define OT_GLYF_COMPOSITE_ITER_HH + + +#include "../../hb.hh" + + +namespace OT { +namespace glyf_impl { + + +template <typename CompositeGlyphRecord> +struct composite_iter_tmpl : hb_iter_with_fallback_t<composite_iter_tmpl<CompositeGlyphRecord>, + const CompositeGlyphRecord &> +{ + typedef const CompositeGlyphRecord *__item_t__; + composite_iter_tmpl (hb_bytes_t glyph_, __item_t__ current_) : + glyph (glyph_), current (nullptr), current_size (0) + { + set_current (current_); + } + + composite_iter_tmpl () : glyph (hb_bytes_t ()), current (nullptr), current_size (0) {} + + const CompositeGlyphRecord & __item__ () const { return *current; } + bool __more__ () const { return current; } + void __next__ () + { + if (!current->has_more ()) { current = nullptr; return; } + + set_current (&StructAtOffset<CompositeGlyphRecord> (current, current_size)); + } + composite_iter_tmpl __end__ () const { return composite_iter_tmpl (); } + bool operator != (const composite_iter_tmpl& o) const + { return current != o.current; } + + + void set_current (__item_t__ current_) + { + if (!glyph.check_range (current_, CompositeGlyphRecord::min_size)) + { + current = nullptr; + current_size = 0; + return; + } + unsigned size = current_->get_size (); + if (!glyph.check_range (current_, size)) + { + current = nullptr; + current_size = 0; + return; + } + + current = current_; + current_size = size; + } + + private: + hb_bytes_t glyph; + __item_t__ current; + unsigned current_size; +}; + + +} /* namespace glyf_impl */ +} /* namespace OT */ + +#endif /* OT_GLYF_COMPOSITE_ITER_HH */ diff --git a/thirdparty/harfbuzz/src/OT/glyf/coord-setter.hh b/thirdparty/harfbuzz/src/OT/glyf/coord-setter.hh new file mode 100644 index 0000000000..df64ed5af7 --- /dev/null +++ b/thirdparty/harfbuzz/src/OT/glyf/coord-setter.hh @@ -0,0 +1,34 @@ +#ifndef OT_GLYF_COORD_SETTER_HH +#define OT_GLYF_COORD_SETTER_HH + + +#include "../../hb.hh" + + +namespace OT { +namespace glyf_impl { + + +struct coord_setter_t +{ + coord_setter_t (hb_array_t<int> coords) : + coords (coords) {} + + int& operator [] (unsigned idx) + { + if (coords.length < idx + 1) + coords.resize (idx + 1); + return coords[idx]; + } + + hb_array_t<int> get_coords () + { return coords.as_array (); } + + hb_vector_t<int> coords; +}; + + +} /* namespace glyf_impl */ +} /* namespace OT */ + +#endif /* OT_GLYF_COORD_SETTER_HH */ diff --git a/thirdparty/harfbuzz/src/OT/glyf/glyf.hh b/thirdparty/harfbuzz/src/OT/glyf/glyf.hh index 5fb32f67f3..e6e985c38c 100644 --- a/thirdparty/harfbuzz/src/OT/glyf/glyf.hh +++ b/thirdparty/harfbuzz/src/OT/glyf/glyf.hh @@ -42,11 +42,15 @@ struct glyf bool serialize (hb_serialize_context_t *c, Iterator it, bool use_short_loca, - const hb_subset_plan_t *plan) + const hb_subset_plan_t *plan, + hb_font_t *font) { TRACE_SERIALIZE (this); + unsigned init_len = c->length (); - for (const auto &_ : it) _.serialize (c, use_short_loca, plan); + for (auto &_ : it) + if (unlikely (!_.serialize (c, use_short_loca, plan, font))) + return false; /* As a special case when all glyph in the font are empty, add a zero byte * to the table, so that OTS doesn’t reject it, and to make the table work @@ -74,10 +78,11 @@ struct glyf hb_vector_t<glyf_impl::SubsetGlyph> glyphs; _populate_subset_glyphs (c->plan, glyphs); + hb_font_t *font = nullptr; if (!c->plan->pinned_at_default) { - if (!_compile_subset_glyphs_with_deltas (c->plan, &glyphs)) - return_trace (false); + font = _create_font_for_instancing (c->plan); + if (unlikely (!font)) return false; } auto padded_offsets = @@ -85,11 +90,14 @@ struct glyf | hb_map (&glyf_impl::SubsetGlyph::padded_size) ; - unsigned max_offset = + padded_offsets | hb_reduce (hb_add, 0); - bool use_short_loca = max_offset < 0x1FFFF; - + bool use_short_loca = false; + if (likely (!c->plan->force_long_loca)) + { + unsigned max_offset = + padded_offsets | hb_reduce (hb_add, 0); + use_short_loca = max_offset < 0x1FFFF; + } - glyf_prime->serialize (c->serializer, hb_iter (glyphs), use_short_loca, c->plan); + glyf_prime->serialize (c->serializer, glyphs.writer (), use_short_loca, c->plan, font); if (!use_short_loca) { padded_offsets = + hb_iter (glyphs) @@ -97,9 +105,12 @@ struct glyf ; } - - if (!c->plan->pinned_at_default) + if (font) + { _free_compiled_subset_glyphs (&glyphs); + hb_font_destroy (font); + } + if (unlikely (c->serializer->in_error ())) return_trace (false); return_trace (c->serializer->check_success (glyf_impl::_add_loca_and_head (c->plan, padded_offsets, @@ -110,9 +121,8 @@ struct glyf _populate_subset_glyphs (const hb_subset_plan_t *plan, hb_vector_t<glyf_impl::SubsetGlyph> &glyphs /* OUT */) const; - bool - _compile_subset_glyphs_with_deltas (const hb_subset_plan_t *plan, - hb_vector_t<glyf_impl::SubsetGlyph> *glyphs /* OUT */) const; + hb_font_t * + _create_font_for_instancing (const hb_subset_plan_t *plan) const; void _free_compiled_subset_glyphs (hb_vector_t<glyf_impl::SubsetGlyph> *glyphs) const { @@ -394,7 +404,11 @@ glyf::_populate_subset_glyphs (const hb_subset_plan_t *plan, plan->pinned_at_default) subset_glyph.source_glyph = glyf_impl::Glyph (); else - subset_glyph.source_glyph = glyf.glyph_for_gid (subset_glyph.old_gid, true); + { + /* If plan has an accelerator, the preprocessing step already trimmed glyphs. + * Don't trim them again! */ + subset_glyph.source_glyph = glyf.glyph_for_gid (subset_glyph.old_gid, !plan->accelerator); + } if (plan->flags & HB_SUBSET_FLAGS_NO_HINTING) subset_glyph.drop_hints_bytes (); @@ -403,17 +417,15 @@ glyf::_populate_subset_glyphs (const hb_subset_plan_t *plan, } } -inline bool -glyf::_compile_subset_glyphs_with_deltas (const hb_subset_plan_t *plan, - hb_vector_t<glyf_impl::SubsetGlyph> *glyphs /* OUT */) const +inline hb_font_t * +glyf::_create_font_for_instancing (const hb_subset_plan_t *plan) const { - OT::glyf_accelerator_t glyf (plan->source); hb_font_t *font = hb_font_create (plan->source); - if (unlikely (!font)) return false; + if (unlikely (font == hb_font_get_empty ())) return nullptr; hb_vector_t<hb_variation_t> vars; if (unlikely (!vars.alloc (plan->user_axes_location->get_population ()))) - return false; + return nullptr; for (auto _ : *plan->user_axes_location) { @@ -423,18 +435,10 @@ glyf::_compile_subset_glyphs_with_deltas (const hb_subset_plan_t *plan, vars.push (var); } +#ifndef HB_NO_VAR hb_font_set_variations (font, vars.arrayZ, plan->user_axes_location->get_population ()); - for (auto& subset_glyph : *glyphs) - { - if (!const_cast<glyf_impl::SubsetGlyph &> (subset_glyph).compile_bytes_with_deltas (plan, font, glyf)) - { - hb_font_destroy (font); - return false; - } - } - - hb_font_destroy (font); - return true; +#endif + return font; } diff --git a/thirdparty/harfbuzz/src/graph/classdef-graph.hh b/thirdparty/harfbuzz/src/graph/classdef-graph.hh index 0bda76ac2f..c2e24a7067 100644 --- a/thirdparty/harfbuzz/src/graph/classdef-graph.hh +++ b/thirdparty/harfbuzz/src/graph/classdef-graph.hh @@ -112,7 +112,7 @@ struct ClassDef : public OT::ClassDef { case 1: return ((ClassDefFormat1*)this)->sanitize (vertex); case 2: return ((ClassDefFormat2*)this)->sanitize (vertex); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K // Not currently supported case 3: case 4: diff --git a/thirdparty/harfbuzz/src/graph/coverage-graph.hh b/thirdparty/harfbuzz/src/graph/coverage-graph.hh index 3c1022f090..49d0936315 100644 --- a/thirdparty/harfbuzz/src/graph/coverage-graph.hh +++ b/thirdparty/harfbuzz/src/graph/coverage-graph.hh @@ -136,7 +136,7 @@ struct Coverage : public OT::Layout::Common::Coverage { case 1: return ((CoverageFormat1*)this)->sanitize (vertex); case 2: return ((CoverageFormat2*)this)->sanitize (vertex); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K // Not currently supported case 3: case 4: diff --git a/thirdparty/harfbuzz/src/graph/graph.hh b/thirdparty/harfbuzz/src/graph/graph.hh index 79c7e690a1..dc5b6a36fe 100644 --- a/thirdparty/harfbuzz/src/graph/graph.hh +++ b/thirdparty/harfbuzz/src/graph/graph.hh @@ -49,6 +49,50 @@ struct graph_t unsigned end = 0; unsigned priority = 0; + + bool link_positions_valid (unsigned num_objects, bool removed_nil) + { + hb_set_t assigned_bytes; + for (const auto& l : obj.real_links) + { + if (l.objidx >= num_objects + || (removed_nil && !l.objidx)) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + "Invalid graph. Invalid object index."); + return false; + } + + unsigned start = l.position; + unsigned end = start + l.width - 1; + + if (unlikely (l.width < 2 || l.width > 4)) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + "Invalid graph. Invalid link width."); + return false; + } + + if (unlikely (end >= table_size ())) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + "Invalid graph. Link position is out of bounds."); + return false; + } + + if (unlikely (assigned_bytes.intersects (start, end))) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, + "Invalid graph. Found offsets whose positions overlap."); + return false; + } + + assigned_bytes.add_range (start, end); + } + + return !assigned_bytes.in_error (); + } + void normalize () { obj.real_links.qsort (); @@ -132,7 +176,7 @@ struct graph_t for (unsigned i = 0; i < parents.length; i++) { if (parents[i] != parent_index) continue; - parents.remove (i); + parents.remove_unordered (i); break; } } @@ -148,7 +192,7 @@ struct graph_t if ((obj.head + link.position) != offset) continue; - obj.real_links.remove (i); + obj.real_links.remove_unordered (i); return; } } @@ -286,8 +330,6 @@ struct graph_t vertices_scratch_.alloc (objects.length); for (unsigned i = 0; i < objects.length; i++) { - // TODO(grieger): check all links point to valid objects. - // If this graph came from a serialization buffer object 0 is the // nil object. We don't need it for our purposes here so drop it. if (i == 0 && !objects[i]) @@ -299,6 +341,9 @@ struct graph_t vertex_t* v = vertices_.push (); if (check_success (!vertices_.in_error ())) v->obj = *objects[i]; + + check_success (v->link_positions_valid (objects.length, removed_nil)); + if (!removed_nil) continue; // Fix indices to account for removed nil object. for (auto& l : v->obj.all_links_writer ()) { @@ -418,6 +463,13 @@ struct graph_t hb_swap (sorted_graph[new_id], vertices_[next_id]); const vertex_t& next = sorted_graph[new_id]; + if (unlikely (!check_success(new_id >= 0))) { + // We are out of ids. Which means we've visited a node more than once. + // This graph contains a cycle which is not allowed. + DEBUG_MSG (SUBSET_REPACK, nullptr, "Invalid graph. Contains cycle."); + return; + } + id_map[next_id] = new_id--; for (const auto& link : next.obj.all_links ()) { @@ -580,7 +632,7 @@ struct graph_t while (roots) { - unsigned next = HB_SET_VALUE_INVALID; + uint32_t next = HB_SET_VALUE_INVALID; if (unlikely (!check_success (!roots.in_error ()))) break; if (!roots.next (&next)) break; @@ -661,8 +713,8 @@ struct graph_t auto new_subgraph = + subgraph.keys () - | hb_map([&] (unsigned node_idx) { - const unsigned *v; + | hb_map([&] (uint32_t node_idx) { + const uint32_t *v; if (index_map.has (node_idx, &v)) return *v; return node_idx; }) @@ -672,10 +724,10 @@ struct graph_t remap_obj_indices (index_map, parents.iter (), true); // Update roots set with new indices as needed. - unsigned next = HB_SET_VALUE_INVALID; + uint32_t next = HB_SET_VALUE_INVALID; while (roots.next (&next)) { - const unsigned *v; + const uint32_t *v; if (index_map.has (next, &v)) { roots.del (next); @@ -690,7 +742,7 @@ struct graph_t { for (const auto& link : vertices_[node_idx].obj.all_links ()) { - const unsigned *v; + const uint32_t *v; if (subgraph.has (link.objidx, &v)) { subgraph.set (link.objidx, *v + 1); @@ -941,6 +993,72 @@ struct graph_t return made_change; } + bool is_fully_connected () + { + update_parents(); + + if (root().parents) + // Root cannot have parents. + return false; + + for (unsigned i = 0; i < root_idx (); i++) + { + if (!vertices_[i].parents) + return false; + } + return true; + } + +#if 0 + /* + * Saves the current graph to a packed binary format which the repacker fuzzer takes + * as a seed. + */ + void save_fuzzer_seed (hb_tag_t tag) const + { + FILE* f = fopen ("./repacker_fuzzer_seed", "w"); + fwrite ((void*) &tag, sizeof (tag), 1, f); + + uint16_t num_objects = vertices_.length; + fwrite ((void*) &num_objects, sizeof (num_objects), 1, f); + + for (const auto& v : vertices_) + { + uint16_t blob_size = v.table_size (); + fwrite ((void*) &blob_size, sizeof (blob_size), 1, f); + fwrite ((const void*) v.obj.head, blob_size, 1, f); + } + + uint16_t link_count = 0; + for (const auto& v : vertices_) + link_count += v.obj.real_links.length; + + fwrite ((void*) &link_count, sizeof (link_count), 1, f); + + typedef struct + { + uint16_t parent; + uint16_t child; + uint16_t position; + uint8_t width; + } link_t; + + for (unsigned i = 0; i < vertices_.length; i++) + { + for (const auto& l : vertices_[i].obj.real_links) + { + link_t link { + (uint16_t) i, (uint16_t) l.objidx, + (uint16_t) l.position, (uint8_t) l.width + }; + fwrite ((void*) &link, sizeof (link), 1, f); + } + } + + fclose (f); + } +#endif + void print_orphaned_nodes () { if (!DEBUG_ENABLED(SUBSET_REPACK)) return; @@ -949,6 +1067,10 @@ struct graph_t parents_invalid = true; update_parents(); + if (root().parents) { + DEBUG_MSG (SUBSET_REPACK, nullptr, "Root node has incoming edges."); + } + for (unsigned i = 0; i < root_idx (); i++) { const auto& v = vertices_[i]; @@ -1065,6 +1187,11 @@ struct graph_t } } + for (unsigned i = 0; i < vertices_.length; i++) + // parents arrays must be accurate or downstream operations like cycle detection + // and sorting won't work correctly. + check_success (!vertices_[i].parents.in_error ()); + parents_invalid = false; } @@ -1183,7 +1310,7 @@ struct graph_t { for (auto& link : vertices_[i].obj.all_links_writer ()) { - const unsigned *v; + const uint32_t *v; if (!id_map.has (link.objidx, &v)) continue; if (only_wide && !(link.width == 4 && !link.is_signed)) continue; diff --git a/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh b/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh index e8d5bef9a8..c170638409 100644 --- a/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh +++ b/thirdparty/harfbuzz/src/graph/gsubgpos-graph.hh @@ -201,7 +201,7 @@ struct Lookup : public OT::Lookup + new_subtable_count * OT::Offset16::static_size; char* buffer = (char*) hb_calloc (1, new_size); c.add_buffer (buffer); - memcpy (buffer, v.obj.head, v.table_size()); + hb_memcpy (buffer, v.obj.head, v.table_size()); v.obj.head = buffer; v.obj.tail = buffer + new_size; @@ -355,7 +355,7 @@ struct GSTAR : public OT::GSUBGPOS { switch (u.version.major) { case 1: return u.version1.get_lookup_list_offset (); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 2: return u.version2.get_lookup_list_offset (); #endif default: return 0; @@ -374,7 +374,7 @@ struct GSTAR : public OT::GSUBGPOS { switch (u.version.major) { case 1: find_lookups<SmallTypes> (graph, lookups); break; -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 2: find_lookups<MediumTypes> (graph, lookups); break; #endif } diff --git a/thirdparty/harfbuzz/src/graph/markbasepos-graph.hh b/thirdparty/harfbuzz/src/graph/markbasepos-graph.hh index e42a6042cc..84ef5f71b9 100644 --- a/thirdparty/harfbuzz/src/graph/markbasepos-graph.hh +++ b/thirdparty/harfbuzz/src/graph/markbasepos-graph.hh @@ -112,7 +112,7 @@ struct AnchorMatrix : public OT::Layout::GPOS_impl::AnchorMatrix auto& child = c.graph.vertices_[child_idx]; child.remove_parent (this_index); - o.real_links.remove (i); + o.real_links.remove_unordered (i); num_links--; i--; } @@ -372,7 +372,7 @@ struct MarkBasePosFormat1 : public OT::Layout::GPOS_impl::MarkBasePosFormat1_2<S if (!mark_coverage) return false; hb_set_t marks = sc.marks_for (0, count); auto new_coverage = - + hb_zip (hb_range (), mark_coverage.table->iter ()) + + hb_enumerate (mark_coverage.table->iter ()) | hb_filter (marks, hb_first) | hb_map_retains_sorting (hb_second) ; @@ -431,7 +431,7 @@ struct MarkBasePosFormat1 : public OT::Layout::GPOS_impl::MarkBasePosFormat1_2<S if (!mark_coverage) return false; hb_set_t marks = sc.marks_for (start, end); auto new_coverage = - + hb_zip (hb_range (), mark_coverage.table->iter ()) + + hb_enumerate (mark_coverage.table->iter ()) | hb_filter (marks, hb_first) | hb_map_retains_sorting (hb_second) ; @@ -477,7 +477,7 @@ struct MarkBasePos : public OT::Layout::GPOS_impl::MarkBasePos switch (u.format) { case 1: return ((MarkBasePosFormat1*)(&u.format1))->split_subtables (c, parent_index, this_index); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 2: HB_FALLTHROUGH; // Don't split 24bit PairPos's. #endif @@ -494,7 +494,7 @@ struct MarkBasePos : public OT::Layout::GPOS_impl::MarkBasePos switch (u.format) { case 1: return ((MarkBasePosFormat1*)(&u.format1))->sanitize (vertex); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 2: HB_FALLTHROUGH; #endif default: diff --git a/thirdparty/harfbuzz/src/graph/pairpos-graph.hh b/thirdparty/harfbuzz/src/graph/pairpos-graph.hh index 8040778ea3..1c13eb24f9 100644 --- a/thirdparty/harfbuzz/src/graph/pairpos-graph.hh +++ b/thirdparty/harfbuzz/src/graph/pairpos-graph.hh @@ -434,7 +434,7 @@ struct PairPosFormat2 : public OT::Layout::GPOS_impl::PairPosFormat2_4<SmallType char* start_addr = ((char*)&values[0]) + start * split_context.class1_record_size; unsigned num_records = end - start; - memcpy (&pair_pos_prime->values[0], + hb_memcpy (&pair_pos_prime->values[0], start_addr, num_records * split_context.class1_record_size); @@ -611,7 +611,7 @@ struct PairPos : public OT::Layout::GPOS_impl::PairPos return ((PairPosFormat1*)(&u.format1))->split_subtables (c, parent_index, this_index); case 2: return ((PairPosFormat2*)(&u.format2))->split_subtables (c, parent_index, this_index); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: HB_FALLTHROUGH; case 4: HB_FALLTHROUGH; // Don't split 24bit PairPos's. @@ -631,7 +631,7 @@ struct PairPos : public OT::Layout::GPOS_impl::PairPos return ((PairPosFormat1*)(&u.format1))->sanitize (vertex); case 2: return ((PairPosFormat2*)(&u.format2))->sanitize (vertex); -#ifndef HB_NO_BORING_EXPANSION +#ifndef HB_NO_BEYOND_64K case 3: HB_FALLTHROUGH; case 4: HB_FALLTHROUGH; #endif diff --git a/thirdparty/harfbuzz/src/graph/serialize.hh b/thirdparty/harfbuzz/src/graph/serialize.hh index ecc6cc5aea..d03a61bd19 100644 --- a/thirdparty/harfbuzz/src/graph/serialize.hh +++ b/thirdparty/harfbuzz/src/graph/serialize.hh @@ -33,6 +33,23 @@ struct overflow_record_t { unsigned parent; unsigned child; + + bool operator != (const overflow_record_t o) const + { return !(*this == o); } + + inline bool operator == (const overflow_record_t& o) const + { + return parent == o.parent && + child == o.child; + } + + inline uint32_t hash () const + { + uint32_t current = 0; + current = current * 31 + hb_hash (parent); + current = current * 31 + hb_hash (child); + return current; + } }; inline @@ -94,6 +111,7 @@ will_overflow (graph_t& graph, if (overflows) overflows->resize (0); graph.update_positions (); + hb_hashmap_t<overflow_record_t*, bool> record_set; const auto& vertices = graph.vertices_; for (int parent_idx = vertices.length - 1; parent_idx >= 0; parent_idx--) { @@ -109,7 +127,10 @@ will_overflow (graph_t& graph, overflow_record_t r; r.parent = parent_idx; r.child = link.objidx; + if (record_set.has(&r)) continue; // don't keep duplicate overflows. + overflows->push (r); + record_set.set(&r, true); } } @@ -223,7 +244,7 @@ inline hb_blob_t* serialize (const graph_t& graph) return nullptr; } - memcpy (start, vertices[i].obj.head, size); + hb_memcpy (start, vertices[i].obj.head, size); // Only real links needs to be serialized. for (const auto& link : vertices[i].obj.real_links) diff --git a/thirdparty/harfbuzz/src/hb-aat-layout-morx-table.hh b/thirdparty/harfbuzz/src/hb-aat-layout-morx-table.hh index aa4ad4cf3c..8b9190d0be 100644 --- a/thirdparty/harfbuzz/src/hb-aat-layout-morx-table.hh +++ b/thirdparty/harfbuzz/src/hb-aat-layout-morx-table.hh @@ -131,14 +131,14 @@ struct RearrangementSubtable hb_glyph_info_t *info = buffer->info; hb_glyph_info_t buf[4]; - memcpy (buf, info + start, l * sizeof (buf[0])); - memcpy (buf + 2, info + end - r, r * sizeof (buf[0])); + hb_memcpy (buf, info + start, l * sizeof (buf[0])); + hb_memcpy (buf + 2, info + end - r, r * sizeof (buf[0])); if (l != r) memmove (info + start + r, info + start + l, (end - start - l - r) * sizeof (buf[0])); - memcpy (info + start, buf + 2, r * sizeof (buf[0])); - memcpy (info + end - l, buf, l * sizeof (buf[0])); + hb_memcpy (info + start, buf + 2, r * sizeof (buf[0])); + hb_memcpy (info + end - l, buf, l * sizeof (buf[0])); if (reverse_l) { buf[0] = info[end - 1]; diff --git a/thirdparty/harfbuzz/src/hb-aat-layout.cc b/thirdparty/harfbuzz/src/hb-aat-layout.cc index d60126fe19..78427b0d5a 100644 --- a/thirdparty/harfbuzz/src/hb-aat-layout.cc +++ b/thirdparty/harfbuzz/src/hb-aat-layout.cc @@ -289,7 +289,7 @@ is_deleted_glyph (const hb_glyph_info_t *info) void hb_aat_layout_remove_deleted_glyphs (hb_buffer_t *buffer) { - hb_ot_layout_delete_glyphs_inplace (buffer, is_deleted_glyph); + buffer->delete_glyphs_inplace (is_deleted_glyph); } /** diff --git a/thirdparty/harfbuzz/src/hb-aat-map.hh b/thirdparty/harfbuzz/src/hb-aat-map.hh index c914f58d70..d0ee7d672c 100644 --- a/thirdparty/harfbuzz/src/hb-aat-map.hh +++ b/thirdparty/harfbuzz/src/hb-aat-map.hh @@ -38,7 +38,7 @@ struct hb_aat_map_t void init () { - memset (this, 0, sizeof (*this)); + hb_memset (this, 0, sizeof (*this)); chain_flags.init (); } void fini () { chain_flags.fini (); } diff --git a/thirdparty/harfbuzz/src/hb-algs.hh b/thirdparty/harfbuzz/src/hb-algs.hh index cc37c073da..d85a4afe10 100644 --- a/thirdparty/harfbuzz/src/hb-algs.hh +++ b/thirdparty/harfbuzz/src/hb-algs.hh @@ -236,17 +236,6 @@ struct template <typename T> constexpr auto impl (const T& v, hb_priority<1>) const HB_RETURN (uint32_t, hb_deref (v).hash ()) - template <typename T> constexpr uint32_t - impl (const hb::shared_ptr<T>& v, hb_priority<1>) const - { - return v.get () ? v.get ()->hash () : 0; - } - template <typename T> constexpr uint32_t - impl (const hb::unique_ptr<T>& v, hb_priority<1>) const - { - return v.get () ? v.get ()->hash () : 0; - } - template <typename T> constexpr auto impl (const T& v, hb_priority<0>) const HB_RETURN (uint32_t, std::hash<hb_decay<decltype (hb_deref (v))>>{} (hb_deref (v))) @@ -495,6 +484,17 @@ struct } HB_FUNCOBJ (hb_equal); +struct +{ + template <typename T> void + operator () (T& a, T& b) const + { + using std::swap; // allow ADL + swap (a, b); + } +} +HB_FUNCOBJ (hb_swap); + template <typename T1, typename T2> struct hb_pair_t @@ -507,7 +507,7 @@ struct hb_pair_t hb_enable_if (std::is_default_constructible<U1>::value && std::is_default_constructible<U2>::value)> hb_pair_t () : first (), second () {} - hb_pair_t (T1 a, T2 b) : first (a), second (b) {} + hb_pair_t (T1 a, T2 b) : first (std::forward<T1> (a)), second (std::forward<T2> (b)) {} template <typename Q1, typename Q2, hb_enable_if (hb_is_convertible (T1, Q1) && @@ -524,6 +524,25 @@ struct hb_pair_t bool operator > (const pair_t& o) const { return first > o.first || (first == o.first && second > o.second); } bool operator <= (const pair_t& o) const { return !(*this > o); } + static int cmp (const void *pa, const void *pb) + { + pair_t *a = (pair_t *) pa; + pair_t *b = (pair_t *) pb; + + if (a->first < b->first) return -1; + if (a->first > b->first) return +1; + if (a->second < b->second) return -1; + if (a->second > b->second) return +1; + return 0; + } + + friend void swap (hb_pair_t& a, hb_pair_t& b) + { + hb_swap (a.first, b.first); + hb_swap (a.second, b.second); + } + + T1 first; T2 second; }; @@ -570,17 +589,6 @@ struct } HB_FUNCOBJ (hb_clamp); -struct -{ - template <typename T> void - operator () (T& a, T& b) const - { - using std::swap; // allow ADL - swap (a, b); - } -} -HB_FUNCOBJ (hb_swap); - /* * Bithacks. */ @@ -849,19 +857,14 @@ hb_in_range (T u, T lo, T hi) return (T)(u - lo) <= (T)(hi - lo); } template <typename T> static inline bool -hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2) +hb_in_ranges (T u, T lo1, T hi1) { - return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2); + return hb_in_range (u, lo1, hi1); } -template <typename T> static inline bool -hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3) +template <typename T, typename ...Ts> static inline bool +hb_in_ranges (T u, T lo1, T hi1, Ts... ds) { - return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2) || hb_in_range (u, lo3, hi3); -} -template <typename T> static inline bool -hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3, T lo4, T hi4) -{ - return hb_in_range (u, lo1, hi1) || hb_in_range (u, lo2, hi2) || hb_in_range (u, lo3, hi3) || hb_in_range (u, lo4, hi4); + return hb_in_range<T> (u, lo1, hi1) || hb_in_ranges<T> (u, ds...); } @@ -869,10 +872,18 @@ hb_in_ranges (T u, T lo1, T hi1, T lo2, T hi2, T lo3, T hi3, T lo4, T hi4) * Overflow checking. */ -/* Consider __builtin_mul_overflow use here also */ static inline bool -hb_unsigned_mul_overflows (unsigned int count, unsigned int size) +hb_unsigned_mul_overflows (unsigned int count, unsigned int size, unsigned *result = nullptr) { +#if (defined(__GNUC__) && (__GNUC__ >= 4)) || defined(__clang__) + unsigned stack_result; + if (!result) + result = &stack_result; + return __builtin_mul_overflow (count, size, result); +#endif + + if (result) + *result = count * size; return (size > 0) && (count >= ((unsigned int) -1) / size); } @@ -1164,9 +1175,12 @@ hb_qsort (void *base, size_t nel, size_t width, } -template <typename T, typename T2, typename T3> static inline void -hb_stable_sort (T *array, unsigned int len, int(*compar)(const T2 *, const T2 *), T3 *array2) +template <typename T, typename T2, typename T3 = int> static inline void +hb_stable_sort (T *array, unsigned int len, int(*compar)(const T2 *, const T2 *), T3 *array2 = nullptr) { + static_assert (hb_is_trivially_copy_assignable (T), ""); + static_assert (hb_is_trivially_copy_assignable (T3), ""); + for (unsigned int i = 1; i < len; i++) { unsigned int j = i; @@ -1189,12 +1203,6 @@ hb_stable_sort (T *array, unsigned int len, int(*compar)(const T2 *, const T2 *) } } -template <typename T> static inline void -hb_stable_sort (T *array, unsigned int len, int(*compar)(const T *, const T *)) -{ - hb_stable_sort (array, len, compar, (int *) nullptr); -} - static inline hb_bool_t hb_codepoint_parse (const char *s, unsigned int len, int base, hb_codepoint_t *out) { @@ -1322,47 +1330,4 @@ struct HB_FUNCOBJ (hb_dec); -/* Compiler-assisted vectorization. */ - -/* Type behaving similar to vectorized vars defined using __attribute__((vector_size(...))), - * basically a fixed-size bitset. */ -template <typename elt_t, unsigned int byte_size> -struct hb_vector_size_t -{ - elt_t& operator [] (unsigned int i) { return v[i]; } - const elt_t& operator [] (unsigned int i) const { return v[i]; } - - void clear (unsigned char v = 0) { memset (this, v, sizeof (*this)); } - - template <typename Op> - hb_vector_size_t process (const Op& op) const - { - hb_vector_size_t r; - for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++) - r.v[i] = op (v[i]); - return r; - } - template <typename Op> - hb_vector_size_t process (const Op& op, const hb_vector_size_t &o) const - { - hb_vector_size_t r; - for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++) - r.v[i] = op (v[i], o.v[i]); - return r; - } - hb_vector_size_t operator | (const hb_vector_size_t &o) const - { return process (hb_bitwise_or, o); } - hb_vector_size_t operator & (const hb_vector_size_t &o) const - { return process (hb_bitwise_and, o); } - hb_vector_size_t operator ^ (const hb_vector_size_t &o) const - { return process (hb_bitwise_xor, o); } - hb_vector_size_t operator ~ () const - { return process (hb_bitwise_neg); } - - private: - static_assert (0 == byte_size % sizeof (elt_t), ""); - elt_t v[byte_size / sizeof (elt_t)]; -}; - - #endif /* HB_ALGS_HH */ diff --git a/thirdparty/harfbuzz/src/hb-array.hh b/thirdparty/harfbuzz/src/hb-array.hh index 5884007c19..17562bc336 100644 --- a/thirdparty/harfbuzz/src/hb-array.hh +++ b/thirdparty/harfbuzz/src/hb-array.hh @@ -100,10 +100,18 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&> /* Ouch. The operator== compares the contents of the array. For range-based for loops, * it's best if we can just compare arrayZ, though comparing contents is still fast, * but also would require that Type has operator==. As such, we optimize this operator - * for range-based for loop and just compare arrayZ and length. */ + * for range-based for loop and just compare arrayZ and length. + * + * The above comment is outdated now because we implemented separate begin/end to + * objects that were using hb_array_t for range-based loop before. */ bool operator != (const hb_array_t& o) const { return this->arrayZ != o.arrayZ || this->length != o.length; } + /* Faster range-based for loop without bounds-check. */ + Type *begin () const { return arrayZ; } + Type *end () const { return arrayZ + length; } + + /* Extra operators. */ Type * operator & () const { return arrayZ; } @@ -112,11 +120,11 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&> HB_INTERNAL bool operator == (const hb_array_t &o) const; - uint32_t hash () const { + uint32_t hash () const + { uint32_t current = 0; - for (unsigned int i = 0; i < this->length; i++) { - current = current * 31 + hb_hash (this->arrayZ[i]); - } + for (auto &v : *this) + current = current * 31 + hb_hash (v); return current; } @@ -184,23 +192,18 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&> hb_sorted_array_t<Type> qsort (int (*cmp_)(const void*, const void*)) { + //static_assert (hb_enable_if (hb_is_trivially_copy_assignable(Type)), ""); if (likely (length)) hb_qsort (arrayZ, length, this->get_item_size (), cmp_); return hb_sorted_array_t<Type> (*this); } hb_sorted_array_t<Type> qsort () { + //static_assert (hb_enable_if (hb_is_trivially_copy_assignable(Type)), ""); if (likely (length)) hb_qsort (arrayZ, length, this->get_item_size (), Type::cmp); return hb_sorted_array_t<Type> (*this); } - void qsort (unsigned int start, unsigned int end) - { - end = hb_min (end, length); - assert (start <= end); - if (likely (start < end)) - hb_qsort (arrayZ + start, end - start, this->get_item_size (), Type::cmp); - } /* * Other methods. @@ -262,17 +265,31 @@ struct hb_array_t : hb_iter_with_fallback_t<hb_array_t<Type>, Type&> void fini () { hb_free ((void *) arrayZ); arrayZ = nullptr; length = 0; } - template <typename hb_serialize_context_t> + template <typename hb_serialize_context_t, + typename U = Type, + hb_enable_if (!(sizeof (U) < sizeof (long long) && hb_is_trivially_copy_assignable(hb_decay<Type>)))> hb_array_t copy (hb_serialize_context_t *c) const { TRACE_SERIALIZE (this); auto* out = c->start_embed (arrayZ); - if (unlikely (!c->extend_size (out, get_size ()))) return_trace (hb_array_t ()); + if (unlikely (!c->extend_size (out, get_size (), false))) return_trace (hb_array_t ()); for (unsigned i = 0; i < length; i++) out[i] = arrayZ[i]; /* TODO: add version that calls c->copy() */ return_trace (hb_array_t (out, length)); } + template <typename hb_serialize_context_t, + typename U = Type, + hb_enable_if (sizeof (U) < sizeof (long long) && hb_is_trivially_copy_assignable(hb_decay<Type>))> + hb_array_t copy (hb_serialize_context_t *c) const + { + TRACE_SERIALIZE (this); + auto* out = c->start_embed (arrayZ); + if (unlikely (!c->extend_size (out, get_size (), false))) return_trace (hb_array_t ()); + hb_memcpy (out, arrayZ, get_size ()); + return_trace (hb_array_t (out, length)); + } + template <typename hb_sanitize_context_t> bool sanitize (hb_sanitize_context_t *c) const { return c->check_array (arrayZ, length); } @@ -295,8 +312,8 @@ hb_array (T (&array_)[length_]) template <typename Type> struct hb_sorted_array_t : - hb_iter_t<hb_sorted_array_t<Type>, Type&>, - hb_array_t<Type> + hb_array_t<Type>, + hb_iter_t<hb_sorted_array_t<Type>, Type&> { typedef hb_iter_t<hb_sorted_array_t, Type&> iter_base_t; HB_ITER_USING (iter_base_t); @@ -316,8 +333,8 @@ struct hb_sorted_array_t : template <typename U, hb_enable_if (hb_is_cr_convertible(U, Type))> constexpr hb_sorted_array_t (const hb_array_t<U> &o) : - hb_iter_t<hb_sorted_array_t, Type&> (), - hb_array_t<Type> (o) {} + hb_array_t<Type> (o), + hb_iter_t<hb_sorted_array_t, Type&> () {} template <typename U, hb_enable_if (hb_is_cr_convertible(U, Type))> hb_sorted_array_t& operator = (const hb_array_t<U> &o) @@ -329,6 +346,11 @@ struct hb_sorted_array_t : bool operator != (const hb_sorted_array_t& o) const { return this->arrayZ != o.arrayZ || this->length != o.length; } + /* Faster range-based for loop without bounds-check. */ + Type *begin () const { return this->arrayZ; } + Type *end () const { return this->arrayZ + this->length; } + + hb_sorted_array_t sub_array (unsigned int start_offset, unsigned int *seg_count /* IN/OUT */) const { return hb_sorted_array_t (((const hb_array_t<Type> *) (this))->sub_array (start_offset, seg_count)); } hb_sorted_array_t sub_array (unsigned int start_offset, unsigned int seg_count) const @@ -421,18 +443,42 @@ inline bool hb_array_t<const unsigned char>::operator == (const hb_array_t<const return 0 == hb_memcmp (arrayZ, o.arrayZ, length); } + +/* Specialize hash() for byte arrays. */ + template <> -inline uint32_t hb_array_t<const char>::hash () const { +inline uint32_t hb_array_t<const char>::hash () const +{ uint32_t current = 0; - for (unsigned int i = 0; i < this->length; i++) - current = current * 31 + (uint32_t) (this->arrayZ[i] * 2654435761u); + unsigned i = 0; + +#if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \ + ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) + struct __attribute__((packed)) packed_uint32_t { uint32_t v; }; + for (; i + 4 <= this->length; i += 4) + current = current * 31 + hb_hash ((uint32_t) ((packed_uint32_t *) &this->arrayZ[i])->v); +#endif + + for (; i < this->length; i++) + current = current * 31 + hb_hash (this->arrayZ[i]); return current; } + template <> -inline uint32_t hb_array_t<const unsigned char>::hash () const { +inline uint32_t hb_array_t<const unsigned char>::hash () const +{ uint32_t current = 0; - for (unsigned int i = 0; i < this->length; i++) - current = current * 31 + (uint32_t) (this->arrayZ[i] * 2654435761u); + unsigned i = 0; + +#if defined(__OPTIMIZE__) && !defined(HB_NO_PACKED) && \ + ((defined(__GNUC__) && __GNUC__ >= 5) || defined(__clang__)) + struct __attribute__((packed)) packed_uint32_t { uint32_t v; }; + for (; i + 4 <= this->length; i += 4) + current = current * 31 + hb_hash ((uint32_t) ((packed_uint32_t *) &this->arrayZ[i])->v); +#endif + + for (; i < this->length; i++) + current = current * 31 + hb_hash (this->arrayZ[i]); return current; } diff --git a/thirdparty/harfbuzz/src/hb-bit-page.hh b/thirdparty/harfbuzz/src/hb-bit-page.hh index 95ae1b7bf9..11987054f8 100644 --- a/thirdparty/harfbuzz/src/hb-bit-page.hh +++ b/thirdparty/harfbuzz/src/hb-bit-page.hh @@ -30,6 +30,53 @@ #include "hb.hh" + +/* Compiler-assisted vectorization. */ + +/* Type behaving similar to vectorized vars defined using __attribute__((vector_size(...))), + * basically a fixed-size bitset. */ +template <typename elt_t, unsigned int byte_size> +struct hb_vector_size_t +{ + elt_t& operator [] (unsigned int i) { return v[i]; } + const elt_t& operator [] (unsigned int i) const { return v[i]; } + + void clear (unsigned char v = 0) { hb_memset (this, v, sizeof (*this)); } + + template <typename Op> + hb_vector_size_t process (const Op& op) const + { + hb_vector_size_t r; + for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++) + r.v[i] = op (v[i]); + return r; + } + template <typename Op> + hb_vector_size_t process (const Op& op, const hb_vector_size_t &o) const + { + hb_vector_size_t r; + for (unsigned int i = 0; i < ARRAY_LENGTH (v); i++) + r.v[i] = op (v[i], o.v[i]); + return r; + } + hb_vector_size_t operator | (const hb_vector_size_t &o) const + { return process (hb_bitwise_or, o); } + hb_vector_size_t operator & (const hb_vector_size_t &o) const + { return process (hb_bitwise_and, o); } + hb_vector_size_t operator ^ (const hb_vector_size_t &o) const + { return process (hb_bitwise_xor, o); } + hb_vector_size_t operator ~ () const + { return process (hb_bitwise_neg); } + + hb_array_t<const elt_t> iter () const + { return hb_array (v); } + + private: + static_assert (0 == byte_size % sizeof (elt_t), ""); + elt_t v[byte_size / sizeof (elt_t)]; +}; + + struct hb_bit_page_t { void init0 () { v.clear (); } @@ -40,17 +87,17 @@ struct hb_bit_page_t bool is_empty () const { - for (unsigned i = 0; i < len (); i++) - if (v[i]) - return false; - return true; + return + + hb_iter (v) + | hb_none + ; } uint32_t hash () const { - uint32_t h = 0; - for (unsigned i = 0; i < len (); i++) - h = h * 31 + hb_hash (v[i]); - return h; + return + + hb_iter (v) + | hb_reduce ([] (uint32_t h, const elt_t &_) { return h * 31 + hb_hash (_); }, (uint32_t) 0u) + ; } void add (hb_codepoint_t g) { elt (g) |= mask (g); } @@ -69,7 +116,7 @@ struct hb_bit_page_t *la |= ~(mask (a) - 1); la++; - memset (la, 0xff, (char *) lb - (char *) la); + hb_memset (la, 0xff, (char *) lb - (char *) la); *lb |= ((mask (b) << 1) - 1); } @@ -85,7 +132,7 @@ struct hb_bit_page_t *la &= mask (a) - 1; la++; - memset (la, 0, (char *) lb - (char *) la); + hb_memset (la, 0, (char *) lb - (char *) la); *lb &= ~((mask (b) << 1) - 1); } @@ -101,13 +148,13 @@ struct hb_bit_page_t hb_codepoint_t *p, unsigned int size) const { - unsigned int start_v = start_value >> ELT_BITS_LOG_2; + unsigned int start_v = start_value / ELT_BITS; unsigned int start_bit = start_value & ELT_MASK; unsigned int count = 0; for (unsigned i = start_v; i < len () && count < size; i++) { elt_t bits = v[i]; - uint32_t v_base = base | (i << ELT_BITS_LOG_2); + uint32_t v_base = base | (i * ELT_BITS); for (unsigned int j = start_bit; j < ELT_BITS && count < size; j++) { if ((elt_t(1) << j) & bits) { @@ -132,13 +179,13 @@ struct hb_bit_page_t unsigned int size, hb_codepoint_t *next_value) const { - unsigned int start_v = start_value >> ELT_BITS_LOG_2; + unsigned int start_v = start_value / ELT_BITS; unsigned int start_bit = start_value & ELT_MASK; unsigned int count = 0; for (unsigned i = start_v; i < len () && count < size; i++) { elt_t bits = v[i]; - uint32_t v_offset = i << ELT_BITS_LOG_2; + uint32_t v_offset = i * ELT_BITS; for (unsigned int j = start_bit; j < ELT_BITS && count < size; j++) { if ((elt_t(1) << j) & bits) @@ -161,7 +208,10 @@ struct hb_bit_page_t bool is_equal (const hb_bit_page_t &other) const { - return 0 == hb_memcmp (&v, &other.v, sizeof (v)); + for (unsigned i = 0; i < len (); i++) + if (v[i] != other.v[i]) + return false; + return true; } bool is_subset (const hb_bit_page_t &larger_page) const { @@ -173,10 +223,10 @@ struct hb_bit_page_t unsigned int get_population () const { - unsigned int pop = 0; - for (unsigned int i = 0; i < len (); i++) - pop += hb_popcount (v[i]); - return pop; + return + + hb_iter (v) + | hb_reduce ([] (unsigned pop, const elt_t &_) { return pop + hb_popcount (_); }, 0u) + ; } bool next (hb_codepoint_t *codepoint) const @@ -262,8 +312,6 @@ struct hb_bit_page_t typedef hb_vector_size_t<elt_t, PAGE_BITS / 8> vector_t; static constexpr unsigned ELT_BITS = sizeof (elt_t) * 8; - static constexpr unsigned ELT_BITS_LOG_2 = 6; - static_assert (1 << ELT_BITS_LOG_2 == ELT_BITS, ""); static constexpr unsigned ELT_MASK = ELT_BITS - 1; static constexpr unsigned BITS = sizeof (vector_t) * 8; diff --git a/thirdparty/harfbuzz/src/hb-bit-set-invertible.hh b/thirdparty/harfbuzz/src/hb-bit-set-invertible.hh index 27fb0732ea..ff8aecc60c 100644 --- a/thirdparty/harfbuzz/src/hb-bit-set-invertible.hh +++ b/thirdparty/harfbuzz/src/hb-bit-set-invertible.hh @@ -123,10 +123,8 @@ struct hb_bit_set_invertible_t bool get (hb_codepoint_t g) const { return s.get (g) ^ inverted; } /* Has interface. */ - static constexpr bool SENTINEL = false; - typedef bool value_t; - value_t operator [] (hb_codepoint_t k) const { return get (k); } - bool has (hb_codepoint_t k) const { return (*this)[k] != SENTINEL; } + bool operator [] (hb_codepoint_t k) const { return get (k); } + bool has (hb_codepoint_t k) const { return (*this)[k]; } /* Predicate. */ bool operator () (hb_codepoint_t k) const { return has (k); } diff --git a/thirdparty/harfbuzz/src/hb-bit-set.hh b/thirdparty/harfbuzz/src/hb-bit-set.hh index a63887efda..8de6e037fb 100644 --- a/thirdparty/harfbuzz/src/hb-bit-set.hh +++ b/thirdparty/harfbuzz/src/hb-bit-set.hh @@ -85,10 +85,10 @@ struct hb_bit_set_t void err () { if (successful) successful = false; } /* TODO Remove */ bool in_error () const { return !successful; } - bool resize (unsigned int count) + bool resize (unsigned int count, bool clear = true) { if (unlikely (!successful)) return false; - if (unlikely (!pages.resize (count) || !page_map.resize (count))) + if (unlikely (!pages.resize (count, clear) || !page_map.resize (count, clear))) { pages.resize (page_map.length); successful = false; @@ -330,10 +330,8 @@ struct hb_bit_set_t } /* Has interface. */ - static constexpr bool SENTINEL = false; - typedef bool value_t; - value_t operator [] (hb_codepoint_t k) const { return get (k); } - bool has (hb_codepoint_t k) const { return (*this)[k] != SENTINEL; } + bool operator [] (hb_codepoint_t k) const { return get (k); } + bool has (hb_codepoint_t k) const { return (*this)[k]; } /* Predicate. */ bool operator () (hb_codepoint_t k) const { return has (k); } @@ -352,7 +350,7 @@ struct hb_bit_set_t { if (unlikely (!successful)) return; unsigned int count = other.pages.length; - if (unlikely (!resize (count))) + if (unlikely (!resize (count, false))) return; population = other.population; @@ -391,7 +389,7 @@ struct hb_bit_set_t bool is_subset (const hb_bit_set_t &larger_set) const { if (has_population () && larger_set.has_population () && - population != larger_set.population) + population > larger_set.population) return false; uint32_t spi = 0; @@ -540,21 +538,21 @@ struct hb_bit_set_t b = nb; for (; a && b; ) { - if (page_map[a - 1].major == other.page_map[b - 1].major) + if (page_map.arrayZ[a - 1].major == other.page_map.arrayZ[b - 1].major) { a--; b--; count--; - page_map[count] = page_map[a]; + page_map.arrayZ[count] = page_map.arrayZ[a]; page_at (count).v = op (page_at (a).v, other.page_at (b).v); } - else if (page_map[a - 1].major > other.page_map[b - 1].major) + else if (page_map.arrayZ[a - 1].major > other.page_map.arrayZ[b - 1].major) { a--; if (passthru_left) { count--; - page_map[count] = page_map[a]; + page_map.arrayZ[count] = page_map.arrayZ[a]; } } else @@ -563,8 +561,8 @@ struct hb_bit_set_t if (passthru_right) { count--; - page_map[count].major = other.page_map[b].major; - page_map[count].index = next_page++; + page_map.arrayZ[count].major = other.page_map.arrayZ[b].major; + page_map.arrayZ[count].index = next_page++; page_at (count).v = other.page_at (b).v; } } @@ -574,15 +572,15 @@ struct hb_bit_set_t { a--; count--; - page_map[count] = page_map [a]; + page_map.arrayZ[count] = page_map.arrayZ[a]; } if (passthru_right) while (b) { b--; count--; - page_map[count].major = other.page_map[b].major; - page_map[count].index = next_page++; + page_map.arrayZ[count].major = other.page_map.arrayZ[b].major; + page_map.arrayZ[count].index = next_page++; page_at (count).v = other.page_at (b).v; } assert (!count); @@ -605,8 +603,6 @@ struct hb_bit_set_t bool next (hb_codepoint_t *codepoint) const { - // TODO: this should be merged with prev() as both implementations - // are very similar. if (unlikely (*codepoint == INVALID)) { *codepoint = get_min (); return *codepoint != INVALID; @@ -640,7 +636,7 @@ struct hb_bit_set_t for (; i < page_map.length; i++) { - const page_map_t ¤t = page_map.arrayZ[i]; + const page_map_t ¤t = page_map_array[i]; hb_codepoint_t m = pages_array[current.index].get_min (); if (m != INVALID) { @@ -663,21 +659,21 @@ struct hb_bit_set_t page_map_t map = {get_major (*codepoint), 0}; unsigned int i; page_map.bfind (map, &i, HB_NOT_FOUND_STORE_CLOSEST); - if (i < page_map.length && page_map[i].major == map.major) + if (i < page_map.length && page_map.arrayZ[i].major == map.major) { - if (pages[page_map[i].index].previous (codepoint)) + if (pages[page_map.arrayZ[i].index].previous (codepoint)) { - *codepoint += page_map[i].major * page_t::PAGE_BITS; + *codepoint += page_map.arrayZ[i].major * page_t::PAGE_BITS; return true; } } i--; for (; (int) i >= 0; i--) { - hb_codepoint_t m = pages[page_map[i].index].get_max (); + hb_codepoint_t m = pages.arrayZ[page_map.arrayZ[i].index].get_max (); if (m != INVALID) { - *codepoint = page_map[i].major * page_t::PAGE_BITS + m; + *codepoint = page_map.arrayZ[i].major * page_t::PAGE_BITS + m; return true; } } @@ -905,7 +901,7 @@ struct hb_bit_set_t { auto &cached_page = page_map.arrayZ[i]; if (cached_page.major == major) - return &pages[cached_page.index]; + return &pages.arrayZ[cached_page.index]; } page_map_t map = {major, pages.length}; @@ -917,15 +913,15 @@ struct hb_bit_set_t if (unlikely (!resize (pages.length + 1))) return nullptr; - pages[map.index].init0 (); - memmove (page_map + i + 1, - page_map + i, + pages.arrayZ[map.index].init0 (); + memmove (page_map.arrayZ + i + 1, + page_map.arrayZ + i, (page_map.length - 1 - i) * page_map.item_size); page_map[i] = map; } last_page_lookup = i; - return &pages[page_map[i].index]; + return &pages.arrayZ[page_map.arrayZ[i].index]; } const page_t *page_for (hb_codepoint_t g) const { @@ -939,7 +935,7 @@ struct hb_bit_set_t { auto &cached_page = page_map.arrayZ[i]; if (cached_page.major == major) - return &pages[cached_page.index]; + return &pages.arrayZ[cached_page.index]; } page_map_t key = {major}; @@ -947,10 +943,18 @@ struct hb_bit_set_t return nullptr; last_page_lookup = i; - return &pages[page_map[i].index]; + return &pages.arrayZ[page_map[i].index]; + } + page_t &page_at (unsigned int i) + { + assert (i < page_map.length); + return pages.arrayZ[page_map.arrayZ[i].index]; + } + const page_t &page_at (unsigned int i) const + { + assert (i < page_map.length); + return pages.arrayZ[page_map.arrayZ[i].index]; } - page_t &page_at (unsigned int i) { return pages[page_map[i].index]; } - const page_t &page_at (unsigned int i) const { return pages[page_map[i].index]; } unsigned int get_major (hb_codepoint_t g) const { return g >> page_t::PAGE_BITS_LOG_2; } unsigned int page_remainder (hb_codepoint_t g) const { return g & page_t::PAGE_BITMASK; } hb_codepoint_t major_start (unsigned int major) const { return major << page_t::PAGE_BITS_LOG_2; } diff --git a/thirdparty/harfbuzz/src/hb-blob.cc b/thirdparty/harfbuzz/src/hb-blob.cc index 9bc12ea3fa..f0fda1fa4d 100644 --- a/thirdparty/harfbuzz/src/hb-blob.cc +++ b/thirdparty/harfbuzz/src/hb-blob.cc @@ -495,7 +495,7 @@ hb_blob_t::try_make_writable () DEBUG_MSG_FUNC (BLOB, this, "dupped successfully -> %p\n", this->data); - memcpy (new_data, this->data, this->length); + hb_memcpy (new_data, this->data, this->length); this->destroy_user_data (); this->mode = HB_MEMORY_MODE_WRITABLE; this->data = new_data; diff --git a/thirdparty/harfbuzz/src/hb-buffer-deserialize-json.hh b/thirdparty/harfbuzz/src/hb-buffer-deserialize-json.hh index 87095855d6..993bb1f698 100644 --- a/thirdparty/harfbuzz/src/hb-buffer-deserialize-json.hh +++ b/thirdparty/harfbuzz/src/hb-buffer-deserialize-json.hh @@ -32,7 +32,7 @@ #include "hb.hh" -#line 36 "hb-buffer-deserialize-json.hh" +#line 33 "hb-buffer-deserialize-json.hh" static const unsigned char _deserialize_json_trans_keys[] = { 0u, 0u, 9u, 123u, 9u, 34u, 97u, 117u, 120u, 121u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, 9u, 125u, 9u, 125u, 9u, 125u, 34u, 34u, 9u, 58u, 9u, 57u, 48u, 57u, @@ -557,12 +557,12 @@ _hb_buffer_deserialize_json (hb_buffer_t *buffer, hb_glyph_info_t info = {0}; hb_glyph_position_t pos = {0}; -#line 561 "hb-buffer-deserialize-json.hh" +#line 554 "hb-buffer-deserialize-json.hh" { cs = deserialize_json_start; } -#line 566 "hb-buffer-deserialize-json.hh" +#line 557 "hb-buffer-deserialize-json.hh" { int _slen; int _trans; @@ -590,8 +590,8 @@ _resume: case 1: #line 38 "hb-buffer-deserialize-json.rl" { - memset (&info, 0, sizeof (info)); - memset (&pos , 0, sizeof (pos )); + hb_memset (&info, 0, sizeof (info)); + hb_memset (&pos , 0, sizeof (pos )); } break; case 5: @@ -774,7 +774,7 @@ _resume: *end_ptr = p; } break; -#line 778 "hb-buffer-deserialize-json.hh" +#line 735 "hb-buffer-deserialize-json.hh" } _again: diff --git a/thirdparty/harfbuzz/src/hb-buffer-deserialize-text.hh b/thirdparty/harfbuzz/src/hb-buffer-deserialize-text.hh index 9062610de2..6b9b4282fc 100644 --- a/thirdparty/harfbuzz/src/hb-buffer-deserialize-text.hh +++ b/thirdparty/harfbuzz/src/hb-buffer-deserialize-text.hh @@ -32,32 +32,30 @@ #include "hb.hh" -#line 36 "hb-buffer-deserialize-text.hh" +#line 33 "hb-buffer-deserialize-text.hh" static const unsigned char _deserialize_text_trans_keys[] = { - 0u, 0u, 9u, 91u, 85u, 85u, 43u, 43u, 48u, 102u, 9u, 85u, 48u, 57u, 45u, 57u, - 48u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 44u, 44u, 45u, 57u, 48u, 57u, - 44u, 57u, 43u, 124u, 45u, 57u, 48u, 57u, 9u, 124u, 9u, 124u, 0u, 0u, 9u, 85u, + 0u, 0u, 9u, 91u, 85u, 85u, 43u, 43u, 48u, 102u, 9u, 85u, 48u, 57u, 48u, 57u, + 45u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 48u, 57u, 45u, 57u, 48u, 57u, 44u, 44u, + 45u, 57u, 48u, 57u, 44u, 57u, 43u, 124u, 9u, 124u, 9u, 124u, 0u, 0u, 9u, 85u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, 9u, 124u, - 9u, 124u, 9u, 124u, 9u, 124u, 0 + 0 }; static const char _deserialize_text_key_spans[] = { - 0, 83, 1, 1, 55, 77, 10, 13, - 10, 10, 10, 13, 10, 1, 13, 10, - 14, 82, 13, 10, 116, 116, 0, 77, - 116, 116, 116, 116, 116, 116, 116, 116, + 0, 83, 1, 1, 55, 77, 10, 10, + 13, 10, 13, 10, 10, 13, 10, 1, + 13, 10, 14, 82, 116, 116, 0, 77, 116, 116, 116, 116, 116, 116, 116, 116, - 116, 116, 116 + 116, 116, 116, 116, 116, 116, 116, 116 }; static const short _deserialize_text_index_offsets[] = { 0, 0, 84, 86, 88, 144, 222, 233, - 247, 258, 269, 280, 294, 305, 307, 321, - 332, 347, 430, 444, 455, 572, 689, 690, + 244, 258, 269, 283, 294, 305, 319, 330, + 332, 346, 357, 372, 455, 572, 689, 690, 768, 885, 1002, 1119, 1236, 1353, 1470, 1587, - 1704, 1821, 1938, 2055, 2172, 2289, 2406, 2523, - 2640, 2757, 2874 + 1704, 1821, 1938, 2055, 2172, 2289, 2406, 2523 }; static const char _deserialize_text_indicies[] = { @@ -90,34 +88,34 @@ static const char _deserialize_text_indicies[] = { 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 4, 1, 8, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 1, 10, 1, 1, 11, 12, 12, - 12, 12, 12, 12, 12, 12, 12, 1, + 9, 1, 10, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 1, 12, 1, 1, 13, 14, 14, 14, 14, 14, 14, 14, 14, 14, 1, 15, 16, 16, 16, 16, - 16, 16, 16, 16, 16, 1, 17, 18, - 18, 18, 18, 18, 18, 18, 18, 18, - 1, 19, 1, 1, 20, 21, 21, 21, + 16, 16, 16, 16, 16, 1, 17, 1, + 1, 18, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 1, 20, 21, 21, 21, 21, 21, 21, 21, 21, 21, 1, 22, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 1, 24, 1, 25, 1, 1, 26, - 27, 27, 27, 27, 27, 27, 27, 27, - 27, 1, 28, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 1, 24, 1, 1, - 1, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 1, 30, 30, 1, 1, + 23, 1, 24, 1, 1, 25, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 1, + 27, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 1, 29, 1, 30, 1, 1, + 31, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 1, 33, 34, 34, 34, 34, + 34, 34, 34, 34, 34, 1, 29, 1, + 1, 1, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 1, 35, 35, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 30, 1, - 1, 30, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 35, + 1, 1, 35, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 30, 30, 1, + 1, 1, 1, 1, 1, 1, 35, 35, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 30, 1, 31, - 1, 1, 32, 33, 33, 33, 33, 33, - 33, 33, 33, 33, 1, 34, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 1, + 1, 1, 1, 1, 1, 1, 35, 1, 36, 36, 36, 36, 36, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 36, @@ -201,282 +199,235 @@ static const char _deserialize_text_indicies[] = { 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 56, 48, - 57, 57, 57, 57, 57, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 57, - 30, 30, 58, 30, 30, 30, 30, 30, - 30, 30, 59, 1, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 60, 30, 30, 61, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 62, 63, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 64, 30, 57, 57, 57, - 57, 57, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 57, 30, 30, 58, - 30, 30, 30, 30, 30, 30, 30, 59, - 1, 30, 30, 30, 65, 66, 66, 66, - 66, 66, 66, 66, 66, 66, 30, 30, - 30, 60, 30, 30, 61, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 62, 63, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 64, 30, 67, 67, 67, 67, 67, 1, + 57, 57, 57, 57, 57, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 57, + 35, 35, 58, 35, 35, 35, 35, 35, + 35, 35, 59, 1, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 60, 35, 35, 61, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 62, 63, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, + 35, 35, 35, 64, 35, 65, 65, 65, + 65, 65, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 65, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 67, 1, 1, 68, 1, 1, 1, - 1, 1, 1, 1, 1, 69, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 70, 1, + 1, 66, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 71, 1, 72, - 72, 72, 72, 72, 1, 1, 1, 1, + 67, 1, 68, 68, 68, 68, 68, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 72, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 68, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 42, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 42, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 73, 1, 74, 74, 74, 74, - 74, 48, 48, 48, 48, 48, 48, 48, + 1, 1, 1, 1, 1, 69, 1, 70, + 70, 70, 70, 70, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 74, 48, 48, 50, 48, - 48, 48, 48, 48, 48, 48, 51, 1, + 48, 48, 48, 48, 48, 48, 70, 48, + 48, 50, 48, 48, 48, 48, 48, 48, + 48, 51, 1, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 48, 52, 48, 48, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 52, 48, 48, 53, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 54, - 55, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 54, 55, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 56, - 48, 75, 75, 75, 75, 75, 1, 1, + 48, 48, 48, 48, 48, 48, 48, 48, + 48, 48, 56, 48, 71, 71, 71, 71, + 71, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 71, 1, 1, 72, 1, + 1, 1, 1, 1, 1, 1, 1, 73, 1, 1, 1, 1, 1, 1, 1, 1, - 75, 1, 1, 76, 1, 1, 1, 1, - 1, 1, 1, 77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 78, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 74, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 79, 1, 80, 80, - 80, 80, 80, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 75, + 1, 76, 76, 76, 76, 76, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 76, 1, 1, 77, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 81, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 78, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 82, 1, 80, 80, 80, 80, 80, + 1, 1, 1, 1, 79, 1, 76, 76, + 76, 76, 76, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 76, 1, 1, + 77, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 78, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 81, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 79, 1, 71, 71, 71, 71, 71, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 82, 1, - 84, 84, 84, 84, 84, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 84, - 1, 1, 85, 1, 1, 1, 1, 1, - 1, 1, 86, 1, 1, 1, 1, 1, + 1, 1, 71, 1, 1, 72, 1, 1, + 1, 1, 1, 1, 1, 1, 73, 1, + 1, 1, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 16, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 74, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 87, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 75, 1, + 80, 80, 80, 80, 80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 88, 1, 84, 84, 84, - 84, 84, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 80, + 1, 1, 81, 1, 1, 1, 1, 1, + 1, 1, 82, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 84, 1, 1, 85, - 1, 1, 1, 1, 1, 1, 1, 86, - 1, 1, 1, 1, 29, 29, 29, 29, - 29, 29, 29, 29, 29, 29, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 83, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 87, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 84, 1, 85, 85, 85, + 85, 85, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 88, 1, 75, 75, 75, 75, 75, 1, + 1, 1, 1, 1, 85, 1, 1, 86, + 1, 1, 1, 1, 1, 1, 1, 87, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 75, 1, 1, 76, 1, 1, 1, - 1, 1, 1, 1, 77, 1, 1, 1, - 1, 89, 89, 89, 89, 89, 89, 89, - 89, 89, 89, 1, 1, 1, 1, 1, - 1, 78, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 88, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 79, 1, 90, - 90, 90, 90, 90, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 90, 1, - 1, 91, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 89, 1, 85, 85, 85, 85, 85, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 85, 1, 1, 86, 1, 1, 1, + 1, 1, 1, 1, 87, 1, 1, 1, + 1, 34, 34, 34, 34, 34, 34, 34, + 34, 34, 34, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 92, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 88, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 93, 1, 90, 90, 90, 90, - 90, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 90, 1, 1, 91, 1, + 1, 1, 1, 1, 1, 89, 1, 80, + 80, 80, 80, 80, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 35, 35, 35, 35, 35, - 35, 35, 35, 35, 35, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 80, 1, + 1, 81, 1, 1, 1, 1, 1, 1, + 1, 82, 1, 1, 1, 1, 90, 90, + 90, 90, 90, 90, 90, 90, 90, 90, + 1, 1, 1, 1, 1, 1, 83, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 45, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 92, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 1, 1, 93, - 1, 67, 67, 67, 67, 67, 1, 1, + 1, 1, 84, 1, 65, 65, 65, 65, + 65, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 65, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 67, 1, 1, 68, 1, 1, 1, 1, - 1, 1, 1, 1, 69, 1, 1, 1, - 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 1, 70, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 66, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 71, 1, 94, 94, - 94, 94, 94, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 94, 30, 30, - 58, 30, 30, 30, 30, 30, 30, 30, - 59, 1, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 60, 30, 30, 61, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 62, 95, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 96, 30, 94, 94, 94, 94, 94, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 94, 30, 30, 58, 30, 30, - 30, 30, 30, 30, 30, 59, 1, 30, - 30, 30, 97, 97, 97, 97, 97, 97, - 97, 97, 97, 97, 30, 30, 30, 60, - 30, 30, 61, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 62, 95, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 96, 30, - 0 + 1, 1, 1, 1, 1, 1, 1, 67, + 1, 0 }; static const char _deserialize_text_trans_targs[] = { 1, 0, 2, 26, 3, 4, 20, 5, - 24, 25, 8, 29, 40, 29, 40, 32, - 37, 33, 34, 12, 13, 16, 13, 16, - 14, 15, 35, 36, 35, 36, 27, 19, - 38, 39, 38, 39, 21, 20, 6, 22, + 24, 25, 28, 39, 9, 31, 34, 31, + 34, 11, 32, 33, 32, 33, 35, 38, + 14, 15, 18, 15, 18, 16, 17, 36, + 37, 36, 37, 27, 21, 20, 6, 22, 23, 21, 22, 23, 21, 22, 23, 25, - 27, 27, 28, 7, 9, 11, 17, 22, - 31, 27, 28, 7, 9, 11, 17, 22, - 31, 41, 42, 30, 10, 18, 22, 31, - 30, 31, 31, 30, 10, 7, 11, 31, - 30, 22, 31, 34, 30, 10, 7, 22, - 31, 37, 30, 10, 22, 31, 27, 22, - 31, 42 + 27, 27, 7, 8, 12, 13, 19, 22, + 30, 27, 7, 8, 12, 13, 19, 22, + 30, 29, 22, 30, 29, 30, 30, 29, + 7, 10, 22, 30, 29, 7, 22, 30, + 29, 7, 8, 13, 30, 29, 7, 8, + 22, 30, 38, 39 }; static const char _deserialize_text_trans_actions[] = { 0, 0, 0, 0, 1, 0, 2, 0, - 2, 2, 3, 4, 4, 5, 5, 4, - 4, 4, 4, 3, 3, 3, 0, 0, - 6, 3, 4, 4, 5, 5, 5, 3, - 4, 4, 5, 5, 7, 8, 9, 7, + 2, 2, 3, 3, 4, 3, 3, 5, + 5, 4, 3, 3, 5, 5, 3, 3, + 4, 4, 4, 0, 0, 6, 4, 3, + 3, 5, 5, 5, 7, 8, 9, 7, 7, 0, 0, 0, 10, 10, 10, 8, - 12, 13, 14, 15, 15, 15, 16, 11, - 11, 18, 19, 20, 20, 20, 0, 17, - 17, 4, 4, 21, 22, 22, 21, 21, - 0, 0, 13, 10, 23, 23, 23, 10, - 24, 24, 24, 5, 25, 26, 26, 25, - 25, 5, 27, 28, 27, 27, 30, 29, - 29, 5 + 12, 13, 14, 14, 14, 14, 15, 11, + 11, 17, 18, 18, 18, 18, 0, 16, + 16, 19, 19, 19, 0, 0, 13, 20, + 21, 21, 20, 20, 22, 23, 22, 22, + 10, 24, 24, 24, 10, 25, 26, 26, + 25, 25, 5, 5 }; static const char _deserialize_text_eof_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, - 10, 10, 11, 17, 17, 21, 0, 11, - 10, 24, 24, 25, 25, 10, 27, 27, - 21, 29, 29 + 10, 10, 11, 16, 19, 0, 11, 20, + 22, 22, 20, 10, 25, 25, 10, 19 }; static const int deserialize_text_start = 1; @@ -509,12 +460,12 @@ _hb_buffer_deserialize_text (hb_buffer_t *buffer, hb_glyph_info_t info = {0}; hb_glyph_position_t pos = {0}; -#line 513 "hb-buffer-deserialize-text.hh" +#line 457 "hb-buffer-deserialize-text.hh" { cs = deserialize_text_start; } -#line 518 "hb-buffer-deserialize-text.hh" +#line 460 "hb-buffer-deserialize-text.hh" { int _slen; int _trans; @@ -542,11 +493,11 @@ _resume: case 1: #line 38 "hb-buffer-deserialize-text.rl" { - memset (&info, 0, sizeof (info)); - memset (&pos , 0, sizeof (pos )); + hb_memset (&info, 0, sizeof (info)); + hb_memset (&pos , 0, sizeof (pos )); } break; - case 3: + case 4: #line 51 "hb-buffer-deserialize-text.rl" { tok = p; @@ -560,7 +511,7 @@ _resume: #line 56 "hb-buffer-deserialize-text.rl" { if (unlikely (!buffer->ensure_unicode ())) return false; } break; - case 20: + case 18: #line 58 "hb-buffer-deserialize-text.rl" { /* TODO Unescape delimiters. */ @@ -574,7 +525,7 @@ _resume: #line 66 "hb-buffer-deserialize-text.rl" {if (!parse_hex (tok, p, &info.codepoint )) return false; } break; - case 23: + case 24: #line 68 "hb-buffer-deserialize-text.rl" { if (!parse_uint (tok, p, &info.cluster )) return false; } break; @@ -586,26 +537,26 @@ _resume: #line 70 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.y_offset )) return false; } break; - case 22: + case 21: #line 71 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.x_advance)) return false; } break; - case 28: + case 23: #line 72 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.y_advance)) return false; } break; - case 16: + case 15: #line 38 "hb-buffer-deserialize-text.rl" { - memset (&info, 0, sizeof (info)); - memset (&pos , 0, sizeof (pos )); + hb_memset (&info, 0, sizeof (info)); + hb_memset (&pos , 0, sizeof (pos )); } #line 51 "hb-buffer-deserialize-text.rl" { tok = p; } break; - case 4: + case 3: #line 51 "hb-buffer-deserialize-text.rl" { tok = p; @@ -621,7 +572,7 @@ _resume: #line 56 "hb-buffer-deserialize-text.rl" { if (unlikely (!buffer->ensure_unicode ())) return false; } break; - case 17: + case 16: #line 58 "hb-buffer-deserialize-text.rl" { /* TODO Unescape delimiters. */ @@ -639,18 +590,6 @@ _resume: *end_ptr = p; } break; - case 19: -#line 58 "hb-buffer-deserialize-text.rl" - { - /* TODO Unescape delimiters. */ - if (!hb_font_glyph_from_string (font, - tok, p - tok, - &info.codepoint)) - return false; -} -#line 55 "hb-buffer-deserialize-text.rl" - { if (unlikely (!buffer->ensure_glyphs ())) return false; } - break; case 7: #line 66 "hb-buffer-deserialize-text.rl" {if (!parse_hex (tok, p, &info.codepoint )) return false; } @@ -687,7 +626,7 @@ _resume: *end_ptr = p; } break; - case 21: + case 20: #line 71 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.x_advance)) return false; } #line 43 "hb-buffer-deserialize-text.rl" @@ -699,7 +638,7 @@ _resume: *end_ptr = p; } break; - case 27: + case 22: #line 72 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.y_advance)) return false; } #line 43 "hb-buffer-deserialize-text.rl" @@ -711,7 +650,7 @@ _resume: *end_ptr = p; } break; - case 24: + case 19: #line 73 "hb-buffer-deserialize-text.rl" { if (!parse_uint (tok, p, &info.mask )) return false; } #line 43 "hb-buffer-deserialize-text.rl" @@ -726,8 +665,8 @@ _resume: case 12: #line 38 "hb-buffer-deserialize-text.rl" { - memset (&info, 0, sizeof (info)); - memset (&pos , 0, sizeof (pos )); + hb_memset (&info, 0, sizeof (info)); + hb_memset (&pos , 0, sizeof (pos )); } #line 51 "hb-buffer-deserialize-text.rl" { @@ -736,11 +675,11 @@ _resume: #line 55 "hb-buffer-deserialize-text.rl" { if (unlikely (!buffer->ensure_glyphs ())) return false; } break; - case 15: + case 14: #line 38 "hb-buffer-deserialize-text.rl" { - memset (&info, 0, sizeof (info)); - memset (&pos , 0, sizeof (pos )); + hb_memset (&info, 0, sizeof (info)); + hb_memset (&pos , 0, sizeof (pos )); } #line 51 "hb-buffer-deserialize-text.rl" { @@ -755,7 +694,7 @@ _resume: return false; } break; - case 18: + case 17: #line 58 "hb-buffer-deserialize-text.rl" { /* TODO Unescape delimiters. */ @@ -775,31 +714,11 @@ _resume: *end_ptr = p; } break; - case 29: -#line 58 "hb-buffer-deserialize-text.rl" - { - /* TODO Unescape delimiters. */ - if (!hb_font_glyph_from_string (font, - tok, p - tok, - &info.codepoint)) - return false; -} -#line 73 "hb-buffer-deserialize-text.rl" - { if (!parse_uint (tok, p, &info.mask )) return false; } -#line 43 "hb-buffer-deserialize-text.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; case 11: #line 38 "hb-buffer-deserialize-text.rl" { - memset (&info, 0, sizeof (info)); - memset (&pos , 0, sizeof (pos )); + hb_memset (&info, 0, sizeof (info)); + hb_memset (&pos , 0, sizeof (pos )); } #line 51 "hb-buffer-deserialize-text.rl" { @@ -822,54 +741,11 @@ _resume: *end_ptr = p; } break; - case 14: -#line 38 "hb-buffer-deserialize-text.rl" - { - memset (&info, 0, sizeof (info)); - memset (&pos , 0, sizeof (pos )); -} -#line 51 "hb-buffer-deserialize-text.rl" - { - tok = p; -} -#line 58 "hb-buffer-deserialize-text.rl" - { - /* TODO Unescape delimiters. */ - if (!hb_font_glyph_from_string (font, - tok, p - tok, - &info.codepoint)) - return false; -} -#line 55 "hb-buffer-deserialize-text.rl" - { if (unlikely (!buffer->ensure_glyphs ())) return false; } - break; - case 30: -#line 58 "hb-buffer-deserialize-text.rl" - { - /* TODO Unescape delimiters. */ - if (!hb_font_glyph_from_string (font, - tok, p - tok, - &info.codepoint)) - return false; -} -#line 73 "hb-buffer-deserialize-text.rl" - { if (!parse_uint (tok, p, &info.mask )) return false; } -#line 55 "hb-buffer-deserialize-text.rl" - { if (unlikely (!buffer->ensure_glyphs ())) return false; } -#line 43 "hb-buffer-deserialize-text.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; case 13: #line 38 "hb-buffer-deserialize-text.rl" { - memset (&info, 0, sizeof (info)); - memset (&pos , 0, sizeof (pos )); + hb_memset (&info, 0, sizeof (info)); + hb_memset (&pos , 0, sizeof (pos )); } #line 51 "hb-buffer-deserialize-text.rl" { @@ -894,7 +770,7 @@ _resume: *end_ptr = p; } break; -#line 898 "hb-buffer-deserialize-text.hh" +#line 715 "hb-buffer-deserialize-text.hh" } _again: @@ -906,7 +782,7 @@ _again: if ( p == eof ) { switch ( _deserialize_text_eof_actions[cs] ) { - case 17: + case 16: #line 58 "hb-buffer-deserialize-text.rl" { /* TODO Unescape delimiters. */ @@ -960,7 +836,7 @@ _again: *end_ptr = p; } break; - case 21: + case 20: #line 71 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.x_advance)) return false; } #line 43 "hb-buffer-deserialize-text.rl" @@ -972,7 +848,7 @@ _again: *end_ptr = p; } break; - case 27: + case 22: #line 72 "hb-buffer-deserialize-text.rl" { if (!parse_int (tok, p, &pos.y_advance)) return false; } #line 43 "hb-buffer-deserialize-text.rl" @@ -984,27 +860,7 @@ _again: *end_ptr = p; } break; - case 24: -#line 73 "hb-buffer-deserialize-text.rl" - { if (!parse_uint (tok, p, &info.mask )) return false; } -#line 43 "hb-buffer-deserialize-text.rl" - { - buffer->add_info (info); - if (unlikely (!buffer->successful)) - return false; - buffer->pos[buffer->len - 1] = pos; - *end_ptr = p; -} - break; - case 29: -#line 58 "hb-buffer-deserialize-text.rl" - { - /* TODO Unescape delimiters. */ - if (!hb_font_glyph_from_string (font, - tok, p - tok, - &info.codepoint)) - return false; -} + case 19: #line 73 "hb-buffer-deserialize-text.rl" { if (!parse_uint (tok, p, &info.mask )) return false; } #line 43 "hb-buffer-deserialize-text.rl" @@ -1019,8 +875,8 @@ _again: case 11: #line 38 "hb-buffer-deserialize-text.rl" { - memset (&info, 0, sizeof (info)); - memset (&pos , 0, sizeof (pos )); + hb_memset (&info, 0, sizeof (info)); + hb_memset (&pos , 0, sizeof (pos )); } #line 51 "hb-buffer-deserialize-text.rl" { @@ -1043,7 +899,7 @@ _again: *end_ptr = p; } break; -#line 1047 "hb-buffer-deserialize-text.hh" +#line 825 "hb-buffer-deserialize-text.hh" } } diff --git a/thirdparty/harfbuzz/src/hb-buffer-serialize.cc b/thirdparty/harfbuzz/src/hb-buffer-serialize.cc index d1e1775430..a458f2318f 100644 --- a/thirdparty/harfbuzz/src/hb-buffer-serialize.cc +++ b/thirdparty/harfbuzz/src/hb-buffer-serialize.cc @@ -183,7 +183,7 @@ _hb_buffer_serialize_glyphs_json (hb_buffer_t *buffer, unsigned int l = p - b; if (buf_size > l) { - memcpy (buf, b, l); + hb_memcpy (buf, b, l); buf += l; buf_size -= l; *buf_consumed += l; @@ -241,7 +241,7 @@ _hb_buffer_serialize_unicode_json (hb_buffer_t *buffer, unsigned int l = p - b; if (buf_size > l) { - memcpy (buf, b, l); + hb_memcpy (buf, b, l); buf += l; buf_size -= l; *buf_consumed += l; @@ -329,7 +329,7 @@ _hb_buffer_serialize_glyphs_text (hb_buffer_t *buffer, unsigned int l = p - b; if (buf_size > l) { - memcpy (buf, b, l); + hb_memcpy (buf, b, l); buf += l; buf_size -= l; *buf_consumed += l; @@ -381,7 +381,7 @@ _hb_buffer_serialize_unicode_text (hb_buffer_t *buffer, unsigned int l = p - b; if (buf_size > l) { - memcpy (buf, b, l); + hb_memcpy (buf, b, l); buf += l; buf_size -= l; *buf_consumed += l; diff --git a/thirdparty/harfbuzz/src/hb-buffer-verify.cc b/thirdparty/harfbuzz/src/hb-buffer-verify.cc index 5453e1ca94..1cd52b39b1 100644 --- a/thirdparty/harfbuzz/src/hb-buffer-verify.cc +++ b/thirdparty/harfbuzz/src/hb-buffer-verify.cc @@ -186,7 +186,7 @@ buffer_verify_unsafe_to_break (hb_buffer_t *buffer, bool ret = true; hb_buffer_diff_flags_t diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0); - if (diff) + if (diff & ~HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH) { buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-break test failed."); ret = false; @@ -313,7 +313,6 @@ buffer_verify_unsafe_to_concat (hb_buffer_t *buffer, bool ret = true; hb_buffer_diff_flags_t diff; - /* * Shape the two fragment streams. */ @@ -382,7 +381,7 @@ buffer_verify_unsafe_to_concat (hb_buffer_t *buffer, * Diff results. */ diff = hb_buffer_diff (reconstruction, buffer, (hb_codepoint_t) -1, 0); - if (diff) + if (diff & ~HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH) { buffer_verify_error (buffer, font, BUFFER_VERIFY_ERROR "unsafe-to-concat test failed."); ret = false; diff --git a/thirdparty/harfbuzz/src/hb-buffer.cc b/thirdparty/harfbuzz/src/hb-buffer.cc index 57a5ae03ed..4b6c2d9eaa 100644 --- a/thirdparty/harfbuzz/src/hb-buffer.cc +++ b/thirdparty/harfbuzz/src/hb-buffer.cc @@ -172,12 +172,13 @@ hb_buffer_t::enlarge (unsigned int size) while (size >= new_allocated) new_allocated += (new_allocated >> 1) + 32; - static_assert ((sizeof (info[0]) == sizeof (pos[0])), ""); - if (unlikely (hb_unsigned_mul_overflows (new_allocated, sizeof (info[0])))) + unsigned new_bytes; + if (unlikely (hb_unsigned_mul_overflows (new_allocated, sizeof (info[0]), &new_bytes))) goto done; - new_pos = (hb_glyph_position_t *) hb_realloc (pos, new_allocated * sizeof (pos[0])); - new_info = (hb_glyph_info_t *) hb_realloc (info, new_allocated * sizeof (info[0])); + static_assert (sizeof (info[0]) == sizeof (pos[0]), ""); + new_pos = (hb_glyph_position_t *) hb_realloc (pos, new_bytes); + new_info = (hb_glyph_info_t *) hb_realloc (info, new_bytes); done: if (unlikely (!new_pos || !new_info)) @@ -208,7 +209,7 @@ hb_buffer_t::make_room_for (unsigned int num_in, assert (have_output); out_info = (hb_glyph_info_t *) pos; - memcpy (out_info, info, out_len * sizeof (out_info[0])); + hb_memcpy (out_info, info, out_len * sizeof (out_info[0])); } return true; @@ -229,7 +230,7 @@ hb_buffer_t::shift_forward (unsigned int count) * Ideally, we should at least set Default_Ignorable bits on * these, as well as consistent cluster values. But the former * is layering violation... */ - memset (info + len, 0, (idx + count - len) * sizeof (info[0])); + hb_memset (info + len, 0, (idx + count - len) * sizeof (info[0])); } len += count; idx += count; @@ -298,8 +299,8 @@ hb_buffer_t::clear () out_len = 0; out_info = info; - memset (context, 0, sizeof context); - memset (context_len, 0, sizeof context_len); + hb_memset (context, 0, sizeof context); + hb_memset (context_len, 0, sizeof context_len); deallocate_var_all (); serial = 0; @@ -313,15 +314,14 @@ hb_buffer_t::enter () serial = 0; shaping_failed = false; scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT; - if (likely (!hb_unsigned_mul_overflows (len, HB_BUFFER_MAX_LEN_FACTOR))) + unsigned mul; + if (likely (!hb_unsigned_mul_overflows (len, HB_BUFFER_MAX_LEN_FACTOR, &mul))) { - max_len = hb_max (len * HB_BUFFER_MAX_LEN_FACTOR, - (unsigned) HB_BUFFER_MAX_LEN_MIN); + max_len = hb_max (mul, (unsigned) HB_BUFFER_MAX_LEN_MIN); } - if (likely (!hb_unsigned_mul_overflows (len, HB_BUFFER_MAX_OPS_FACTOR))) + if (likely (!hb_unsigned_mul_overflows (len, HB_BUFFER_MAX_OPS_FACTOR, &mul))) { - max_ops = hb_max (len * HB_BUFFER_MAX_OPS_FACTOR, - (unsigned) HB_BUFFER_MAX_OPS_MIN); + max_ops = hb_max (mul, (unsigned) HB_BUFFER_MAX_OPS_MIN); } } void @@ -345,7 +345,7 @@ hb_buffer_t::add (hb_codepoint_t codepoint, glyph = &info[len]; - memset (glyph, 0, sizeof (*glyph)); + hb_memset (glyph, 0, sizeof (*glyph)); glyph->codepoint = codepoint; glyph->mask = 0; glyph->cluster = cluster; @@ -606,6 +606,53 @@ done: } void +hb_buffer_t::delete_glyphs_inplace (bool (*filter) (const hb_glyph_info_t *info)) +{ + /* Merge clusters and delete filtered glyphs. + * NOTE! We can't use out-buffer as we have positioning data. */ + unsigned int j = 0; + unsigned int count = len; + for (unsigned int i = 0; i < count; i++) + { + if (filter (&info[i])) + { + /* Merge clusters. + * Same logic as delete_glyph(), but for in-place removal. */ + + unsigned int cluster = info[i].cluster; + if (i + 1 < count && cluster == info[i + 1].cluster) + continue; /* Cluster survives; do nothing. */ + + if (j) + { + /* Merge cluster backward. */ + if (cluster < info[j - 1].cluster) + { + unsigned int mask = info[i].mask; + unsigned int old_cluster = info[j - 1].cluster; + for (unsigned k = j; k && info[k - 1].cluster == old_cluster; k--) + set_cluster (info[k - 1], cluster, mask); + } + continue; + } + + if (i + 1 < count) + merge_clusters (i, i + 2); /* Merge cluster forward. */ + + continue; + } + + if (j != i) + { + info[j] = info[i]; + pos[j] = pos[i]; + } + j++; + } + len = j; +} + +void hb_buffer_t::guess_segment_properties () { assert_unicode (); @@ -933,7 +980,6 @@ hb_buffer_get_unicode_funcs (const hb_buffer_t *buffer) void hb_buffer_set_direction (hb_buffer_t *buffer, hb_direction_t direction) - { if (unlikely (hb_object_is_immutable (buffer))) return; @@ -1385,9 +1431,9 @@ hb_buffer_set_length (hb_buffer_t *buffer, /* Wipe the new space */ if (length > buffer->len) { - memset (buffer->info + buffer->len, 0, sizeof (buffer->info[0]) * (length - buffer->len)); + hb_memset (buffer->info + buffer->len, 0, sizeof (buffer->info[0]) * (length - buffer->len)); if (buffer->have_positions) - memset (buffer->pos + buffer->len, 0, sizeof (buffer->pos[0]) * (length - buffer->len)); + hb_memset (buffer->pos + buffer->len, 0, sizeof (buffer->pos[0]) * (length - buffer->len)); } buffer->len = length; @@ -1795,7 +1841,9 @@ hb_buffer_add_latin1 (hb_buffer_t *buffer, * marks at stat of run. * * This function does not check the validity of @text, it is up to the caller - * to ensure it contains a valid Unicode code points. + * to ensure it contains a valid Unicode scalar values. In contrast, + * hb_buffer_add_utf32() can be used that takes similar input but performs + * sanity-check on the input. * * Since: 0.9.31 **/ @@ -1858,9 +1906,9 @@ hb_buffer_append (hb_buffer_t *buffer, hb_segment_properties_overlay (&buffer->props, &source->props); - memcpy (buffer->info + orig_len, source->info + start, (end - start) * sizeof (buffer->info[0])); + hb_memcpy (buffer->info + orig_len, source->info + start, (end - start) * sizeof (buffer->info[0])); if (buffer->have_positions) - memcpy (buffer->pos + orig_len, source->pos + start, (end - start) * sizeof (buffer->pos[0])); + hb_memcpy (buffer->pos + orig_len, source->pos + start, (end - start) * sizeof (buffer->pos[0])); if (source->content_type == HB_BUFFER_CONTENT_TYPE_UNICODE) { @@ -2048,7 +2096,7 @@ hb_buffer_diff (hb_buffer_t *buffer, result |= HB_BUFFER_DIFF_FLAG_CODEPOINT_MISMATCH; if (buf_info->cluster != ref_info->cluster) result |= HB_BUFFER_DIFF_FLAG_CLUSTER_MISMATCH; - if ((buf_info->mask & ~ref_info->mask & HB_GLYPH_FLAG_DEFINED)) + if ((buf_info->mask ^ ref_info->mask) & HB_GLYPH_FLAG_DEFINED) result |= HB_BUFFER_DIFF_FLAG_GLYPH_FLAGS_MISMATCH; if (contains && ref_info->codepoint == dottedcircle_glyph) result |= HB_BUFFER_DIFF_FLAG_DOTTED_CIRCLE_PRESENT; @@ -2103,6 +2151,13 @@ hb_buffer_set_message_func (hb_buffer_t *buffer, hb_buffer_message_func_t func, void *user_data, hb_destroy_func_t destroy) { + if (unlikely (hb_object_is_immutable (buffer))) + { + if (destroy) + destroy (user_data); + return; + } + if (buffer->message_destroy) buffer->message_destroy (buffer->message_data); diff --git a/thirdparty/harfbuzz/src/hb-buffer.hh b/thirdparty/harfbuzz/src/hb-buffer.hh index 26c3f0fac8..bb1efe9dd3 100644 --- a/thirdparty/harfbuzz/src/hb-buffer.hh +++ b/thirdparty/harfbuzz/src/hb-buffer.hh @@ -32,6 +32,7 @@ #include "hb.hh" #include "hb-unicode.hh" +#include "hb-set-digest.hh" #ifndef HB_BUFFER_MAX_LEN_FACTOR @@ -207,6 +208,14 @@ struct hb_buffer_t hb_glyph_info_t &prev () { return out_info[out_len ? out_len - 1 : 0]; } hb_glyph_info_t prev () const { return out_info[out_len ? out_len - 1 : 0]; } + hb_set_digest_t digest () const + { + hb_set_digest_t d; + d.init (); + d.add_array (&info[0].codepoint, len, sizeof (info[0])); + return d; + } + HB_INTERNAL void similar (const hb_buffer_t &src); HB_INTERNAL void reset (); HB_INTERNAL void clear (); @@ -402,6 +411,8 @@ struct hb_buffer_t HB_INTERNAL void merge_out_clusters (unsigned int start, unsigned int end); /* Merge clusters for deleting current glyph, and skip it. */ HB_INTERNAL void delete_glyph (); + HB_INTERNAL void delete_glyphs_inplace (bool (*filter) (const hb_glyph_info_t *info)); + /* Adds glyph flags in mask to infos with clusters between start and end. diff --git a/thirdparty/harfbuzz/src/hb-cache.hh b/thirdparty/harfbuzz/src/hb-cache.hh index 897f313fbd..f8c8108f1f 100644 --- a/thirdparty/harfbuzz/src/hb-cache.hh +++ b/thirdparty/harfbuzz/src/hb-cache.hh @@ -46,7 +46,7 @@ struct hb_cache_t >::type; static_assert ((key_bits >= cache_bits), ""); - static_assert ((key_bits + value_bits - cache_bits <= 8 * sizeof (item_t)), ""); + static_assert ((key_bits + value_bits <= cache_bits + 8 * sizeof (item_t)), ""); void init () { clear (); } void fini () {} diff --git a/thirdparty/harfbuzz/src/hb-cff-interp-common.hh b/thirdparty/harfbuzz/src/hb-cff-interp-common.hh index 5c2cb060a4..49805a89c5 100644 --- a/thirdparty/harfbuzz/src/hb-cff-interp-common.hh +++ b/thirdparty/harfbuzz/src/hb-cff-interp-common.hh @@ -284,65 +284,56 @@ struct UnsizedByteStr : UnsizedArrayOf <HBUINT8> /* A byte string associated with the current offset and an error condition */ struct byte_str_ref_t { - byte_str_ref_t () { init (); } - - void init () - { - str = hb_ubytes_t (); - offset = 0; - error = false; - } - - void fini () {} + byte_str_ref_t () + : str () {} byte_str_ref_t (const hb_ubytes_t &str_, unsigned int offset_ = 0) - : str (str_), offset (offset_), error (false) {} + : str (str_) { set_offset (offset_); } void reset (const hb_ubytes_t &str_, unsigned int offset_ = 0) { str = str_; - offset = offset_; - error = false; + set_offset (offset_); } const unsigned char& operator [] (int i) { - if (unlikely ((unsigned int) (offset + i) >= str.length)) + if (unlikely ((unsigned int) (get_offset () + i) >= str.length)) { set_error (); return Null (unsigned char); } - return str[offset + i]; + return str.arrayZ[get_offset () + i]; } + unsigned char head_unchecked () const { return str.arrayZ[get_offset ()]; } + /* Conversion to hb_ubytes_t */ - operator hb_ubytes_t () const { return str.sub_array (offset, str.length - offset); } + operator hb_ubytes_t () const { return str.sub_array (get_offset ()); } hb_ubytes_t sub_array (unsigned int offset_, unsigned int len_) const { return str.sub_array (offset_, len_); } bool avail (unsigned int count=1) const - { return (!in_error () && offset + count <= str.length); } + { return get_offset () + count <= str.length; } void inc (unsigned int count=1) { - if (likely (!in_error () && (offset <= str.length) && (offset + count <= str.length))) - { - offset += count; - } - else - { - offset = str.length; - set_error (); - } + /* Automatically puts us in error if count is out-of-range. */ + set_offset (get_offset () + count); } - void set_error () { error = true; } - bool in_error () const { return error; } + /* We (ab)use ubytes backwards_length as a cursor (called offset), + * as well as to store error condition. */ - hb_ubytes_t str; - unsigned int offset; /* beginning of the sub-string within str */ + unsigned get_offset () const { return str.backwards_length; } + void set_offset (unsigned offset) { str.backwards_length = offset; } + + void set_error () { str.backwards_length = str.length + 1; } + bool in_error () const { return str.backwards_length > str.length; } + + unsigned total_size () const { return str.length; } protected: - bool error; + hb_ubytes_t str; }; using byte_str_array_t = hb_vector_t<hb_ubytes_t>; @@ -491,8 +482,15 @@ struct arg_stack_t : cff_stack_t<ARG, 513> /* an operator prefixed by its operands in a byte string */ struct op_str_t { - hb_ubytes_t str; + /* This used to have a hb_ubytes_t. Using a pointer and length + * in a particular order, saves 8 bytes in this struct and more + * in our parsed_cs_op_t subclass. */ + + const unsigned char *ptr = nullptr; + op_code_t op; + + uint8_t length = 0; }; /* base of OP_SERIALIZER */ @@ -503,9 +501,11 @@ struct op_serializer_t { TRACE_SERIALIZE (this); - HBUINT8 *d = c->allocate_size<HBUINT8> (opstr.str.length); + unsigned char *d = c->allocate_size<unsigned char> (opstr.length); if (unlikely (!d)) return_trace (false); - memcpy (d, &opstr.str[0], opstr.str.length); + /* Faster than hb_memcpy for small strings. */ + for (unsigned i = 0; i < opstr.length; i++) + d[i] = opstr.ptr[i]; return_trace (true); } }; @@ -529,16 +529,20 @@ struct parsed_values_t { VAL *val = values.push (); val->op = op; - val->str = str_ref.str.sub_array (opStart, str_ref.offset - opStart); - opStart = str_ref.offset; + auto arr = str_ref.sub_array (opStart, str_ref.get_offset () - opStart); + val->ptr = arr.arrayZ; + val->length = arr.length; + opStart = str_ref.get_offset (); } void add_op (op_code_t op, const byte_str_ref_t& str_ref, const VAL &v) { VAL *val = values.push (v); val->op = op; - val->str = str_ref.sub_array ( opStart, str_ref.offset - opStart); - opStart = str_ref.offset; + auto arr = str_ref.sub_array (opStart, str_ref.get_offset () - opStart); + val->ptr = arr.arrayZ; + val->length = arr.length; + opStart = str_ref.get_offset (); } bool has_op (op_code_t op) const @@ -549,8 +553,7 @@ struct parsed_values_t } unsigned get_count () const { return values.length; } - const VAL &get_value (unsigned int i) const { return values[i]; } - const VAL &operator [] (unsigned int i) const { return get_value (i); } + const VAL &operator [] (unsigned int i) const { return values[i]; } unsigned int opStart; hb_vector_t<VAL> values; @@ -565,23 +568,23 @@ struct interp_env_t str_ref.reset (str_); } bool in_error () const - { return error || str_ref.in_error () || argStack.in_error (); } + { return str_ref.in_error () || argStack.in_error (); } - void set_error () { error = true; } + void set_error () { str_ref.set_error (); } op_code_t fetch_op () { op_code_t op = OpCode_Invalid; if (unlikely (!str_ref.avail ())) return OpCode_Invalid; - op = (op_code_t)(unsigned char)str_ref[0]; + op = (op_code_t) str_ref.head_unchecked (); + str_ref.inc (); if (op == OpCode_escape) { if (unlikely (!str_ref.avail ())) return OpCode_Invalid; - op = Make_OpCode_ESC(str_ref[1]); + op = Make_OpCode_ESC (str_ref.head_unchecked ()); str_ref.inc (); } - str_ref.inc (); return op; } @@ -596,8 +599,6 @@ struct interp_env_t str_ref; arg_stack_t<ARG> argStack; - protected: - bool error = false; }; using num_interp_env_t = interp_env_t<>; diff --git a/thirdparty/harfbuzz/src/hb-cff2-interp-cs.hh b/thirdparty/harfbuzz/src/hb-cff2-interp-cs.hh index d0b9e7b086..00c25800e6 100644 --- a/thirdparty/harfbuzz/src/hb-cff2-interp-cs.hh +++ b/thirdparty/harfbuzz/src/hb-cff2-interp-cs.hh @@ -40,13 +40,15 @@ struct blend_arg_t : number_t void set_real (double v) { reset_blends (); number_t::set_real (v); } void set_blends (unsigned int numValues_, unsigned int valueIndex_, - unsigned int numBlends, hb_array_t<const blend_arg_t> blends_) + hb_array_t<const blend_arg_t> blends_) { numValues = numValues_; valueIndex = valueIndex_; - deltas.resize (numBlends); + unsigned numBlends = blends_.length; + if (unlikely (!deltas.resize (numBlends))) + return; for (unsigned int i = 0; i < numBlends; i++) - deltas[i] = blends_[i]; + deltas.arrayZ[i] = blends_.arrayZ[i]; } bool blending () const { return deltas.length > 0; } @@ -61,7 +63,6 @@ struct blend_arg_t : number_t hb_vector_t<number_t> deltas; }; -typedef interp_env_t<blend_arg_t> BlendInterpEnv; typedef biased_subrs_t<CFF2Subrs> cff2_biased_subrs_t; template <typename ELEM> @@ -154,8 +155,9 @@ struct cff2_cs_interp_env_t : cs_interp_env_t<ELEM, CFF2Subrs> { if (likely (scalars.length == deltas.length)) { - for (unsigned int i = 0; i < scalars.length; i++) - v += (double) scalars[i] * deltas[i].to_real (); + unsigned count = scalars.length; + for (unsigned i = 0; i < count; i++) + v += (double) scalars.arrayZ[i] * deltas.arrayZ[i].to_real (); } } return v; @@ -220,7 +222,7 @@ struct cff2_cs_opset_t : cs_opset_t<ELEM, OPSET, cff2_cs_interp_env_t<ELEM>, PAR const hb_array_t<const ELEM> blends, unsigned n, unsigned i) { - arg.set_blends (n, i, blends.length, blends); + arg.set_blends (n, i, blends); } template <typename T = ELEM, hb_enable_if (!hb_is_same (T, blend_arg_t))> diff --git a/thirdparty/harfbuzz/src/hb-common.cc b/thirdparty/harfbuzz/src/hb-common.cc index bbb6cd552b..e9f9cfeb5f 100644 --- a/thirdparty/harfbuzz/src/hb-common.cc +++ b/thirdparty/harfbuzz/src/hb-common.cc @@ -285,7 +285,7 @@ struct hb_language_item_t { lang = (hb_language_t) hb_malloc(len); if (likely (lang)) { - memcpy((unsigned char *) lang, s, len); + hb_memcpy((unsigned char *) lang, s, len); for (unsigned char *p = (unsigned char *) lang; *p; p++) *p = canon_map[*p]; } @@ -379,7 +379,7 @@ hb_language_from_string (const char *str, int len) /* NUL-terminate it. */ char strbuf[64]; len = hb_min (len, (int) sizeof (strbuf) - 1); - memcpy (strbuf, str, len); + hb_memcpy (strbuf, str, len); strbuf[len] = '\0'; item = lang_find_or_insert (strbuf); } @@ -976,7 +976,7 @@ hb_feature_from_string (const char *str, int len, } if (feature) - memset (feature, 0, sizeof (*feature)); + hb_memset (feature, 0, sizeof (*feature)); return false; } @@ -1025,7 +1025,7 @@ hb_feature_to_string (hb_feature_t *feature, } assert (len < ARRAY_LENGTH (s)); len = hb_min (len, size - 1); - memcpy (buf, s, len); + hb_memcpy (buf, s, len); buf[len] = '\0'; } @@ -1088,7 +1088,7 @@ hb_variation_from_string (const char *str, int len, } if (variation) - memset (variation, 0, sizeof (*variation)); + hb_memset (variation, 0, sizeof (*variation)); return false; } @@ -1136,7 +1136,7 @@ get_C_locale () /** * hb_variation_to_string: * @variation: an #hb_variation_t to convert - * @buf: (array length=size) (out): output string + * @buf: (array length=size) (out caller-allocates): output string * @size: the allocated size of @buf * * Converts an #hb_variation_t into a `NULL`-terminated string in the format @@ -1166,7 +1166,7 @@ hb_variation_to_string (hb_variation_t *variation, assert (len < ARRAY_LENGTH (s)); len = hb_min (len, size - 1); - memcpy (buf, s, len); + hb_memcpy (buf, s, len); buf[len] = '\0'; } diff --git a/thirdparty/harfbuzz/src/hb-config.hh b/thirdparty/harfbuzz/src/hb-config.hh index d56617f6a9..98b1e9d0cf 100644 --- a/thirdparty/harfbuzz/src/hb-config.hh +++ b/thirdparty/harfbuzz/src/hb-config.hh @@ -35,8 +35,9 @@ #include "config.h" #endif -#ifndef HB_BORING_EXPANSION -#define HB_NO_BORING_EXPANSION +#ifndef HB_EXPERIMENTAL_API +#define HB_NO_BEYOND_64K +#define HB_NO_VAR_COMPOSITES #endif #ifdef HB_TINY @@ -84,6 +85,7 @@ #define HB_NO_OT_SHAPE_FRACTIONS #define HB_NO_STYLE #define HB_NO_SUBSET_LAYOUT +#define HB_NO_VERTICAL #define HB_NO_VAR #endif @@ -104,7 +106,7 @@ #ifdef HB_NO_BORING_EXPANSION #define HB_NO_BEYOND_64K -#define HB_NO_VARIATIONS2 +#define HB_NO_AVAR2 #endif #ifdef HB_DISABLE_DEPRECATED @@ -113,6 +115,11 @@ #define HB_IF_NOT_DEPRECATED(x) x #endif +#ifdef HB_NO_SHAPER +#define HB_NO_OT_SHAPE +#define HB_NO_AAT_SHAPE +#endif + #ifdef HB_NO_AAT #define HB_NO_OT_NAME_LANGUAGE_AAT #define HB_NO_AAT_SHAPE @@ -159,6 +166,7 @@ #define HB_NO_OT_SHAPER_HEBREW_FALLBACK #define HB_NO_OT_SHAPER_THAI_FALLBACK #define HB_NO_OT_SHAPER_VOWEL_CONSTRAINTS +#define HB_NO_OT_SHAPER_MYANMAR_ZAWGYI #endif #ifdef NDEBUG diff --git a/thirdparty/harfbuzz/src/hb-coretext.cc b/thirdparty/harfbuzz/src/hb-coretext.cc index 99b33c001e..4267e0e13e 100644 --- a/thirdparty/harfbuzz/src/hb-coretext.cc +++ b/thirdparty/harfbuzz/src/hb-coretext.cc @@ -347,10 +347,13 @@ _hb_coretext_shaper_font_data_create (hb_font_t *font) hb_ot_var_axis_info_t info; unsigned int c = 1; hb_ot_var_get_axis_infos (font->face, i, &c, &info); - CFDictionarySetValue (variations, - CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &info.tag), - CFNumberCreate (kCFAllocatorDefault, kCFNumberFloatType, &font->design_coords[i]) - ); + float v = hb_clamp (font->design_coords[i], info.min_value, info.max_value); + + CFNumberRef tag_number = CFNumberCreate (kCFAllocatorDefault, kCFNumberIntType, &info.tag); + CFNumberRef value_number = CFNumberCreate (kCFAllocatorDefault, kCFNumberFloatType, &v); + CFDictionarySetValue (variations, tag_number, value_number); + CFRelease (tag_number); + CFRelease (value_number); } CFDictionaryRef attributes = @@ -648,7 +651,7 @@ _hb_coretext_shape (hb_shape_plan_t *shape_plan, } else { active_feature_t *feature = active_features.lsearch (event->feature); if (feature) - active_features.remove (feature - active_features.arrayZ); + active_features.remove_ordered (feature - active_features.arrayZ); } } } diff --git a/thirdparty/harfbuzz/src/hb-draw.cc b/thirdparty/harfbuzz/src/hb-draw.cc index 46797e64e6..72c203f24f 100644 --- a/thirdparty/harfbuzz/src/hb-draw.cc +++ b/thirdparty/harfbuzz/src/hb-draw.cc @@ -80,6 +80,56 @@ hb_draw_close_path_nil (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data HB_UN void *user_data HB_UNUSED) {} +static bool +_hb_draw_funcs_set_preamble (hb_draw_funcs_t *dfuncs, + bool func_is_null, + void **user_data, + hb_destroy_func_t *destroy) +{ + if (hb_object_is_immutable (dfuncs)) + { + if (*destroy) + (*destroy) (*user_data); + return false; + } + + if (func_is_null) + { + if (*destroy) + (*destroy) (*user_data); + *destroy = nullptr; + *user_data = nullptr; + } + + return true; +} + +static bool +_hb_draw_funcs_set_middle (hb_draw_funcs_t *dfuncs, + void *user_data, + hb_destroy_func_t destroy) +{ + if (user_data && !dfuncs->user_data) + { + dfuncs->user_data = (decltype (dfuncs->user_data)) hb_calloc (1, sizeof (*dfuncs->user_data)); + if (unlikely (!dfuncs->user_data)) + goto fail; + } + if (destroy && !dfuncs->destroy) + { + dfuncs->destroy = (decltype (dfuncs->destroy)) hb_calloc (1, sizeof (*dfuncs->destroy)); + if (unlikely (!dfuncs->destroy)) + goto fail; + } + + return true; + +fail: + if (destroy) + (destroy) (user_data); + return false; +} + #define HB_DRAW_FUNC_IMPLEMENT(name) \ \ void \ @@ -88,43 +138,24 @@ hb_draw_funcs_set_##name##_func (hb_draw_funcs_t *dfuncs, \ void *user_data, \ hb_destroy_func_t destroy) \ { \ - if (hb_object_is_immutable (dfuncs)) \ - return; \ + if (!_hb_draw_funcs_set_preamble (dfuncs, !func, &user_data, &destroy))\ + return; \ \ if (dfuncs->destroy && dfuncs->destroy->name) \ dfuncs->destroy->name (!dfuncs->user_data ? nullptr : dfuncs->user_data->name); \ \ - if (user_data && !dfuncs->user_data) \ - { \ - dfuncs->user_data = (decltype (dfuncs->user_data)) hb_calloc (1, sizeof (*dfuncs->user_data)); \ - if (unlikely (!dfuncs->user_data)) \ - goto fail; \ - } \ - if (destroy && !dfuncs->destroy) \ - { \ - dfuncs->destroy = (decltype (dfuncs->destroy)) hb_calloc (1, sizeof (*dfuncs->destroy)); \ - if (unlikely (!dfuncs->destroy)) \ - goto fail; \ - } \ + if (!_hb_draw_funcs_set_middle (dfuncs, user_data, destroy)) \ + return; \ \ - if (func) { \ + if (func) \ dfuncs->func.name = func; \ - if (dfuncs->user_data) \ - dfuncs->user_data->name = user_data; \ - if (dfuncs->destroy) \ - dfuncs->destroy->name = destroy; \ - } else { \ + else \ dfuncs->func.name = hb_draw_##name##_nil; \ - if (dfuncs->user_data) \ - dfuncs->user_data->name = nullptr; \ - if (dfuncs->destroy) \ - dfuncs->destroy->name = nullptr; \ - } \ - return; \ - \ -fail: \ - if (destroy) \ - destroy (user_data); \ + \ + if (dfuncs->user_data) \ + dfuncs->user_data->name = user_data; \ + if (dfuncs->destroy) \ + dfuncs->destroy->name = destroy; \ } HB_DRAW_FUNCS_IMPLEMENT_CALLBACKS diff --git a/thirdparty/harfbuzz/src/hb-face.cc b/thirdparty/harfbuzz/src/hb-face.cc index e7deb31dd8..8b4b635c7a 100644 --- a/thirdparty/harfbuzz/src/hb-face.cc +++ b/thirdparty/harfbuzz/src/hb-face.cc @@ -288,6 +288,7 @@ hb_face_destroy (hb_face_t *face) { if (!hb_object_destroy (face)) return; +#ifndef HB_NO_SHAPER for (hb_face_t::plan_node_t *node = face->shape_plans; node; ) { hb_face_t::plan_node_t *next = node->next; @@ -295,6 +296,7 @@ hb_face_destroy (hb_face_t *face) hb_free (node); node = next; } +#endif face->data.fini (); face->table.fini (); @@ -636,7 +638,7 @@ hb_face_collect_variation_unicodes (hb_face_t *face, struct face_table_info_t { hb_blob_t* data; - unsigned order; + signed order; }; struct hb_face_builder_data_t @@ -784,16 +786,16 @@ hb_face_builder_create () hb_bool_t hb_face_builder_add_table (hb_face_t *face, hb_tag_t tag, hb_blob_t *blob) { - if (tag == HB_MAP_VALUE_INVALID) + if (unlikely (face->destroy != (hb_destroy_func_t) _hb_face_builder_data_destroy)) return false; - if (unlikely (face->destroy != (hb_destroy_func_t) _hb_face_builder_data_destroy)) + if (tag == HB_MAP_VALUE_INVALID) return false; hb_face_builder_data_t *data = (hb_face_builder_data_t *) face->user_data; hb_blob_t* previous = data->tables.get (tag).data; - if (!data->tables.set (tag, face_table_info_t {hb_blob_reference (blob), 0})) + if (!data->tables.set (tag, face_table_info_t {hb_blob_reference (blob), -1})) { hb_blob_destroy (blob); return false; @@ -819,13 +821,16 @@ void hb_face_builder_sort_tables (hb_face_t *face, const hb_tag_t *tags) { + if (unlikely (face->destroy != (hb_destroy_func_t) _hb_face_builder_data_destroy)) + return; + hb_face_builder_data_t *data = (hb_face_builder_data_t *) face->user_data; // Sort all unspecified tables after any specified tables. for (auto& info : data->tables.values_ref()) - info.order = -1; + info.order = (unsigned) -1; - unsigned order = 0; + signed order = 0; for (const hb_tag_t* tag = tags; *tag; tag++) diff --git a/thirdparty/harfbuzz/src/hb-face.hh b/thirdparty/harfbuzz/src/hb-face.hh index 12e10d01e0..1bf0606e52 100644 --- a/thirdparty/harfbuzz/src/hb-face.hh +++ b/thirdparty/harfbuzz/src/hb-face.hh @@ -65,7 +65,9 @@ struct hb_face_t hb_shape_plan_t *shape_plan; plan_node_t *next; }; +#ifndef HB_NO_SHAPER hb_atomic_ptr_t<plan_node_t> shape_plans; +#endif hb_blob_t *reference_table (hb_tag_t tag) const { diff --git a/thirdparty/harfbuzz/src/hb-fallback-shape.cc b/thirdparty/harfbuzz/src/hb-fallback-shape.cc index f8524ecc8e..c54ad8764b 100644 --- a/thirdparty/harfbuzz/src/hb-fallback-shape.cc +++ b/thirdparty/harfbuzz/src/hb-fallback-shape.cc @@ -75,16 +75,6 @@ _hb_fallback_shape (hb_shape_plan_t *shape_plan HB_UNUSED, const hb_feature_t *features HB_UNUSED, unsigned int num_features HB_UNUSED) { - /* TODO - * - * - Apply fallback kern. - * - Handle Variation Selectors? - * - Apply normalization? - * - * This will make the fallback shaper into a dumb "TrueType" - * shaper which many people unfortunately still request. - */ - hb_codepoint_t space; bool has_space = (bool) font->get_nominal_glyph (' ', &space); diff --git a/thirdparty/harfbuzz/src/hb-font.cc b/thirdparty/harfbuzz/src/hb-font.cc index 856bbdda32..0ce3e2608a 100644 --- a/thirdparty/harfbuzz/src/hb-font.cc +++ b/thirdparty/harfbuzz/src/hb-font.cc @@ -71,7 +71,7 @@ hb_font_get_font_h_extents_nil (hb_font_t *font HB_UNUSED, hb_font_extents_t *extents, void *user_data HB_UNUSED) { - memset (extents, 0, sizeof (*extents)); + hb_memset (extents, 0, sizeof (*extents)); return false; } @@ -96,7 +96,7 @@ hb_font_get_font_v_extents_nil (hb_font_t *font HB_UNUSED, hb_font_extents_t *extents, void *user_data HB_UNUSED) { - memset (extents, 0, sizeof (*extents)); + hb_memset (extents, 0, sizeof (*extents)); return false; } @@ -409,7 +409,7 @@ hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED, hb_glyph_extents_t *extents, void *user_data HB_UNUSED) { - memset (extents, 0, sizeof (*extents)); + hb_memset (extents, 0, sizeof (*extents)); return false; } @@ -518,6 +518,7 @@ typedef struct hb_font_get_glyph_shape_default_adaptor_t { void *draw_data; float x_scale; float y_scale; + float slant; } hb_font_get_glyph_shape_default_adaptor_t; static void @@ -530,9 +531,10 @@ hb_draw_move_to_default (hb_draw_funcs_t *dfuncs HB_UNUSED, hb_font_get_glyph_shape_default_adaptor_t *adaptor = (hb_font_get_glyph_shape_default_adaptor_t *) draw_data; float x_scale = adaptor->x_scale; float y_scale = adaptor->y_scale; + float slant = adaptor->slant; adaptor->draw_funcs->emit_move_to (adaptor->draw_data, *st, - x_scale * to_x, y_scale * to_y); + x_scale * to_x + slant * to_y, y_scale * to_y); } static void @@ -544,12 +546,13 @@ hb_draw_line_to_default (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data, hb_font_get_glyph_shape_default_adaptor_t *adaptor = (hb_font_get_glyph_shape_default_adaptor_t *) draw_data; float x_scale = adaptor->x_scale; float y_scale = adaptor->y_scale; + float slant = adaptor->slant; - st->current_x *= x_scale; - st->current_y *= y_scale; + st->current_x = st->current_x * x_scale + st->current_y * slant; + st->current_y = st->current_y * y_scale; adaptor->draw_funcs->emit_line_to (adaptor->draw_data, *st, - x_scale * to_x, y_scale * to_y); + x_scale * to_x + slant * to_y, y_scale * to_y); } static void @@ -562,13 +565,14 @@ hb_draw_quadratic_to_default (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data hb_font_get_glyph_shape_default_adaptor_t *adaptor = (hb_font_get_glyph_shape_default_adaptor_t *) draw_data; float x_scale = adaptor->x_scale; float y_scale = adaptor->y_scale; + float slant = adaptor->slant; - st->current_x *= x_scale; - st->current_y *= y_scale; + st->current_x = st->current_x * x_scale + st->current_y * slant; + st->current_y = st->current_y * y_scale; adaptor->draw_funcs->emit_quadratic_to (adaptor->draw_data, *st, - x_scale * control_x, y_scale * control_y, - x_scale * to_x, y_scale * to_y); + x_scale * control_x + slant * control_y, y_scale * control_y, + x_scale * to_x + slant * to_y, y_scale * to_y); } static void @@ -582,14 +586,15 @@ hb_draw_cubic_to_default (hb_draw_funcs_t *dfuncs HB_UNUSED, void *draw_data, hb_font_get_glyph_shape_default_adaptor_t *adaptor = (hb_font_get_glyph_shape_default_adaptor_t *) draw_data; float x_scale = adaptor->x_scale; float y_scale = adaptor->y_scale; + float slant = adaptor->slant; - st->current_x *= x_scale; - st->current_y *= y_scale; + st->current_x = st->current_x * x_scale + st->current_y * slant; + st->current_y = st->current_y * y_scale; adaptor->draw_funcs->emit_cubic_to (adaptor->draw_data, *st, - x_scale * control1_x, y_scale * control1_y, - x_scale * control2_x, y_scale * control2_y, - x_scale * to_x, y_scale * to_y); + x_scale * control1_x + slant * control1_y, y_scale * control1_y, + x_scale * control2_x + slant * control2_y, y_scale * control2_y, + x_scale * to_x + slant * to_y, y_scale * to_y); } static void @@ -623,8 +628,10 @@ hb_font_get_glyph_shape_default (hb_font_t *font, hb_font_get_glyph_shape_default_adaptor_t adaptor = { draw_funcs, draw_data, - (float) font->x_scale / (float) font->parent->x_scale, - (float) font->y_scale / (float) font->parent->y_scale + font->parent->x_scale ? (float) font->x_scale / (float) font->parent->x_scale : 0.f, + font->parent->y_scale ? (float) font->y_scale / (float) font->parent->y_scale : 0.f, + font->parent->y_scale ? (font->slant - font->parent->slant) * + (float) font->x_scale / (float) font->parent->y_scale : 0.f }; font->parent->get_glyph_shape (glyph, @@ -822,6 +829,56 @@ hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs) } +static bool +_hb_font_funcs_set_preamble (hb_font_funcs_t *ffuncs, + bool func_is_null, + void **user_data, + hb_destroy_func_t *destroy) +{ + if (hb_object_is_immutable (ffuncs)) + { + if (*destroy) + (*destroy) (*user_data); + return false; + } + + if (func_is_null) + { + if (*destroy) + (*destroy) (*user_data); + *destroy = nullptr; + *user_data = nullptr; + } + + return true; +} + +static bool +_hb_font_funcs_set_middle (hb_font_funcs_t *ffuncs, + void *user_data, + hb_destroy_func_t destroy) +{ + if (user_data && !ffuncs->user_data) + { + ffuncs->user_data = (decltype (ffuncs->user_data)) hb_calloc (1, sizeof (*ffuncs->user_data)); + if (unlikely (!ffuncs->user_data)) + goto fail; + } + if (destroy && !ffuncs->destroy) + { + ffuncs->destroy = (decltype (ffuncs->destroy)) hb_calloc (1, sizeof (*ffuncs->destroy)); + if (unlikely (!ffuncs->destroy)) + goto fail; + } + + return true; + +fail: + if (destroy) + (destroy) (user_data); + return false; +} + #define HB_FONT_FUNC_IMPLEMENT(name) \ \ void \ @@ -830,51 +887,24 @@ hb_font_funcs_set_##name##_func (hb_font_funcs_t *ffuncs, \ void *user_data, \ hb_destroy_func_t destroy) \ { \ - if (hb_object_is_immutable (ffuncs)) \ - goto fail; \ - \ - if (!func) \ - { \ - if (destroy) \ - destroy (user_data); \ - destroy = nullptr; \ - user_data = nullptr; \ - } \ + if (!_hb_font_funcs_set_preamble (ffuncs, !func, &user_data, &destroy))\ + return; \ \ if (ffuncs->destroy && ffuncs->destroy->name) \ ffuncs->destroy->name (!ffuncs->user_data ? nullptr : ffuncs->user_data->name); \ \ - if (user_data && !ffuncs->user_data) \ - { \ - ffuncs->user_data = (decltype (ffuncs->user_data)) hb_calloc (1, sizeof (*ffuncs->user_data)); \ - if (unlikely (!ffuncs->user_data)) \ - goto fail; \ - } \ - if (destroy && !ffuncs->destroy) \ - { \ - ffuncs->destroy = (decltype (ffuncs->destroy)) hb_calloc (1, sizeof (*ffuncs->destroy)); \ - if (unlikely (!ffuncs->destroy)) \ - goto fail; \ - } \ + if (!_hb_font_funcs_set_middle (ffuncs, user_data, destroy)) \ + return; \ \ - if (func) { \ + if (func) \ ffuncs->get.f.name = func; \ - if (ffuncs->user_data) \ - ffuncs->user_data->name = user_data; \ - if (ffuncs->destroy) \ - ffuncs->destroy->name = destroy; \ - } else { \ + else \ ffuncs->get.f.name = hb_font_get_##name##_default; \ - if (ffuncs->user_data) \ - ffuncs->user_data->name = nullptr; \ - if (ffuncs->destroy) \ - ffuncs->destroy->name = nullptr; \ - } \ - return; \ - \ -fail: \ - if (destroy) \ - destroy (user_data); \ + \ + if (ffuncs->user_data) \ + ffuncs->user_data->name = user_data; \ + if (ffuncs->destroy) \ + ffuncs->destroy->name = destroy; \ } HB_FONT_FUNCS_IMPLEMENT_CALLBACKS @@ -1323,7 +1353,7 @@ hb_font_get_glyph_from_name (hb_font_t *font, * @draw_data: User data to pass to draw callbacks * * Fetches the glyph shape that corresponds to a glyph in the specified @font. - * The shape is returned by way of calls to the callsbacks of the @dfuncs + * The shape is returned by way of calls to the callbacks of the @dfuncs * objects, with @draw_data passed to them. * * Since: 4.0.0 @@ -1780,8 +1810,8 @@ hb_font_create_sub_font (hb_font_t *parent) float *design_coords = (float *) hb_calloc (num_coords, sizeof (parent->design_coords[0])); if (likely (coords && design_coords)) { - memcpy (coords, parent->coords, num_coords * sizeof (parent->coords[0])); - memcpy (design_coords, parent->design_coords, num_coords * sizeof (parent->design_coords[0])); + hb_memcpy (coords, parent->coords, num_coords * sizeof (parent->coords[0])); + hb_memcpy (design_coords, parent->design_coords, num_coords * sizeof (parent->design_coords[0])); _hb_font_adopt_var_coords (font, coords, design_coords, num_coords); } else @@ -2443,7 +2473,7 @@ hb_font_set_var_coords_design (hb_font_t *font, } if (coords_length) - memcpy (design_coords, coords, coords_length * sizeof (font->design_coords[0])); + hb_memcpy (design_coords, coords, coords_length * sizeof (font->design_coords[0])); hb_ot_var_normalize_coords (font->face, coords_length, coords, normalized); _hb_font_adopt_var_coords (font, normalized, design_coords, coords_length); @@ -2519,8 +2549,8 @@ hb_font_set_var_coords_normalized (hb_font_t *font, if (coords_length) { - memcpy (copy, coords, coords_length * sizeof (coords[0])); - memcpy (unmapped, coords, coords_length * sizeof (coords[0])); + hb_memcpy (copy, coords, coords_length * sizeof (coords[0])); + hb_memcpy (unmapped, coords, coords_length * sizeof (coords[0])); } /* Best effort design coords simulation */ diff --git a/thirdparty/harfbuzz/src/hb-font.hh b/thirdparty/harfbuzz/src/hb-font.hh index bb402e23eb..6942d99c70 100644 --- a/thirdparty/harfbuzz/src/hb-font.hh +++ b/thirdparty/harfbuzz/src/hb-font.hh @@ -206,14 +206,14 @@ struct hb_font_t hb_bool_t get_font_h_extents (hb_font_extents_t *extents) { - memset (extents, 0, sizeof (*extents)); + hb_memset (extents, 0, sizeof (*extents)); return klass->get.f.font_h_extents (this, user_data, extents, !klass->user_data ? nullptr : klass->user_data->font_h_extents); } hb_bool_t get_font_v_extents (hb_font_extents_t *extents) { - memset (extents, 0, sizeof (*extents)); + hb_memset (extents, 0, sizeof (*extents)); return klass->get.f.font_v_extents (this, user_data, extents, !klass->user_data ? nullptr : klass->user_data->font_v_extents); @@ -342,7 +342,7 @@ struct hb_font_t hb_bool_t get_glyph_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) { - memset (extents, 0, sizeof (*extents)); + hb_memset (extents, 0, sizeof (*extents)); return klass->get.f.glyph_extents (this, user_data, glyph, extents, diff --git a/thirdparty/harfbuzz/src/hb-ft.cc b/thirdparty/harfbuzz/src/hb-ft.cc index bcc1dd080f..3892dedc13 100644 --- a/thirdparty/harfbuzz/src/hb-ft.cc +++ b/thirdparty/harfbuzz/src/hb-ft.cc @@ -89,7 +89,7 @@ struct hb_ft_font_t bool unref; /* Whether to destroy ft_face when done. */ bool transform; /* Whether to apply FT_Face's transform. */ - mutable hb_mutex_t lock; + mutable hb_mutex_t lock; /* Protects members below. */ FT_Face ft_face; mutable unsigned cached_serial; mutable hb_ft_advance_cache_t advance_cache; @@ -732,16 +732,18 @@ hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED, static int _hb_ft_move_to (const FT_Vector *to, - hb_draw_session_t *drawing) + void *arg) { + hb_draw_session_t *drawing = (hb_draw_session_t *) arg; drawing->move_to (to->x, to->y); return FT_Err_Ok; } static int _hb_ft_line_to (const FT_Vector *to, - hb_draw_session_t *drawing) + void *arg) { + hb_draw_session_t *drawing = (hb_draw_session_t *) arg; drawing->line_to (to->x, to->y); return FT_Err_Ok; } @@ -749,8 +751,9 @@ _hb_ft_line_to (const FT_Vector *to, static int _hb_ft_conic_to (const FT_Vector *control, const FT_Vector *to, - hb_draw_session_t *drawing) + void *arg) { + hb_draw_session_t *drawing = (hb_draw_session_t *) arg; drawing->quadratic_to (control->x, control->y, to->x, to->y); return FT_Err_Ok; @@ -760,8 +763,9 @@ static int _hb_ft_cubic_to (const FT_Vector *control1, const FT_Vector *control2, const FT_Vector *to, - hb_draw_session_t *drawing) + void *arg) { + hb_draw_session_t *drawing = (hb_draw_session_t *) arg; drawing->cubic_to (control1->x, control1->y, control2->x, control2->y, to->x, to->y); @@ -787,10 +791,10 @@ hb_ft_get_glyph_shape (hb_font_t *font HB_UNUSED, return; const FT_Outline_Funcs outline_funcs = { - (FT_Outline_MoveToFunc) _hb_ft_move_to, - (FT_Outline_LineToFunc) _hb_ft_line_to, - (FT_Outline_ConicToFunc) _hb_ft_conic_to, - (FT_Outline_CubicToFunc) _hb_ft_cubic_to, + _hb_ft_move_to, + _hb_ft_line_to, + _hb_ft_conic_to, + _hb_ft_cubic_to, 0, /* shift */ 0, /* delta */ }; @@ -975,8 +979,9 @@ hb_ft_face_create_referenced (FT_Face ft_face) } static void -hb_ft_face_finalize (FT_Face ft_face) +hb_ft_face_finalize (void *arg) { + FT_Face ft_face = (FT_Face) arg; hb_face_destroy ((hb_face_t *) ft_face->generic.data); } @@ -1008,7 +1013,7 @@ hb_ft_face_create_cached (FT_Face ft_face) ft_face->generic.finalizer (ft_face); ft_face->generic.data = hb_ft_face_create (ft_face, nullptr); - ft_face->generic.finalizer = (FT_Generic_Finalizer) hb_ft_face_finalize; + ft_face->generic.finalizer = hb_ft_face_finalize; } return hb_face_reference ((hb_face_t *) ft_face->generic.data); @@ -1217,8 +1222,9 @@ get_ft_library () } static void -_release_blob (FT_Face ft_face) +_release_blob (void *arg) { + FT_Face ft_face = (FT_Face) arg; hb_blob_destroy ((hb_blob_t *) ft_face->generic.data); } @@ -1271,7 +1277,7 @@ hb_ft_font_set_funcs (hb_font_t *font) ft_face->generic.data = blob; - ft_face->generic.finalizer = (FT_Generic_Finalizer) _release_blob; + ft_face->generic.finalizer = _release_blob; _hb_ft_font_set_funcs (font, ft_face, true); hb_ft_font_set_load_flags (font, FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING); diff --git a/thirdparty/harfbuzz/src/hb-glib.cc b/thirdparty/harfbuzz/src/hb-glib.cc index 8ddc7ebad8..1da81696e7 100644 --- a/thirdparty/harfbuzz/src/hb-glib.cc +++ b/thirdparty/harfbuzz/src/hb-glib.cc @@ -129,32 +129,9 @@ hb_glib_unicode_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED, { #if GLIB_CHECK_VERSION(2,29,12) return g_unichar_compose (a, b, ab); +#else + return false; #endif - - /* We don't ifdef-out the fallback code such that compiler always - * sees it and makes sure it's compilable. */ - - gchar utf8[12]; - gchar *normalized; - int len; - hb_bool_t ret; - - len = g_unichar_to_utf8 (a, utf8); - len += g_unichar_to_utf8 (b, utf8 + len); - normalized = g_utf8_normalize (utf8, len, G_NORMALIZE_NFC); - len = g_utf8_strlen (normalized, -1); - if (unlikely (!len)) - return false; - - if (len == 1) { - *ab = g_utf8_get_char (normalized); - ret = true; - } else { - ret = false; - } - - g_free (normalized); - return ret; } static hb_bool_t @@ -166,55 +143,9 @@ hb_glib_unicode_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, { #if GLIB_CHECK_VERSION(2,29,12) return g_unichar_decompose (ab, a, b); +#else + return false; #endif - - /* We don't ifdef-out the fallback code such that compiler always - * sees it and makes sure it's compilable. */ - - gchar utf8[6]; - gchar *normalized; - int len; - hb_bool_t ret; - - len = g_unichar_to_utf8 (ab, utf8); - normalized = g_utf8_normalize (utf8, len, G_NORMALIZE_NFD); - len = g_utf8_strlen (normalized, -1); - if (unlikely (!len)) - return false; - - if (len == 1) { - *a = g_utf8_get_char (normalized); - *b = 0; - ret = *a != ab; - } else if (len == 2) { - *a = g_utf8_get_char (normalized); - *b = g_utf8_get_char (g_utf8_next_char (normalized)); - /* Here's the ugly part: if ab decomposes to a single character and - * that character decomposes again, we have to detect that and undo - * the second part :-(. */ - gchar *recomposed = g_utf8_normalize (normalized, -1, G_NORMALIZE_NFC); - hb_codepoint_t c = g_utf8_get_char (recomposed); - if (c != ab && c != *a) { - *a = c; - *b = 0; - } - g_free (recomposed); - ret = true; - } else { - /* If decomposed to more than two characters, take the last one, - * and recompose the rest to get the first component. */ - gchar *end = g_utf8_offset_to_pointer (normalized, len - 1); - gchar *recomposed; - *b = g_utf8_get_char (end); - recomposed = g_utf8_normalize (normalized, end - normalized, G_NORMALIZE_NFC); - /* We expect that recomposed has exactly one character now. */ - *a = g_utf8_get_char (recomposed); - g_free (recomposed); - ret = true; - } - - g_free (normalized); - return ret; } diff --git a/thirdparty/harfbuzz/src/hb-graphite2.cc b/thirdparty/harfbuzz/src/hb-graphite2.cc index 4d0e687c75..9e068f8d84 100644 --- a/thirdparty/harfbuzz/src/hb-graphite2.cc +++ b/thirdparty/harfbuzz/src/hb-graphite2.cc @@ -318,7 +318,7 @@ _hb_graphite2_shape (hb_shape_plan_t *shape_plan HB_UNUSED, #undef ALLOCATE_ARRAY - memset (clusters, 0, sizeof (clusters[0]) * buffer->len); + hb_memset (clusters, 0, sizeof (clusters[0]) * buffer->len); hb_codepoint_t *pg = gids; clusters[0].cluster = buffer->info[0].cluster; diff --git a/thirdparty/harfbuzz/src/hb-iter.hh b/thirdparty/harfbuzz/src/hb-iter.hh index 1a3ab43de0..b57f37b132 100644 --- a/thirdparty/harfbuzz/src/hb-iter.hh +++ b/thirdparty/harfbuzz/src/hb-iter.hh @@ -73,8 +73,10 @@ struct hb_iter_t /* Operators. */ iter_t iter () const { return *thiz(); } iter_t operator + () const { return *thiz(); } - iter_t begin () const { return *thiz(); } - iter_t end () const { return thiz()->__end__ (); } + iter_t _begin () const { return *thiz(); } + iter_t begin () const { return _begin (); } + iter_t _end () const { return thiz()->__end__ (); } + iter_t end () const { return _end (); } explicit operator bool () const { return thiz()->__more__ (); } unsigned len () const { return thiz()->__len__ (); } /* The following can only be enabled if item_t is reference type. Otherwise @@ -118,7 +120,9 @@ struct hb_iter_t #define HB_ITER_USING(Name) \ using item_t = typename Name::item_t; \ + using Name::_begin; \ using Name::begin; \ + using Name::_end; \ using Name::end; \ using Name::get_item_size; \ using Name::is_iterator; \ @@ -377,7 +381,7 @@ struct hb_map_iter_t : void __forward__ (unsigned n) { it += n; } void __prev__ () { --it; } void __rewind__ (unsigned n) { it -= n; } - hb_map_iter_t __end__ () const { return hb_map_iter_t (it.end (), f); } + hb_map_iter_t __end__ () const { return hb_map_iter_t (it._end (), f); } bool operator != (const hb_map_iter_t& o) const { return it != o.it; } @@ -440,7 +444,7 @@ struct hb_filter_iter_t : bool __more__ () const { return bool (it); } void __next__ () { do ++it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); } void __prev__ () { do --it; while (it && !hb_has (p.get (), hb_get (f.get (), *it))); } - hb_filter_iter_t __end__ () const { return hb_filter_iter_t (it.end (), p, f); } + hb_filter_iter_t __end__ () const { return hb_filter_iter_t (it._end (), p, f); } bool operator != (const hb_filter_iter_t& o) const { return it != o.it; } @@ -553,7 +557,7 @@ struct hb_zip_iter_t : void __forward__ (unsigned n) { a += n; b += n; } void __prev__ () { --a; --b; } void __rewind__ (unsigned n) { a -= n; b -= n; } - hb_zip_iter_t __end__ () const { return hb_zip_iter_t (a.end (), b.end ()); } + hb_zip_iter_t __end__ () const { return hb_zip_iter_t (a._end (), b._end ()); } /* Note, we should stop if ANY of the iters reaches end. As such two compare * unequal if both items are unequal, NOT if either is unequal. */ bool operator != (const hb_zip_iter_t& o) const @@ -637,7 +641,7 @@ struct hb_concat_iter_t : } } - hb_concat_iter_t __end__ () const { return hb_concat_iter_t (a.end (), b.end ()); } + hb_concat_iter_t __end__ () const { return hb_concat_iter_t (a._end (), b._end ()); } bool operator != (const hb_concat_iter_t& o) const { return a != o.a diff --git a/thirdparty/harfbuzz/src/hb-machinery.hh b/thirdparty/harfbuzz/src/hb-machinery.hh index 2571f22e15..b555739cfb 100644 --- a/thirdparty/harfbuzz/src/hb-machinery.hh +++ b/thirdparty/harfbuzz/src/hb-machinery.hh @@ -136,6 +136,13 @@ static inline Type& StructAfter(TObject &X) /* * Lazy loaders. + * + * The lazy-loaders are thread-safe pointer-like objects that create their + * instead on-demand. They also support access to a "data" object that is + * necessary for creating their instance. The data object, if specified, + * is accessed via pointer math, located at a location before the position + * of the loader itself. This avoids having to store a pointer to data + * for every lazy-loader. Multiple lazy-loaders can access the same data. */ template <typename Data, unsigned int WheresData> @@ -228,7 +235,8 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData> bool cmpexch (Stored *current, Stored *value) const { - /* This *must* be called when there are no other threads accessing. */ + /* This function can only be safely called directly if no + * other thread is accessing. */ return this->instance.cmpexch (current, value); } @@ -261,7 +269,7 @@ struct hb_lazy_loader_t : hb_data_wrapper_t<Data, WheresData> hb_free (p); } -// private: + private: /* Must only have one pointer. */ hb_atomic_ptr_t<Stored *> instance; }; @@ -283,7 +291,7 @@ struct hb_table_lazy_loader_t : hb_lazy_loader_t<T, { auto c = hb_sanitize_context_t (); if (core) - c.set_num_glyphs (0); // So we don't recurse ad infinitum... + c.set_num_glyphs (0); // So we don't recurse ad infinitum, or doesn't need num_glyphs return c.reference_table<T> (face); } static void destroy (hb_blob_t *p) { hb_blob_destroy (p); } diff --git a/thirdparty/harfbuzz/src/hb-map.hh b/thirdparty/harfbuzz/src/hb-map.hh index 8302e3f8c7..bfb1b3f768 100644 --- a/thirdparty/harfbuzz/src/hb-map.hh +++ b/thirdparty/harfbuzz/src/hb-map.hh @@ -43,9 +43,9 @@ struct hb_hashmap_t hb_hashmap_t () { init (); } ~hb_hashmap_t () { fini (); } - hb_hashmap_t (const hb_hashmap_t& o) : hb_hashmap_t () { resize (population); hb_copy (o, *this); } + hb_hashmap_t (const hb_hashmap_t& o) : hb_hashmap_t () { resize (o.population); hb_copy (o, *this); } hb_hashmap_t (hb_hashmap_t&& o) : hb_hashmap_t () { hb_swap (*this, o); } - hb_hashmap_t& operator= (const hb_hashmap_t& o) { resize (population); hb_copy (o, *this); return *this; } + hb_hashmap_t& operator= (const hb_hashmap_t& o) { reset (); resize (o.population); hb_copy (o, *this); return *this; } hb_hashmap_t& operator= (hb_hashmap_t&& o) { hb_swap (*this, o); return *this; } hb_hashmap_t (std::initializer_list<hb_pair_t<K, V>> lst) : hb_hashmap_t () @@ -71,6 +71,11 @@ struct hb_hashmap_t uint32_t is_tombstone_ : 1; V value; + item_t () : key (), + hash (0), + is_used_ (false), is_tombstone_ (false), + value () {} + bool is_used () const { return is_used_; } void set_used (bool is_used) { is_used_ = is_used; } bool is_tombstone () const { return is_tombstone_; } @@ -88,17 +93,8 @@ struct hb_hashmap_t return minus_1; }; - void clear () - { - new (std::addressof (key)) K (); - new (std::addressof (value)) V (); - hash = 0; - is_used_ = false; - is_tombstone_ = false; - } - - bool operator == (const K &o) { return hb_deref (key) == hb_deref (o); } - bool operator == (const item_t &o) { return *this == o.key; } + bool operator == (const K &o) const { return hb_deref (key) == hb_deref (o); } + bool operator == (const item_t &o) const { return *this == o.key; } hb_pair_t<K, V> get_pair() const { return hb_pair_t<K, V> (key, value); } hb_pair_t<const K &, const V &> get_pair_ref() const { return hb_pair_t<const K &, const V &> (key, value); } @@ -107,8 +103,8 @@ struct hb_hashmap_t }; hb_object_header_t header; - bool successful; /* Allocations successful */ - unsigned int population; /* Not including tombstones. */ + unsigned int successful : 1; /* Allocations successful */ + unsigned int population : 31; /* Not including tombstones. */ unsigned int occupancy; /* Including tombstones. */ unsigned int mask; unsigned int prime; @@ -118,7 +114,10 @@ struct hb_hashmap_t { if (unlikely (!a.successful || !b.successful)) return; - hb_swap (a.population, b.population); + unsigned tmp = a.population; + a.population = b.population; + b.population = tmp; + //hb_swap (a.population, b.population); hb_swap (a.occupancy, b.occupancy); hb_swap (a.mask, b.mask); hb_swap (a.prime, b.prime); @@ -160,7 +159,9 @@ struct hb_hashmap_t { if (unlikely (!successful)) return false; - unsigned int power = hb_bit_storage (hb_max (population, new_population) * 2 + 8); + if (new_population != 0 && (new_population + new_population / 2) < mask) return true; + + unsigned int power = hb_bit_storage (hb_max ((unsigned) population, new_population) * 2 + 8); unsigned int new_size = 1u << power; item_t *new_items = (item_t *) hb_malloc ((size_t) new_size * sizeof (item_t)); if (unlikely (!new_items)) @@ -169,9 +170,9 @@ struct hb_hashmap_t return false; } for (auto &_ : hb_iter (new_items, new_size)) - _.clear (); + new (&_) item_t (); - unsigned int old_size = mask + 1; + unsigned int old_size = size (); item_t *old_items = items; /* Switch to new, empty, array. */ @@ -181,47 +182,82 @@ struct hb_hashmap_t items = new_items; /* Insert back old items. */ - if (old_items) - for (unsigned int i = 0; i < old_size; i++) + for (unsigned int i = 0; i < old_size; i++) + { + if (old_items[i].is_real ()) { - if (old_items[i].is_real ()) - { - set_with_hash (old_items[i].key, - old_items[i].hash, - std::move (old_items[i].value)); - } - old_items[i].~item_t (); + set_with_hash (std::move (old_items[i].key), + old_items[i].hash, + std::move (old_items[i].value)); } + old_items[i].~item_t (); + } hb_free (old_items); return true; } + template <typename KK, typename VV> + bool set_with_hash (KK&& key, uint32_t hash, VV&& value, bool is_delete=false) + { + if (unlikely (!successful)) return false; + if (unlikely ((occupancy + occupancy / 2) >= mask && !resize ())) return false; + item_t &item = item_for_hash (key, hash); + + if (is_delete && !(item == key)) + return true; /* Trying to delete non-existent key. */ + + if (item.is_used ()) + { + occupancy--; + if (!item.is_tombstone ()) + population--; + } + + item.key = std::forward<KK> (key); + item.value = std::forward<VV> (value); + item.hash = hash; + item.set_used (true); + item.set_tombstone (is_delete); + + occupancy++; + if (!is_delete) + population++; + + return true; + } + + template <typename VV> + bool set (const K &key, VV&& value) { return set_with_hash (key, hb_hash (key), std::forward<VV> (value)); } template <typename VV> - bool set (K key, VV&& value) { return set_with_hash (key, hb_hash (key), std::forward<VV> (value)); } + bool set (K &&key, VV&& value) { return set_with_hash (std::move (key), hb_hash (key), std::forward<VV> (value)); } - const V& get (K key) const + const V& get_with_hash (const K &key, uint32_t hash) const + { + if (unlikely (!items)) return item_t::default_value (); + auto &item = item_for_hash (key, hash); + return item.is_real () && item == key ? item.value : item_t::default_value (); + } + const V& get (const K &key) const { if (unlikely (!items)) return item_t::default_value (); - unsigned int i = bucket_for (key); - return items[i].is_real () && items[i] == key ? items[i].value : item_t::default_value (); + return get_with_hash (key, hb_hash (key)); } - void del (K key) { set_with_hash (key, hb_hash (key), item_t::default_value (), true); } + void del (const K &key) { set_with_hash (key, hb_hash (key), item_t::default_value (), true); } /* Has interface. */ - typedef const V& value_t; - value_t operator [] (K k) const { return get (k); } + const V& operator [] (K k) const { return get (k); } template <typename VV=V> bool has (K key, VV **vp = nullptr) const { if (unlikely (!items)) return false; - unsigned int i = bucket_for (key); - if (items[i].is_real () && items[i] == key) + auto &item = item_for_hash (key, hb_hash (key)); + if (item.is_real () && item == key) { - if (vp) *vp = &items[i].value; + if (vp) *vp = std::addressof (item.value); return true; } else @@ -230,13 +266,18 @@ struct hb_hashmap_t /* Projection. */ V operator () (K k) const { return get (k); } + unsigned size () const { return mask ? mask + 1 : 0; } + void clear () { if (unlikely (!successful)) return; - if (items) - for (auto &_ : hb_iter (items, mask + 1)) - _.clear (); + for (auto &_ : hb_iter (items, size ())) + { + /* Reconstruct items. */ + _.~item_t (); + new (&_) item_t (); + } population = occupancy = 0; } @@ -246,11 +287,10 @@ struct hb_hashmap_t uint32_t hash () const { - uint32_t h = 0; - for (const auto &item : + hb_array (items, mask ? mask + 1 : 0) - | hb_filter (&item_t::is_real)) - h ^= item.total_hash (); - return h; + return + + iter_items () + | hb_reduce ([] (uint32_t h, const item_t &_) { return h ^ _.total_hash (); }, (uint32_t) 0u) + ; } bool is_equal (const hb_hashmap_t &other) const @@ -258,7 +298,7 @@ struct hb_hashmap_t if (population != other.population) return false; for (auto pair : iter ()) - if (get (pair.first) != pair.second) + if (other.get (pair.first) != pair.second) return false; return true; @@ -271,87 +311,54 @@ struct hb_hashmap_t /* * Iterator */ - auto iter () const HB_AUTO_RETURN + + auto iter_items () const HB_AUTO_RETURN ( - + hb_array (items, mask ? mask + 1 : 0) + + hb_iter (items, size ()) | hb_filter (&item_t::is_real) - | hb_map (&item_t::get_pair) ) auto iter_ref () const HB_AUTO_RETURN ( - + hb_array (items, mask ? mask + 1 : 0) - | hb_filter (&item_t::is_real) + + iter_items () | hb_map (&item_t::get_pair_ref) ) - auto keys () const HB_AUTO_RETURN + auto iter () const HB_AUTO_RETURN ( - + hb_array (items, mask ? mask + 1 : 0) - | hb_filter (&item_t::is_real) - | hb_map (&item_t::key) - | hb_map (hb_ridentity) + + iter_items () + | hb_map (&item_t::get_pair) ) auto keys_ref () const HB_AUTO_RETURN ( - + hb_array (items, mask ? mask + 1 : 0) - | hb_filter (&item_t::is_real) + + iter_items () | hb_map (&item_t::key) ) - auto values () const HB_AUTO_RETURN + auto keys () const HB_AUTO_RETURN ( - + hb_array (items, mask ? mask + 1 : 0) - | hb_filter (&item_t::is_real) - | hb_map (&item_t::value) + + keys_ref () | hb_map (hb_ridentity) ) auto values_ref () const HB_AUTO_RETURN ( - + hb_array (items, mask ? mask + 1 : 0) - | hb_filter (&item_t::is_real) + + iter_items () | hb_map (&item_t::value) ) + auto values () const HB_AUTO_RETURN + ( + + values_ref () + | hb_map (hb_ridentity) + ) /* Sink interface. */ hb_hashmap_t& operator << (const hb_pair_t<K, V>& v) { set (v.first, v.second); return *this; } - - protected: - - template <typename VV> - bool set_with_hash (K key, uint32_t hash, VV&& value, bool is_delete=false) - { - if (unlikely (!successful)) return false; - if (unlikely ((occupancy + occupancy / 2) >= mask && !resize ())) return false; - unsigned int i = bucket_for_hash (key, hash); - - if (is_delete && items[i].key != key) - return true; /* Trying to delete non-existent key. */ - - if (items[i].is_used ()) - { - occupancy--; - if (!items[i].is_tombstone ()) - population--; - } - - items[i].key = key; - items[i].value = std::forward<VV> (value); - items[i].hash = hash; - items[i].set_used (true); - items[i].set_tombstone (is_delete); - - occupancy++; - if (!is_delete) - population++; - - return true; - } - - unsigned int bucket_for (const K &key) const - { - return bucket_for_hash (key, hb_hash (key)); - } - - unsigned int bucket_for_hash (const K &key, uint32_t hash) const + hb_hashmap_t& operator << (const hb_pair_t<K, V&&>& v) + { set (v.first, std::move (v.second)); return *this; } + hb_hashmap_t& operator << (const hb_pair_t<K&&, V>& v) + { set (std::move (v.first), v.second); return *this; } + hb_hashmap_t& operator << (const hb_pair_t<K&&, V&&>& v) + { set (std::move (v.first), std::move (v.second)); return *this; } + + item_t& item_for_hash (const K &key, uint32_t hash) const { hash &= 0x3FFFFFFF; // We only store lower 30bit of hash unsigned int i = hash % prime; @@ -360,12 +367,12 @@ struct hb_hashmap_t while (items[i].is_used ()) { if (items[i].hash == hash && items[i] == key) - return i; + return items[i]; if (tombstone == (unsigned) -1 && items[i].is_tombstone ()) tombstone = i; i = (i + ++step) & mask; } - return tombstone == (unsigned) -1 ? i : tombstone; + return items[tombstone == (unsigned) -1 ? i : tombstone]; } static unsigned int prime_for (unsigned int shift) diff --git a/thirdparty/harfbuzz/src/hb-meta.hh b/thirdparty/harfbuzz/src/hb-meta.hh index 52a6791e31..31aa7fa6f1 100644 --- a/thirdparty/harfbuzz/src/hb-meta.hh +++ b/thirdparty/harfbuzz/src/hb-meta.hh @@ -112,8 +112,7 @@ template <typename T> auto _hb_try_add_pointer (hb_priority<1>) -> hb_type_ident template <typename T> using hb_add_pointer = decltype (_hb_try_add_pointer<T> (hb_prioritize)); -/* TODO Add feature-parity to std::decay. */ -template <typename T> using hb_decay = hb_remove_const<hb_remove_reference<T>>; +template <typename T> using hb_decay = typename std::decay<T>::type; #define hb_is_convertible(From,To) std::is_convertible<From, To>::value diff --git a/thirdparty/harfbuzz/src/hb-ms-feature-ranges.hh b/thirdparty/harfbuzz/src/hb-ms-feature-ranges.hh index d40fdeaa82..46a20c91ea 100644 --- a/thirdparty/harfbuzz/src/hb-ms-feature-ranges.hh +++ b/thirdparty/harfbuzz/src/hb-ms-feature-ranges.hh @@ -166,7 +166,7 @@ hb_ms_setup_features (const hb_feature_t *features, { auto *feature = active_features.lsearch (event->feature); if (feature) - active_features.remove (feature - active_features.arrayZ); + active_features.remove_ordered (feature - active_features.arrayZ); } } diff --git a/thirdparty/harfbuzz/src/hb-multimap.hh b/thirdparty/harfbuzz/src/hb-multimap.hh new file mode 100644 index 0000000000..f0f95917aa --- /dev/null +++ b/thirdparty/harfbuzz/src/hb-multimap.hh @@ -0,0 +1,92 @@ +/* + * Copyright © 2022 Behdad Esfahbod + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + */ + +#ifndef HB_MULTIMAP_HH +#define HB_MULTIMAP_HH + +#include "hb.hh" +#include "hb-map.hh" +#include "hb-vector.hh" + + +/* + * hb_multimap_t + */ + +struct hb_multimap_t +{ + void add (hb_codepoint_t k, hb_codepoint_t v) + { + hb_codepoint_t *i; + if (multiples_indices.has (k, &i)) + { + multiples_values[*i].push (v); + return; + } + + hb_codepoint_t *old_v; + if (singulars.has (k, &old_v)) + { + hb_codepoint_t old = *old_v; + singulars.del (k); + + multiples_indices.set (k, multiples_values.length); + auto *vec = multiples_values.push (); + + vec->push (old); + vec->push (v); + + return; + } + + singulars.set (k, v); + } + + hb_array_t<const hb_codepoint_t> get (hb_codepoint_t k) const + { + hb_codepoint_t *v; + if (singulars.has (k, &v)) + return hb_array (v, 1); + + hb_codepoint_t *i; + if (multiples_indices.has (k, &i)) + return multiples_values[*i].as_array (); + + return hb_array_t<hb_codepoint_t> (); + } + + bool in_error () const + { + return singulars.in_error () || multiples_indices.in_error () || multiples_values.in_error (); + } + + protected: + hb_map_t singulars; + hb_map_t multiples_indices; + hb_vector_t<hb_vector_t<hb_codepoint_t>> multiples_values; +}; + + + +#endif /* HB_MULTIMAP_HH */ diff --git a/thirdparty/harfbuzz/src/hb-mutex.hh b/thirdparty/harfbuzz/src/hb-mutex.hh index 6914b22450..053f9ddcc4 100644 --- a/thirdparty/harfbuzz/src/hb-mutex.hh +++ b/thirdparty/harfbuzz/src/hb-mutex.hh @@ -108,10 +108,11 @@ struct hb_mutex_t struct hb_lock_t { - hb_lock_t (hb_mutex_t &mutex_) : mutex (mutex_) { mutex.lock (); } - ~hb_lock_t () { mutex.unlock (); } + hb_lock_t (hb_mutex_t &mutex_) : mutex (&mutex_) { mutex->lock (); } + hb_lock_t (hb_mutex_t *mutex_) : mutex (mutex_) { if (mutex) mutex->lock (); } + ~hb_lock_t () { if (mutex) mutex->unlock (); } private: - hb_mutex_t &mutex; + hb_mutex_t *mutex; }; diff --git a/thirdparty/harfbuzz/src/hb-number-parser.hh b/thirdparty/harfbuzz/src/hb-number-parser.hh index 1a9dbba6dd..ec68c3a728 100644 --- a/thirdparty/harfbuzz/src/hb-number-parser.hh +++ b/thirdparty/harfbuzz/src/hb-number-parser.hh @@ -31,7 +31,7 @@ #include "hb.hh" -#line 35 "hb-number-parser.hh" +#line 32 "hb-number-parser.hh" static const unsigned char _double_parser_trans_keys[] = { 0u, 0u, 43u, 57u, 46u, 57u, 48u, 57u, 43u, 57u, 48u, 57u, 48u, 101u, 48u, 57u, 46u, 101u, 0 @@ -135,12 +135,12 @@ strtod_rl (const char *p, const char **end_ptr /* IN/OUT */) int cs; -#line 139 "hb-number-parser.hh" +#line 132 "hb-number-parser.hh" { cs = double_parser_start; } -#line 144 "hb-number-parser.hh" +#line 135 "hb-number-parser.hh" { int _slen; int _trans; @@ -198,7 +198,7 @@ _resume: exp_overflow = true; } break; -#line 202 "hb-number-parser.hh" +#line 187 "hb-number-parser.hh" } _again: diff --git a/thirdparty/harfbuzz/src/hb-object.hh b/thirdparty/harfbuzz/src/hb-object.hh index 9876c2923c..a23c25f7ca 100644 --- a/thirdparty/harfbuzz/src/hb-object.hh +++ b/thirdparty/harfbuzz/src/hb-object.hh @@ -80,7 +80,7 @@ struct hb_lockable_set_t if (item) { item_t old = *item; - *item = items[items.length - 1]; + *item = std::move (items.tail ()); items.pop (); l.unlock (); old.fini (); @@ -123,7 +123,7 @@ struct hb_lockable_set_t l.lock (); while (items.length) { - item_t old = items[items.length - 1]; + item_t old = items.tail (); items.pop (); l.unlock (); old.fini (); diff --git a/thirdparty/harfbuzz/src/hb-open-file.hh b/thirdparty/harfbuzz/src/hb-open-file.hh index 6eee5827c1..13570a46e0 100644 --- a/thirdparty/harfbuzz/src/hb-open-file.hh +++ b/thirdparty/harfbuzz/src/hb-open-file.hh @@ -90,7 +90,7 @@ typedef struct OpenTypeOffsetTable { if (table_count) { - + tables.sub_array (start_offset, table_count) + + tables.as_array ().sub_array (start_offset, table_count) | hb_map (&TableRecord::tag) | hb_sink (hb_array (table_tags, *table_count)) ; @@ -158,7 +158,7 @@ typedef struct OpenTypeOffsetTable return_trace (false); if (likely (len)) - memcpy (start, blob->data, len); + hb_memcpy (start, blob->data, len); /* 4-byte alignment. */ c->align (4); diff --git a/thirdparty/harfbuzz/src/hb-open-type.hh b/thirdparty/harfbuzz/src/hb-open-type.hh index e66f451820..290799127a 100644 --- a/thirdparty/harfbuzz/src/hb-open-type.hh +++ b/thirdparty/harfbuzz/src/hb-open-type.hh @@ -148,7 +148,7 @@ struct HBFixed : Type static_assert (Type::static_size * 8 > fraction_bits, ""); HBFixed& operator = (typename Type::type i ) { Type::operator= (i); return *this; } - float to_float () const { return ((int32_t) Type::v) / shift; } + float to_float (float offset = 0) const { return ((int32_t) Type::v + offset) / shift; } void set_float (float f) { Type::v = roundf (f * shift); } public: DEFINE_SIZE_STATIC (Type::static_size); @@ -157,6 +157,9 @@ struct HBFixed : Type /* 16-bit signed fixed number with the low 14 bits of fraction (2.14). */ using F2DOT14 = HBFixed<HBINT16, 14>; +/* 16-bit signed fixed number with the low 12 bits of fraction (4.12). */ +using F4DOT12 = HBFixed<HBINT16, 12>; + /* 32-bit signed fixed-point number (16.16). */ using F16DOT16 = HBFixed<HBINT32, 16>; @@ -209,6 +212,12 @@ typedef Index NameID; struct VarIdx : HBUINT32 { static constexpr unsigned NO_VARIATION = 0xFFFFFFFFu; + static_assert (NO_VARIATION == HB_OT_LAYOUT_NO_VARIATIONS_INDEX, ""); + static uint32_t add (uint32_t i, unsigned short v) + { + if (i == NO_VARIATION) return i; + return i + v; + } VarIdx& operator = (uint32_t i) { HBUINT32::operator= (i); return *this; } }; DECLARE_NULL_NAMESPACE_BYTES (OT, VarIdx); @@ -493,10 +502,10 @@ struct UnsizedArrayOf void qsort (unsigned int len, unsigned int start = 0, unsigned int end = (unsigned int) -1) { as_array (len).qsort (start, end); } - bool serialize (hb_serialize_context_t *c, unsigned int items_len) + bool serialize (hb_serialize_context_t *c, unsigned int items_len, bool clear = true) { TRACE_SERIALIZE (this); - if (unlikely (!c->extend (this, items_len))) return_trace (false); + if (unlikely (!c->extend_size (this, get_size (items_len), clear))) return_trace (false); return_trace (true); } template <typename Iterator, @@ -504,8 +513,8 @@ struct UnsizedArrayOf bool serialize (hb_serialize_context_t *c, Iterator items) { TRACE_SERIALIZE (this); - unsigned count = items.len (); - if (unlikely (!serialize (c, count))) return_trace (false); + unsigned count = hb_len (items); + if (unlikely (!serialize (c, count, false))) return_trace (false); /* TODO Umm. Just exhaust the iterator instead? Being extra * cautious right now.. */ for (unsigned i = 0; i < count; i++, ++items) @@ -646,14 +655,9 @@ struct ArrayOf operator iter_t () const { return iter (); } operator writer_t () { return writer (); } - hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const - { return as_array ().sub_array (start_offset, count); } - hb_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const - { return as_array ().sub_array (start_offset, count); } - hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int count) - { return as_array ().sub_array (start_offset, count); } - hb_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) - { return as_array ().sub_array (start_offset, count); } + /* Faster range-based for loop. */ + const Type *begin () const { return arrayZ; } + const Type *end () const { return arrayZ + len; } template <typename T> Type &lsearch (const T &x, Type ¬_found = Crap (Type)) @@ -667,15 +671,15 @@ struct ArrayOf unsigned int to_store = (unsigned int) -1) const { return as_array ().lfind (x, i, not_found, to_store); } - void qsort (unsigned int start = 0, unsigned int end = (unsigned int) -1) - { as_array ().qsort (start, end); } + void qsort () + { as_array ().qsort (); } - HB_NODISCARD bool serialize (hb_serialize_context_t *c, unsigned items_len) + HB_NODISCARD bool serialize (hb_serialize_context_t *c, unsigned items_len, bool clear = true) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (this))) return_trace (false); c->check_assign (len, items_len, HB_SERIALIZE_ERROR_ARRAY_OVERFLOW); - if (unlikely (!c->extend (this))) return_trace (false); + if (unlikely (!c->extend_size (this, get_size (), clear))) return_trace (false); return_trace (true); } template <typename Iterator, @@ -683,8 +687,8 @@ struct ArrayOf HB_NODISCARD bool serialize (hb_serialize_context_t *c, Iterator items) { TRACE_SERIALIZE (this); - unsigned count = items.len (); - if (unlikely (!serialize (c, count))) return_trace (false); + unsigned count = hb_len (items); + if (unlikely (!serialize (c, count, false))) return_trace (false); /* TODO Umm. Just exhaust the iterator instead? Being extra * cautious right now.. */ for (unsigned i = 0; i < count; i++, ++items) @@ -828,21 +832,25 @@ struct HeadlessArrayOf operator iter_t () const { return iter (); } operator writer_t () { return writer (); } - bool serialize (hb_serialize_context_t *c, unsigned int items_len) + /* Faster range-based for loop. */ + const Type *begin () const { return arrayZ; } + const Type *end () const { return arrayZ + get_length (); } + + HB_NODISCARD bool serialize (hb_serialize_context_t *c, unsigned int items_len, bool clear = true) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (this))) return_trace (false); c->check_assign (lenP1, items_len + 1, HB_SERIALIZE_ERROR_ARRAY_OVERFLOW); - if (unlikely (!c->extend (this))) return_trace (false); + if (unlikely (!c->extend_size (this, get_size (), clear))) return_trace (false); return_trace (true); } template <typename Iterator, hb_requires (hb_is_source_of (Iterator, Type))> - bool serialize (hb_serialize_context_t *c, Iterator items) + HB_NODISCARD bool serialize (hb_serialize_context_t *c, Iterator items) { TRACE_SERIALIZE (this); - unsigned count = items.len (); - if (unlikely (!serialize (c, count))) return_trace (false); + unsigned count = hb_len (items); + if (unlikely (!serialize (c, count, false))) return_trace (false); /* TODO Umm. Just exhaust the iterator instead? Being extra * cautious right now.. */ for (unsigned i = 0; i < count; i++, ++items) @@ -944,14 +952,9 @@ struct SortedArrayOf : ArrayOf<Type, LenType> operator iter_t () const { return iter (); } operator writer_t () { return writer (); } - hb_sorted_array_t<const Type> sub_array (unsigned int start_offset, unsigned int count) const - { return as_array ().sub_array (start_offset, count); } - hb_sorted_array_t<const Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const - { return as_array ().sub_array (start_offset, count); } - hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int count) - { return as_array ().sub_array (start_offset, count); } - hb_sorted_array_t<Type> sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) - { return as_array ().sub_array (start_offset, count); } + /* Faster range-based for loop. */ + const Type *begin () const { return this->arrayZ; } + const Type *end () const { return this->arrayZ + this->len; } bool serialize (hb_serialize_context_t *c, unsigned int items_len) { diff --git a/thirdparty/harfbuzz/src/hb-ot-cff-common.hh b/thirdparty/harfbuzz/src/hb-ot-cff-common.hh index ae3b83a256..f22824fc69 100644 --- a/thirdparty/harfbuzz/src/hb-ot-cff-common.hh +++ b/thirdparty/harfbuzz/src/hb-ot-cff-common.hh @@ -66,95 +66,25 @@ struct CFFIndex { TRACE_SERIALIZE (this); unsigned int size = get_size (); - CFFIndex *out = c->allocate_size<CFFIndex> (size); + CFFIndex *out = c->allocate_size<CFFIndex> (size, false); if (likely (out)) - memcpy (out, this, size); + hb_memcpy (out, this, size); return_trace (out); } + template <typename Iterable, + hb_requires (hb_is_iterable (Iterable))> bool serialize (hb_serialize_context_t *c, - unsigned int offSize_, - const byte_str_array_t &byteArray) + const Iterable &iterable) { TRACE_SERIALIZE (this); - - if (byteArray.length == 0) - { - COUNT *dest = c->allocate_min<COUNT> (); - if (unlikely (!dest)) return_trace (false); - *dest = 0; - return_trace (true); - } - - /* serialize CFFIndex header */ - if (unlikely (!c->extend_min (this))) return_trace (false); - this->count = byteArray.length; - this->offSize = offSize_; - if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (byteArray.length + 1)))) - return_trace (false); - - /* serialize indices */ - unsigned int offset = 1; - unsigned int i = 0; - for (; i < byteArray.length; i++) - { - set_offset_at (i, offset); - offset += byteArray[i].get_size (); - } - set_offset_at (i, offset); - - /* serialize data */ - for (unsigned int i = 0; i < byteArray.length; i++) - { - const hb_ubytes_t &bs = byteArray[i]; - unsigned char *dest = c->allocate_size<unsigned char> (bs.length); - if (unlikely (!dest)) return_trace (false); - memcpy (dest, &bs[0], bs.length); - } - - return_trace (true); - } - - bool serialize (hb_serialize_context_t *c, - unsigned int offSize_, - const str_buff_vec_t &buffArray) - { - byte_str_array_t byteArray; - byteArray.init (); - byteArray.resize (buffArray.length); - for (unsigned int i = 0; i < byteArray.length; i++) - byteArray[i] = hb_ubytes_t (buffArray[i].arrayZ, buffArray[i].length); - bool result = this->serialize (c, offSize_, byteArray); - byteArray.fini (); - return result; - } - - template <typename Iterator, - hb_requires (hb_is_iterator (Iterator))> - bool serialize (hb_serialize_context_t *c, - Iterator it) - { - TRACE_SERIALIZE (this); - serialize_header(c, + it | hb_map ([] (const hb_ubytes_t &_) { return _.length; })); + auto it = hb_iter (iterable); + serialize_header(c, + it | hb_map (hb_iter) | hb_map (hb_len)); for (const auto &_ : +it) - _.copy (c); + hb_iter (_).copy (c); return_trace (true); } - bool serialize (hb_serialize_context_t *c, - const byte_str_array_t &byteArray) - { return serialize (c, + hb_iter (byteArray)); } - - bool serialize (hb_serialize_context_t *c, - const str_buff_vec_t &buffArray) - { - auto it = - + hb_iter (buffArray) - | hb_map ([] (const str_buff_t &_) { return hb_ubytes_t (_.arrayZ, _.length); }) - ; - return serialize (c, it); - } - template <typename Iterator, hb_requires (hb_is_iterator (Iterator))> bool serialize_header (hb_serialize_context_t *c, @@ -171,7 +101,7 @@ struct CFFIndex if (!this->count) return_trace (true); if (unlikely (!c->extend (this->offSize))) return_trace (false); this->offSize = off_size; - if (unlikely (!c->allocate_size<HBUINT8> (off_size * (this->count + 1)))) + if (unlikely (!c->allocate_size<HBUINT8> (off_size * (this->count + 1), false))) return_trace (false); /* serialize indices */ @@ -179,14 +109,27 @@ struct CFFIndex unsigned int i = 0; for (unsigned _ : +it) { - CFFIndex<COUNT>::set_offset_at (i++, offset); + set_offset_at (i++, offset); offset += _; } - CFFIndex<COUNT>::set_offset_at (i, offset); + set_offset_at (i, offset); return_trace (true); } + template <typename Iterable, + hb_requires (hb_is_iterable (Iterable))> + static unsigned total_size (const Iterable &iterable) + { + auto it = + hb_iter (iterable) | hb_map (hb_iter) | hb_map (hb_len); + if (!it) return 0; + + unsigned total = + it | hb_reduce (hb_add, 0); + unsigned off_size = (hb_bit_storage (total + 1) + 7) / 8; + + return min_size + HBUINT8::static_size + (hb_len (it) + 1) * off_size + total; + } + void set_offset_at (unsigned int index, unsigned int offset) { assert (index <= count); @@ -207,10 +150,14 @@ struct CFFIndex unsigned int size = offSize; const HBUINT8 *p = offsets + size * index; - unsigned int offset = 0; - for (; size; size--) - offset = (offset << 8) + *p++; - return offset; + switch (size) + { + case 1: return * (HBUINT8 *) p; + case 2: return * (HBUINT16 *) p; + case 3: return * (HBUINT24 *) p; + case 4: return * (HBUINT32 *) p; + default: return 0; + } } unsigned int length_at (unsigned int index) const @@ -229,6 +176,7 @@ struct CFFIndex hb_ubytes_t operator [] (unsigned int index) const { if (unlikely (index >= count)) return hb_ubytes_t (); + _hb_compiler_memory_r_barrier (); unsigned length = length_at (index); if (unlikely (!length)) return hb_ubytes_t (); return hb_ubytes_t (data_base () + offset_at (index) - 1, length); @@ -280,7 +228,7 @@ struct CFFIndexOf : CFFIndex<COUNT> if (unlikely (!c->extend_min (this))) return_trace (false); this->count = dataArrayLen; this->offSize = offSize_; - if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (dataArrayLen + 1)))) + if (unlikely (!c->allocate_size<HBUINT8> (offSize_ * (dataArrayLen + 1), false))) return_trace (false); /* serialize indices */ @@ -288,10 +236,10 @@ struct CFFIndexOf : CFFIndex<COUNT> unsigned int i = 0; for (; i < dataArrayLen; i++) { - CFFIndex<COUNT>::set_offset_at (i, offset); + this->set_offset_at (i, offset); offset += dataSizeArray[i]; } - CFFIndex<COUNT>::set_offset_at (i, offset); + this->set_offset_at (i, offset); /* serialize data */ for (unsigned int i = 0; i < dataArrayLen; i++) @@ -324,13 +272,12 @@ struct Dict : UnsizedByteStr template <typename T, typename V> static bool serialize_int_op (hb_serialize_context_t *c, op_code_t op, V value, op_code_t intOp) { - // XXX: not sure why but LLVM fails to compile the following 'unlikely' macro invocation - if (/*unlikely*/ (!serialize_int<T, V> (c, intOp, value))) + if (unlikely ((!serialize_int<T, V> (c, intOp, value)))) return false; TRACE_SERIALIZE (this); /* serialize the opcode */ - HBUINT8 *p = c->allocate_size<HBUINT8> (OpCode_Size (op)); + HBUINT8 *p = c->allocate_size<HBUINT8> (OpCode_Size (op), false); if (unlikely (!p)) return_trace (false); if (Is_OpCode_ESC (op)) { @@ -415,9 +362,8 @@ struct FDSelect0 { TRACE_SANITIZE (this); if (unlikely (!(c->check_struct (this)))) return_trace (false); - for (unsigned int i = 0; i < c->get_num_glyphs (); i++) - if (unlikely (!fds[i].sanitize (c))) - return_trace (false); + if (unlikely (!c->check_array (fds, c->get_num_glyphs ()))) + return_trace (false); return_trace (true); } @@ -471,14 +417,20 @@ struct FDSelect3_4 return_trace (true); } - hb_codepoint_t get_fd (hb_codepoint_t glyph) const + static int _cmp_range (const void *_key, const void *_item) { - unsigned int i; - for (i = 1; i < nRanges (); i++) - if (glyph < ranges[i].first) - break; + hb_codepoint_t glyph = * (hb_codepoint_t *) _key; + FDSelect3_4_Range<GID_TYPE, FD_TYPE> *range = (FDSelect3_4_Range<GID_TYPE, FD_TYPE> *) _item; - return (hb_codepoint_t) ranges[i - 1].fd; + if (glyph < range[0].first) return -1; + if (glyph < range[1].first) return 0; + return +1; + } + + hb_codepoint_t get_fd (hb_codepoint_t glyph) const + { + auto *range = hb_bsearch (glyph, &ranges[0], nRanges () - 1, sizeof (ranges[0]), _cmp_range); + return range ? range->fd : ranges[nRanges () - 1].fd; } GID_TYPE &nRanges () { return ranges.len; } @@ -501,9 +453,9 @@ struct FDSelect { TRACE_SERIALIZE (this); unsigned int size = src.get_size (num_glyphs); - FDSelect *dest = c->allocate_size<FDSelect> (size); + FDSelect *dest = c->allocate_size<FDSelect> (size, false); if (unlikely (!dest)) return_trace (false); - memcpy (dest, &src, size); + hb_memcpy (dest, &src, size); return_trace (true); } diff --git a/thirdparty/harfbuzz/src/hb-ot-cff1-table.hh b/thirdparty/harfbuzz/src/hb-ot-cff1-table.hh index 17b0296616..bb856c9ddb 100644 --- a/thirdparty/harfbuzz/src/hb-ot-cff1-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-cff1-table.hh @@ -175,7 +175,7 @@ struct Encoding unsigned int size = src.get_size (); Encoding *dest = c->allocate_size<Encoding> (size); if (unlikely (!dest)) return_trace (false); - memcpy (dest, &src, size); + hb_memcpy (dest, &src, size); return_trace (true); } @@ -471,7 +471,7 @@ struct Charset unsigned int size = src.get_size (num_glyphs); Charset *dest = c->allocate_size<Charset> (size); if (unlikely (!dest)) return_trace (false); - memcpy (dest, &src, size); + hb_memcpy (dest, &src, size); return_trace (true); } @@ -617,7 +617,6 @@ struct CFF1StringIndex : CFF1Index } byte_str_array_t bytesArray; - bytesArray.init (); if (!bytesArray.resize (sidmap.get_population ())) return_trace (false); for (unsigned int i = 0; i < strings.count; i++) @@ -628,7 +627,6 @@ struct CFF1StringIndex : CFF1Index } bool result = CFF1Index::serialize (c, bytesArray); - bytesArray.fini (); return_trace (result); } }; @@ -813,7 +811,7 @@ struct cff1_top_dict_opset_t : top_dict_opset_t<cff1_top_dict_val_t> break; default: - env.last_offset = env.str_ref.offset; + env.last_offset = env.str_ref.get_offset (); top_dict_opset_t<cff1_top_dict_val_t>::process_op (op, env, dictval); /* Record this operand below if stack is empty, otherwise done */ if (!env.argStack.is_empty ()) return; @@ -1295,10 +1293,10 @@ struct cff1 } protected: - hb_blob_t *blob = nullptr; hb_sanitize_context_t sc; public: + hb_blob_t *blob = nullptr; const Encoding *encoding = nullptr; const Charset *charset = nullptr; const CFF1NameIndex *nameIndex = nullptr; diff --git a/thirdparty/harfbuzz/src/hb-ot-cff2-table.hh b/thirdparty/harfbuzz/src/hb-ot-cff2-table.hh index 746160dc8e..9081930bbe 100644 --- a/thirdparty/harfbuzz/src/hb-ot-cff2-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-cff2-table.hh @@ -56,7 +56,7 @@ struct CFF2FDSelect unsigned int size = src.get_size (num_glyphs); CFF2FDSelect *dest = c->allocate_size<CFF2FDSelect> (size); if (unlikely (!dest)) return_trace (false); - memcpy (dest, &src, size); + hb_memcpy (dest, &src, size); return_trace (true); } @@ -124,7 +124,7 @@ struct CFF2VariationStore unsigned int size_ = varStore->get_size (); CFF2VariationStore *dest = c->allocate_size<CFF2VariationStore> (size_); if (unlikely (!dest)) return_trace (false); - memcpy (dest, varStore, size_); + hb_memcpy (dest, varStore, size_); return_trace (true); } @@ -483,13 +483,18 @@ struct cff2 blob = nullptr; } + hb_map_t *create_glyph_to_sid_map () const + { + return nullptr; + } + bool is_valid () const { return blob; } protected: - hb_blob_t *blob = nullptr; hb_sanitize_context_t sc; public: + hb_blob_t *blob = nullptr; cff2_top_dict_values_t topDict; const CFF2Subrs *globalSubrs = nullptr; const CFF2VariationStore *varStore = nullptr; diff --git a/thirdparty/harfbuzz/src/hb-ot-cmap-table.hh b/thirdparty/harfbuzz/src/hb-ot-cmap-table.hh index 09c9fe93f3..523196fa79 100644 --- a/thirdparty/harfbuzz/src/hb-ot-cmap-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-cmap-table.hh @@ -909,7 +909,7 @@ struct DefaultUVS : SortedArray32Of<UnicodeValueRange> hb_codepoint_t first = arrayZ[i].startUnicodeValue; hb_codepoint_t last = hb_min ((hb_codepoint_t) (first + arrayZ[i].additionalCount), (hb_codepoint_t) HB_UNICODE_MAX); - out->add_range (first, hb_min (last, 0x10FFFFu)); + out->add_range (first, last); } } @@ -925,37 +925,75 @@ struct DefaultUVS : SortedArray32Of<UnicodeValueRange> if (unlikely (!c->copy<HBUINT32> (len))) return nullptr; unsigned init_len = c->length (); - hb_codepoint_t lastCode = HB_MAP_VALUE_INVALID; - int count = -1; - - for (const UnicodeValueRange& _ : as_array ()) + if (this->len > unicodes->get_population () * hb_bit_storage ((unsigned) this->len)) { - for (const unsigned addcnt : hb_range ((unsigned) _.additionalCount + 1)) + hb_codepoint_t start = HB_SET_VALUE_INVALID; + hb_codepoint_t end = HB_SET_VALUE_INVALID; + + for (hb_codepoint_t u = HB_SET_VALUE_INVALID; + unicodes->next (&u);) { - unsigned curEntry = (unsigned) _.startUnicodeValue + addcnt; - if (!unicodes->has (curEntry)) continue; - count += 1; - if (lastCode == HB_MAP_VALUE_INVALID) - lastCode = curEntry; - else if (lastCode + count != curEntry) + if (!as_array ().bsearch (u)) + continue; + if (start == HB_SET_VALUE_INVALID) { + start = u; + end = start - 1; + } + if (end + 1 != u || end - start == 255) + { UnicodeValueRange rec; - rec.startUnicodeValue = lastCode; - rec.additionalCount = count - 1; + rec.startUnicodeValue = start; + rec.additionalCount = end - start; c->copy<UnicodeValueRange> (rec); - - lastCode = curEntry; - count = 0; + start = u; } + end = u; + } + if (start != HB_SET_VALUE_INVALID) + { + UnicodeValueRange rec; + rec.startUnicodeValue = start; + rec.additionalCount = end - start; + c->copy<UnicodeValueRange> (rec); } - } - if (lastCode != HB_MAP_VALUE_INVALID) + } + else { - UnicodeValueRange rec; - rec.startUnicodeValue = lastCode; - rec.additionalCount = count; - c->copy<UnicodeValueRange> (rec); + hb_codepoint_t lastCode = HB_SET_VALUE_INVALID; + int count = -1; + + for (const UnicodeValueRange& _ : *this) + { + hb_codepoint_t curEntry = (hb_codepoint_t) (_.startUnicodeValue - 1); + hb_codepoint_t end = curEntry + _.additionalCount + 2; + + for (; unicodes->next (&curEntry) && curEntry < end;) + { + count += 1; + if (lastCode == HB_SET_VALUE_INVALID) + lastCode = curEntry; + else if (lastCode + count != curEntry) + { + UnicodeValueRange rec; + rec.startUnicodeValue = lastCode; + rec.additionalCount = count - 1; + c->copy<UnicodeValueRange> (rec); + + lastCode = curEntry; + count = 0; + } + } + } + + if (lastCode != HB_MAP_VALUE_INVALID) + { + UnicodeValueRange rec; + rec.startUnicodeValue = lastCode; + rec.additionalCount = count; + c->copy<UnicodeValueRange> (rec); + } } if (c->length () - init_len == 0) @@ -1474,32 +1512,80 @@ struct EncodingRecord DEFINE_SIZE_STATIC (8); }; +struct cmap; + struct SubtableUnicodesCache { private: - const void* base; - hb_hashmap_t<intptr_t, hb::unique_ptr<hb_set_t>> cached_unicodes; + hb_blob_ptr_t<cmap> base_blob; + const char* base; + hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> cached_unicodes; public: + + static SubtableUnicodesCache* create (hb_blob_ptr_t<cmap> source_table) + { + SubtableUnicodesCache* cache = + (SubtableUnicodesCache*) hb_malloc (sizeof(SubtableUnicodesCache)); + new (cache) SubtableUnicodesCache (source_table); + return cache; + } + + static void destroy (void* value) { + if (!value) return; + + SubtableUnicodesCache* cache = (SubtableUnicodesCache*) value; + cache->~SubtableUnicodesCache (); + hb_free (cache); + } + SubtableUnicodesCache(const void* cmap_base) - : base(cmap_base), cached_unicodes() {} + : base_blob(), + base ((const char*) cmap_base), + cached_unicodes () + {} + + SubtableUnicodesCache(hb_blob_ptr_t<cmap> base_blob_) + : base_blob(base_blob_), + base ((const char *) base_blob.get()), + cached_unicodes () + {} + + ~SubtableUnicodesCache() + { + base_blob.destroy (); + } + + bool same_base(const void* other) const + { + return other == (const void*) base; + } - hb_set_t* set_for (const EncodingRecord* record) + const hb_set_t* set_for (const EncodingRecord* record, + SubtableUnicodesCache& mutable_cache) const { - if (!cached_unicodes.has ((intptr_t) record)) + if (cached_unicodes.has ((unsigned) ((const char *) record - base))) + return cached_unicodes.get ((unsigned) ((const char *) record - base)); + + return mutable_cache.set_for (record); + } + + const hb_set_t* set_for (const EncodingRecord* record) + { + if (!cached_unicodes.has ((unsigned) ((const char *) record - base))) { hb_set_t *s = hb_set_create (); if (unlikely (s->in_error ())) return hb_set_get_empty (); - + (base+record->subtable).collect_unicodes (s); - if (unlikely (!cached_unicodes.set ((intptr_t) record, hb::unique_ptr<hb_set_t> {s}))) + if (unlikely (!cached_unicodes.set ((unsigned) ((const char *) record - base), hb::unique_ptr<hb_set_t> {s}))) return hb_set_get_empty (); return s; } - return cached_unicodes.get ((intptr_t) record); + return cached_unicodes.get ((unsigned) ((const char *) record - base)); } }; @@ -1523,13 +1609,30 @@ struct cmap { static constexpr hb_tag_t tableTag = HB_OT_TAG_cmap; + + static SubtableUnicodesCache* create_filled_cache(hb_blob_ptr_t<cmap> source_table) { + const cmap* cmap = source_table.get(); + auto it = + + hb_iter (cmap->encodingRecord) + | hb_filter ([&](const EncodingRecord& _) { + return cmap::filter_encoding_records_for_subset (cmap, _); + }) + ; + + SubtableUnicodesCache* cache = SubtableUnicodesCache::create(source_table); + for (const EncodingRecord& _ : it) + cache->set_for(&_); // populate the cache for this encoding record. + + return cache; + } + template<typename Iterator, typename EncodingRecIter, hb_requires (hb_is_iterator (EncodingRecIter))> bool serialize (hb_serialize_context_t *c, Iterator it, EncodingRecIter encodingrec_iter, const void *base, - const hb_subset_plan_t *plan, + hb_subset_plan_t *plan, bool drop_format_4 = false) { if (unlikely (!c->extend_min ((*this)))) return false; @@ -1538,7 +1641,14 @@ struct cmap unsigned format4objidx = 0, format12objidx = 0, format14objidx = 0; auto snap = c->snapshot (); - SubtableUnicodesCache unicodes_cache (base); + SubtableUnicodesCache local_unicodes_cache (base); + const SubtableUnicodesCache* unicodes_cache = &local_unicodes_cache; + + if (plan->accelerator && + plan->accelerator->cmap_cache && + plan->accelerator->cmap_cache->same_base (base)) + unicodes_cache = plan->accelerator->cmap_cache; + for (const EncodingRecord& _ : encodingrec_iter) { if (c->in_error ()) @@ -1547,7 +1657,7 @@ struct cmap unsigned format = (base+_.subtable).u.format; if (format != 4 && format != 12 && format != 14) continue; - hb_set_t* unicodes_set = unicodes_cache.set_for (&_); + const hb_set_t* unicodes_set = unicodes_cache->set_for (&_, local_unicodes_cache); if (!drop_format_4 && format == 4) { @@ -1566,7 +1676,13 @@ struct cmap else if (format == 12) { - if (_can_drop (_, *unicodes_set, base, unicodes_cache, + it | hb_map (hb_first), encodingrec_iter)) continue; + if (_can_drop (_, + *unicodes_set, + base, + *unicodes_cache, + local_unicodes_cache, + + it | hb_map (hb_first), encodingrec_iter)) + continue; c->copy (_, + it | hb_filter (*unicodes_set, hb_first), 12u, base, plan, &format12objidx); } else if (format == 14) c->copy (_, it, 14u, base, plan, &format14objidx); @@ -1585,7 +1701,8 @@ struct cmap bool _can_drop (const EncodingRecord& cmap12, const hb_set_t& cmap12_unicodes, const void* base, - SubtableUnicodesCache& unicodes_cache, + const SubtableUnicodesCache& unicodes_cache, + SubtableUnicodesCache& local_unicodes_cache, Iterator subset_unicodes, EncodingRecordIterator encoding_records) { @@ -1616,7 +1733,7 @@ struct cmap || (base+_.subtable).get_language() != target_language) continue; - hb_set_t* sibling_unicodes = unicodes_cache.set_for (&_); + const hb_set_t* sibling_unicodes = unicodes_cache.set_for (&_, local_unicodes_cache); auto cmap12 = + subset_unicodes | hb_filter (cmap12_unicodes); auto sibling = + subset_unicodes | hb_filter (*sibling_unicodes); @@ -1653,17 +1770,9 @@ struct cmap auto encodingrec_iter = + hb_iter (encodingRecord) - | hb_filter ([&] (const EncodingRecord& _) - { - if ((_.platformID == 0 && _.encodingID == 3) || - (_.platformID == 0 && _.encodingID == 4) || - (_.platformID == 3 && _.encodingID == 1) || - (_.platformID == 3 && _.encodingID == 10) || - (this + _.subtable).u.format == 14) - return true; - - return false; - }) + | hb_filter ([&](const EncodingRecord& _) { + return cmap::filter_encoding_records_for_subset (this, _); + }) ; if (unlikely (!encodingrec_iter.len ())) return_trace (false); @@ -1692,7 +1801,11 @@ struct cmap { return (_.second != HB_MAP_VALUE_INVALID); }) ; - return_trace (cmap_prime->serialize (c->serializer, it, encodingrec_iter, this, c->plan)); + return_trace (cmap_prime->serialize (c->serializer, + it, + encodingrec_iter, + this, + c->plan)); } const CmapSubtable *find_best_subtable (bool *symbol = nullptr) const @@ -1928,6 +2041,19 @@ struct cmap encodingRecord.sanitize (c, this)); } + private: + + static bool filter_encoding_records_for_subset(const cmap* cmap, + const EncodingRecord& _) + { + return + (_.platformID == 0 && _.encodingID == 3) || + (_.platformID == 0 && _.encodingID == 4) || + (_.platformID == 3 && _.encodingID == 1) || + (_.platformID == 3 && _.encodingID == 10) || + (cmap + _.subtable).u.format == 14; + } + protected: HBUINT16 version; /* Table version number (0). */ SortedArray16Of<EncodingRecord> diff --git a/thirdparty/harfbuzz/src/hb-ot-color-cbdt-table.hh b/thirdparty/harfbuzz/src/hb-ot-color-cbdt-table.hh index 23fa56c4f6..3246894d39 100644 --- a/thirdparty/harfbuzz/src/hb-ot-color-cbdt-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-color-cbdt-table.hh @@ -67,7 +67,7 @@ _copy_data_to_cbdt (hb_vector_t<char> *cbdt_prime, { unsigned int new_len = cbdt_prime->length + length; if (unlikely (!cbdt_prime->alloc (new_len))) return false; - memcpy (cbdt_prime->arrayZ + cbdt_prime->length, data, length); + hb_memcpy (cbdt_prime->arrayZ + cbdt_prime->length, data, length); cbdt_prime->length = new_len; return true; } @@ -468,13 +468,13 @@ struct IndexSubtableRecord if (unlikely (!c->serializer->check_success (records->resize (records->length + 1)))) return_trace (false); - (*records)[records->length - 1].firstGlyphIndex = 1; - (*records)[records->length - 1].lastGlyphIndex = 0; + records->tail ().firstGlyphIndex = 1; + records->tail ().lastGlyphIndex = 0; bitmap_size_context->size += IndexSubtableRecord::min_size; c->serializer->push (); - if (unlikely (!add_new_subtable (c, bitmap_size_context, &((*records)[records->length - 1]), lookup, base, start))) + if (unlikely (!add_new_subtable (c, bitmap_size_context, &(records->tail ()), lookup, base, start))) { c->serializer->pop_discard (); c->serializer->revert (snap); diff --git a/thirdparty/harfbuzz/src/hb-ot-color-colr-table.hh b/thirdparty/harfbuzz/src/hb-ot-color-colr-table.hh index 908bf550f0..1af9d30937 100644 --- a/thirdparty/harfbuzz/src/hb-ot-color-colr-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-color-colr-table.hh @@ -39,11 +39,7 @@ #define HB_OT_TAG_COLR HB_TAG('C','O','L','R') #ifndef HB_COLRV1_MAX_NESTING_LEVEL -#define HB_COLRV1_MAX_NESTING_LEVEL 100 -#endif - -#ifndef COLRV1_ENABLE_SUBSETTING -#define COLRV1_ENABLE_SUBSETTING 1 +#define HB_COLRV1_MAX_NESTING_LEVEL 16 #endif namespace OT { @@ -188,6 +184,7 @@ struct Variable protected: T value; + public: VarIdx varIdxBase; public: DEFINE_SIZE_STATIC (4 + T::static_size); @@ -196,6 +193,8 @@ struct Variable template <typename T> struct NoVariable { + static constexpr uint32_t varIdxBase = VarIdx::NO_VARIATION; + NoVariable<T>* copy (hb_serialize_context_t *c) const { TRACE_SERIALIZE (this); @@ -888,6 +887,11 @@ struct PaintComposite DEFINE_SIZE_STATIC (8); }; +struct ClipBoxData +{ + int xMin, yMin, xMax, yMax; +}; + struct ClipBoxFormat1 { bool sanitize (hb_sanitize_context_t *c) const @@ -896,6 +900,14 @@ struct ClipBoxFormat1 return_trace (c->check_struct (this)); } + void get_clip_box (ClipBoxData &clip_box, const VarStoreInstancer &instancer HB_UNUSED) const + { + clip_box.xMin = xMin; + clip_box.yMin = yMin; + clip_box.xMax = xMax; + clip_box.yMax = yMax; + } + public: HBUINT8 format; /* format = 1(noVar) or 2(Var)*/ FWORD xMin; @@ -906,7 +918,20 @@ struct ClipBoxFormat1 DEFINE_SIZE_STATIC (1 + 4 * FWORD::static_size); }; -struct ClipBoxFormat2 : Variable<ClipBoxFormat1> {}; +struct ClipBoxFormat2 : Variable<ClipBoxFormat1> +{ + void get_clip_box (ClipBoxData &clip_box, const VarStoreInstancer &instancer) const + { + value.get_clip_box(clip_box, instancer); + if (instancer) + { + clip_box.xMin += _hb_roundf (instancer (varIdxBase, 0)); + clip_box.yMin += _hb_roundf (instancer (varIdxBase, 1)); + clip_box.xMax += _hb_roundf (instancer (varIdxBase, 2)); + clip_box.yMax += _hb_roundf (instancer (varIdxBase, 3)); + } + } +}; struct ClipBox { @@ -932,6 +957,28 @@ struct ClipBox } } + bool get_extents (hb_glyph_extents_t *extents, + const VarStoreInstancer &instancer) const + { + ClipBoxData clip_box; + switch (u.format) { + case 1: + u.format1.get_clip_box (clip_box, instancer); + break; + case 2: + u.format2.get_clip_box (clip_box, instancer); + break; + default: + return false; + } + + extents->x_bearing = clip_box.xMin; + extents->y_bearing = clip_box.yMax; + extents->width = clip_box.xMax - clip_box.xMin; + extents->height = clip_box.yMin - clip_box.yMax; + return true; + } + protected: union { HBUINT8 format; /* Format identifier */ @@ -942,6 +989,9 @@ struct ClipBox struct ClipRecord { + int cmp (hb_codepoint_t g) const + { return g < startGlyphID ? -1 : g <= endGlyphID ? 0 : +1; } + ClipRecord* copy (hb_serialize_context_t *c, const void *base) const { TRACE_SERIALIZE (this); @@ -957,6 +1007,13 @@ struct ClipRecord return_trace (c->check_struct (this) && clipBox.sanitize (c, base)); } + bool get_extents (hb_glyph_extents_t *extents, + const void *base, + const VarStoreInstancer &instancer) const + { + return (base+clipBox).get_extents (extents, instancer); + } + public: HBUINT16 startGlyphID; // first gid clip applies to HBUINT16 endGlyphID; // last gid clip applies to, inclusive @@ -964,6 +1021,7 @@ struct ClipRecord public: DEFINE_SIZE_STATIC (7); }; +DECLARE_NULL_NAMESPACE_BYTES (OT, ClipRecord); struct ClipList { @@ -1052,11 +1110,26 @@ struct ClipList bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); + // TODO Make a formatted struct! return_trace (c->check_struct (this) && clips.sanitize (c, this)); } + bool + get_extents (hb_codepoint_t gid, + hb_glyph_extents_t *extents, + const VarStoreInstancer &instancer) const + { + auto *rec = clips.as_array ().bsearch (gid); + if (rec) + { + rec->get_extents (extents, this, instancer); + return true; + } + return false; + } + HBUINT8 format; // Set to 1. - Array32Of<ClipRecord> clips; // Clip records, sorted by startGlyphID + SortedArray32Of<ClipRecord> clips; // Clip records, sorted by startGlyphID public: DEFINE_SIZE_ARRAY_SIZED (5, clips); }; @@ -1359,7 +1432,7 @@ struct COLR (this+baseGlyphsZ).sanitize (c, numBaseGlyphs) && (this+layersZ).sanitize (c, numLayers) && (version == 0 || - (COLRV1_ENABLE_SUBSETTING && version == 1 && + (version == 1 && baseGlyphList.sanitize (c, this) && layerList.sanitize (c, this) && clipList.sanitize (c, this) && @@ -1516,6 +1589,30 @@ struct COLR return_trace (true); } + bool + get_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents) const + { + if (version != 1) + return false; + + VarStoreInstancer instancer (this+varStore, + this+varIdxMap, + hb_array (font->coords, font->num_coords)); + + if ((this+clipList).get_extents (glyph, + extents, + instancer)) + { + extents->x_bearing = font->em_scale_x (extents->x_bearing); + extents->y_bearing = font->em_scale_x (extents->y_bearing); + extents->width = font->em_scale_x (extents->width); + extents->height = font->em_scale_x (extents->height); + return true; + } + + return false; + } + protected: HBUINT16 version; /* Table version number (starts at 0). */ HBUINT16 numBaseGlyphs; /* Number of Base Glyph Records. */ diff --git a/thirdparty/harfbuzz/src/hb-ot-face-table-list.hh b/thirdparty/harfbuzz/src/hb-ot-face-table-list.hh index c05034b3bb..c9da36c1bb 100644 --- a/thirdparty/harfbuzz/src/hb-ot-face-table-list.hh +++ b/thirdparty/harfbuzz/src/hb-ot-face-table-list.hh @@ -56,9 +56,9 @@ HB_OT_CORE_TABLE (OT, maxp) #if !defined(HB_NO_FACE_COLLECT_UNICODES) || !defined(HB_NO_OT_FONT) HB_OT_ACCELERATOR (OT, cmap) #endif -HB_OT_TABLE (OT, hhea) +HB_OT_CORE_TABLE (OT, hhea) HB_OT_ACCELERATOR (OT, hmtx) -HB_OT_TABLE (OT, OS2) +HB_OT_CORE_TABLE (OT, OS2) #if !defined(HB_NO_OT_FONT_GLYPH_NAMES) || !defined(HB_NO_METRICS) || !defined(HB_NO_STYLE) HB_OT_ACCELERATOR (OT, post) #endif @@ -66,7 +66,7 @@ HB_OT_ACCELERATOR (OT, post) HB_OT_ACCELERATOR (OT, name) #endif #ifndef HB_NO_STYLE -HB_OT_TABLE (OT, STAT) +HB_OT_CORE_TABLE (OT, STAT) #endif #ifndef HB_NO_META HB_OT_ACCELERATOR (OT, meta) @@ -74,9 +74,9 @@ HB_OT_ACCELERATOR (OT, meta) /* Vertical layout. */ #ifndef HB_NO_VERTICAL -HB_OT_TABLE (OT, vhea) +HB_OT_CORE_TABLE (OT, vhea) HB_OT_ACCELERATOR (OT, vmtx) -HB_OT_TABLE (OT, VORG) +HB_OT_CORE_TABLE (OT, VORG) #endif /* TrueType outlines. */ @@ -91,15 +91,15 @@ HB_OT_ACCELERATOR (OT, cff2) /* OpenType variations. */ #ifndef HB_NO_VAR -HB_OT_TABLE (OT, fvar) -HB_OT_TABLE (OT, avar) +HB_OT_CORE_TABLE (OT, fvar) +HB_OT_CORE_TABLE (OT, avar) HB_OT_ACCELERATOR (OT, gvar) -HB_OT_TABLE (OT, MVAR) +HB_OT_CORE_TABLE (OT, MVAR) #endif /* Legacy kern. */ #ifndef HB_NO_OT_KERN -HB_OT_TABLE (OT, kern) +HB_OT_CORE_TABLE (OT, kern) #endif /* OpenType shaping. */ @@ -107,12 +107,12 @@ HB_OT_TABLE (OT, kern) HB_OT_ACCELERATOR (OT, GDEF) HB_OT_ACCELERATOR (OT, GSUB) HB_OT_ACCELERATOR (OT, GPOS) -//HB_OT_TABLE (OT, JSTF) +//HB_OT_CORE_TABLE (OT, JSTF) #endif /* OpenType baseline. */ #ifndef HB_NO_BASE -HB_OT_TABLE (OT, BASE) +HB_OT_CORE_TABLE (OT, BASE) #endif /* AAT shaping. */ @@ -129,8 +129,8 @@ HB_OT_TABLE (AAT, feat) /* OpenType color fonts. */ #ifndef HB_NO_COLOR -HB_OT_TABLE (OT, COLR) -HB_OT_TABLE (OT, CPAL) +HB_OT_CORE_TABLE (OT, COLR) +HB_OT_CORE_TABLE (OT, CPAL) HB_OT_ACCELERATOR (OT, CBDT) HB_OT_ACCELERATOR (OT, sbix) HB_OT_ACCELERATOR (OT, SVG) @@ -138,7 +138,7 @@ HB_OT_ACCELERATOR (OT, SVG) /* OpenType math. */ #ifndef HB_NO_MATH -HB_OT_TABLE (OT, MATH) +HB_OT_CORE_TABLE (OT, MATH) #endif diff --git a/thirdparty/harfbuzz/src/hb-ot-font.cc b/thirdparty/harfbuzz/src/hb-ot-font.cc index 825b30853c..8405103423 100644 --- a/thirdparty/harfbuzz/src/hb-ot-font.cc +++ b/thirdparty/harfbuzz/src/hb-ot-font.cc @@ -45,6 +45,7 @@ #include "hb-ot-vorg-table.hh" #include "hb-ot-color-cbdt-table.hh" #include "hb-ot-color-sbix-table.hh" +#include "hb-ot-color-colr-table.hh" /** @@ -350,13 +351,15 @@ hb_ot_get_glyph_extents (hb_font_t *font, if (ot_face->sbix->get_extents (font, glyph, extents)) return true; if (ot_face->CBDT->get_extents (font, glyph, extents)) return true; #endif +#if !defined(HB_NO_COLOR) + if (ot_face->COLR->get_extents (font, glyph, extents)) return true; +#endif if (ot_face->glyf->get_extents (font, glyph, extents)) return true; #ifndef HB_NO_OT_FONT_CFF if (ot_face->cff1->get_extents (font, glyph, extents)) return true; if (ot_face->cff2->get_extents (font, glyph, extents)) return true; #endif - // TODO Hook up side-bearings variations. return false; } diff --git a/thirdparty/harfbuzz/src/hb-ot-layout-common.hh b/thirdparty/harfbuzz/src/hb-ot-layout-common.hh index 579abf011a..0f424f5aa6 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout-common.hh +++ b/thirdparty/harfbuzz/src/hb-ot-layout-common.hh @@ -478,7 +478,7 @@ struct IndexArray : Array16Of<Index> { if (_count) { - + this->sub_array (start_offset, _count) + + this->as_array ().sub_array (start_offset, _count) | hb_sink (hb_array (_indexes, *_count)) ; } @@ -658,7 +658,7 @@ struct FeatureParamsCharacterVariants { if (char_count) { - + characters.sub_array (start_offset, char_count) + + characters.as_array ().sub_array (start_offset, char_count) | hb_sink (hb_array (chars, *char_count)) ; } @@ -932,7 +932,7 @@ struct RecordArrayOf : SortedArray16Of<Record<Type>> { if (record_count) { - + this->sub_array (start_offset, record_count) + + this->as_array ().sub_array (start_offset, record_count) | hb_map (&Record<Type>::tag) | hb_sink (hb_array (record_tags, *record_count)) ; @@ -980,18 +980,16 @@ struct RecordListOfFeature : RecordListOf<Feature> auto *out = c->serializer->start_embed (*this); if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false); - unsigned count = this->len; - - + hb_zip (*this, hb_range (count)) - | hb_filter (l->feature_index_map, hb_second) - | hb_apply ([l, out, this] (const hb_pair_t<const Record<Feature>&, unsigned>& _) + + hb_enumerate (*this) + | hb_filter (l->feature_index_map, hb_first) + | hb_apply ([l, out, this] (const hb_pair_t<unsigned, const Record<Feature>&>& _) { const Feature *f_sub = nullptr; const Feature **f = nullptr; - if (l->feature_substitutes_map->has (_.second, &f)) + if (l->feature_substitutes_map->has (_.first, &f)) f_sub = *f; - subset_record_array (l, out, this, f_sub) (_.first); + subset_record_array (l, out, this, f_sub) (_.second); }) ; @@ -1079,7 +1077,7 @@ struct LangSys auto *out = c->serializer->start_embed (*this); if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false); - const unsigned *v; + const uint32_t *v; out->reqFeatureIndex = l->feature_index_map->has (reqFeatureIndex, &v) ? *v : 0xFFFFu; if (!l->visitFeatureIndex (featureIndex.len)) @@ -1147,7 +1145,6 @@ struct Script return; } - unsigned langsys_count = get_lang_sys_count (); if (has_default_lang_sys ()) { //only collect features from non-redundant langsys @@ -1156,24 +1153,24 @@ struct Script d.collect_features (c); } - for (auto _ : + hb_zip (langSys, hb_range (langsys_count))) + for (auto _ : + hb_enumerate (langSys)) { - const LangSys& l = this+_.first.offset; + const LangSys& l = this+_.second.offset; if (!c->visitLangsys (l.get_feature_count ())) continue; if (l.compare (d, c->duplicate_feature_map)) continue; l.collect_features (c); - c->script_langsys_map->get (script_index)->add (_.second); + c->script_langsys_map->get (script_index)->add (_.first); } } else { - for (auto _ : + hb_zip (langSys, hb_range (langsys_count))) + for (auto _ : + hb_enumerate (langSys)) { - const LangSys& l = this+_.first.offset; + const LangSys& l = this+_.second.offset; if (!c->visitLangsys (l.get_feature_count ())) continue; l.collect_features (c); - c->script_langsys_map->get (script_index)->add (_.second); + c->script_langsys_map->get (script_index)->add (_.first); } } } @@ -1211,10 +1208,9 @@ struct Script const hb_set_t *active_langsys = l->script_langsys_map->get (l->cur_script_index); if (active_langsys) { - unsigned count = langSys.len; - + hb_zip (langSys, hb_range (count)) - | hb_filter (active_langsys, hb_second) - | hb_map (hb_first) + + hb_enumerate (langSys) + | hb_filter (active_langsys, hb_first) + | hb_map (hb_second) | hb_filter ([=] (const Record<LangSys>& record) {return l->visitLangSys (); }) | hb_apply (subset_record_array (l, &(out->langSys), this)) ; @@ -1250,12 +1246,11 @@ struct RecordListOfScript : RecordListOf<Script> auto *out = c->serializer->start_embed (*this); if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false); - unsigned count = this->len; - for (auto _ : + hb_zip (*this, hb_range (count))) + for (auto _ : + hb_enumerate (*this)) { auto snap = c->serializer->snapshot (); - l->cur_script_index = _.second; - bool ret = _.first.subset (l, this); + l->cur_script_index = _.first; + bool ret = _.second.subset (l, this); if (!ret) c->serializer->revert (snap); else out->len++; } @@ -1388,7 +1383,13 @@ struct Lookup outMarkFilteringSet = markFilteringSet; } - return_trace (out->subTable.len); + // Always keep the lookup even if it's empty. The rest of layout subsetting depends on lookup + // indices being consistent with those computed during planning. So if an empty lookup is + // discarded during the subset phase it will invalidate all subsequent lookup indices. + // Generally we shouldn't end up with an empty lookup as we pre-prune them during the planning + // phase, but it can happen in rare cases such as when during closure subtable is considered + // degenerate (see: https://github.com/harfbuzz/harfbuzz/issues/3853) + return true; } template <typename TSubTable> @@ -1454,10 +1455,9 @@ struct LookupOffsetList : List16OfOffsetTo<TLookup, OffsetType> auto *out = c->serializer->start_embed (this); if (unlikely (!out || !c->serializer->extend_min (out))) return_trace (false); - unsigned count = this->len; - + hb_zip (*this, hb_range (count)) - | hb_filter (l->lookup_index_map, hb_second) - | hb_map (hb_first) + + hb_enumerate (*this) + | hb_filter (l->lookup_index_map, hb_first) + | hb_map (hb_second) | hb_apply (subset_offset_array (c, *out, this)) ; return_trace (true); @@ -1491,7 +1491,7 @@ static bool ClassDef_remap_and_serialize (hb_serialize_context_t *c, klass_map->set (0, 0); unsigned idx = klass_map->has (0) ? 1 : 0; - for (const unsigned k: klasses.iter ()) + for (const unsigned k: klasses) { if (klass_map->has (k)) continue; klass_map->set (k, idx); @@ -1524,6 +1524,11 @@ struct ClassDefFormat1_3 return classValue[(unsigned int) (glyph_id - startGlyph)]; } + unsigned get_population () const + { + return classValue.len; + } + template<typename Iterator, hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))> bool serialize (hb_serialize_context_t *c, @@ -1548,7 +1553,7 @@ struct ClassDefFormat1_3 startGlyph = glyph_min; if (unlikely (!classValue.serialize (c, glyph_count))) return_trace (false); - for (const hb_pair_t<hb_codepoint_t, unsigned> gid_klass_pair : + it) + for (const hb_pair_t<hb_codepoint_t, uint32_t> gid_klass_pair : + it) { unsigned idx = gid_klass_pair.first - glyph_min; classValue[idx] = gid_klass_pair.second; @@ -1639,11 +1644,10 @@ struct ClassDefFormat1_3 bool intersects (const hb_set_t *glyphs) const { - /* TODO Speed up, using hb_set_next()? */ hb_codepoint_t start = startGlyph; hb_codepoint_t end = startGlyph + classValue.len; for (hb_codepoint_t iter = startGlyph - 1; - hb_set_next (glyphs, &iter) && iter < end;) + glyphs->next (&iter) && iter < end;) if (classValue[iter - start]) return true; return false; } @@ -1654,10 +1658,10 @@ struct ClassDefFormat1_3 { /* Match if there's any glyph that is not listed! */ hb_codepoint_t g = HB_SET_VALUE_INVALID; - if (!hb_set_next (glyphs, &g)) return false; + if (!glyphs->next (&g)) return false; if (g < startGlyph) return true; g = startGlyph + count - 1; - if (hb_set_next (glyphs, &g)) return true; + if (glyphs->next (&g)) return true; /* Fall through. */ } /* TODO Speed up, using set overlap first? */ @@ -1675,12 +1679,12 @@ struct ClassDefFormat1_3 if (klass == 0) { unsigned start_glyph = startGlyph; - for (unsigned g = HB_SET_VALUE_INVALID; - hb_set_next (glyphs, &g) && g < start_glyph;) + for (uint32_t g = HB_SET_VALUE_INVALID; + glyphs->next (&g) && g < start_glyph;) intersect_glyphs->add (g); - for (unsigned g = startGlyph + count - 1; - hb_set_next (glyphs, &g);) + for (uint32_t g = startGlyph + count - 1; + glyphs-> next (&g);) intersect_glyphs->add (g); return; @@ -1696,7 +1700,7 @@ struct ClassDefFormat1_3 unsigned start_glyph = startGlyph; unsigned end_glyph = start_glyph + count; for (unsigned g = startGlyph - 1; - hb_set_next (glyphs, &g) && g < end_glyph;) + glyphs->next (&g) && g < end_glyph;) if (classValue.arrayZ[g - start_glyph] == klass) intersect_glyphs->add (g); #endif @@ -1739,6 +1743,14 @@ struct ClassDefFormat2_4 return rangeRecord.bsearch (glyph_id).value; } + unsigned get_population () const + { + typename Types::large_int ret = 0; + for (const auto &r : rangeRecord) + ret += r.get_population (); + return ret > UINT_MAX ? UINT_MAX : (unsigned) ret; + } + template<typename Iterator, hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))> bool serialize (hb_serialize_context_t *c, @@ -1802,28 +1814,45 @@ struct ClassDefFormat2_4 { TRACE_SUBSET (this); const hb_map_t &glyph_map = *c->plan->glyph_map_gsub; + const hb_set_t &glyph_set = *c->plan->glyphset_gsub (); hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> glyph_and_klass; hb_set_t orig_klasses; - unsigned num_source_glyphs = c->plan->source->get_num_glyphs (); - unsigned count = rangeRecord.len; - for (unsigned i = 0; i < count; i++) + if (glyph_set.get_population () * hb_bit_storage ((unsigned) rangeRecord.len) / 2 + < get_population ()) { - unsigned klass = rangeRecord[i].value; - if (!klass) continue; - hb_codepoint_t start = rangeRecord[i].first; - hb_codepoint_t end = hb_min (rangeRecord[i].last + 1, num_source_glyphs); - for (hb_codepoint_t g = start; g < end; g++) + for (hb_codepoint_t g : glyph_set) { - hb_codepoint_t new_gid = glyph_map[g]; + unsigned klass = get_class (g); + if (!klass) continue; + hb_codepoint_t new_gid = glyph_map[g]; if (new_gid == HB_MAP_VALUE_INVALID) continue; - if (glyph_filter && !glyph_filter->has (g)) continue; - + if (glyph_filter && !glyph_filter->has (g)) continue; glyph_and_klass.push (hb_pair (new_gid, klass)); orig_klasses.add (klass); } } + else + { + unsigned num_source_glyphs = c->plan->source->get_num_glyphs (); + for (auto &range : rangeRecord) + { + unsigned klass = range.value; + if (!klass) continue; + hb_codepoint_t start = range.first; + hb_codepoint_t end = hb_min (range.last + 1, num_source_glyphs); + for (hb_codepoint_t g = start; g < end; g++) + { + hb_codepoint_t new_gid = glyph_map[g]; + if (new_gid == HB_MAP_VALUE_INVALID) continue; + if (glyph_filter && !glyph_filter->has (g)) continue; + + glyph_and_klass.push (hb_pair (new_gid, klass)); + orig_klasses.add (klass); + } + } + } const hb_set_t& glyphset = *c->plan->glyphset_gsub (); unsigned glyph_count = glyph_filter @@ -1850,10 +1879,9 @@ struct ClassDefFormat2_4 template <typename set_t> bool collect_coverage (set_t *glyphs) const { - unsigned int count = rangeRecord.len; - for (unsigned int i = 0; i < count; i++) - if (rangeRecord[i].value) - if (unlikely (!rangeRecord[i].collect_coverage (glyphs))) + for (auto &range : rangeRecord) + if (range.value) + if (unlikely (!range.collect_coverage (glyphs))) return false; return true; } @@ -1861,11 +1889,10 @@ struct ClassDefFormat2_4 template <typename set_t> bool collect_class (set_t *glyphs, unsigned int klass) const { - unsigned int count = rangeRecord.len; - for (unsigned int i = 0; i < count; i++) + for (auto &range : rangeRecord) { - if (rangeRecord[i].value == klass) - if (unlikely (!rangeRecord[i].collect_coverage (glyphs))) + if (range.value == klass) + if (unlikely (!range.collect_coverage (glyphs))) return false; } return true; @@ -1873,32 +1900,32 @@ struct ClassDefFormat2_4 bool intersects (const hb_set_t *glyphs) const { - /* TODO Speed up, using hb_set_next() and bsearch()? */ - unsigned int count = rangeRecord.len; - for (unsigned int i = 0; i < count; i++) + if (rangeRecord.len > glyphs->get_population () * hb_bit_storage ((unsigned) rangeRecord.len) / 2) { - const auto& range = rangeRecord[i]; - if (range.intersects (*glyphs) && range.value) - return true; + for (hb_codepoint_t g = HB_SET_VALUE_INVALID; glyphs->next (&g);) + if (get_class (g)) + return true; + return false; } - return false; + + return hb_any (+ hb_iter (rangeRecord) + | hb_map ([glyphs] (const RangeRecord<Types> &range) { return range.intersects (*glyphs) && range.value; })); } bool intersects_class (const hb_set_t *glyphs, uint16_t klass) const { - unsigned int count = rangeRecord.len; if (klass == 0) { /* Match if there's any glyph that is not listed! */ hb_codepoint_t g = HB_SET_VALUE_INVALID; - for (unsigned int i = 0; i < count; i++) + for (auto &range : rangeRecord) { - if (!hb_set_next (glyphs, &g)) + if (!glyphs->next (&g)) break; - if (g < rangeRecord[i].first) + if (g < range.first) return true; - g = rangeRecord[i].last; + g = range.last; } - if (g != HB_SET_VALUE_INVALID && hb_set_next (glyphs, &g)) + if (g != HB_SET_VALUE_INVALID && glyphs->next (&g)) return true; /* Fall through. */ } @@ -1910,49 +1937,49 @@ struct ClassDefFormat2_4 void intersected_class_glyphs (const hb_set_t *glyphs, unsigned klass, hb_set_t *intersect_glyphs) const { - unsigned count = rangeRecord.len; if (klass == 0) { hb_codepoint_t g = HB_SET_VALUE_INVALID; - for (unsigned int i = 0; i < count; i++) + for (auto &range : rangeRecord) { - if (!hb_set_next (glyphs, &g)) + if (!glyphs->next (&g)) goto done; - while (g < rangeRecord[i].first) + while (g < range.first) { intersect_glyphs->add (g); - if (!hb_set_next (glyphs, &g)) + if (!glyphs->next (&g)) goto done; } - g = rangeRecord[i].last; + g = range.last; } - while (hb_set_next (glyphs, &g)) + while (glyphs->next (&g)) intersect_glyphs->add (g); done: return; } -#if 0 - /* The following implementation is faster asymptotically, but slower - * in practice. */ - if ((count >> 3) > glyphs->get_population ()) + unsigned count = rangeRecord.len; + if (count > glyphs->get_population () * hb_bit_storage (count) * 8) { for (hb_codepoint_t g = HB_SET_VALUE_INVALID; - hb_set_next (glyphs, &g);) - if (rangeRecord.as_array ().bfind (g)) + glyphs->next (&g);) + { + unsigned i; + if (rangeRecord.as_array ().bfind (g, &i) && + rangeRecord.arrayZ[i].value == klass) intersect_glyphs->add (g); + } return; } -#endif - for (unsigned int i = 0; i < count; i++) + for (auto &range : rangeRecord) { - if (rangeRecord[i].value != klass) continue; + if (range.value != klass) continue; - unsigned end = rangeRecord[i].last + 1; - for (hb_codepoint_t g = rangeRecord[i].first - 1; - hb_set_next (glyphs, &g) && g < end;) + unsigned end = range.last + 1; + for (hb_codepoint_t g = range.first - 1; + glyphs->next (&g) && g < end;) intersect_glyphs->add (g); } } @@ -1961,25 +1988,24 @@ struct ClassDefFormat2_4 { if (glyphs->is_empty ()) return; - unsigned count = rangeRecord.len; hb_codepoint_t g = HB_SET_VALUE_INVALID; - for (unsigned int i = 0; i < count; i++) + for (auto &range : rangeRecord) { - if (!hb_set_next (glyphs, &g)) + if (!glyphs->next (&g)) break; - if (g < rangeRecord[i].first) + if (g < range.first) { intersect_classes->add (0); break; } - g = rangeRecord[i].last; + g = range.last; } - if (g != HB_SET_VALUE_INVALID && hb_set_next (glyphs, &g)) + if (g != HB_SET_VALUE_INVALID && glyphs->next (&g)) intersect_classes->add (0); - for (const auto& record : rangeRecord.iter ()) - if (record.intersects (*glyphs)) - intersect_classes->add (record.value); + for (const auto& range : rangeRecord) + if (range.intersects (*glyphs)) + intersect_classes->add (range.value); } protected: @@ -1994,10 +2020,8 @@ struct ClassDefFormat2_4 struct ClassDef { /* Has interface. */ - static constexpr unsigned SENTINEL = 0; - typedef unsigned int value_t; - value_t operator [] (hb_codepoint_t k) const { return get (k); } - bool has (hb_codepoint_t k) const { return (*this)[k] != SENTINEL; } + unsigned operator [] (hb_codepoint_t k) const { return get (k); } + bool has (hb_codepoint_t k) const { return (*this)[k]; } /* Projection. */ hb_codepoint_t operator () (hb_codepoint_t k) const { return get (k); } @@ -2015,6 +2039,19 @@ struct ClassDef } } + unsigned get_population () const + { + switch (u.format) { + case 1: return u.format1.get_population (); + case 2: return u.format2.get_population (); +#ifndef HB_NO_BEYOND_64K + case 3: return u.format3.get_population (); + case 4: return u.format4.get_population (); +#endif + default:return NOT_COVERED; + } + } + template<typename Iterator, hb_requires (hb_is_sorted_source_of (Iterator, hb_codepoint_t))> bool serialize (hb_serialize_context_t *c, Iterator it_with_class_zero) @@ -2332,7 +2369,7 @@ struct VarRegionList { unsigned int backward = region_map.backward (r); if (backward >= region_count) return_trace (false); - memcpy (&axesZ[axisCount * r], &src->axesZ[axisCount * backward], VarRegionAxis::static_size * axisCount); + hb_memcpy (&axesZ[axisCount * r], &src->axesZ[axisCount * backward], VarRegionAxis::static_size * axisCount); } return_trace (true); @@ -2442,21 +2479,26 @@ struct VarData unsigned ri_count = src->regionIndices.len; enum delta_size_t { kZero=0, kNonWord, kWord }; hb_vector_t<delta_size_t> delta_sz; - hb_vector_t<unsigned int> ri_map; /* maps old index to new index */ + hb_vector_t<unsigned int> ri_map; /* maps new index to old index */ delta_sz.resize (ri_count); ri_map.resize (ri_count); unsigned int new_word_count = 0; unsigned int r; + const HBUINT8 *src_delta_bytes = src->get_delta_bytes (); + unsigned src_row_size = src->get_row_size (); + unsigned src_word_count = src->wordCount (); + bool src_long_words = src->longWords (); + bool has_long = false; - if (src->longWords ()) + if (src_long_words) { - for (r = 0; r < ri_count; r++) + for (r = 0; r < src_word_count; r++) { for (unsigned int i = 0; i < inner_map.get_next_value (); i++) { unsigned int old = inner_map.backward (i); - int32_t delta = src->get_item_delta (old, r); + int32_t delta = src->get_item_delta_fast (old, r, src_delta_bytes, src_row_size); if (delta < -65536 || 65535 < delta) { has_long = true; @@ -2470,11 +2512,13 @@ struct VarData signed max_threshold = has_long ? +65535 : +127; for (r = 0; r < ri_count; r++) { + bool short_circuit = src_long_words == has_long && src_word_count <= r; + delta_sz[r] = kZero; for (unsigned int i = 0; i < inner_map.get_next_value (); i++) { unsigned int old = inner_map.backward (i); - int32_t delta = src->get_item_delta (old, r); + int32_t delta = src->get_item_delta_fast (old, r, src_delta_bytes, src_row_size); if (delta < min_threshold || max_threshold < delta) { delta_sz[r] = kWord; @@ -2482,7 +2526,11 @@ struct VarData break; } else if (delta != 0) + { delta_sz[r] = kNonWord; + if (short_circuit) + break; + } } } @@ -2492,7 +2540,8 @@ struct VarData for (r = 0; r < ri_count; r++) if (delta_sz[r]) { - ri_map[r] = (delta_sz[r] == kWord)? word_index++ : non_word_index++; + unsigned new_r = (delta_sz[r] == kWord)? word_index++ : non_word_index++; + ri_map[new_r] = r; new_ri_count++; } @@ -2502,14 +2551,20 @@ struct VarData if (unlikely (!c->extend (this))) return_trace (false); - for (r = 0; r < ri_count; r++) - if (delta_sz[r]) regionIndices[ri_map[r]] = region_map[src->regionIndices[r]]; + for (r = 0; r < new_ri_count; r++) + regionIndices[r] = region_map[src->regionIndices[ri_map[r]]]; - for (unsigned int i = 0; i < itemCount; i++) + HBUINT8 *delta_bytes = get_delta_bytes (); + unsigned row_size = get_row_size (); + unsigned count = itemCount; + for (unsigned int i = 0; i < count; i++) { - unsigned int old = inner_map.backward (i); - for (unsigned int r = 0; r < ri_count; r++) - if (delta_sz[r]) set_item_delta (i, ri_map[r], src->get_item_delta (old, r)); + unsigned int old = inner_map.backward (i); + for (unsigned int r = 0; r < new_ri_count; r++) + set_item_delta_fast (i, r, + src->get_item_delta_fast (old, ri_map[r], + src_delta_bytes, src_row_size), + delta_bytes, row_size); } return_trace (true); @@ -2517,12 +2572,15 @@ struct VarData void collect_region_refs (hb_set_t ®ion_indices, const hb_inc_bimap_t &inner_map) const { + const HBUINT8 *delta_bytes = get_delta_bytes (); + unsigned row_size = get_row_size (); + for (unsigned int r = 0; r < regionIndices.len; r++) { - unsigned int region = regionIndices[r]; + unsigned int region = regionIndices.arrayZ[r]; if (region_indices.has (region)) continue; for (unsigned int i = 0; i < inner_map.get_next_value (); i++) - if (get_item_delta (inner_map.backward (i), r) != 0) + if (get_item_delta_fast (inner_map.backward (i), r, delta_bytes, row_size) != 0) { region_indices.add (region); break; @@ -2537,10 +2595,12 @@ struct VarData HBUINT8 *get_delta_bytes () { return &StructAfter<HBUINT8> (regionIndices); } - int32_t get_item_delta (unsigned int item, unsigned int region) const + int32_t get_item_delta_fast (unsigned int item, unsigned int region, + const HBUINT8 *delta_bytes, unsigned row_size) const { - if ( item >= itemCount || unlikely (region >= regionIndices.len)) return 0; - const HBINT8 *p = (const HBINT8 *) get_delta_bytes () + item * get_row_size (); + if (unlikely (item >= itemCount || region >= regionIndices.len)) return 0; + + const HBINT8 *p = (const HBINT8 *) delta_bytes + item * row_size; unsigned word_count = wordCount (); bool is_long = longWords (); if (is_long) @@ -2558,10 +2618,17 @@ struct VarData return (p + HBINT16::static_size * word_count)[region - word_count]; } } + int32_t get_item_delta (unsigned int item, unsigned int region) const + { + return get_item_delta_fast (item, region, + get_delta_bytes (), + get_row_size ()); + } - void set_item_delta (unsigned int item, unsigned int region, int32_t delta) + void set_item_delta_fast (unsigned int item, unsigned int region, int32_t delta, + HBUINT8 *delta_bytes, unsigned row_size) { - HBINT8 *p = (HBINT8 *)get_delta_bytes () + item * get_row_size (); + HBINT8 *p = (HBINT8 *) delta_bytes + item * row_size; unsigned word_count = wordCount (); bool is_long = longWords (); if (is_long) @@ -2579,6 +2646,12 @@ struct VarData (p + HBINT16::static_size * word_count)[region - word_count] = delta; } } + void set_item_delta (unsigned int item, unsigned int region, int32_t delta) + { + set_item_delta_fast (item, region, delta, + get_delta_bytes (), + get_row_size ()); + } bool longWords () const { return wordSizeCount & 0x8000u /* LONG_WORDS */; } unsigned wordCount () const { return wordSizeCount & 0x7FFFu /* WORD_DELTA_COUNT_MASK */; } @@ -2642,6 +2715,14 @@ struct VariationStore unsigned int inner = index & 0xFFFF; return get_delta (outer, inner, coords, coord_count, cache); } + float get_delta (unsigned int index, + hb_array_t<int> coords, + VarRegionList::cache_t *cache = nullptr) const + { + return get_delta (index, + coords.arrayZ, coords.length, + cache); + } bool sanitize (hb_sanitize_context_t *c) const { @@ -2948,7 +3029,7 @@ struct ConditionSet // all conditions met if (num_kept_cond == 0) return DROP_COND_WITH_VAR; - + //check if condition_set is unique with variations if (c->conditionset_map->has (p)) //duplicate found, drop the entire record @@ -3420,17 +3501,16 @@ struct VariationDevice { TRACE_SERIALIZE (this); if (!layout_variation_idx_delta_map) return_trace (nullptr); - auto snap = c->snapshot (); + + hb_pair_t<unsigned, int> *v; + if (!layout_variation_idx_delta_map->has (varIdx, &v)) + return_trace (nullptr); + + c->start_zerocopy (this->static_size); auto *out = c->embed (this); if (unlikely (!out)) return_trace (nullptr); - /* TODO Just get() and bail if NO_VARIATION. Needs to setup the map to return that. */ - if (!layout_variation_idx_delta_map->has (varIdx)) - { - c->revert (snap); - return_trace (nullptr); - } - unsigned new_idx = hb_first (layout_variation_idx_delta_map->get (varIdx)); + unsigned new_idx = hb_first (*v); out->varIdx = new_idx; return_trace (out); } diff --git a/thirdparty/harfbuzz/src/hb-ot-layout-gdef-table.hh b/thirdparty/harfbuzz/src/hb-ot-layout-gdef-table.hh index 22925fdfa9..a84edef162 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout-gdef-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-layout-gdef-table.hh @@ -73,7 +73,7 @@ struct AttachList if (point_count) { - + points.sub_array (start_offset, point_count) + + points.as_array ().sub_array (start_offset, point_count) | hb_sink (hb_array (point_array, *point_count)) ; } @@ -322,7 +322,7 @@ struct LigGlyph { if (caret_count) { - + carets.sub_array (start_offset, caret_count) + + carets.as_array ().sub_array (start_offset, caret_count) | hb_map (hb_add (this)) | hb_map ([&] (const CaretValue &value) { return value.get_caret_value (font, direction, glyph_id, var_store); }) | hb_sink (hb_array (caret_array, *caret_count)) diff --git a/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh b/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh index d1d94255f4..04ccefd108 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh +++ b/thirdparty/harfbuzz/src/hb-ot-layout-gsubgpos.hh @@ -100,8 +100,8 @@ struct hb_closure_context_t : bool is_lookup_done (unsigned int lookup_index) { - if (done_lookups_glyph_count->in_error () || - done_lookups_glyph_set->in_error ()) + if (unlikely (done_lookups_glyph_count->in_error () || + done_lookups_glyph_set->in_error ())) return true; /* Have we visited this lookup with the current set of glyphs? */ @@ -535,7 +535,12 @@ struct hb_ot_apply_context_t : bool next (unsigned *unsafe_to = nullptr) { assert (num_items > 0); - while (idx + num_items < end) + /* The alternate condition below is faster at string boundaries, + * but produces subpar "unsafe-to-concat" values. */ + signed stop = (signed) end - (signed) num_items; + if (c->buffer->flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) + stop = (signed) end - 1; + while ((signed) idx < stop) { idx++; hb_glyph_info_t &info = c->buffer->info[idx]; @@ -568,7 +573,12 @@ struct hb_ot_apply_context_t : bool prev (unsigned *unsafe_from = nullptr) { assert (num_items > 0); - while (idx > num_items - 1) + /* The alternate condition below is faster at string boundaries, + * but produces subpar "unsafe-to-concat" values. */ + unsigned stop = num_items - 1; + if (c->buffer->flags & HB_BUFFER_FLAG_PRODUCE_UNSAFE_TO_CONCAT) + stop = 1 - 1; + while (idx > stop) { idx--; hb_glyph_info_t &info = c->buffer->out_info[idx]; @@ -672,6 +682,7 @@ struct hb_ot_apply_context_t : const GDEF &gdef; const VariationStore &var_store; VariationStore::cache_t *var_store_cache; + hb_set_digest_t digest; hb_direction_t direction; hb_mask_t lookup_mask = 1; @@ -707,6 +718,7 @@ struct hb_ot_apply_context_t : nullptr #endif ), + digest (buffer_->digest ()), direction (buffer_->props.direction), has_glyph_classes (gdef.has_glyph_classes ()) { init_iters (); } @@ -781,8 +793,10 @@ struct hb_ot_apply_context_t : void _set_glyph_class (hb_codepoint_t glyph_index, unsigned int class_guess = 0, bool ligature = false, - bool component = false) const + bool component = false) { + digest.add (glyph_index); + if (new_syllables != (unsigned) -1) buffer->cur().syllable() = new_syllables; @@ -815,24 +829,24 @@ struct hb_ot_apply_context_t : _hb_glyph_info_set_glyph_props (&buffer->cur(), props); } - void replace_glyph (hb_codepoint_t glyph_index) const + void replace_glyph (hb_codepoint_t glyph_index) { _set_glyph_class (glyph_index); (void) buffer->replace_glyph (glyph_index); } - void replace_glyph_inplace (hb_codepoint_t glyph_index) const + void replace_glyph_inplace (hb_codepoint_t glyph_index) { _set_glyph_class (glyph_index); buffer->cur().codepoint = glyph_index; } void replace_glyph_with_ligature (hb_codepoint_t glyph_index, - unsigned int class_guess) const + unsigned int class_guess) { _set_glyph_class (glyph_index, class_guess, true); (void) buffer->replace_glyph (glyph_index); } void output_glyph_for_component (hb_codepoint_t glyph_index, - unsigned int class_guess) const + unsigned int class_guess) { _set_glyph_class (glyph_index, class_guess, false, true); (void) buffer->output_glyph (glyph_index); @@ -844,7 +858,7 @@ struct hb_accelerate_subtables_context_t : hb_dispatch_context_t<hb_accelerate_subtables_context_t> { template <typename Type> - static inline bool apply_to (const void *obj, OT::hb_ot_apply_context_t *c) + static inline bool apply_to (const void *obj, hb_ot_apply_context_t *c) { const Type *typed_obj = (const Type *) obj; return typed_obj->apply (c); @@ -852,30 +866,30 @@ struct hb_accelerate_subtables_context_t : #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE template <typename T> - static inline auto apply_cached_ (const T *obj, OT::hb_ot_apply_context_t *c, hb_priority<1>) HB_RETURN (bool, obj->apply (c, true) ) + static inline auto apply_cached_ (const T *obj, hb_ot_apply_context_t *c, hb_priority<1>) HB_RETURN (bool, obj->apply (c, true) ) template <typename T> - static inline auto apply_cached_ (const T *obj, OT::hb_ot_apply_context_t *c, hb_priority<0>) HB_RETURN (bool, obj->apply (c) ) + static inline auto apply_cached_ (const T *obj, hb_ot_apply_context_t *c, hb_priority<0>) HB_RETURN (bool, obj->apply (c) ) template <typename Type> - static inline bool apply_cached_to (const void *obj, OT::hb_ot_apply_context_t *c) + static inline bool apply_cached_to (const void *obj, hb_ot_apply_context_t *c) { const Type *typed_obj = (const Type *) obj; return apply_cached_ (typed_obj, c, hb_prioritize); } template <typename T> - static inline auto cache_func_ (const T *obj, OT::hb_ot_apply_context_t *c, bool enter, hb_priority<1>) HB_RETURN (bool, obj->cache_func (c, enter) ) + static inline auto cache_func_ (const T *obj, hb_ot_apply_context_t *c, bool enter, hb_priority<1>) HB_RETURN (bool, obj->cache_func (c, enter) ) template <typename T> - static inline bool cache_func_ (const T *obj, OT::hb_ot_apply_context_t *c, bool enter, hb_priority<0>) { return false; } + static inline bool cache_func_ (const T *obj, hb_ot_apply_context_t *c, bool enter, hb_priority<0>) { return false; } template <typename Type> - static inline bool cache_func_to (const void *obj, OT::hb_ot_apply_context_t *c, bool enter) + static inline bool cache_func_to (const void *obj, hb_ot_apply_context_t *c, bool enter) { const Type *typed_obj = (const Type *) obj; return cache_func_ (typed_obj, c, enter, hb_prioritize); } #endif - typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_ot_apply_context_t *c); - typedef bool (*hb_cache_func_t) (const void *obj, OT::hb_ot_apply_context_t *c, bool enter); + typedef bool (*hb_apply_func_t) (const void *obj, hb_ot_apply_context_t *c); + typedef bool (*hb_cache_func_t) (const void *obj, hb_ot_apply_context_t *c, bool enter); struct hb_applicable_t { @@ -901,20 +915,20 @@ struct hb_accelerate_subtables_context_t : obj_.get_coverage ().collect_coverage (&digest); } - bool apply (OT::hb_ot_apply_context_t *c) const + bool apply (hb_ot_apply_context_t *c) const { return digest.may_have (c->buffer->cur().codepoint) && apply_func (obj, c); } #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE - bool apply_cached (OT::hb_ot_apply_context_t *c) const + bool apply_cached (hb_ot_apply_context_t *c) const { return digest.may_have (c->buffer->cur().codepoint) && apply_cached_func (obj, c); } - bool cache_enter (OT::hb_ot_apply_context_t *c) const + bool cache_enter (hb_ot_apply_context_t *c) const { return cache_func (obj, c, true); } - void cache_leave (OT::hb_ot_apply_context_t *c) const + void cache_leave (hb_ot_apply_context_t *c) const { cache_func (obj, c, false); } @@ -988,8 +1002,8 @@ struct hb_accelerate_subtables_context_t : }; -typedef bool (*intersects_func_t) (const hb_set_t *glyphs, unsigned value, const void *data); -typedef void (*intersected_glyphs_func_t) (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs); +typedef bool (*intersects_func_t) (const hb_set_t *glyphs, unsigned value, const void *data, void *cache); +typedef void (*intersected_glyphs_func_t) (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs, void *cache); typedef void (*collect_glyphs_func_t) (hb_set_t *glyphs, unsigned value, const void *data); typedef bool (*match_func_t) (hb_glyph_info_t &info, unsigned value, const void *data); @@ -1012,16 +1026,25 @@ struct ChainContextApplyFuncs }; -static inline bool intersects_glyph (const hb_set_t *glyphs, unsigned value, const void *data HB_UNUSED) +static inline bool intersects_glyph (const hb_set_t *glyphs, unsigned value, const void *data HB_UNUSED, void *cache HB_UNUSED) { return glyphs->has (value); } -static inline bool intersects_class (const hb_set_t *glyphs, unsigned value, const void *data) +static inline bool intersects_class (const hb_set_t *glyphs, unsigned value, const void *data, void *cache) { const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data); - return class_def.intersects_class (glyphs, value); + hb_map_t *map = (hb_map_t *) cache; + + hb_codepoint_t *cached_v; + if (map->has (value, &cached_v)) + return *cached_v; + + bool v = class_def.intersects_class (glyphs, value); + map->set (value, v); + + return v; } -static inline bool intersects_coverage (const hb_set_t *glyphs, unsigned value, const void *data) +static inline bool intersects_coverage (const hb_set_t *glyphs, unsigned value, const void *data, void *cache HB_UNUSED) { Offset16To<Coverage> coverage; coverage = value; @@ -1029,17 +1052,36 @@ static inline bool intersects_coverage (const hb_set_t *glyphs, unsigned value, } -static inline void intersected_glyph (const hb_set_t *glyphs HB_UNUSED, const void *data, unsigned value, hb_set_t *intersected_glyphs) +static inline void intersected_glyph (const hb_set_t *glyphs HB_UNUSED, const void *data, unsigned value, hb_set_t *intersected_glyphs, HB_UNUSED void *cache) { unsigned g = reinterpret_cast<const HBUINT16 *>(data)[value]; intersected_glyphs->add (g); } -static inline void intersected_class_glyphs (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs) + +using intersected_class_cache_t = hb_hashmap_t<unsigned, hb_set_t>; + +static inline void intersected_class_glyphs (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs, void *cache) { const ClassDef &class_def = *reinterpret_cast<const ClassDef *>(data); - class_def.intersected_class_glyphs (glyphs, value, intersected_glyphs); + + intersected_class_cache_t *map = (intersected_class_cache_t *) cache; + + hb_set_t *cached_v; + if (map->has (value, &cached_v)) + { + intersected_glyphs->union_ (*cached_v); + return; + } + + hb_set_t v; + class_def.intersected_class_glyphs (glyphs, value, &v); + + intersected_glyphs->union_ (v); + + map->set (value, std::move (v)); } -static inline void intersected_coverage_glyphs (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs) + +static inline void intersected_coverage_glyphs (const hb_set_t *glyphs, const void *data, unsigned value, hb_set_t *intersected_glyphs, HB_UNUSED void *cache) { Offset16To<Coverage> coverage; coverage = value; @@ -1052,10 +1094,11 @@ static inline bool array_is_subset_of (const hb_set_t *glyphs, unsigned int count, const HBUINT values[], intersects_func_t intersects_func, - const void *intersects_data) + const void *intersects_data, + void *cache) { for (const auto &_ : + hb_iter (values, count)) - if (!intersects_func (glyphs, _, intersects_data)) return false; + if (!intersects_func (glyphs, _, intersects_data, cache)) return false; return true; } @@ -1492,7 +1535,8 @@ static void context_closure_recurse_lookups (hb_closure_context_t *c, unsigned value, ContextFormat context_format, const void *data, - intersected_glyphs_func_t intersected_glyphs_func) + intersected_glyphs_func_t intersected_glyphs_func, + void *cache) { hb_set_t *covered_seq_indicies = hb_set_create (); for (unsigned int i = 0; i < lookupCount; i++) @@ -1513,7 +1557,7 @@ static void context_closure_recurse_lookups (hb_closure_context_t *c, pos_glyphs.add (value); break; case ContextFormat::ClassBasedContext: - intersected_glyphs_func (&c->parent_active_glyphs (), data, value, &pos_glyphs); + intersected_glyphs_func (&c->parent_active_glyphs (), data, value, &pos_glyphs, cache); break; case ContextFormat::CoverageBasedContext: pos_glyphs.set (c->parent_active_glyphs ()); @@ -1530,7 +1574,7 @@ static void context_closure_recurse_lookups (hb_closure_context_t *c, input_value = input[seqIndex - 1]; } - intersected_glyphs_func (c->glyphs, input_data, input_value, &pos_glyphs); + intersected_glyphs_func (c->glyphs, input_data, input_value, &pos_glyphs, cache); } } @@ -1710,6 +1754,8 @@ struct ContextClosureLookupContext ContextClosureFuncs funcs; ContextFormat context_format; const void *intersects_data; + void *intersects_cache; + void *intersected_glyphs_cache; }; struct ContextCollectGlyphsLookupContext @@ -1732,7 +1778,9 @@ static inline bool context_intersects (const hb_set_t *glyphs, { return array_is_subset_of (glyphs, inputCount ? inputCount - 1 : 0, input, - lookup_context.funcs.intersects, lookup_context.intersects_data); + lookup_context.funcs.intersects, + lookup_context.intersects_data, + lookup_context.intersects_cache); } template <typename HBUINT> @@ -1753,7 +1801,8 @@ static inline void context_closure_lookup (hb_closure_context_t *c, value, lookup_context.context_format, lookup_context.intersects_data, - lookup_context.funcs.intersected_glyphs); + lookup_context.funcs.intersected_glyphs, + lookup_context.intersected_glyphs_cache); } template <typename HBUINT> @@ -1777,7 +1826,7 @@ static inline bool context_would_apply_lookup (hb_would_apply_context_t *c, const HBUINT input[], /* Array of input values--start with second glyph */ unsigned int lookupCount HB_UNUSED, const LookupRecord lookupRecord[] HB_UNUSED, - ContextApplyLookupContext &lookup_context) + const ContextApplyLookupContext &lookup_context) { return would_match_input (c, inputCount, input, @@ -1790,7 +1839,7 @@ static inline bool context_apply_lookup (hb_ot_apply_context_t *c, const HBUINT input[], /* Array of input values--start with second glyph */ unsigned int lookupCount, const LookupRecord lookupRecord[], - ContextApplyLookupContext &lookup_context) + const ContextApplyLookupContext &lookup_context) { unsigned match_end = 0; unsigned match_positions[HB_MAX_CONTEXT_LENGTH]; @@ -1858,7 +1907,7 @@ struct Rule } bool would_apply (hb_would_apply_context_t *c, - ContextApplyLookupContext &lookup_context) const + const ContextApplyLookupContext &lookup_context) const { const auto &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>> (inputZ.as_array (inputCount ? inputCount - 1 : 0)); @@ -1869,7 +1918,7 @@ struct Rule } bool apply (hb_ot_apply_context_t *c, - ContextApplyLookupContext &lookup_context) const + const ContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); const auto &lookupRecord = StructAfter<UnsizedArrayOf<LookupRecord>> @@ -1989,7 +2038,7 @@ struct RuleSet } bool would_apply (hb_would_apply_context_t *c, - ContextApplyLookupContext &lookup_context) const + const ContextApplyLookupContext &lookup_context) const { return + hb_iter (rule) @@ -2000,7 +2049,7 @@ struct RuleSet } bool apply (hb_ot_apply_context_t *c, - ContextApplyLookupContext &lookup_context) const + const ContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); return_trace ( @@ -2108,7 +2157,7 @@ struct ContextFormat1_4 void closure_lookups (hb_closure_lookups_context_t *c) const { struct ContextClosureLookupContext lookup_context = { - {intersects_glyph, intersected_glyph}, + {intersects_glyph, nullptr}, ContextFormat::SimpleContext, nullptr }; @@ -2220,10 +2269,12 @@ struct ContextFormat2_5 const ClassDef &class_def = this+classDef; + hb_map_t cache; struct ContextClosureLookupContext lookup_context = { - {intersects_class, intersected_class_glyphs}, + {intersects_class, nullptr}, ContextFormat::ClassBasedContext, - &class_def + &class_def, + &cache }; hb_set_t retained_coverage_glyphs; @@ -2259,10 +2310,14 @@ struct ContextFormat2_5 const ClassDef &class_def = this+classDef; + hb_map_t cache; + intersected_class_cache_t intersected_cache; struct ContextClosureLookupContext lookup_context = { {intersects_class, intersected_class_glyphs}, ContextFormat::ClassBasedContext, - &class_def + &class_def, + &cache, + &intersected_cache }; + hb_enumerate (ruleSet) @@ -2286,10 +2341,12 @@ struct ContextFormat2_5 const ClassDef &class_def = this+classDef; + hb_map_t cache; struct ContextClosureLookupContext lookup_context = { - {intersects_class, intersected_class_glyphs}, + {intersects_class, nullptr}, ContextFormat::ClassBasedContext, - &class_def + &class_def, + &cache }; + hb_iter (ruleSet) @@ -2407,6 +2464,7 @@ struct ContextFormat2_5 const hb_map_t *lookup_map = c->table_tag == HB_OT_TAG_GSUB ? c->plan->gsub_lookups : c->plan->gpos_lookups; bool ret = true; int non_zero_index = -1, index = 0; + auto snapshot = c->serializer->snapshot(); for (const auto& _ : + hb_enumerate (ruleSet) | hb_filter (klass_map, hb_first)) { @@ -2418,8 +2476,10 @@ struct ContextFormat2_5 } if (coverage_glyph_classes.has (_.first) && - o->serialize_subset (c, _.second, this, lookup_map, &klass_map)) + o->serialize_subset (c, _.second, this, lookup_map, &klass_map)) { non_zero_index = index; + snapshot = c->serializer->snapshot(); + } index++; } @@ -2433,6 +2493,7 @@ struct ContextFormat2_5 out->ruleSet.pop (); index--; } + c->serializer->revert (snapshot); return_trace (bool (out->ruleSet)); } @@ -2469,7 +2530,7 @@ struct ContextFormat3 return false; struct ContextClosureLookupContext lookup_context = { - {intersects_coverage, intersected_coverage_glyphs}, + {intersects_coverage, nullptr}, ContextFormat::CoverageBasedContext, this }; @@ -2655,6 +2716,8 @@ struct ChainContextClosureLookupContext ContextClosureFuncs funcs; ContextFormat context_format; const void *intersects_data[3]; + void *intersects_cache[3]; + void *intersected_glyphs_cache; }; struct ChainContextCollectGlyphsLookupContext @@ -2681,13 +2744,19 @@ static inline bool chain_context_intersects (const hb_set_t *glyphs, { return array_is_subset_of (glyphs, backtrackCount, backtrack, - lookup_context.funcs.intersects, lookup_context.intersects_data[0]) + lookup_context.funcs.intersects, + lookup_context.intersects_data[0], + lookup_context.intersects_cache[0]) && array_is_subset_of (glyphs, inputCount ? inputCount - 1 : 0, input, - lookup_context.funcs.intersects, lookup_context.intersects_data[1]) + lookup_context.funcs.intersects, + lookup_context.intersects_data[1], + lookup_context.intersects_cache[1]) && array_is_subset_of (glyphs, lookaheadCount, lookahead, - lookup_context.funcs.intersects, lookup_context.intersects_data[2]); + lookup_context.funcs.intersects, + lookup_context.intersects_data[2], + lookup_context.intersects_cache[2]); } template <typename HBUINT> @@ -2714,7 +2783,8 @@ static inline void chain_context_closure_lookup (hb_closure_context_t *c, value, lookup_context.context_format, lookup_context.intersects_data[1], - lookup_context.funcs.intersected_glyphs); + lookup_context.funcs.intersected_glyphs, + lookup_context.intersected_glyphs_cache); } template <typename HBUINT> @@ -2752,7 +2822,7 @@ static inline bool chain_context_would_apply_lookup (hb_would_apply_context_t *c const HBUINT lookahead[] HB_UNUSED, unsigned int lookupCount HB_UNUSED, const LookupRecord lookupRecord[] HB_UNUSED, - ChainContextApplyLookupContext &lookup_context) + const ChainContextApplyLookupContext &lookup_context) { return (c->zero_context ? !backtrackCount && !lookaheadCount : true) && would_match_input (c, @@ -2770,7 +2840,7 @@ static inline bool chain_context_apply_lookup (hb_ot_apply_context_t *c, const HBUINT lookahead[], unsigned int lookupCount, const LookupRecord lookupRecord[], - ChainContextApplyLookupContext &lookup_context) + const ChainContextApplyLookupContext &lookup_context) { unsigned end_index = c->buffer->idx; unsigned match_end = 0; @@ -2864,7 +2934,7 @@ struct ChainRule } bool would_apply (hb_would_apply_context_t *c, - ChainContextApplyLookupContext &lookup_context) const + const ChainContextApplyLookupContext &lookup_context) const { const auto &input = StructAfter<decltype (inputX)> (backtrack); const auto &lookahead = StructAfter<decltype (lookaheadX)> (input); @@ -2876,7 +2946,8 @@ struct ChainRule lookup.arrayZ, lookup_context); } - bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const + bool apply (hb_ot_apply_context_t *c, + const ChainContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); const auto &input = StructAfter<decltype (inputX)> (backtrack); @@ -3042,7 +3113,8 @@ struct ChainRuleSet ; } - bool would_apply (hb_would_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const + bool would_apply (hb_would_apply_context_t *c, + const ChainContextApplyLookupContext &lookup_context) const { return + hb_iter (rule) @@ -3052,7 +3124,8 @@ struct ChainRuleSet ; } - bool apply (hb_ot_apply_context_t *c, ChainContextApplyLookupContext &lookup_context) const + bool apply (hb_ot_apply_context_t *c, + const ChainContextApplyLookupContext &lookup_context) const { TRACE_APPLY (this); return_trace ( @@ -3166,7 +3239,7 @@ struct ChainContextFormat1_4 void closure_lookups (hb_closure_lookups_context_t *c) const { struct ChainContextClosureLookupContext lookup_context = { - {intersects_glyph, intersected_glyph}, + {intersects_glyph, nullptr}, ContextFormat::SimpleContext, {nullptr, nullptr, nullptr} }; @@ -3278,12 +3351,14 @@ struct ChainContextFormat2_5 const ClassDef &input_class_def = this+inputClassDef; const ClassDef &lookahead_class_def = this+lookaheadClassDef; + hb_map_t caches[3] = {}; struct ChainContextClosureLookupContext lookup_context = { - {intersects_class, intersected_class_glyphs}, + {intersects_class, nullptr}, ContextFormat::ClassBasedContext, {&backtrack_class_def, &input_class_def, - &lookahead_class_def} + &lookahead_class_def}, + {&caches[0], &caches[1], &caches[2]} }; hb_set_t retained_coverage_glyphs; @@ -3321,12 +3396,16 @@ struct ChainContextFormat2_5 const ClassDef &input_class_def = this+inputClassDef; const ClassDef &lookahead_class_def = this+lookaheadClassDef; + hb_map_t caches[3] = {}; + intersected_class_cache_t intersected_cache; struct ChainContextClosureLookupContext lookup_context = { {intersects_class, intersected_class_glyphs}, ContextFormat::ClassBasedContext, {&backtrack_class_def, &input_class_def, - &lookahead_class_def} + &lookahead_class_def}, + {&caches[0], &caches[1], &caches[2]}, + &intersected_cache }; + hb_enumerate (ruleSet) @@ -3352,12 +3431,14 @@ struct ChainContextFormat2_5 const ClassDef &input_class_def = this+inputClassDef; const ClassDef &lookahead_class_def = this+lookaheadClassDef; + hb_map_t caches[3] = {}; struct ChainContextClosureLookupContext lookup_context = { - {intersects_class, intersected_class_glyphs}, + {intersects_class, nullptr}, ContextFormat::ClassBasedContext, {&backtrack_class_def, &input_class_def, - &lookahead_class_def} + &lookahead_class_def}, + {&caches[0], &caches[1], &caches[2]} }; + hb_iter (ruleSet) @@ -3587,7 +3668,7 @@ struct ChainContextFormat3 const auto &lookahead = StructAfter<decltype (lookaheadX)> (input); struct ChainContextClosureLookupContext lookup_context = { - {intersects_coverage, intersected_coverage_glyphs}, + {intersects_coverage, nullptr}, ContextFormat::CoverageBasedContext, {this, this, this} }; @@ -3938,13 +4019,14 @@ struct hb_ot_layout_lookup_accelerator_t template <typename TLookup> void init (const TLookup &lookup) { - digest.init (); - lookup.collect_coverage (&digest); - subtables.init (); - OT::hb_accelerate_subtables_context_t c_accelerate_subtables (subtables); + hb_accelerate_subtables_context_t c_accelerate_subtables (subtables); lookup.dispatch (&c_accelerate_subtables); + digest.init (); + for (auto& subtable : hb_iter (subtables)) + digest.add (subtable.digest); + #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE cache_user_idx = c_accelerate_subtables.cache_user_idx; for (unsigned i = 0; i < subtables.length; i++) @@ -3962,21 +4044,25 @@ struct hb_ot_layout_lookup_accelerator_t #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE if (use_cache) { - for (unsigned int i = 0; i < subtables.length; i++) - if (subtables[i].apply_cached (c)) - return true; + return + + hb_iter (subtables) + | hb_map ([&c] (const hb_accelerate_subtables_context_t::hb_applicable_t &_) { return _.apply_cached (c); }) + | hb_any + ; } else #endif { - for (unsigned int i = 0; i < subtables.length; i++) - if (subtables[i].apply (c)) - return true; + return + + hb_iter (subtables) + | hb_map ([&c] (const hb_accelerate_subtables_context_t::hb_applicable_t &_) { return _.apply (c); }) + | hb_any + ; } return false; } - bool cache_enter (OT::hb_ot_apply_context_t *c) const + bool cache_enter (hb_ot_apply_context_t *c) const { #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE return cache_user_idx != (unsigned) -1 && @@ -3985,7 +4071,7 @@ struct hb_ot_layout_lookup_accelerator_t return false; #endif } - void cache_leave (OT::hb_ot_apply_context_t *c) const + void cache_leave (hb_ot_apply_context_t *c) const { #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE subtables[cache_user_idx].cache_leave (c); @@ -3993,8 +4079,8 @@ struct hb_ot_layout_lookup_accelerator_t } - private: hb_set_digest_t digest; + private: hb_accelerate_subtables_context_t::array_t subtables; #ifndef HB_NO_OT_LAYOUT_LOOKUP_CACHE unsigned cache_user_idx = (unsigned) -1; @@ -4255,11 +4341,11 @@ struct GSUBGPOS hb_set_t *lookup_indexes /* IN/OUT */) const { hb_set_t visited_lookups, inactive_lookups; - OT::hb_closure_lookups_context_t c (face, glyphs, &visited_lookups, &inactive_lookups); + hb_closure_lookups_context_t c (face, glyphs, &visited_lookups, &inactive_lookups); c.set_recurse_func (TLookup::template dispatch_recurse_func<hb_closure_lookups_context_t>); - for (unsigned lookup_index : + hb_iter (lookup_indexes)) + for (unsigned lookup_index : *lookup_indexes) reinterpret_cast<const TLookup &> (get_lookup (lookup_index)).closure_lookups (&c, lookup_index); hb_set_union (lookup_indexes, &visited_lookups); @@ -4301,7 +4387,7 @@ struct GSUBGPOS } #endif - for (unsigned i : feature_indices->iter()) + for (unsigned i : hb_iter (feature_indices)) { hb_tag_t tag = get_feature_tag (i); if (tag == HB_TAG ('p', 'r', 'e', 'f')) diff --git a/thirdparty/harfbuzz/src/hb-ot-layout.cc b/thirdparty/harfbuzz/src/hb-ot-layout.cc index dbb30076a2..e8091ec3e0 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout.cc +++ b/thirdparty/harfbuzz/src/hb-ot-layout.cc @@ -1465,56 +1465,6 @@ hb_ot_layout_substitute_start (hb_font_t *font, _hb_ot_layout_set_glyph_props (font, buffer); } -void -hb_ot_layout_delete_glyphs_inplace (hb_buffer_t *buffer, - bool (*filter) (const hb_glyph_info_t *info)) -{ - /* Merge clusters and delete filtered glyphs. - * NOTE! We can't use out-buffer as we have positioning data. */ - unsigned int j = 0; - unsigned int count = buffer->len; - hb_glyph_info_t *info = buffer->info; - hb_glyph_position_t *pos = buffer->pos; - for (unsigned int i = 0; i < count; i++) - { - if (filter (&info[i])) - { - /* Merge clusters. - * Same logic as buffer->delete_glyph(), but for in-place removal. */ - - unsigned int cluster = info[i].cluster; - if (i + 1 < count && cluster == info[i + 1].cluster) - continue; /* Cluster survives; do nothing. */ - - if (j) - { - /* Merge cluster backward. */ - if (cluster < info[j - 1].cluster) - { - unsigned int mask = info[i].mask; - unsigned int old_cluster = info[j - 1].cluster; - for (unsigned k = j; k && info[k - 1].cluster == old_cluster; k--) - buffer->set_cluster (info[k - 1], cluster, mask); - } - continue; - } - - if (i + 1 < count) - buffer->merge_clusters (i, i + 2); /* Merge cluster forward. */ - - continue; - } - - if (j != i) - { - info[j] = info[i]; - pos[j] = pos[i]; - } - j++; - } - buffer->len = j; -} - /** * hb_ot_layout_lookup_substitute_closure: * @face: #hb_face_t to work upon @@ -1867,7 +1817,7 @@ apply_forward (OT::hb_ot_apply_context_t *c, while (buffer->idx < buffer->len && buffer->successful) { bool applied = false; - if (accel.may_have (buffer->cur().codepoint) && + if (accel.digest.may_have (buffer->cur().codepoint) && (buffer->cur().mask & c->lookup_mask) && c->check_glyph_property (&buffer->cur(), c->lookup_props)) { @@ -1894,7 +1844,7 @@ apply_backward (OT::hb_ot_apply_context_t *c, hb_buffer_t *buffer = c->buffer; do { - if (accel.may_have (buffer->cur().codepoint) && + if (accel.digest.may_have (buffer->cur().codepoint) && (buffer->cur().mask & c->lookup_mask) && c->check_glyph_property (&buffer->cur(), c->lookup_props)) ret |= accel.apply (c, false); @@ -1908,15 +1858,16 @@ apply_backward (OT::hb_ot_apply_context_t *c, } template <typename Proxy> -static inline void +static inline bool apply_string (OT::hb_ot_apply_context_t *c, const typename Proxy::Lookup &lookup, const OT::hb_ot_layout_lookup_accelerator_t &accel) { + bool ret = false; hb_buffer_t *buffer = c->buffer; if (unlikely (!buffer->len || !c->lookup_mask)) - return; + return ret; c->set_lookup_props (lookup.get_props ()); @@ -1927,7 +1878,7 @@ apply_string (OT::hb_ot_apply_context_t *c, buffer->clear_output (); buffer->idx = 0; - apply_forward (c, accel); + ret = apply_forward (c, accel); if (!Proxy::always_inplace) buffer->sync (); @@ -1937,8 +1888,10 @@ apply_string (OT::hb_ot_apply_context_t *c, /* in-place backward substitution/positioning */ assert (!buffer->have_output); buffer->idx = buffer->len - 1; - apply_backward (c, accel); + ret = apply_backward (c, accel); } + + return ret; } template <typename Proxy> @@ -1957,23 +1910,42 @@ inline void hb_ot_map_t::apply (const Proxy &proxy, const stage_map_t *stage = &stages[table_index][stage_index]; for (; i < stage->last_lookup; i++) { - unsigned int lookup_index = lookups[table_index][i].index; - if (!buffer->message (font, "start lookup %d", lookup_index)) continue; - c.set_lookup_index (lookup_index); - c.set_lookup_mask (lookups[table_index][i].mask); - c.set_auto_zwj (lookups[table_index][i].auto_zwj); - c.set_auto_zwnj (lookups[table_index][i].auto_zwnj); - c.set_random (lookups[table_index][i].random); - c.set_per_syllable (lookups[table_index][i].per_syllable); - - apply_string<Proxy> (&c, - proxy.table.get_lookup (lookup_index), - proxy.accels[lookup_index]); - (void) buffer->message (font, "end lookup %d", lookup_index); + auto &lookup = lookups[table_index][i]; + + unsigned int lookup_index = lookup.index; + if (!buffer->message (font, "start lookup %d feature '%c%c%c%c'", lookup_index, HB_UNTAG (lookup.feature_tag))) continue; + + /* c.digest is a digest of all the current glyphs in the buffer + * (plus some past glyphs). + * + * Only try applying the lookup if there is any overlap. */ + if (proxy.accels[lookup_index].digest.may_have (c.digest)) + { + c.set_lookup_index (lookup_index); + c.set_lookup_mask (lookup.mask); + c.set_auto_zwj (lookup.auto_zwj); + c.set_auto_zwnj (lookup.auto_zwnj); + c.set_random (lookup.random); + c.set_per_syllable (lookup.per_syllable); + + apply_string<Proxy> (&c, + proxy.table.get_lookup (lookup_index), + proxy.accels[lookup_index]); + } + else + (void) buffer->message (font, "skipped lookup %d feature '%c%c%c%c' because no glyph matches", lookup_index, HB_UNTAG (lookup.feature_tag)); + + (void) buffer->message (font, "end lookup %d feature '%c%c%c%c'", lookup_index, HB_UNTAG (lookup.feature_tag)); } if (stage->pause_func) - stage->pause_func (plan, font, buffer); + { + if (stage->pause_func (plan, font, buffer)) + { + /* Refresh working buffer digest since buffer changed. */ + c.digest = buffer->digest (); + } + } } } diff --git a/thirdparty/harfbuzz/src/hb-ot-layout.hh b/thirdparty/harfbuzz/src/hb-ot-layout.hh index de06610cb5..9505d5f147 100644 --- a/thirdparty/harfbuzz/src/hb-ot-layout.hh +++ b/thirdparty/harfbuzz/src/hb-ot-layout.hh @@ -102,10 +102,6 @@ HB_INTERNAL void hb_ot_layout_substitute_start (hb_font_t *font, hb_buffer_t *buffer); -HB_INTERNAL void -hb_ot_layout_delete_glyphs_inplace (hb_buffer_t *buffer, - bool (*filter) (const hb_glyph_info_t *info)); - namespace OT { struct hb_ot_apply_context_t; struct hb_ot_layout_lookup_accelerator_t; @@ -552,7 +548,7 @@ _hb_glyph_info_clear_substituted (hb_glyph_info_t *info) info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED); } -static inline void +static inline bool _hb_clear_substitution_flags (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) @@ -561,6 +557,7 @@ _hb_clear_substitution_flags (const hb_ot_shape_plan_t *plan HB_UNUSED, unsigned int count = buffer->len; for (unsigned int i = 0; i < count; i++) _hb_glyph_info_clear_substituted (&info[i]); + return false; } diff --git a/thirdparty/harfbuzz/src/hb-ot-map.cc b/thirdparty/harfbuzz/src/hb-ot-map.cc index 39215b335f..8882dbaccb 100644 --- a/thirdparty/harfbuzz/src/hb-ot-map.cc +++ b/thirdparty/harfbuzz/src/hb-ot-map.cc @@ -45,7 +45,7 @@ void hb_ot_map_t::collect_lookups (unsigned int table_index, hb_set_t *lookups_o hb_ot_map_builder_t::hb_ot_map_builder_t (hb_face_t *face_, const hb_segment_properties_t &props_) { - memset (this, 0, sizeof (*this)); + hb_memset (this, 0, sizeof (*this)); feature_infos.init (); for (unsigned int table_index = 0; table_index < 2; table_index++) @@ -133,7 +133,8 @@ hb_ot_map_builder_t::add_lookups (hb_ot_map_t &m, bool auto_zwnj, bool auto_zwj, bool random, - bool per_syllable) + bool per_syllable, + hb_tag_t feature_tag) { unsigned int lookup_indices[32]; unsigned int offset, len; @@ -162,6 +163,7 @@ hb_ot_map_builder_t::add_lookups (hb_ot_map_t &m, lookup->auto_zwj = auto_zwj; lookup->random = random; lookup->per_syllable = per_syllable; + lookup->feature_tag = feature_tag; } offset += len; @@ -212,24 +214,26 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, if (feature_infos.length) { feature_infos.qsort (); + auto *f = feature_infos.arrayZ; unsigned int j = 0; - for (unsigned int i = 1; i < feature_infos.length; i++) - if (feature_infos[i].tag != feature_infos[j].tag) - feature_infos[++j] = feature_infos[i]; + unsigned count = feature_infos.length; + for (unsigned int i = 1; i < count; i++) + if (f[i].tag != f[j].tag) + f[++j] = f[i]; else { - if (feature_infos[i].flags & F_GLOBAL) { - feature_infos[j].flags |= F_GLOBAL; - feature_infos[j].max_value = feature_infos[i].max_value; - feature_infos[j].default_value = feature_infos[i].default_value; + if (f[i].flags & F_GLOBAL) { + f[j].flags |= F_GLOBAL; + f[j].max_value = f[i].max_value; + f[j].default_value = f[i].default_value; } else { - if (feature_infos[j].flags & F_GLOBAL) - feature_infos[j].flags ^= F_GLOBAL; - feature_infos[j].max_value = hb_max (feature_infos[j].max_value, feature_infos[i].max_value); + if (f[j].flags & F_GLOBAL) + f[j].flags ^= F_GLOBAL; + f[j].max_value = hb_max (f[j].max_value, f[i].max_value); /* Inherit default_value from j */ } - feature_infos[j].flags |= (feature_infos[i].flags & F_HAS_FALLBACK); - feature_infos[j].stage[0] = hb_min (feature_infos[j].stage[0], feature_infos[i].stage[0]); - feature_infos[j].stage[1] = hb_min (feature_infos[j].stage[1], feature_infos[i].stage[1]); + f[j].flags |= (f[i].flags & F_HAS_FALLBACK); + f[j].stage[0] = hb_min (f[j].stage[0], f[i].stage[0]); + f[j].stage[1] = hb_min (f[j].stage[1], f[i].stage[1]); } feature_infos.shrink (j + 1); } @@ -239,7 +243,8 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, static_assert ((!(HB_GLYPH_FLAG_DEFINED & (HB_GLYPH_FLAG_DEFINED + 1))), ""); unsigned int next_bit = hb_popcount (HB_GLYPH_FLAG_DEFINED) + 1; - for (unsigned int i = 0; i < feature_infos.length; i++) + unsigned count = feature_infos.length; + for (unsigned int i = 0; i < count; i++) { const feature_info_t *info = &feature_infos[i]; @@ -308,7 +313,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, map->_1_mask = (1u << map->shift) & map->mask; map->needs_fallback = !found; } - feature_infos.shrink (0); /* Done with these */ + //feature_infos.shrink (0); /* Done with these */ add_gsub_pause (nullptr); @@ -317,6 +322,7 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, for (unsigned int table_index = 0; table_index < 2; table_index++) { /* Collect lookup indices for features */ + auto &lookups = m.lookups[table_index]; unsigned int stage_index = 0; unsigned int last_num_lookups = 0; @@ -329,36 +335,39 @@ hb_ot_map_builder_t::compile (hb_ot_map_t &m, key.variations_index[table_index], global_bit_mask); - for (unsigned i = 0; i < m.features.length; i++) - if (m.features[i].stage[table_index] == stage) + for (auto &feature : m.features) + { + if (feature.stage[table_index] == stage) add_lookups (m, table_index, - m.features[i].index[table_index], + feature.index[table_index], key.variations_index[table_index], - m.features[i].mask, - m.features[i].auto_zwnj, - m.features[i].auto_zwj, - m.features[i].random, - m.features[i].per_syllable); + feature.mask, + feature.auto_zwnj, + feature.auto_zwj, + feature.random, + feature.per_syllable, + feature.tag); + } /* Sort lookups and merge duplicates */ - if (last_num_lookups < m.lookups[table_index].length) + if (last_num_lookups < lookups.length) { - m.lookups[table_index].qsort (last_num_lookups, m.lookups[table_index].length); + lookups.as_array ().sub_array (last_num_lookups, lookups.length - last_num_lookups).qsort (); unsigned int j = last_num_lookups; - for (unsigned int i = j + 1; i < m.lookups[table_index].length; i++) - if (m.lookups[table_index][i].index != m.lookups[table_index][j].index) - m.lookups[table_index][++j] = m.lookups[table_index][i]; + for (unsigned int i = j + 1; i < lookups.length; i++) + if (lookups.arrayZ[i].index != lookups.arrayZ[j].index) + lookups.arrayZ[++j] = lookups.arrayZ[i]; else { - m.lookups[table_index][j].mask |= m.lookups[table_index][i].mask; - m.lookups[table_index][j].auto_zwnj &= m.lookups[table_index][i].auto_zwnj; - m.lookups[table_index][j].auto_zwj &= m.lookups[table_index][i].auto_zwj; + lookups.arrayZ[j].mask |= lookups.arrayZ[i].mask; + lookups.arrayZ[j].auto_zwnj &= lookups.arrayZ[i].auto_zwnj; + lookups.arrayZ[j].auto_zwj &= lookups.arrayZ[i].auto_zwj; } - m.lookups[table_index].shrink (j + 1); + lookups.shrink (j + 1); } - last_num_lookups = m.lookups[table_index].length; + last_num_lookups = lookups.length; if (stage_index < stages[table_index].length && stages[table_index][stage_index].index == stage) { hb_ot_map_t::stage_map_t *stage_map = m.stages[table_index].push (); diff --git a/thirdparty/harfbuzz/src/hb-ot-map.hh b/thirdparty/harfbuzz/src/hb-ot-map.hh index a7b5eec30d..efc8cae96a 100644 --- a/thirdparty/harfbuzz/src/hb-ot-map.hh +++ b/thirdparty/harfbuzz/src/hb-ot-map.hh @@ -69,6 +69,7 @@ struct hb_ot_map_t unsigned short random : 1; unsigned short per_syllable : 1; hb_mask_t mask; + hb_tag_t feature_tag; HB_INTERNAL static int cmp (const void *pa, const void *pb) { @@ -78,7 +79,9 @@ struct hb_ot_map_t } }; - typedef void (*pause_func_t) (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); + /* Pause functions return true if new glyph indices might have been + * added to the buffer. This is used to update buffer digest. */ + typedef bool (*pause_func_t) (const struct hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); struct stage_map_t { unsigned int last_lookup; /* Cumulative */ @@ -87,13 +90,13 @@ struct hb_ot_map_t void init () { - memset (this, 0, sizeof (*this)); + hb_memset (this, 0, sizeof (*this)); - features.init (); + features.init0 (); for (unsigned int table_index = 0; table_index < 2; table_index++) { - lookups[table_index].init (); - stages[table_index].init (); + lookups[table_index].init0 (); + stages[table_index].init0 (); } } void fini () @@ -239,7 +242,8 @@ struct hb_ot_map_builder_t bool auto_zwnj = true, bool auto_zwj = true, bool random = false, - bool per_syllable = false); + bool per_syllable = false, + hb_tag_t feature_tag = HB_TAG(' ',' ',' ',' ')); struct feature_info_t { hb_tag_t tag; diff --git a/thirdparty/harfbuzz/src/hb-ot-math-table.hh b/thirdparty/harfbuzz/src/hb-ot-math-table.hh index d834d94371..93953370e2 100644 --- a/thirdparty/harfbuzz/src/hb-ot-math-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-math-table.hh @@ -77,11 +77,11 @@ struct MathConstants HBINT16 *p = c->allocate_size<HBINT16> (HBINT16::static_size * 2); if (unlikely (!p)) return_trace (nullptr); - memcpy (p, percentScaleDown, HBINT16::static_size * 2); + hb_memcpy (p, percentScaleDown, HBINT16::static_size * 2); HBUINT16 *m = c->allocate_size<HBUINT16> (HBUINT16::static_size * 2); if (unlikely (!m)) return_trace (nullptr); - memcpy (m, minHeight, HBUINT16::static_size * 2); + hb_memcpy (m, minHeight, HBUINT16::static_size * 2); unsigned count = ARRAY_LENGTH (mathValueRecords); for (unsigned i = 0; i < count; i++) @@ -786,7 +786,7 @@ struct MathGlyphAssembly if (parts_count) { int64_t mult = font->dir_mult (direction); - for (auto _ : hb_zip (partRecords.sub_array (start_offset, parts_count), + for (auto _ : hb_zip (partRecords.as_array ().sub_array (start_offset, parts_count), hb_array (parts, *parts_count))) _.first.extract (_.second, mult, font); } @@ -855,7 +855,7 @@ struct MathGlyphConstruction if (variants_count) { int64_t mult = font->dir_mult (direction); - for (auto _ : hb_zip (mathGlyphVariantRecord.sub_array (start_offset, variants_count), + for (auto _ : hb_zip (mathGlyphVariantRecord.as_array ().sub_array (start_offset, variants_count), hb_array (variants, *variants_count))) _.second = {_.first.variantGlyph, font->em_mult (_.first.advanceMeasurement, mult)}; } diff --git a/thirdparty/harfbuzz/src/hb-ot-meta-table.hh b/thirdparty/harfbuzz/src/hb-ot-meta-table.hh index 93e64c5327..e1b68bcf91 100644 --- a/thirdparty/harfbuzz/src/hb-ot-meta-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-meta-table.hh @@ -84,7 +84,7 @@ struct meta { if (count) { - + table->dataMaps.sub_array (start_offset, count) + + table->dataMaps.as_array ().sub_array (start_offset, count) | hb_map (&DataMap::get_tag) | hb_map ([](hb_tag_t tag) { return (hb_ot_meta_tag_t) tag; }) | hb_sink (hb_array (entries, *count)) diff --git a/thirdparty/harfbuzz/src/hb-ot-name-table.hh b/thirdparty/harfbuzz/src/hb-ot-name-table.hh index 1f2131ffcc..6f4461cc15 100644 --- a/thirdparty/harfbuzz/src/hb-ot-name-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-name-table.hh @@ -30,10 +30,55 @@ #include "hb-open-type.hh" #include "hb-ot-name-language.hh" #include "hb-aat-layout.hh" +#include "hb-utf.hh" namespace OT { +template <typename in_utf_t, typename out_utf_t> +inline unsigned int +hb_ot_name_convert_utf (hb_bytes_t bytes, + unsigned int *text_size /* IN/OUT */, + typename out_utf_t::codepoint_t *text /* OUT */) +{ + unsigned int src_len = bytes.length / sizeof (typename in_utf_t::codepoint_t); + const typename in_utf_t::codepoint_t *src = (const typename in_utf_t::codepoint_t *) bytes.arrayZ; + const typename in_utf_t::codepoint_t *src_end = src + src_len; + + typename out_utf_t::codepoint_t *dst = text; + + hb_codepoint_t unicode; + const hb_codepoint_t replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT; + + if (text_size && *text_size) + { + (*text_size)--; /* Save room for NUL-termination. */ + const typename out_utf_t::codepoint_t *dst_end = text + *text_size; + + while (src < src_end && dst < dst_end) + { + const typename in_utf_t::codepoint_t *src_next = in_utf_t::next (src, src_end, &unicode, replacement); + typename out_utf_t::codepoint_t *dst_next = out_utf_t::encode (dst, dst_end, unicode); + if (dst_next == dst) + break; /* Out-of-room. */ + + dst = dst_next; + src = src_next; + } + + *text_size = dst - text; + *dst = 0; /* NUL-terminate. */ + } + + /* Accumulate length of rest. */ + unsigned int dst_len = dst - text; + while (src < src_end) + { + src = in_utf_t::next (src, src_end, &unicode, replacement); + dst_len += out_utf_t::encode_len (unicode); + } + return dst_len; +} #define entry_score var.u16[0] #define entry_index var.u16[1] @@ -97,12 +142,68 @@ struct NameRecord return UNSUPPORTED; } - NameRecord* copy (hb_serialize_context_t *c, const void *base) const + NameRecord* copy (hb_serialize_context_t *c, const void *base +#ifdef HB_EXPERIMENTAL_API + , const hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> *name_table_overrides +#endif + ) const { TRACE_SERIALIZE (this); + HB_UNUSED auto snap = c->snapshot (); auto *out = c->embed (this); if (unlikely (!out)) return_trace (nullptr); - out->offset.serialize_copy (c, offset, base, 0, hb_serialize_context_t::Tail, length); +#ifdef HB_EXPERIMENTAL_API + hb_ot_name_record_ids_t record_ids (platformID, encodingID, languageID, nameID); + hb_bytes_t* name_bytes; + + if (name_table_overrides->has (record_ids, &name_bytes)) { + hb_bytes_t encoded_bytes = *name_bytes; + char *name_str_utf16_be = nullptr; + + if (platformID != 1) + { + unsigned text_size = hb_ot_name_convert_utf<hb_utf8_t, hb_utf16_be_t> (*name_bytes, nullptr, nullptr); + + text_size++; // needs to consider NULL terminator for use in hb_ot_name_convert_utf() + unsigned byte_len = text_size * hb_utf16_be_t::codepoint_t::static_size; + name_str_utf16_be = (char *) hb_calloc (byte_len, 1); + if (!name_str_utf16_be) + { + c->revert (snap); + return_trace (nullptr); + } + hb_ot_name_convert_utf<hb_utf8_t, hb_utf16_be_t> (*name_bytes, &text_size, + (hb_utf16_be_t::codepoint_t *) name_str_utf16_be); + + unsigned encoded_byte_len = text_size * hb_utf16_be_t::codepoint_t::static_size; + if (!encoded_byte_len || !c->check_assign (out->length, encoded_byte_len, HB_SERIALIZE_ERROR_INT_OVERFLOW)) { + c->revert (snap); + hb_free (name_str_utf16_be); + return_trace (nullptr); + } + + encoded_bytes = hb_bytes_t (name_str_utf16_be, encoded_byte_len); + } + else + { + // mac platform, copy the UTF-8 string(all ascii characters) as is + if (!c->check_assign (out->length, encoded_bytes.length, HB_SERIALIZE_ERROR_INT_OVERFLOW)) { + c->revert (snap); + return_trace (nullptr); + } + } + + out->offset = 0; + c->push (); + encoded_bytes.copy (c); + c->add_link (out->offset, c->pop_pack (), hb_serialize_context_t::Tail, 0); + hb_free (name_str_utf16_be); + } + else +#endif + { + out->offset.serialize_copy (c, offset, base, 0, hb_serialize_context_t::Tail, length); + } return_trace (out); } @@ -216,29 +317,61 @@ struct name hb_requires (hb_is_source_of (Iterator, const NameRecord &))> bool serialize (hb_serialize_context_t *c, Iterator it, - const void *src_string_pool) + const void *src_string_pool +#ifdef HB_EXPERIMENTAL_API + , const hb_vector_t<hb_ot_name_record_ids_t>& insert_name_records + , const hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> *name_table_overrides +#endif + ) { TRACE_SERIALIZE (this); if (unlikely (!c->extend_min ((*this)))) return_trace (false); + unsigned total_count = it.len () +#ifdef HB_EXPERIMENTAL_API + + insert_name_records.length +#endif + ; this->format = 0; - this->count = it.len (); + if (!c->check_assign (this->count, total_count, HB_SERIALIZE_ERROR_INT_OVERFLOW)) + return false; - NameRecord *name_records = (NameRecord *) hb_calloc (it.len (), NameRecord::static_size); + NameRecord *name_records = (NameRecord *) hb_calloc (total_count, NameRecord::static_size); if (unlikely (!name_records)) return_trace (false); - hb_array_t<NameRecord> records (name_records, it.len ()); + hb_array_t<NameRecord> records (name_records, total_count); for (const NameRecord& record : it) { + hb_memcpy (name_records, &record, NameRecord::static_size); + name_records++; + } + +#ifdef HB_EXPERIMENTAL_API + for (unsigned i = 0; i < insert_name_records.length; i++) + { + const hb_ot_name_record_ids_t& ids = insert_name_records[i]; + NameRecord record; + record.platformID = ids.platform_id; + record.encodingID = ids.encoding_id; + record.languageID = ids.language_id; + record.nameID = ids.name_id; + record.length = 0; // handled in NameRecord copy() + record.offset = 0; memcpy (name_records, &record, NameRecord::static_size); name_records++; } +#endif records.qsort (); - c->copy_all (records, src_string_pool); + c->copy_all (records, + src_string_pool +#ifdef HB_EXPERIMENTAL_API + , name_table_overrides +#endif + ); hb_free (records.arrayZ); @@ -256,6 +389,11 @@ struct name name *name_prime = c->serializer->start_embed<name> (); if (unlikely (!name_prime)) return_trace (false); +#ifdef HB_EXPERIMENTAL_API + const hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> *name_table_overrides = + c->plan->name_table_overrides; +#endif + auto it = + nameRecordZ.as_array (count) | hb_filter (c->plan->name_ids, &NameRecord::nameID) @@ -265,10 +403,48 @@ struct name (c->plan->flags & HB_SUBSET_FLAGS_NAME_LEGACY) || namerecord.isUnicode (); }) +#ifdef HB_EXPERIMENTAL_API + | hb_filter ([&] (const NameRecord& namerecord) { + if (name_table_overrides->is_empty ()) + return true; + hb_ot_name_record_ids_t rec_ids (namerecord.platformID, + namerecord.encodingID, + namerecord.languageID, + namerecord.nameID); + + hb_bytes_t *p; + if (name_table_overrides->has (rec_ids, &p) && + (*p).length == 0) + return false; + return true; + }) +#endif ; - name_prime->serialize (c->serializer, it, std::addressof (this + stringOffset)); - return_trace (name_prime->count); +#ifdef HB_EXPERIMENTAL_API + hb_vector_t<hb_ot_name_record_ids_t> insert_name_records; + if (!name_table_overrides->is_empty ()) + { + if (unlikely (!insert_name_records.alloc (name_table_overrides->get_population ()))) + return_trace (false); + for (const auto& record_ids : name_table_overrides->keys ()) + { + if (name_table_overrides->get (record_ids).length == 0) + continue; + if (has_name_record_with_ids (record_ids)) + continue; + insert_name_records.push (record_ids); + } + } +#endif + + return (name_prime->serialize (c->serializer, it, + std::addressof (this + stringOffset) +#ifdef HB_EXPERIMENTAL_API + , insert_name_records + , name_table_overrides +#endif + )); } bool sanitize_records (hb_sanitize_context_t *c) const @@ -378,6 +554,23 @@ struct name hb_vector_t<hb_ot_name_entry_t> names; }; + private: + // sometimes NameRecords are not sorted in the font file, so use linear search + // here + bool has_name_record_with_ids (const hb_ot_name_record_ids_t& record_ids) const + { + for (const auto& record : nameRecordZ.as_array (count)) + { + if (record.platformID == record_ids.platform_id && + record.encodingID == record_ids.encoding_id && + record.languageID == record_ids.language_id && + record.nameID == record_ids.name_id) + return true; + } + return false; + } + + public: /* We only implement format 0 for now. */ HBUINT16 format; /* Format selector (=0/1). */ HBUINT16 count; /* Number of name records. */ diff --git a/thirdparty/harfbuzz/src/hb-ot-name.cc b/thirdparty/harfbuzz/src/hb-ot-name.cc index c35ac5b3dc..6adf1e8fbe 100644 --- a/thirdparty/harfbuzz/src/hb-ot-name.cc +++ b/thirdparty/harfbuzz/src/hb-ot-name.cc @@ -64,52 +64,6 @@ hb_ot_name_list_names (hb_face_t *face, return (const hb_ot_name_entry_t *) name.names; } - -template <typename in_utf_t, typename out_utf_t> -static inline unsigned int -hb_ot_name_convert_utf (hb_bytes_t bytes, - unsigned int *text_size /* IN/OUT */, - typename out_utf_t::codepoint_t *text /* OUT */) -{ - unsigned int src_len = bytes.length / sizeof (typename in_utf_t::codepoint_t); - const typename in_utf_t::codepoint_t *src = (const typename in_utf_t::codepoint_t *) bytes.arrayZ; - const typename in_utf_t::codepoint_t *src_end = src + src_len; - - typename out_utf_t::codepoint_t *dst = text; - - hb_codepoint_t unicode; - const hb_codepoint_t replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT; - - if (text_size && *text_size) - { - (*text_size)--; /* Same room for NUL-termination. */ - const typename out_utf_t::codepoint_t *dst_end = text + *text_size; - - while (src < src_end && dst < dst_end) - { - const typename in_utf_t::codepoint_t *src_next = in_utf_t::next (src, src_end, &unicode, replacement); - typename out_utf_t::codepoint_t *dst_next = out_utf_t::encode (dst, dst_end, unicode); - if (dst_next == dst) - break; /* Out-of-room. */ - - dst = dst_next; - src = src_next; - } - - *text_size = dst - text; - *dst = 0; /* NUL-terminate. */ - } - - /* Accumulate length of rest. */ - unsigned int dst_len = dst - text; - while (src < src_end) - { - src = in_utf_t::next (src, src_end, &unicode, replacement); - dst_len += out_utf_t::encode_len (unicode); - } - return dst_len; -} - template <typename utf_t> static inline unsigned int hb_ot_name_get_utf (hb_face_t *face, @@ -130,10 +84,10 @@ hb_ot_name_get_utf (hb_face_t *face, hb_bytes_t bytes = name.get_name (idx); if (width == 2) /* UTF16-BE */ - return hb_ot_name_convert_utf<hb_utf16_be_t, utf_t> (bytes, text_size, text); + return OT::hb_ot_name_convert_utf<hb_utf16_be_t, utf_t> (bytes, text_size, text); if (width == 1) /* ASCII */ - return hb_ot_name_convert_utf<hb_ascii_t, utf_t> (bytes, text_size, text); + return OT::hb_ot_name_convert_utf<hb_ascii_t, utf_t> (bytes, text_size, text); } if (text_size) @@ -227,5 +181,4 @@ hb_ot_name_get_utf32 (hb_face_t *face, return hb_ot_name_get_utf<hb_utf32_t> (face, name_id, language, text_size, text); } - #endif diff --git a/thirdparty/harfbuzz/src/hb-ot-os2-table.hh b/thirdparty/harfbuzz/src/hb-ot-os2-table.hh index c6e8fad6fc..5b017d56a6 100644 --- a/thirdparty/harfbuzz/src/hb-ot-os2-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-os2-table.hh @@ -212,17 +212,6 @@ struct OS2 TRACE_SUBSET (this); OS2 *os2_prime = c->serializer->embed (this); if (unlikely (!os2_prime)) return_trace (false); - if (c->plan->flags & HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES) - return_trace (true); - - /* when --gids option is not used, no need to do collect_mapping that is - * iterating all codepoints in each subtable, which is not efficient */ - uint16_t min_cp, max_cp; - find_min_and_max_codepoint (c->plan->unicodes, &min_cp, &max_cp); - os2_prime->usFirstCharIndex = min_cp; - os2_prime->usLastCharIndex = max_cp; - - _update_unicode_ranges (c->plan->unicodes, os2_prime->ulUnicodeRange); if (c->plan->user_axes_location->has (HB_TAG ('w','g','h','t')) && !c->plan->pinned_at_default) @@ -244,6 +233,18 @@ struct OS2 return_trace (false); } + if (c->plan->flags & HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES) + return_trace (true); + + /* when --gids option is not used, no need to do collect_mapping that is + * iterating all codepoints in each subtable, which is not efficient */ + uint16_t min_cp, max_cp; + find_min_and_max_codepoint (c->plan->unicodes, &min_cp, &max_cp); + os2_prime->usFirstCharIndex = min_cp; + os2_prime->usLastCharIndex = max_cp; + + _update_unicode_ranges (c->plan->unicodes, os2_prime->ulUnicodeRange); + return_trace (true); } diff --git a/thirdparty/harfbuzz/src/hb-ot-post-table-v2subset.hh b/thirdparty/harfbuzz/src/hb-ot-post-table-v2subset.hh index 4d427e5431..951e6395d6 100644 --- a/thirdparty/harfbuzz/src/hb-ot-post-table-v2subset.hh +++ b/thirdparty/harfbuzz/src/hb-ot-post-table-v2subset.hh @@ -78,14 +78,14 @@ HB_INTERNAL bool postV2Tail::subset (hb_subset_context_t *c) const post::accelerator_t _post (c->plan->source); - hb_hashmap_t<hb_bytes_t, unsigned, true> glyph_name_to_new_index; + hb_hashmap_t<hb_bytes_t, uint32_t, true> glyph_name_to_new_index; for (hb_codepoint_t new_gid = 0; new_gid < num_glyphs; new_gid++) { hb_codepoint_t old_gid = reverse_glyph_map.get (new_gid); unsigned old_index = glyphNameIndex[old_gid]; unsigned new_index; - const unsigned *new_index2; + const uint32_t *new_index2; if (old_index <= 257) new_index = old_index; else if (old_new_index_map.has (old_index, &new_index2)) { diff --git a/thirdparty/harfbuzz/src/hb-ot-post-table.hh b/thirdparty/harfbuzz/src/hb-ot-post-table.hh index 59c1de3784..a04b80357b 100644 --- a/thirdparty/harfbuzz/src/hb-ot-post-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-post-table.hh @@ -84,7 +84,7 @@ struct post post *post_prime = c->allocate_min<post> (); if (unlikely (!post_prime)) return_trace (false); - memcpy (post_prime, this, post::min_size); + hb_memcpy (post_prime, this, post::min_size); if (!glyph_names) return_trace (c->check_assign (post_prime->version.major, 3, HB_SERIALIZE_ERROR_INT_OVERFLOW)); // Version 3 does not have any glyph names. diff --git a/thirdparty/harfbuzz/src/hb-ot-shape-normalize.cc b/thirdparty/harfbuzz/src/hb-ot-shape-normalize.cc index 7db0b25b73..897377aa15 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shape-normalize.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shape-normalize.cc @@ -341,7 +341,7 @@ _hb_ot_shape_normalize (const hb_ot_shape_plan_t *plan, { unsigned int end; for (end = buffer->idx + 1; end < count; end++) - if (unlikely (_hb_glyph_info_is_unicode_mark (&buffer->info[end]))) + if (_hb_glyph_info_is_unicode_mark (&buffer->info[end])) break; if (end < count) diff --git a/thirdparty/harfbuzz/src/hb-ot-shape.cc b/thirdparty/harfbuzz/src/hb-ot-shape.cc index 249b5a864c..bbdfc214a1 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shape.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shape.cc @@ -91,9 +91,11 @@ hb_ot_shape_planner_t::hb_ot_shape_planner_t (hb_face_t *fac script_zero_marks = shaper->zero_width_marks != HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE; script_fallback_mark_positioning = shaper->fallback_position; +#ifndef HB_NO_AAT_SHAPE /* https://github.com/harfbuzz/harfbuzz/issues/1528 */ if (apply_morx && shaper != &_hb_ot_shaper_default) shaper = &_hb_ot_shaper_dumber; +#endif } void @@ -864,7 +866,7 @@ hb_ot_hide_default_ignorables (hb_buffer_t *buffer, } } else - hb_ot_layout_delete_glyphs_inplace (buffer, _hb_glyph_info_is_default_ignorable); + buffer->delete_glyphs_inplace (_hb_glyph_info_is_default_ignorable); } diff --git a/thirdparty/harfbuzz/src/hb-ot-shape.hh b/thirdparty/harfbuzz/src/hb-ot-shape.hh index cd6f15cbe2..ace28602f6 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shape.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shape.hh @@ -51,7 +51,7 @@ struct hb_ot_shape_plan_key_t bool equal (const hb_ot_shape_plan_key_t *other) { - return 0 == memcmp (this, other, sizeof (*this)); + return 0 == hb_memcmp (this, other, sizeof (*this)); } }; diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-arabic.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-arabic.cc index ed2748b828..2332ae3697 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-arabic.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-arabic.cc @@ -161,22 +161,23 @@ static const struct arabic_state_table_entry { }; -static void +static bool arabic_fallback_shape (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); -static void +static bool record_stch (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); -static void +static bool deallocate_buffer_var (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action); + return false; } static void @@ -412,19 +413,19 @@ setup_masks_arabic (const hb_ot_shape_plan_t *plan, setup_masks_arabic_plan (arabic_plan, buffer, plan->props.script); } -static void +static bool arabic_fallback_shape (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { #ifdef HB_NO_OT_SHAPER_ARABIC_FALLBACK - return; + return false; #endif const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data; if (!arabic_plan->do_fallback) - return; + return false; retry: arabic_fallback_plan_t *fallback_plan = arabic_plan->fallback_plan; @@ -440,6 +441,7 @@ retry: } arabic_fallback_plan_shape (fallback_plan, font, buffer); + return true; } /* @@ -450,14 +452,14 @@ retry: * marks can use it as well. */ -static void +static bool record_stch (const hb_ot_shape_plan_t *plan, hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) { const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data; if (!arabic_plan->has_stch) - return; + return false; /* 'stch' feature was just applied. Look for anything that multiplied, * and record it for stch treatment later. Note that rtlm, frac, etc @@ -473,6 +475,7 @@ record_stch (const hb_ot_shape_plan_t *plan, info[i].arabic_shaping_action() = comp % 2 ? STCH_REPEATING : STCH_FIXED; buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH; } + return false; } static void diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-default.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-default.cc index 2f6f499eec..f0404a4d2c 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-default.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-default.cc @@ -49,6 +49,7 @@ const hb_ot_shaper_t _hb_ot_shaper_default = true, /* fallback_position */ }; +#ifndef HB_NO_AAT_SHAPE /* Same as default but no mark advance zeroing / fallback positioning. * Dumbest shaper ever, basically. */ const hb_ot_shaper_t _hb_ot_shaper_dumber = @@ -68,6 +69,7 @@ const hb_ot_shaper_t _hb_ot_shaper_dumber = HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, false, /* fallback_position */ }; +#endif #endif diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-indic-machine.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-indic-machine.hh index d52b13f616..d6c67b81bd 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-indic-machine.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-indic-machine.hh @@ -53,7 +53,7 @@ enum indic_syllable_type_t { }; -#line 57 "hb-ot-shaper-indic-machine.hh" +#line 54 "hb-ot-shaper-indic-machine.hh" #define indic_syllable_machine_ex_A 9u #define indic_syllable_machine_ex_C 1u #define indic_syllable_machine_ex_CM 16u @@ -61,6 +61,7 @@ enum indic_syllable_type_t { #define indic_syllable_machine_ex_DOTTEDCIRCLE 11u #define indic_syllable_machine_ex_H 4u #define indic_syllable_machine_ex_M 7u +#define indic_syllable_machine_ex_MPst 13u #define indic_syllable_machine_ex_N 3u #define indic_syllable_machine_ex_PLACEHOLDER 10u #define indic_syllable_machine_ex_RS 12u @@ -75,268 +76,302 @@ enum indic_syllable_type_t { #define indic_syllable_machine_ex_ZWNJ 5u -#line 79 "hb-ot-shaper-indic-machine.hh" +#line 75 "hb-ot-shaper-indic-machine.hh" static const unsigned char _indic_syllable_machine_trans_keys[] = { - 8u, 8u, 4u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, 4u, 12u, 4u, 8u, 8u, 8u, - 5u, 7u, 5u, 8u, 4u, 8u, 4u, 12u, 4u, 12u, 4u, 12u, 8u, 8u, 5u, 7u, - 5u, 8u, 4u, 8u, 4u, 8u, 4u, 12u, 8u, 8u, 5u, 7u, 5u, 8u, 4u, 8u, - 4u, 8u, 5u, 8u, 8u, 8u, 1u, 18u, 3u, 16u, 3u, 16u, 4u, 16u, 1u, 15u, - 5u, 9u, 5u, 9u, 9u, 9u, 5u, 9u, 1u, 15u, 1u, 15u, 1u, 15u, 3u, 9u, - 4u, 9u, 5u, 9u, 4u, 9u, 5u, 9u, 3u, 9u, 5u, 9u, 3u, 16u, 3u, 16u, - 3u, 16u, 3u, 16u, 4u, 16u, 1u, 15u, 3u, 16u, 3u, 16u, 4u, 16u, 1u, 15u, - 5u, 9u, 9u, 9u, 5u, 9u, 1u, 15u, 1u, 15u, 3u, 9u, 4u, 9u, 5u, 9u, - 4u, 9u, 5u, 9u, 5u, 9u, 3u, 9u, 5u, 9u, 3u, 16u, 3u, 16u, 4u, 8u, - 3u, 16u, 3u, 16u, 4u, 16u, 1u, 15u, 3u, 16u, 1u, 15u, 5u, 9u, 9u, 9u, - 5u, 9u, 1u, 15u, 1u, 15u, 3u, 9u, 4u, 9u, 5u, 9u, 3u, 16u, 4u, 9u, - 5u, 9u, 5u, 9u, 3u, 9u, 5u, 9u, 3u, 16u, 4u, 12u, 4u, 8u, 3u, 16u, - 3u, 16u, 4u, 16u, 1u, 15u, 3u, 16u, 1u, 15u, 5u, 9u, 9u, 9u, 5u, 9u, - 1u, 15u, 1u, 15u, 3u, 9u, 4u, 9u, 5u, 9u, 3u, 16u, 4u, 9u, 5u, 9u, - 5u, 9u, 3u, 9u, 5u, 9u, 1u, 16u, 3u, 16u, 1u, 16u, 4u, 12u, 5u, 9u, - 9u, 9u, 5u, 9u, 1u, 15u, 3u, 9u, 5u, 9u, 5u, 9u, 9u, 9u, 5u, 9u, - 1u, 15u, 0 + 8u, 8u, 4u, 13u, 5u, 13u, 5u, 13u, 13u, 13u, 4u, 13u, 4u, 13u, 4u, 13u, + 8u, 8u, 5u, 13u, 5u, 13u, 13u, 13u, 4u, 13u, 4u, 13u, 4u, 13u, 4u, 13u, + 8u, 8u, 5u, 13u, 5u, 13u, 13u, 13u, 4u, 13u, 4u, 13u, 4u, 13u, 8u, 8u, + 5u, 13u, 5u, 13u, 13u, 13u, 4u, 13u, 4u, 13u, 5u, 13u, 8u, 8u, 1u, 18u, + 3u, 16u, 3u, 16u, 4u, 16u, 1u, 15u, 5u, 9u, 5u, 9u, 9u, 9u, 5u, 9u, + 1u, 15u, 1u, 15u, 1u, 15u, 3u, 13u, 4u, 13u, 5u, 13u, 5u, 13u, 4u, 13u, + 5u, 9u, 3u, 9u, 5u, 9u, 3u, 16u, 3u, 16u, 3u, 16u, 3u, 16u, 4u, 16u, + 1u, 15u, 3u, 16u, 3u, 16u, 4u, 16u, 1u, 15u, 5u, 9u, 9u, 9u, 5u, 9u, + 1u, 15u, 1u, 15u, 3u, 13u, 4u, 13u, 5u, 13u, 5u, 13u, 4u, 13u, 5u, 9u, + 5u, 9u, 3u, 9u, 5u, 9u, 3u, 16u, 3u, 16u, 4u, 13u, 3u, 16u, 3u, 16u, + 4u, 16u, 1u, 15u, 3u, 16u, 1u, 15u, 5u, 9u, 9u, 9u, 5u, 9u, 1u, 15u, + 1u, 15u, 3u, 13u, 4u, 13u, 5u, 13u, 5u, 13u, 3u, 16u, 4u, 13u, 5u, 9u, + 5u, 9u, 3u, 9u, 5u, 9u, 3u, 16u, 4u, 13u, 4u, 13u, 3u, 16u, 3u, 16u, + 4u, 16u, 1u, 15u, 3u, 16u, 1u, 15u, 5u, 9u, 9u, 9u, 5u, 9u, 1u, 15u, + 1u, 15u, 3u, 13u, 4u, 13u, 5u, 13u, 5u, 13u, 3u, 16u, 4u, 13u, 5u, 9u, + 5u, 9u, 3u, 9u, 5u, 9u, 1u, 16u, 3u, 16u, 1u, 16u, 4u, 13u, 5u, 13u, + 5u, 13u, 9u, 9u, 5u, 9u, 1u, 15u, 3u, 9u, 5u, 9u, 5u, 9u, 9u, 9u, + 5u, 9u, 1u, 15u, 0 }; static const char _indic_syllable_machine_key_spans[] = { - 1, 5, 3, 4, 5, 9, 5, 1, - 3, 4, 5, 9, 9, 9, 1, 3, - 4, 5, 5, 9, 1, 3, 4, 5, - 5, 4, 1, 18, 14, 14, 13, 15, - 5, 5, 1, 5, 15, 15, 15, 7, - 6, 5, 6, 5, 7, 5, 14, 14, - 14, 14, 13, 15, 14, 14, 13, 15, - 5, 1, 5, 15, 15, 7, 6, 5, - 6, 5, 5, 7, 5, 14, 14, 5, - 14, 14, 13, 15, 14, 15, 5, 1, - 5, 15, 15, 7, 6, 5, 14, 6, - 5, 5, 7, 5, 14, 9, 5, 14, - 14, 13, 15, 14, 15, 5, 1, 5, - 15, 15, 7, 6, 5, 14, 6, 5, - 5, 7, 5, 16, 14, 16, 9, 5, - 1, 5, 15, 7, 5, 5, 1, 5, - 15 + 1, 10, 9, 9, 1, 10, 10, 10, + 1, 9, 9, 1, 10, 10, 10, 10, + 1, 9, 9, 1, 10, 10, 10, 1, + 9, 9, 1, 10, 10, 9, 1, 18, + 14, 14, 13, 15, 5, 5, 1, 5, + 15, 15, 15, 11, 10, 9, 9, 10, + 5, 7, 5, 14, 14, 14, 14, 13, + 15, 14, 14, 13, 15, 5, 1, 5, + 15, 15, 11, 10, 9, 9, 10, 5, + 5, 7, 5, 14, 14, 10, 14, 14, + 13, 15, 14, 15, 5, 1, 5, 15, + 15, 11, 10, 9, 9, 14, 10, 5, + 5, 7, 5, 14, 10, 10, 14, 14, + 13, 15, 14, 15, 5, 1, 5, 15, + 15, 11, 10, 9, 9, 14, 10, 5, + 5, 7, 5, 16, 14, 16, 10, 9, + 9, 1, 5, 15, 7, 5, 5, 1, + 5, 15 }; static const short _indic_syllable_machine_index_offsets[] = { - 0, 2, 8, 12, 17, 23, 33, 39, - 41, 45, 50, 56, 66, 76, 86, 88, - 92, 97, 103, 109, 119, 121, 125, 130, - 136, 142, 147, 149, 168, 183, 198, 212, - 228, 234, 240, 242, 248, 264, 280, 296, - 304, 311, 317, 324, 330, 338, 344, 359, - 374, 389, 404, 418, 434, 449, 464, 478, - 494, 500, 502, 508, 524, 540, 548, 555, - 561, 568, 574, 580, 588, 594, 609, 624, - 630, 645, 660, 674, 690, 705, 721, 727, - 729, 735, 751, 767, 775, 782, 788, 803, - 810, 816, 822, 830, 836, 851, 861, 867, - 882, 897, 911, 927, 942, 958, 964, 966, - 972, 988, 1004, 1012, 1019, 1025, 1040, 1047, - 1053, 1059, 1067, 1073, 1090, 1105, 1122, 1132, - 1138, 1140, 1146, 1162, 1170, 1176, 1182, 1184, - 1190 + 0, 2, 13, 23, 33, 35, 46, 57, + 68, 70, 80, 90, 92, 103, 114, 125, + 136, 138, 148, 158, 160, 171, 182, 193, + 195, 205, 215, 217, 228, 239, 249, 251, + 270, 285, 300, 314, 330, 336, 342, 344, + 350, 366, 382, 398, 410, 421, 431, 441, + 452, 458, 466, 472, 487, 502, 517, 532, + 546, 562, 577, 592, 606, 622, 628, 630, + 636, 652, 668, 680, 691, 701, 711, 722, + 728, 734, 742, 748, 763, 778, 789, 804, + 819, 833, 849, 864, 880, 886, 888, 894, + 910, 926, 938, 949, 959, 969, 984, 995, + 1001, 1007, 1015, 1021, 1036, 1047, 1058, 1073, + 1088, 1102, 1118, 1133, 1149, 1155, 1157, 1163, + 1179, 1195, 1207, 1218, 1228, 1238, 1253, 1264, + 1270, 1276, 1284, 1290, 1307, 1322, 1339, 1350, + 1360, 1370, 1372, 1378, 1394, 1402, 1408, 1414, + 1416, 1422 }; static const unsigned char _indic_syllable_machine_indicies[] = { - 1, 0, 2, 3, 3, 4, 1, 0, - 3, 3, 4, 0, 3, 3, 4, 1, - 0, 5, 3, 3, 4, 1, 0, 2, - 3, 3, 4, 1, 0, 0, 0, 6, - 0, 8, 9, 9, 10, 11, 7, 11, - 7, 9, 9, 10, 7, 9, 9, 10, - 11, 7, 12, 9, 9, 10, 11, 7, - 8, 9, 9, 10, 11, 7, 7, 7, - 13, 7, 8, 9, 9, 10, 11, 7, - 7, 7, 14, 7, 16, 17, 17, 18, - 19, 15, 15, 15, 20, 15, 19, 15, - 17, 17, 18, 21, 17, 17, 18, 19, - 15, 16, 17, 17, 18, 19, 15, 22, - 17, 17, 18, 19, 15, 24, 25, 25, - 26, 27, 23, 23, 23, 28, 23, 27, - 23, 25, 25, 26, 23, 25, 25, 26, - 27, 23, 24, 25, 25, 26, 27, 23, - 29, 25, 25, 26, 27, 23, 17, 17, - 18, 1, 0, 31, 30, 33, 34, 35, - 36, 37, 38, 18, 19, 39, 40, 40, - 20, 32, 41, 42, 43, 44, 45, 32, - 47, 48, 49, 50, 4, 1, 51, 46, - 46, 6, 46, 46, 46, 52, 46, 53, - 48, 54, 54, 4, 1, 51, 46, 46, - 46, 46, 46, 46, 52, 46, 48, 54, - 54, 4, 1, 51, 46, 46, 46, 46, - 46, 46, 52, 46, 33, 46, 46, 46, - 55, 56, 46, 1, 51, 46, 46, 46, - 46, 46, 33, 46, 57, 57, 46, 1, - 51, 46, 51, 46, 46, 58, 51, 46, - 51, 46, 51, 46, 46, 46, 51, 46, - 33, 46, 59, 46, 57, 57, 46, 1, - 51, 46, 46, 46, 46, 46, 33, 46, - 33, 46, 46, 46, 57, 57, 46, 1, - 51, 46, 46, 46, 46, 46, 33, 46, - 33, 46, 46, 46, 57, 56, 46, 1, - 51, 46, 46, 46, 46, 46, 33, 46, - 60, 61, 62, 62, 4, 1, 51, 46, - 61, 62, 62, 4, 1, 51, 46, 62, - 62, 4, 1, 51, 46, 63, 64, 64, - 4, 1, 51, 46, 55, 65, 46, 1, - 51, 46, 55, 46, 57, 57, 46, 1, - 51, 46, 57, 65, 46, 1, 51, 46, - 47, 48, 54, 54, 4, 1, 51, 46, - 46, 46, 46, 46, 46, 52, 46, 47, - 48, 49, 54, 4, 1, 51, 46, 46, - 6, 46, 46, 46, 52, 46, 67, 68, - 69, 70, 10, 11, 71, 66, 66, 14, - 66, 66, 66, 72, 66, 73, 68, 74, - 70, 10, 11, 71, 66, 66, 66, 66, - 66, 66, 72, 66, 68, 74, 70, 10, - 11, 71, 66, 66, 66, 66, 66, 66, - 72, 66, 75, 66, 66, 66, 76, 77, - 66, 11, 71, 66, 66, 66, 66, 66, - 75, 66, 78, 68, 79, 80, 10, 11, - 71, 66, 66, 13, 66, 66, 66, 72, - 66, 81, 68, 74, 74, 10, 11, 71, - 66, 66, 66, 66, 66, 66, 72, 66, - 68, 74, 74, 10, 11, 71, 66, 66, - 66, 66, 66, 66, 72, 66, 75, 66, - 66, 66, 82, 77, 66, 11, 71, 66, - 66, 66, 66, 66, 75, 66, 71, 66, - 66, 83, 71, 66, 71, 66, 71, 66, - 66, 66, 71, 66, 75, 66, 84, 66, - 82, 82, 66, 11, 71, 66, 66, 66, - 66, 66, 75, 66, 75, 66, 66, 66, - 82, 82, 66, 11, 71, 66, 66, 66, - 66, 66, 75, 66, 85, 86, 87, 87, - 10, 11, 71, 66, 86, 87, 87, 10, - 11, 71, 66, 87, 87, 10, 11, 71, - 66, 88, 89, 89, 10, 11, 71, 66, - 76, 90, 66, 11, 71, 66, 82, 82, - 66, 11, 71, 66, 76, 66, 82, 82, - 66, 11, 71, 66, 82, 90, 66, 11, - 71, 66, 78, 68, 74, 74, 10, 11, - 71, 66, 66, 66, 66, 66, 66, 72, - 66, 78, 68, 79, 74, 10, 11, 71, - 66, 66, 13, 66, 66, 66, 72, 66, - 8, 9, 9, 10, 11, 66, 67, 68, - 74, 70, 10, 11, 71, 66, 66, 66, - 66, 66, 66, 72, 66, 92, 36, 93, - 93, 18, 19, 39, 91, 91, 91, 91, - 91, 91, 43, 91, 36, 93, 93, 18, - 19, 39, 91, 91, 91, 91, 91, 91, - 43, 91, 94, 91, 91, 91, 95, 96, - 91, 19, 39, 91, 91, 91, 91, 91, - 94, 91, 35, 36, 97, 98, 18, 19, - 39, 91, 91, 20, 91, 91, 91, 43, - 91, 94, 91, 91, 91, 99, 96, 91, - 19, 39, 91, 91, 91, 91, 91, 94, - 91, 39, 91, 91, 100, 39, 91, 39, - 91, 39, 91, 91, 91, 39, 91, 94, - 91, 101, 91, 99, 99, 91, 19, 39, - 91, 91, 91, 91, 91, 94, 91, 94, - 91, 91, 91, 99, 99, 91, 19, 39, - 91, 91, 91, 91, 91, 94, 91, 102, - 103, 104, 104, 18, 19, 39, 91, 103, - 104, 104, 18, 19, 39, 91, 104, 104, - 18, 19, 39, 91, 35, 36, 93, 93, - 18, 19, 39, 91, 91, 91, 91, 91, - 91, 43, 91, 105, 106, 106, 18, 19, - 39, 91, 95, 107, 91, 19, 39, 91, - 99, 99, 91, 19, 39, 91, 95, 91, - 99, 99, 91, 19, 39, 91, 99, 107, - 91, 19, 39, 91, 35, 36, 97, 93, - 18, 19, 39, 91, 91, 20, 91, 91, - 91, 43, 91, 16, 17, 17, 18, 19, - 108, 108, 108, 20, 108, 16, 17, 17, - 18, 19, 108, 110, 111, 112, 113, 26, - 27, 114, 109, 109, 28, 109, 109, 109, - 115, 109, 116, 111, 113, 113, 26, 27, - 114, 109, 109, 109, 109, 109, 109, 115, - 109, 111, 113, 113, 26, 27, 114, 109, - 109, 109, 109, 109, 109, 115, 109, 117, - 109, 109, 109, 118, 119, 109, 27, 114, - 109, 109, 109, 109, 109, 117, 109, 110, - 111, 112, 40, 26, 27, 114, 109, 109, - 28, 109, 109, 109, 115, 109, 117, 109, - 109, 109, 120, 119, 109, 27, 114, 109, - 109, 109, 109, 109, 117, 109, 114, 109, - 109, 121, 114, 109, 114, 109, 114, 109, - 109, 109, 114, 109, 117, 109, 122, 109, - 120, 120, 109, 27, 114, 109, 109, 109, - 109, 109, 117, 109, 117, 109, 109, 109, - 120, 120, 109, 27, 114, 109, 109, 109, - 109, 109, 117, 109, 123, 124, 125, 125, - 26, 27, 114, 109, 124, 125, 125, 26, - 27, 114, 109, 125, 125, 26, 27, 114, - 109, 110, 111, 113, 113, 26, 27, 114, - 109, 109, 109, 109, 109, 109, 115, 109, - 126, 127, 127, 26, 27, 114, 109, 118, - 128, 109, 27, 114, 109, 120, 120, 109, - 27, 114, 109, 118, 109, 120, 120, 109, - 27, 114, 109, 120, 128, 109, 27, 114, - 109, 33, 34, 35, 36, 97, 93, 18, - 19, 39, 40, 40, 20, 91, 91, 33, - 43, 91, 47, 129, 49, 50, 4, 1, - 51, 46, 46, 6, 46, 46, 46, 52, - 46, 33, 34, 35, 36, 130, 131, 18, - 132, 133, 46, 40, 20, 46, 46, 33, - 43, 46, 16, 134, 134, 18, 132, 51, - 46, 46, 20, 46, 133, 46, 46, 135, - 133, 46, 133, 46, 133, 46, 46, 46, - 133, 46, 33, 46, 59, 16, 134, 134, - 18, 132, 51, 46, 46, 46, 46, 46, - 33, 46, 137, 136, 138, 138, 136, 31, - 139, 136, 138, 138, 136, 31, 139, 136, - 139, 136, 136, 140, 139, 136, 139, 136, - 139, 136, 136, 136, 139, 136, 33, 108, - 108, 108, 108, 108, 108, 108, 108, 40, - 108, 108, 108, 108, 33, 108, 0 + 1, 0, 2, 3, 3, 4, 5, 0, + 0, 0, 0, 4, 0, 3, 3, 4, + 6, 0, 0, 0, 0, 4, 0, 3, + 3, 4, 5, 0, 0, 0, 0, 4, + 0, 4, 0, 7, 3, 3, 4, 5, + 0, 0, 0, 0, 4, 0, 2, 3, + 3, 4, 5, 0, 0, 0, 8, 4, + 0, 10, 11, 11, 12, 13, 9, 9, + 9, 9, 12, 9, 14, 9, 11, 11, + 12, 15, 9, 9, 9, 9, 12, 9, + 11, 11, 12, 13, 9, 9, 9, 9, + 12, 9, 12, 9, 16, 11, 11, 12, + 13, 9, 9, 9, 9, 12, 9, 10, + 11, 11, 12, 13, 9, 9, 9, 17, + 12, 9, 10, 11, 11, 12, 13, 9, + 9, 9, 18, 12, 9, 20, 21, 21, + 22, 23, 19, 19, 19, 24, 22, 19, + 25, 19, 21, 21, 22, 27, 26, 26, + 26, 26, 22, 26, 21, 21, 22, 23, + 19, 19, 19, 19, 22, 19, 22, 26, + 20, 21, 21, 22, 23, 19, 19, 19, + 19, 22, 19, 28, 21, 21, 22, 23, + 19, 19, 19, 19, 22, 19, 30, 31, + 31, 32, 33, 29, 29, 29, 34, 32, + 29, 35, 29, 31, 31, 32, 36, 29, + 29, 29, 29, 32, 29, 31, 31, 32, + 33, 29, 29, 29, 29, 32, 29, 32, + 29, 30, 31, 31, 32, 33, 29, 29, + 29, 29, 32, 29, 37, 31, 31, 32, + 33, 29, 29, 29, 29, 32, 29, 21, + 21, 22, 38, 0, 0, 0, 0, 22, + 0, 40, 39, 42, 43, 44, 45, 46, + 47, 22, 23, 48, 49, 49, 24, 22, + 50, 51, 52, 53, 54, 41, 56, 57, + 58, 59, 4, 5, 60, 55, 55, 8, + 4, 55, 55, 61, 55, 62, 57, 63, + 63, 4, 5, 60, 55, 55, 55, 4, + 55, 55, 61, 55, 57, 63, 63, 4, + 5, 60, 55, 55, 55, 4, 55, 55, + 61, 55, 42, 55, 55, 55, 64, 65, + 55, 1, 60, 55, 55, 55, 55, 55, + 42, 55, 66, 66, 55, 1, 60, 55, + 60, 55, 55, 67, 60, 55, 60, 55, + 60, 55, 55, 55, 60, 55, 42, 55, + 68, 55, 66, 66, 55, 1, 60, 55, + 55, 55, 55, 55, 42, 55, 42, 55, + 55, 55, 66, 66, 55, 1, 60, 55, + 55, 55, 55, 55, 42, 55, 42, 55, + 55, 55, 66, 65, 55, 1, 60, 55, + 55, 55, 55, 55, 42, 55, 69, 70, + 71, 71, 4, 5, 60, 55, 55, 55, + 4, 55, 70, 71, 71, 4, 5, 60, + 55, 55, 55, 4, 55, 71, 71, 4, + 5, 60, 55, 55, 55, 4, 55, 60, + 55, 55, 67, 60, 55, 55, 55, 4, + 55, 72, 73, 73, 4, 5, 60, 55, + 55, 55, 4, 55, 64, 74, 55, 1, + 60, 55, 64, 55, 66, 66, 55, 1, + 60, 55, 66, 74, 55, 1, 60, 55, + 56, 57, 63, 63, 4, 5, 60, 55, + 55, 55, 4, 55, 55, 61, 55, 56, + 57, 58, 63, 4, 5, 60, 55, 55, + 8, 4, 55, 55, 61, 55, 76, 77, + 78, 79, 12, 13, 80, 75, 75, 18, + 12, 75, 75, 81, 75, 82, 77, 83, + 79, 12, 13, 80, 75, 75, 75, 12, + 75, 75, 81, 75, 77, 83, 79, 12, + 13, 80, 75, 75, 75, 12, 75, 75, + 81, 75, 84, 75, 75, 75, 85, 86, + 75, 14, 80, 75, 75, 75, 75, 75, + 84, 75, 87, 77, 88, 89, 12, 13, + 80, 75, 75, 17, 12, 75, 75, 81, + 75, 90, 77, 83, 83, 12, 13, 80, + 75, 75, 75, 12, 75, 75, 81, 75, + 77, 83, 83, 12, 13, 80, 75, 75, + 75, 12, 75, 75, 81, 75, 84, 75, + 75, 75, 91, 86, 75, 14, 80, 75, + 75, 75, 75, 75, 84, 75, 80, 75, + 75, 92, 80, 75, 80, 75, 80, 75, + 75, 75, 80, 75, 84, 75, 93, 75, + 91, 91, 75, 14, 80, 75, 75, 75, + 75, 75, 84, 75, 84, 75, 75, 75, + 91, 91, 75, 14, 80, 75, 75, 75, + 75, 75, 84, 75, 94, 95, 96, 96, + 12, 13, 80, 75, 75, 75, 12, 75, + 95, 96, 96, 12, 13, 80, 75, 75, + 75, 12, 75, 96, 96, 12, 13, 80, + 75, 75, 75, 12, 75, 80, 75, 75, + 92, 80, 75, 75, 75, 12, 75, 97, + 98, 98, 12, 13, 80, 75, 75, 75, + 12, 75, 85, 99, 75, 14, 80, 75, + 91, 91, 75, 14, 80, 75, 85, 75, + 91, 91, 75, 14, 80, 75, 91, 99, + 75, 14, 80, 75, 87, 77, 83, 83, + 12, 13, 80, 75, 75, 75, 12, 75, + 75, 81, 75, 87, 77, 88, 83, 12, + 13, 80, 75, 75, 17, 12, 75, 75, + 81, 75, 10, 11, 11, 12, 13, 75, + 75, 75, 75, 12, 75, 76, 77, 83, + 79, 12, 13, 80, 75, 75, 75, 12, + 75, 75, 81, 75, 101, 45, 102, 102, + 22, 23, 48, 100, 100, 100, 22, 100, + 100, 52, 100, 45, 102, 102, 22, 23, + 48, 100, 100, 100, 22, 100, 100, 52, + 100, 103, 100, 100, 100, 104, 105, 100, + 25, 48, 100, 100, 100, 100, 100, 103, + 100, 44, 45, 106, 107, 22, 23, 48, + 100, 100, 24, 22, 100, 100, 52, 100, + 103, 100, 100, 100, 108, 105, 100, 25, + 48, 100, 100, 100, 100, 100, 103, 100, + 48, 100, 100, 109, 48, 100, 48, 100, + 48, 100, 100, 100, 48, 100, 103, 100, + 110, 100, 108, 108, 100, 25, 48, 100, + 100, 100, 100, 100, 103, 100, 103, 100, + 100, 100, 108, 108, 100, 25, 48, 100, + 100, 100, 100, 100, 103, 100, 111, 112, + 113, 113, 22, 23, 48, 100, 100, 100, + 22, 100, 112, 113, 113, 22, 23, 48, + 100, 100, 100, 22, 100, 113, 113, 22, + 23, 48, 100, 100, 100, 22, 100, 48, + 100, 100, 109, 48, 100, 100, 100, 22, + 100, 44, 45, 102, 102, 22, 23, 48, + 100, 100, 100, 22, 100, 100, 52, 100, + 114, 115, 115, 22, 23, 48, 100, 100, + 100, 22, 100, 104, 116, 100, 25, 48, + 100, 108, 108, 100, 25, 48, 100, 104, + 100, 108, 108, 100, 25, 48, 100, 108, + 116, 100, 25, 48, 100, 44, 45, 106, + 102, 22, 23, 48, 100, 100, 24, 22, + 100, 100, 52, 100, 20, 21, 21, 22, + 23, 117, 117, 117, 24, 22, 117, 20, + 21, 21, 22, 23, 117, 117, 117, 117, + 22, 117, 119, 120, 121, 122, 32, 33, + 123, 118, 118, 34, 32, 118, 118, 124, + 118, 125, 120, 122, 122, 32, 33, 123, + 118, 118, 118, 32, 118, 118, 124, 118, + 120, 122, 122, 32, 33, 123, 118, 118, + 118, 32, 118, 118, 124, 118, 126, 118, + 118, 118, 127, 128, 118, 35, 123, 118, + 118, 118, 118, 118, 126, 118, 119, 120, + 121, 49, 32, 33, 123, 118, 118, 34, + 32, 118, 118, 124, 118, 126, 118, 118, + 118, 129, 128, 118, 35, 123, 118, 118, + 118, 118, 118, 126, 118, 123, 118, 118, + 130, 123, 118, 123, 118, 123, 118, 118, + 118, 123, 118, 126, 118, 131, 118, 129, + 129, 118, 35, 123, 118, 118, 118, 118, + 118, 126, 118, 126, 118, 118, 118, 129, + 129, 118, 35, 123, 118, 118, 118, 118, + 118, 126, 118, 132, 133, 134, 134, 32, + 33, 123, 118, 118, 118, 32, 118, 133, + 134, 134, 32, 33, 123, 118, 118, 118, + 32, 118, 134, 134, 32, 33, 123, 118, + 118, 118, 32, 118, 123, 118, 118, 130, + 123, 118, 118, 118, 32, 118, 119, 120, + 122, 122, 32, 33, 123, 118, 118, 118, + 32, 118, 118, 124, 118, 135, 136, 136, + 32, 33, 123, 118, 118, 118, 32, 118, + 127, 137, 118, 35, 123, 118, 129, 129, + 118, 35, 123, 118, 127, 118, 129, 129, + 118, 35, 123, 118, 129, 137, 118, 35, + 123, 118, 42, 43, 44, 45, 106, 102, + 22, 23, 48, 49, 49, 24, 22, 100, + 42, 52, 100, 56, 138, 58, 59, 4, + 5, 60, 55, 55, 8, 4, 55, 55, + 61, 55, 42, 43, 44, 45, 139, 140, + 22, 141, 142, 55, 49, 24, 22, 55, + 42, 52, 55, 20, 143, 143, 22, 141, + 60, 55, 55, 24, 22, 55, 60, 55, + 55, 67, 60, 55, 55, 55, 22, 55, + 142, 55, 55, 144, 142, 55, 55, 55, + 22, 55, 142, 55, 142, 55, 55, 55, + 142, 55, 42, 55, 68, 20, 143, 143, + 22, 141, 60, 55, 55, 55, 22, 55, + 42, 55, 146, 145, 147, 147, 145, 40, + 148, 145, 147, 147, 145, 40, 148, 145, + 148, 145, 145, 149, 148, 145, 148, 145, + 148, 145, 145, 145, 148, 145, 42, 117, + 117, 117, 117, 117, 117, 117, 117, 49, + 117, 117, 117, 117, 42, 117, 0 }; static const unsigned char _indic_syllable_machine_trans_targs[] = { - 27, 33, 38, 2, 39, 45, 46, 27, - 55, 8, 61, 56, 68, 69, 72, 27, - 77, 15, 83, 78, 86, 27, 91, 27, - 100, 21, 106, 101, 109, 114, 27, 125, - 27, 28, 48, 73, 75, 93, 94, 79, - 95, 115, 116, 87, 123, 128, 27, 29, - 31, 5, 47, 34, 42, 30, 1, 32, - 36, 0, 35, 37, 40, 41, 3, 43, - 4, 44, 27, 49, 51, 12, 71, 57, - 64, 50, 6, 52, 66, 59, 53, 11, - 70, 54, 7, 58, 60, 62, 63, 9, - 65, 10, 67, 27, 74, 17, 76, 89, - 81, 13, 92, 14, 80, 82, 84, 85, - 16, 88, 18, 90, 27, 27, 96, 98, - 19, 23, 102, 110, 97, 99, 112, 104, - 20, 103, 105, 107, 108, 22, 111, 24, - 113, 117, 118, 122, 119, 120, 25, 121, - 27, 124, 26, 126, 127 + 31, 37, 42, 2, 43, 46, 4, 50, + 51, 31, 60, 9, 66, 69, 61, 11, + 74, 75, 78, 31, 83, 17, 89, 92, + 93, 84, 31, 19, 98, 31, 107, 24, + 113, 116, 117, 108, 26, 122, 127, 31, + 134, 31, 32, 53, 79, 81, 100, 101, + 85, 102, 123, 124, 94, 132, 137, 31, + 33, 35, 6, 52, 38, 47, 34, 1, + 36, 40, 0, 39, 41, 44, 45, 3, + 48, 5, 49, 31, 54, 56, 14, 77, + 62, 70, 55, 7, 57, 72, 64, 58, + 13, 76, 59, 8, 63, 65, 67, 68, + 10, 71, 12, 73, 31, 80, 20, 82, + 96, 87, 15, 99, 16, 86, 88, 90, + 91, 18, 95, 21, 97, 31, 31, 103, + 105, 22, 27, 109, 118, 104, 106, 120, + 111, 23, 110, 112, 114, 115, 25, 119, + 28, 121, 125, 126, 131, 128, 129, 29, + 130, 31, 133, 30, 135, 136 }; static const char _indic_syllable_machine_trans_actions[] = { - 1, 0, 2, 0, 2, 2, 2, 3, - 2, 0, 2, 0, 2, 2, 2, 4, - 2, 0, 5, 0, 5, 6, 2, 7, - 2, 0, 2, 0, 2, 2, 8, 0, - 11, 2, 2, 5, 0, 12, 12, 0, - 2, 5, 2, 5, 2, 0, 13, 2, - 0, 0, 2, 0, 2, 2, 0, 2, - 2, 0, 0, 2, 2, 2, 0, 0, - 0, 2, 14, 2, 0, 0, 2, 0, - 2, 2, 0, 2, 2, 2, 2, 0, + 1, 0, 2, 0, 2, 0, 0, 2, + 2, 3, 2, 0, 2, 0, 0, 0, + 2, 2, 2, 4, 2, 0, 5, 0, + 5, 0, 6, 0, 2, 7, 2, 0, + 2, 0, 2, 0, 0, 2, 0, 8, + 0, 11, 2, 2, 5, 0, 12, 12, + 0, 2, 5, 2, 5, 2, 0, 13, + 2, 0, 0, 2, 0, 2, 2, 0, 2, 2, 0, 0, 2, 2, 2, 0, - 0, 0, 2, 15, 5, 0, 5, 2, - 2, 0, 5, 0, 0, 2, 5, 5, - 0, 0, 0, 2, 16, 17, 2, 0, - 0, 0, 0, 2, 2, 2, 2, 2, - 0, 0, 2, 2, 2, 0, 0, 0, - 2, 0, 18, 18, 0, 0, 0, 0, - 19, 2, 0, 0, 0 + 0, 0, 2, 14, 2, 0, 0, 2, + 0, 2, 2, 0, 2, 2, 2, 2, + 0, 2, 2, 0, 0, 2, 2, 2, + 0, 0, 0, 2, 15, 5, 0, 5, + 2, 2, 0, 5, 0, 0, 2, 5, + 5, 0, 0, 0, 2, 16, 17, 2, + 0, 0, 0, 0, 2, 2, 2, 2, + 2, 0, 0, 2, 2, 2, 0, 0, + 0, 2, 0, 18, 18, 0, 0, 0, + 0, 19, 2, 0, 0, 0 }; static const char _indic_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 9, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -349,14 +384,16 @@ static const char _indic_syllable_machine_to_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 + 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0 }; static const char _indic_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -369,41 +406,42 @@ static const char _indic_syllable_machine_from_state_actions[] = { 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0 + 0, 0 }; static const short _indic_syllable_machine_eof_trans[] = { - 1, 1, 1, 1, 1, 1, 8, 8, - 8, 8, 8, 8, 8, 16, 16, 22, - 16, 16, 16, 24, 24, 24, 24, 24, - 24, 1, 31, 0, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 67, - 67, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, - 92, 92, 92, 92, 92, 109, 109, 110, - 110, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 110, 110, 110, 110, 110, - 110, 110, 110, 92, 47, 47, 47, 47, - 47, 47, 47, 137, 137, 137, 137, 137, - 109 + 1, 1, 1, 1, 1, 1, 1, 10, + 10, 10, 10, 10, 10, 10, 10, 20, + 20, 27, 20, 27, 20, 20, 30, 30, + 30, 30, 30, 30, 30, 1, 40, 0, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 56, 56, 56, + 56, 56, 56, 56, 56, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 76, + 76, 76, 76, 76, 76, 76, 76, 101, + 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 101, 101, 101, 101, + 101, 101, 101, 101, 118, 118, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 119, 119, 119, 119, 119, + 119, 119, 119, 101, 56, 56, 56, 56, + 56, 56, 56, 56, 146, 146, 146, 146, + 146, 118 }; -static const int indic_syllable_machine_start = 27; -static const int indic_syllable_machine_first_final = 27; +static const int indic_syllable_machine_start = 31; +static const int indic_syllable_machine_first_final = 31; static const int indic_syllable_machine_error = -1; -static const int indic_syllable_machine_en_main = 27; +static const int indic_syllable_machine_en_main = 31; #line 58 "hb-ot-shaper-indic-machine.rl" -#line 117 "hb-ot-shaper-indic-machine.rl" +#line 118 "hb-ot-shaper-indic-machine.rl" #define found_syllable(syllable_type) \ @@ -412,7 +450,7 @@ static const int indic_syllable_machine_en_main = 27; for (unsigned int i = ts; i < te; i++) \ info[i].syllable() = (syllable_serial << 4) | syllable_type; \ syllable_serial++; \ - if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ + if (syllable_serial == 16) syllable_serial = 1; \ } HB_STMT_END inline void @@ -422,7 +460,7 @@ find_syllables_indic (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 426 "hb-ot-shaper-indic-machine.hh" +#line 453 "hb-ot-shaper-indic-machine.hh" { cs = indic_syllable_machine_start; ts = 0; @@ -430,7 +468,7 @@ find_syllables_indic (hb_buffer_t *buffer) act = 0; } -#line 137 "hb-ot-shaper-indic-machine.rl" +#line 138 "hb-ot-shaper-indic-machine.rl" p = 0; @@ -438,7 +476,7 @@ find_syllables_indic (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 442 "hb-ot-shaper-indic-machine.hh" +#line 465 "hb-ot-shaper-indic-machine.hh" { int _slen; int _trans; @@ -452,7 +490,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 456 "hb-ot-shaper-indic-machine.hh" +#line 477 "hb-ot-shaper-indic-machine.hh" } _keys = _indic_syllable_machine_trans_keys + (cs<<1); @@ -475,51 +513,51 @@ _eof_trans: {te = p+1;} break; case 11: -#line 113 "hb-ot-shaper-indic-machine.rl" +#line 114 "hb-ot-shaper-indic-machine.rl" {te = p+1;{ found_syllable (indic_non_indic_cluster); }} break; case 13: -#line 108 "hb-ot-shaper-indic-machine.rl" +#line 109 "hb-ot-shaper-indic-machine.rl" {te = p;p--;{ found_syllable (indic_consonant_syllable); }} break; case 14: -#line 109 "hb-ot-shaper-indic-machine.rl" +#line 110 "hb-ot-shaper-indic-machine.rl" {te = p;p--;{ found_syllable (indic_vowel_syllable); }} break; case 17: -#line 110 "hb-ot-shaper-indic-machine.rl" +#line 111 "hb-ot-shaper-indic-machine.rl" {te = p;p--;{ found_syllable (indic_standalone_cluster); }} break; case 19: -#line 111 "hb-ot-shaper-indic-machine.rl" +#line 112 "hb-ot-shaper-indic-machine.rl" {te = p;p--;{ found_syllable (indic_symbol_cluster); }} break; case 15: -#line 112 "hb-ot-shaper-indic-machine.rl" +#line 113 "hb-ot-shaper-indic-machine.rl" {te = p;p--;{ found_syllable (indic_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} break; case 16: -#line 113 "hb-ot-shaper-indic-machine.rl" +#line 114 "hb-ot-shaper-indic-machine.rl" {te = p;p--;{ found_syllable (indic_non_indic_cluster); }} break; case 1: -#line 108 "hb-ot-shaper-indic-machine.rl" +#line 109 "hb-ot-shaper-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (indic_consonant_syllable); }} break; case 3: -#line 109 "hb-ot-shaper-indic-machine.rl" +#line 110 "hb-ot-shaper-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (indic_vowel_syllable); }} break; case 7: -#line 110 "hb-ot-shaper-indic-machine.rl" +#line 111 "hb-ot-shaper-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (indic_standalone_cluster); }} break; case 8: -#line 111 "hb-ot-shaper-indic-machine.rl" +#line 112 "hb-ot-shaper-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (indic_symbol_cluster); }} break; case 4: -#line 112 "hb-ot-shaper-indic-machine.rl" +#line 113 "hb-ot-shaper-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (indic_broken_cluster); buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE; }} break; case 6: @@ -540,19 +578,19 @@ _eof_trans: case 18: #line 1 "NONE" {te = p+1;} -#line 108 "hb-ot-shaper-indic-machine.rl" +#line 109 "hb-ot-shaper-indic-machine.rl" {act = 1;} break; case 5: #line 1 "NONE" {te = p+1;} -#line 112 "hb-ot-shaper-indic-machine.rl" +#line 113 "hb-ot-shaper-indic-machine.rl" {act = 5;} break; case 12: #line 1 "NONE" {te = p+1;} -#line 113 "hb-ot-shaper-indic-machine.rl" +#line 114 "hb-ot-shaper-indic-machine.rl" {act = 6;} break; #line 559 "hb-ot-shaper-indic-machine.hh" @@ -564,7 +602,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 568 "hb-ot-shaper-indic-machine.hh" +#line 566 "hb-ot-shaper-indic-machine.hh" } if ( ++p != pe ) @@ -580,7 +618,7 @@ _again: } -#line 145 "hb-ot-shaper-indic-machine.rl" +#line 146 "hb-ot-shaper-indic-machine.rl" } diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-indic-table.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-indic-table.cc index bf6a2757bb..d9fb0510e4 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-indic-table.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-indic-table.cc @@ -42,6 +42,7 @@ #define OT_PLACEHOLDER I_Cat(PLACEHOLDER) #define OT_DOTTEDCIRCLE I_Cat(DOTTEDCIRCLE) #define OT_RS I_Cat(RS) +#define OT_MPst I_Cat(MPst) #define OT_Repha I_Cat(Repha) #define OT_Ra I_Cat(Ra) #define OT_CM I_Cat(CM) @@ -80,9 +81,10 @@ static_assert (OT_VPst == M_Cat(VPst), ""); #define _OT_CS OT_CS /* 2 chars; CS */ #define _OT_DC OT_DOTTEDCIRCLE /* 1 chars; DOTTEDCIRCLE */ #define _OT_H OT_H /* 11 chars; H */ -#define _OT_M OT_M /* 143 chars; M */ +#define _OT_M OT_M /* 142 chars; M */ #define _OT_MH OT_MH /* 1 chars; MH */ #define _OT_ML OT_ML /* 1 chars; ML */ +#define _OT_MP OT_MPst /* 1 chars; MPst */ #define _OT_MR OT_MR /* 1 chars; MR */ #define _OT_MW OT_MW /* 2 chars; MW */ #define _OT_MY OT_MY /* 3 chars; MY */ @@ -200,7 +202,7 @@ static const uint16_t indic_table[] = { /* 0A28 */ _(C,C), _(X,X), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), _(C,C), /* 0A30 */ _(R,C), _(X,X), _(C,C), _(C,C), _(X,X), _(C,C), _(C,C), _(X,X), /* 0A38 */ _(C,C), _(C,C), _(X,X), _(X,X), _(N,X), _(X,X), _(M,AP), _(M,LM), - /* 0A40 */ _(M,AP), _(M,AP), _(M,AP), _(X,X), _(X,X), _(X,X), _(X,X), _(M,AP), + /* 0A40 */_(MP,AP), _(M,AP), _(M,AP), _(X,X), _(X,X), _(X,X), _(X,X), _(M,AP), /* 0A48 */ _(M,AP), _(X,X), _(X,X), _(M,AP), _(M,AP), _(H,B), _(X,X), _(X,X), /* 0A50 */ _(X,X), _(M,B), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), /* 0A58 */ _(X,X), _(C,C), _(C,C), _(C,C), _(C,C), _(X,X), _(C,C), _(X,X), @@ -451,15 +453,12 @@ static const uint16_t indic_table[] = { /* Grantha */ /* 11300 */ _(X,X),_(SM,SM),_(SM,SM),_(SM,SM), _(X,X), _(X,X), _(X,X), _(X,X), - /* 11308 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), - /* 11310 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), - /* 11318 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), - /* 11320 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), - /* 11328 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), - /* 11330 */ _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), _(X,X), + +#define indic_offset_0x11338u 1720 + /* 11338 */ _(X,X), _(X,X), _(X,X), _(N,X), _(N,X), _(X,X), _(X,X), _(X,X), -}; /* Table items: 1776; occupancy: 69% */ +}; /* Table items: 1728; occupancy: 71% */ uint16_t hb_indic_get_categories (hb_codepoint_t u) @@ -497,7 +496,8 @@ hb_indic_get_categories (hb_codepoint_t u) break; case 0x11u: - if (hb_in_range<hb_codepoint_t> (u, 0x11300u, 0x1133Fu)) return indic_table[u - 0x11300u + indic_offset_0x11300u]; + if (hb_in_range<hb_codepoint_t> (u, 0x11300u, 0x11307u)) return indic_table[u - 0x11300u + indic_offset_0x11300u]; + if (hb_in_range<hb_codepoint_t> (u, 0x11338u, 0x1133Fu)) return indic_table[u - 0x11338u + indic_offset_0x11338u]; break; default: @@ -519,6 +519,7 @@ hb_indic_get_categories (hb_codepoint_t u) #undef _OT_M #undef _OT_MH #undef _OT_ML +#undef _OT_MP #undef _OT_MR #undef _OT_MW #undef _OT_MY diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-indic.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-indic.cc index 55509c1101..7652210d9d 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-indic.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-indic.cc @@ -223,15 +223,15 @@ enum { INDIC_BASIC_FEATURES = INDIC_INIT, /* Don't forget to update this! */ }; -static void +static bool setup_syllables_indic (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); -static void +static bool initial_reordering_indic (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); -static void +static bool final_reordering_indic (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); @@ -413,7 +413,7 @@ setup_masks_indic (const hb_ot_shape_plan_t *plan HB_UNUSED, set_indic_properties (info[i]); } -static void +static bool setup_syllables_indic (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) @@ -422,6 +422,7 @@ setup_syllables_indic (const hb_ot_shape_plan_t *plan HB_UNUSED, find_syllables_indic (buffer); foreach_syllable (buffer, start, end) buffer->unsafe_to_break (start, end); + return false; } static int @@ -714,6 +715,9 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, } } } else if (info[i].indic_position() != POS_SMVD) { + if (info[i].indic_category() == I_Cat(MPst) && + i > start && info[i - 1].indic_category() == I_Cat(SM)) + info[i - 1].indic_position() = info[i].indic_position(); last_pos = (indic_position_t) info[i].indic_position(); } } @@ -729,7 +733,7 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, if (info[j].indic_position() < POS_SMVD) info[j].indic_position() = info[i].indic_position(); last = i; - } else if (info[i].indic_category() == I_Cat(M)) + } else if (FLAG_UNSAFE (info[i].indic_category()) & (FLAG (I_Cat(M)) | FLAG (I_Cat(MPst)))) last = i; } @@ -742,14 +746,40 @@ initial_reordering_consonant_syllable (const hb_ot_shape_plan_t *plan, /* Sit tight, rock 'n roll! */ hb_stable_sort (info + start, end - start, compare_indic_order); - /* Find base again */ + + /* Find base again; also flip left-matra sequence. */ + unsigned first_left_matra = end; + unsigned last_left_matra = end; base = end; for (unsigned int i = start; i < end; i++) + { if (info[i].indic_position() == POS_BASE_C) { base = i; break; } + else if (info[i].indic_position() == POS_PRE_M) + { + if (first_left_matra == end) + first_left_matra = i; + last_left_matra = i; + } + } + /* https://github.com/harfbuzz/harfbuzz/issues/3863 */ + if (first_left_matra < last_left_matra) + { + /* No need to merge clusters, handled later. */ + buffer->reverse_range (first_left_matra, last_left_matra + 1); + /* Reverse back nuktas, etc. */ + unsigned i = first_left_matra; + for (unsigned j = i; j <= last_left_matra; j++) + if (FLAG_UNSAFE (info[j].indic_category()) & (FLAG (I_Cat(M)) | FLAG (I_Cat(MPst)))) + { + buffer->reverse_range (i, j + 1); + i = j + 1; + } + } + /* Things are out-of-control for post base positions, they may shuffle * around like crazy. In old-spec mode, we move halants around, so in * that case merge all clusters after base. Otherwise, check the sort @@ -955,25 +985,29 @@ initial_reordering_syllable_indic (const hb_ot_shape_plan_t *plan, } } -static void +static bool initial_reordering_indic (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { + bool ret = false; if (!buffer->message (font, "start reordering indic initial")) - return; + return ret; update_consonant_positions_indic (plan, font, buffer); - hb_syllabic_insert_dotted_circles (font, buffer, - indic_broken_cluster, - I_Cat(DOTTEDCIRCLE), - I_Cat(Repha), - POS_END); + if (hb_syllabic_insert_dotted_circles (font, buffer, + indic_broken_cluster, + I_Cat(DOTTEDCIRCLE), + I_Cat(Repha), + POS_END)) + ret = true; foreach_syllable (buffer, start, end) initial_reordering_syllable_indic (plan, font->face, buffer, start, end); (void) buffer->message (font, "end reordering indic initial"); + + return ret; } static void @@ -1116,7 +1150,7 @@ final_reordering_syllable_indic (const hb_ot_shape_plan_t *plan, { search: while (new_pos > start && - !(is_one_of (info[new_pos], (FLAG (I_Cat(M)) | FLAG (I_Cat(H)))))) + !(is_one_of (info[new_pos], (FLAG (I_Cat(M)) | FLAG (I_Cat(MPst)) | FLAG (I_Cat(H)))))) new_pos--; /* If we found no Halant we are done. @@ -1316,7 +1350,8 @@ final_reordering_syllable_indic (const hb_ot_shape_plan_t *plan, unlikely (is_halant (info[new_reph_pos]))) { for (unsigned int i = base + 1; i < new_reph_pos; i++) - if (info[i].indic_category() == I_Cat(M)) { + if (FLAG_UNSAFE (info[i].indic_category()) & (FLAG (I_Cat(M)) | FLAG (I_Cat(MPst)))) + { /* Ok, got it. */ new_reph_pos--; } @@ -1376,7 +1411,7 @@ final_reordering_syllable_indic (const hb_ot_shape_plan_t *plan, if (buffer->props.script != HB_SCRIPT_MALAYALAM && buffer->props.script != HB_SCRIPT_TAMIL) { while (new_pos > start && - !(is_one_of (info[new_pos - 1], FLAG(I_Cat(M)) | FLAG (I_Cat(H))))) + !(is_one_of (info[new_pos - 1], FLAG (I_Cat(M)) | FLAG (I_Cat(MPst)) | FLAG (I_Cat(H))))) new_pos--; } @@ -1439,13 +1474,13 @@ final_reordering_syllable_indic (const hb_ot_shape_plan_t *plan, } -static void +static bool final_reordering_indic (const hb_ot_shape_plan_t *plan, hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) { unsigned int count = buffer->len; - if (unlikely (!count)) return; + if (unlikely (!count)) return false; if (buffer->message (font, "start reordering indic final")) { foreach_syllable (buffer, start, end) @@ -1455,6 +1490,8 @@ final_reordering_indic (const hb_ot_shape_plan_t *plan, HB_BUFFER_DEALLOCATE_VAR (buffer, indic_category); HB_BUFFER_DEALLOCATE_VAR (buffer, indic_position); + + return false; } diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-khmer-machine.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-khmer-machine.hh index e18bd75ef1..fd91ee0caf 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-khmer-machine.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-khmer-machine.hh @@ -48,7 +48,7 @@ enum khmer_syllable_type_t { }; -#line 52 "hb-ot-shaper-khmer-machine.hh" +#line 49 "hb-ot-shaper-khmer-machine.hh" #define khmer_syllable_machine_ex_C 1u #define khmer_syllable_machine_ex_DOTTEDCIRCLE 11u #define khmer_syllable_machine_ex_H 4u @@ -66,7 +66,7 @@ enum khmer_syllable_type_t { #define khmer_syllable_machine_ex_ZWNJ 5u -#line 70 "hb-ot-shaper-khmer-machine.hh" +#line 65 "hb-ot-shaper-khmer-machine.hh" static const unsigned char _khmer_syllable_machine_trans_keys[] = { 5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 5u, 26u, 1u, 15u, 5u, 26u, 5u, 26u, @@ -284,7 +284,7 @@ static const int khmer_syllable_machine_en_main = 21; for (unsigned int i = ts; i < te; i++) \ info[i].syllable() = (syllable_serial << 4) | syllable_type; \ syllable_serial++; \ - if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ + if (syllable_serial == 16) syllable_serial = 1; \ } HB_STMT_END inline void @@ -294,7 +294,7 @@ find_syllables_khmer (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 298 "hb-ot-shaper-khmer-machine.hh" +#line 287 "hb-ot-shaper-khmer-machine.hh" { cs = khmer_syllable_machine_start; ts = 0; @@ -310,7 +310,7 @@ find_syllables_khmer (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 314 "hb-ot-shaper-khmer-machine.hh" +#line 299 "hb-ot-shaper-khmer-machine.hh" { int _slen; int _trans; @@ -324,7 +324,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 328 "hb-ot-shaper-khmer-machine.hh" +#line 311 "hb-ot-shaper-khmer-machine.hh" } _keys = _khmer_syllable_machine_trans_keys + (cs<<1); @@ -394,7 +394,7 @@ _eof_trans: #line 98 "hb-ot-shaper-khmer-machine.rl" {act = 3;} break; -#line 398 "hb-ot-shaper-khmer-machine.hh" +#line 368 "hb-ot-shaper-khmer-machine.hh" } _again: @@ -403,7 +403,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 407 "hb-ot-shaper-khmer-machine.hh" +#line 375 "hb-ot-shaper-khmer-machine.hh" } if ( ++p != pe ) diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-khmer.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-khmer.cc index d9795589fa..019a285102 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-khmer.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-khmer.cc @@ -89,11 +89,11 @@ set_khmer_properties (hb_glyph_info_t &info) info.khmer_category() = (khmer_category_t) (type & 0xFFu); } -static void +static bool setup_syllables_khmer (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); -static void +static bool reorder_khmer (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); @@ -192,7 +192,7 @@ setup_masks_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED, set_khmer_properties (info[i]); } -static void +static bool setup_syllables_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) @@ -201,6 +201,7 @@ setup_syllables_khmer (const hb_ot_shape_plan_t *plan HB_UNUSED, find_syllables_khmer (buffer); foreach_syllable (buffer, start, end) buffer->unsafe_to_break (start, end); + return false; } @@ -303,23 +304,27 @@ reorder_syllable_khmer (const hb_ot_shape_plan_t *plan, } } -static void +static bool reorder_khmer (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { + bool ret = false; if (buffer->message (font, "start reordering khmer")) { - hb_syllabic_insert_dotted_circles (font, buffer, - khmer_broken_cluster, - K_Cat(DOTTEDCIRCLE), - (unsigned) -1); + if (hb_syllabic_insert_dotted_circles (font, buffer, + khmer_broken_cluster, + K_Cat(DOTTEDCIRCLE), + (unsigned) -1)) + ret = true; foreach_syllable (buffer, start, end) reorder_syllable_khmer (plan, font->face, buffer, start, end); (void) buffer->message (font, "end reordering khmer"); } HB_BUFFER_DEALLOCATE_VAR (buffer, khmer_category); + + return ret; } diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar-machine.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar-machine.hh index b109708937..87cded4ed8 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar-machine.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar-machine.hh @@ -50,7 +50,7 @@ enum myanmar_syllable_type_t { }; -#line 54 "hb-ot-shaper-myanmar-machine.hh" +#line 51 "hb-ot-shaper-myanmar-machine.hh" #define myanmar_syllable_machine_ex_A 9u #define myanmar_syllable_machine_ex_As 32u #define myanmar_syllable_machine_ex_C 1u @@ -77,7 +77,7 @@ enum myanmar_syllable_type_t { #define myanmar_syllable_machine_ex_ZWNJ 5u -#line 81 "hb-ot-shaper-myanmar-machine.hh" +#line 76 "hb-ot-shaper-myanmar-machine.hh" static const unsigned char _myanmar_syllable_machine_trans_keys[] = { 1u, 41u, 3u, 41u, 5u, 39u, 5u, 8u, 3u, 41u, 3u, 39u, 3u, 39u, 5u, 39u, 5u, 39u, 3u, 39u, 3u, 39u, 3u, 41u, 5u, 39u, 1u, 15u, 3u, 39u, 3u, 39u, @@ -433,7 +433,7 @@ static const int myanmar_syllable_machine_en_main = 0; for (unsigned int i = ts; i < te; i++) \ info[i].syllable() = (syllable_serial << 4) | syllable_type; \ syllable_serial++; \ - if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ + if (syllable_serial == 16) syllable_serial = 1; \ } HB_STMT_END inline void @@ -443,7 +443,7 @@ find_syllables_myanmar (hb_buffer_t *buffer) int cs; hb_glyph_info_t *info = buffer->info; -#line 447 "hb-ot-shaper-myanmar-machine.hh" +#line 436 "hb-ot-shaper-myanmar-machine.hh" { cs = myanmar_syllable_machine_start; ts = 0; @@ -459,7 +459,7 @@ find_syllables_myanmar (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 463 "hb-ot-shaper-myanmar-machine.hh" +#line 448 "hb-ot-shaper-myanmar-machine.hh" { int _slen; int _trans; @@ -473,7 +473,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 477 "hb-ot-shaper-myanmar-machine.hh" +#line 460 "hb-ot-shaper-myanmar-machine.hh" } _keys = _myanmar_syllable_machine_trans_keys + (cs<<1); @@ -519,7 +519,7 @@ _eof_trans: #line 113 "hb-ot-shaper-myanmar-machine.rl" {te = p;p--;{ found_syllable (myanmar_non_myanmar_cluster); }} break; -#line 523 "hb-ot-shaper-myanmar-machine.hh" +#line 498 "hb-ot-shaper-myanmar-machine.hh" } _again: @@ -528,7 +528,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 532 "hb-ot-shaper-myanmar-machine.hh" +#line 505 "hb-ot-shaper-myanmar-machine.hh" } if ( ++p != pe ) diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar.cc index 78bd8de524..1b2a085a8d 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-myanmar.cc @@ -98,11 +98,11 @@ is_consonant_myanmar (const hb_glyph_info_t &info) } -static void +static bool setup_syllables_myanmar (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); -static void +static bool reorder_myanmar (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); @@ -150,7 +150,7 @@ setup_masks_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED, set_myanmar_properties (info[i]); } -static void +static bool setup_syllables_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) @@ -159,6 +159,7 @@ setup_syllables_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED, find_syllables_myanmar (buffer); foreach_syllable (buffer, start, end) buffer->unsafe_to_break (start, end); + return false; } static int @@ -270,6 +271,33 @@ initial_reordering_consonant_syllable (hb_buffer_t *buffer, /* Sit tight, rock 'n roll! */ buffer->sort (start, end, compare_myanmar_order); + + /* Flip left-matra sequence. */ + unsigned first_left_matra = end; + unsigned last_left_matra = end; + for (unsigned int i = start; i < end; i++) + { + if (info[i].myanmar_position() == POS_PRE_M) + { + if (first_left_matra == end) + first_left_matra = i; + last_left_matra = i; + } + } + /* https://github.com/harfbuzz/harfbuzz/issues/3863 */ + if (first_left_matra < last_left_matra) + { + /* No need to merge clusters, done already? */ + buffer->reverse_range (first_left_matra, last_left_matra + 1); + /* Reverse back VS, etc. */ + unsigned i = first_left_matra; + for (unsigned j = i; j <= last_left_matra; j++) + if (info[j].myanmar_category() == M_Cat(VPre)) + { + buffer->reverse_range (i, j + 1); + i = j + 1; + } + } } static void @@ -291,16 +319,18 @@ reorder_syllable_myanmar (const hb_ot_shape_plan_t *plan HB_UNUSED, } } -static void +static bool reorder_myanmar (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { + bool ret = false; if (buffer->message (font, "start reordering myanmar")) { - hb_syllabic_insert_dotted_circles (font, buffer, - myanmar_broken_cluster, - M_Cat(DOTTEDCIRCLE)); + if (hb_syllabic_insert_dotted_circles (font, buffer, + myanmar_broken_cluster, + M_Cat(DOTTEDCIRCLE))) + ret = true; foreach_syllable (buffer, start, end) reorder_syllable_myanmar (plan, font->face, buffer, start, end); @@ -309,6 +339,8 @@ reorder_myanmar (const hb_ot_shape_plan_t *plan, HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_category); HB_BUFFER_DEALLOCATE_VAR (buffer, myanmar_position); + + return ret; } @@ -331,6 +363,7 @@ const hb_ot_shaper_t _hb_ot_shaper_myanmar = }; +#ifndef HB_NO_OT_SHAPER_MYANMAR_ZAWGYI /* Ugly Zawgyi encoding. * Disable all auto processing. * https://github.com/harfbuzz/harfbuzz/issues/1162 */ @@ -351,6 +384,7 @@ const hb_ot_shaper_t _hb_ot_shaper_myanmar_zawgyi = HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, false, /* fallback_position */ }; +#endif #endif diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-syllabic.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-syllabic.cc index a8e0d8e8c1..89226ae4a1 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-syllabic.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-syllabic.cc @@ -29,7 +29,7 @@ #include "hb-ot-shaper-syllabic.hh" -void +bool hb_syllabic_insert_dotted_circles (hb_font_t *font, hb_buffer_t *buffer, unsigned int broken_syllable_type, @@ -38,13 +38,13 @@ hb_syllabic_insert_dotted_circles (hb_font_t *font, int dottedcircle_position) { if (unlikely (buffer->flags & HB_BUFFER_FLAG_DO_NOT_INSERT_DOTTED_CIRCLE)) - return; + return false; if (likely (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_BROKEN_SYLLABLE))) - return; + return false; hb_codepoint_t dottedcircle_glyph; if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph)) - return; + return false; hb_glyph_info_t dottedcircle = {0}; dottedcircle.codepoint = 0x25CCu; @@ -84,14 +84,16 @@ hb_syllabic_insert_dotted_circles (hb_font_t *font, (void) buffer->next_glyph (); } buffer->sync (); + return true; } -HB_INTERNAL void +HB_INTERNAL bool hb_syllabic_clear_var (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { HB_BUFFER_DEALLOCATE_VAR (buffer, syllable); + return false; } diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-syllabic.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-syllabic.hh index e8a15bb48a..f240ad1c26 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-syllabic.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-syllabic.hh @@ -30,7 +30,7 @@ #include "hb-ot-shaper.hh" -HB_INTERNAL void +HB_INTERNAL bool hb_syllabic_insert_dotted_circles (hb_font_t *font, hb_buffer_t *buffer, unsigned int broken_syllable_type, @@ -38,7 +38,7 @@ hb_syllabic_insert_dotted_circles (hb_font_t *font, int repha_category = -1, int dottedcircle_position = -1); -HB_INTERNAL void +HB_INTERNAL bool hb_syllabic_clear_var (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-thai.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-thai.cc index 15349b1e64..6cd67cde35 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-thai.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-thai.cc @@ -98,9 +98,9 @@ static hb_codepoint_t thai_pua_shape (hb_codepoint_t u, thai_action_t action, hb_font_t *font) { struct thai_pua_mapping_t { - hb_codepoint_t u; - hb_codepoint_t win_pua; - hb_codepoint_t mac_pua; + uint16_t u; + uint16_t win_pua; + uint16_t mac_pua; } const *pua_mappings = nullptr; static const thai_pua_mapping_t SD_mappings[] = { {0x0E48u, 0xF70Au, 0xF88Bu}, /* MAI EK */ diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-use-machine.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-use-machine.hh index 41e8a34f3b..f2fbdb725b 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-use-machine.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-use-machine.hh @@ -53,7 +53,7 @@ enum use_syllable_type_t { }; -#line 57 "hb-ot-shaper-use-machine.hh" +#line 54 "hb-ot-shaper-use-machine.hh" #define use_syllable_machine_ex_B 1u #define use_syllable_machine_ex_CGJ 6u #define use_syllable_machine_ex_CMAbv 31u @@ -97,7 +97,7 @@ enum use_syllable_type_t { #define use_syllable_machine_ex_ZWNJ 14u -#line 101 "hb-ot-shaper-use-machine.hh" +#line 96 "hb-ot-shaper-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { 0u, 53u, 11u, 53u, 11u, 53u, 1u, 53u, 14u, 48u, 14u, 47u, 14u, 47u, 14u, 47u, 14u, 46u, 14u, 46u, 14u, 14u, 14u, 48u, 14u, 48u, 14u, 48u, 1u, 14u, 14u, 48u, @@ -839,7 +839,7 @@ static const int use_syllable_machine_en_main = 0; for (unsigned i = (*ts).second.first; i < (*te).second.first; ++i) \ info[i].syllable() = (syllable_serial << 4) | syllable_type; \ syllable_serial++; \ - if (unlikely (syllable_serial == 16)) syllable_serial = 1; \ + if (syllable_serial == 16) syllable_serial = 1; \ } HB_STMT_END @@ -929,7 +929,7 @@ find_syllables_use (hb_buffer_t *buffer) unsigned int act HB_UNUSED; int cs; -#line 933 "hb-ot-shaper-use-machine.hh" +#line 922 "hb-ot-shaper-use-machine.hh" { cs = use_syllable_machine_start; ts = 0; @@ -942,7 +942,7 @@ find_syllables_use (hb_buffer_t *buffer) unsigned int syllable_serial = 1; -#line 946 "hb-ot-shaper-use-machine.hh" +#line 931 "hb-ot-shaper-use-machine.hh" { int _slen; int _trans; @@ -956,7 +956,7 @@ _resume: #line 1 "NONE" {ts = p;} break; -#line 960 "hb-ot-shaper-use-machine.hh" +#line 943 "hb-ot-shaper-use-machine.hh" } _keys = _use_syllable_machine_trans_keys + (cs<<1); @@ -1046,7 +1046,7 @@ _eof_trans: #line 178 "hb-ot-shaper-use-machine.rl" {te = p;p--;{ found_syllable (use_non_cluster); }} break; -#line 1050 "hb-ot-shaper-use-machine.hh" +#line 1014 "hb-ot-shaper-use-machine.hh" } _again: @@ -1055,7 +1055,7 @@ _again: #line 1 "NONE" {ts = 0;} break; -#line 1059 "hb-ot-shaper-use-machine.hh" +#line 1021 "hb-ot-shaper-use-machine.hh" } if ( ++p != pe ) diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh b/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh index 9833fb55de..6b6b552ee5 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-use-table.hh @@ -91,6 +91,9 @@ #define VMPre USE(VMPre) #pragma GCC diagnostic pop + +#ifndef HB_OPTIMIZE_SIZE + static const uint8_t hb_use_u8[3141] = { @@ -357,6 +360,273 @@ hb_use_get_category (unsigned u) return u<921600u?hb_use_u8[2777+(((hb_use_u8[593+(((hb_use_u16[((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>3>>5))<<5)+((u>>1>>3>>3)&31u))])<<3)+((u>>1>>3)&7u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O; } + +#else + +static const uint8_t +hb_use_u8[3413] = +{ + 16, 50, 51, 51, 51, 52, 51, 83, 118, 131, 51, 57, 58, 179, 195, 61, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, + 14, 0, 1, 1, 2, 1, 1, 3, 4, 5, 6, 7, 8, 9, 10, 1, + 11, 12, 1, 1, 1, 1, 1, 1, 13, 14, 15, 16, 17, 18, 19, 1, + 1, 20, 1, 1, 1, 1, 21, 1, 1, 1, 1, 1, 1, 1, 22, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 23, 24, 25, 26, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 27, + 28, 1, 1, 1, 1, 1, 29, 1, 1, 1, 1, 30, 31, 1, 32, 33, + 34, 35, 36, 37, 38, 39, 40, 41, 42, 43, 44, 45, 1, 46, 47, 48, + 49, 50, 50, 50, 50, 51, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 52, 53, 1, 1, 1, + 54, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50, 55, 1, 1, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 56, 1, 1, + 1, 1, 57, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 58, 59, 1, 60, 1, 1, 1, 1, 61, 1, 1, 1, 1, 1, + 1, 62, 63, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 0, 1, 0, 0, 0, 2, 3, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 8, 0, 0, 0, 0, + 0, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 33, 34, 35, 36, 37, 38, 39, + 40, 41, 42, 43, 36, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 54, + 0, 55, 56, 57, 58, 59, 0, 0, 0, 60, 61, 62, 63, 55, 64, 65, + 66, 67, 55, 55, 68, 69, 70, 0, 0, 71, 72, 73, 74, 55, 75, 76, + 0, 77, 55, 78, 79, 80, 0, 0, 0, 81, 82, 83, 84, 85, 86, 55, + 87, 55, 88, 89, 0, 0, 0, 90, 91, 0, 0, 0, 0, 0, 0, 0, + 92, 93, 94, 0, 95, 96, 0, 0, 97, 0, 0, 0, 0, 0, 0, 98, + 0, 0, 99, 55, 100, 0, 0, 0, 0, 101, 102, 55, 103, 104, 105, 106, + 107, 55, 108, 109, 0, 110, 111, 112, 113, 55, 114, 115, 116, 55, 117, 118, + 119, 0, 0, 0, 0, 0, 0, 55, 120, 121, 0, 0, 0, 0, 0, 0, + 122, 0, 0, 0, 0, 0, 0, 0, 123, 0, 0, 0, 124, 125, 126, 0, + 0, 127, 128, 129, 0, 0, 0, 50, 130, 0, 0, 0, 0, 131, 132, 0, + 0, 55, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 55, 134, 0, + 0, 0, 99, 135, 99, 136, 137, 138, 0, 139, 140, 141, 142, 143, 144, 145, + 0, 146, 147, 148, 149, 143, 150, 151, 152, 153, 154, 155, 0, 156, 157, 158, + 159, 160, 161, 162, 163, 0, 0, 0, 0, 55, 164, 165, 166, 167, 168, 169, + 0, 0, 0, 0, 0, 55, 170, 171, 0, 55, 172, 173, 0, 55, 174, 66, + 0, 175, 176, 177, 0, 0, 0, 0, 0, 55, 178, 0, 0, 0, 0, 0, + 0, 179, 180, 181, 0, 0, 182, 183, 184, 185, 186, 187, 55, 188, 0, 0, + 0, 189, 190, 191, 192, 193, 194, 0, 0, 195, 196, 197, 198, 199, 66, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 200, 201, 202, 203, 0, 0, 0, 0, + 0, 55, 55, 55, 55, 55, 55, 55, 55, 55, 204, 205, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 66, 0, 55, 206, 0, 0, 0, 0, 0, + 0, 55, 55, 207, 208, 209, 0, 0, 210, 55, 55, 55, 55, 55, 55, 211, + 0, 55, 55, 55, 212, 213, 0, 0, 0, 0, 0, 0, 214, 0, 0, 0, + 0, 55, 215, 216, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99, 217, 55, + 218, 0, 0, 0, 0, 0, 0, 99, 219, 55, 55, 220, 0, 0, 0, 0, + 0, 221, 221, 221, 221, 221, 221, 221, 221, 222, 222, 222, 222, 222, 222, 222, + 223, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, + 0, 2, 2, 2, 2, 2, 0, 0, 0, 3, 0, 0, 0, 0, 0, 4, + 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 6, 7, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 8, 9, 9, 9, 9, 0, 0, 0, 7, 10, + 0, 2, 2, 2, 2, 11, 12, 0, 0, 9, 13, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 14, 15, 16, 17, 18, 19, 20, 14, 21, 22, + 23, 10, 24, 25, 18, 2, 2, 2, 2, 2, 18, 0, 2, 2, 2, 2, + 2, 0, 2, 2, 2, 2, 2, 2, 2, 26, 27, 28, 2, 2, 2, 7, + 28, 7, 28, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 7, 2, 2, + 2, 7, 7, 0, 2, 2, 0, 15, 16, 17, 18, 29, 30, 31, 30, 32, + 0, 0, 0, 0, 33, 0, 0, 2, 28, 2, 0, 0, 0, 0, 0, 7, + 34, 10, 13, 28, 2, 2, 7, 0, 28, 7, 2, 28, 7, 2, 0, 35, + 16, 17, 29, 0, 25, 36, 25, 37, 0, 38, 0, 0, 0, 28, 2, 7, + 7, 0, 0, 0, 2, 2, 2, 2, 2, 39, 40, 41, 0, 0, 0, 0, + 0, 10, 13, 28, 2, 2, 2, 2, 28, 2, 28, 2, 2, 2, 2, 2, + 2, 7, 2, 28, 2, 2, 0, 15, 16, 17, 18, 19, 25, 20, 33, 22, + 0, 0, 0, 0, 0, 28, 39, 39, 42, 10, 27, 28, 2, 2, 2, 7, + 28, 7, 2, 28, 2, 2, 0, 15, 43, 0, 0, 25, 20, 0, 0, 2, + 28, 28, 0, 0, 0, 0, 0, 0, 0, 0, 44, 28, 2, 2, 7, 0, + 2, 7, 2, 2, 0, 28, 7, 7, 2, 0, 28, 7, 0, 2, 7, 0, + 2, 2, 2, 2, 2, 2, 0, 0, 21, 14, 45, 0, 46, 31, 46, 32, + 0, 0, 0, 0, 33, 0, 0, 0, 0, 13, 27, 47, 2, 2, 2, 7, + 2, 7, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 15, + 20, 14, 21, 45, 20, 36, 20, 37, 0, 0, 0, 25, 29, 2, 7, 0, + 0, 8, 27, 28, 2, 2, 2, 7, 2, 2, 2, 28, 2, 2, 0, 15, + 43, 0, 0, 33, 45, 0, 0, 0, 7, 48, 49, 0, 0, 0, 0, 0, + 0, 9, 27, 2, 2, 2, 2, 7, 2, 2, 2, 2, 2, 2, 50, 51, + 21, 21, 17, 29, 46, 31, 46, 32, 52, 0, 0, 0, 33, 0, 0, 0, + 28, 10, 27, 28, 2, 2, 2, 2, 2, 2, 2, 2, 7, 0, 2, 2, + 2, 2, 28, 2, 2, 2, 2, 28, 0, 2, 2, 2, 7, 0, 53, 0, + 33, 21, 20, 29, 29, 16, 46, 46, 23, 0, 21, 0, 0, 0, 0, 0, + 0, 2, 0, 2, 7, 0, 0, 0, 0, 0, 0, 0, 0, 18, 0, 0, + 0, 2, 2, 54, 54, 55, 0, 0, 16, 2, 2, 2, 2, 28, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 7, 0, 56, 19, 57, 20, 20, 18, 18, + 44, 19, 9, 29, 9, 2, 2, 58, 59, 59, 59, 59, 59, 60, 59, 59, + 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 61, + 0, 0, 0, 0, 62, 0, 0, 0, 0, 2, 2, 2, 2, 2, 63, 43, + 57, 64, 20, 20, 65, 66, 67, 68, 69, 2, 2, 2, 2, 2, 1, 0, + 3, 2, 2, 2, 21, 18, 2, 2, 70, 69, 71, 72, 63, 71, 27, 27, + 2, 50, 20, 51, 2, 2, 2, 2, 2, 2, 73, 74, 75, 27, 27, 76, + 77, 2, 2, 2, 2, 2, 27, 43, 0, 2, 57, 78, 0, 0, 0, 0, + 28, 2, 57, 45, 0, 0, 0, 0, 0, 2, 57, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 7, 2, 7, 57, 0, 0, 0, 0, 0, + 0, 2, 2, 79, 43, 20, 57, 18, 46, 46, 46, 46, 13, 80, 81, 82, + 83, 84, 85, 0, 0, 0, 0, 86, 0, 7, 0, 0, 28, 0, 87, 79, + 88, 2, 2, 2, 2, 7, 0, 0, 0, 40, 40, 89, 90, 2, 2, 2, + 2, 2, 2, 2, 2, 11, 7, 0, 0, 91, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 2, 7, 20, 78, 43, 20, 92, 59, 0, + 0, 93, 94, 93, 93, 95, 96, 0, 0, 2, 2, 2, 2, 2, 2, 2, + 0, 2, 2, 7, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 0, + 0, 2, 2, 2, 2, 27, 0, 0, 0, 2, 2, 2, 2, 2, 7, 0, + 0, 2, 2, 2, 50, 97, 43, 0, 0, 2, 2, 98, 99, 100, 101, 59, + 61, 102, 14, 43, 20, 57, 19, 78, 46, 46, 74, 9, 9, 9, 103, 44, + 38, 9, 104, 72, 2, 2, 2, 2, 2, 2, 2, 105, 20, 18, 18, 20, + 46, 46, 20, 106, 2, 2, 2, 7, 0, 0, 0, 0, 0, 0, 107, 108, + 109, 109, 109, 0, 0, 0, 0, 0, 0, 104, 72, 2, 2, 2, 2, 2, + 2, 58, 59, 57, 23, 20, 110, 59, 2, 2, 2, 2, 105, 20, 21, 43, + 43, 100, 12, 0, 0, 0, 0, 0, 0, 2, 2, 59, 16, 46, 21, 111, + 100, 100, 100, 112, 113, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 28, + 2, 9, 44, 114, 114, 114, 9, 114, 114, 13, 114, 114, 114, 24, 0, 38, + 0, 0, 0, 115, 49, 9, 3, 0, 0, 0, 0, 0, 0, 0, 116, 0, + 0, 0, 0, 0, 0, 0, 4, 117, 118, 40, 40, 3, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 118, 118, 119, 118, 118, 118, 118, 118, 118, 118, + 118, 0, 0, 120, 0, 0, 0, 0, 0, 0, 5, 120, 0, 0, 0, 0, + 0, 44, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 7, + 0, 2, 2, 2, 2, 0, 0, 0, 28, 0, 0, 0, 0, 0, 0, 0, + 121, 2, 51, 2, 106, 2, 8, 2, 2, 2, 63, 17, 14, 0, 0, 29, + 0, 2, 2, 0, 0, 0, 0, 0, 0, 27, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 122, 21, 21, 21, 21, 21, 21, 21, 123, 0, 0, 0, 0, + 0, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 0, + 50, 2, 2, 2, 20, 20, 124, 114, 0, 2, 2, 2, 125, 18, 57, 18, + 111, 100, 126, 0, 0, 0, 0, 0, 0, 9, 127, 2, 2, 2, 2, 2, + 2, 2, 128, 21, 20, 18, 46, 129, 130, 131, 0, 0, 0, 0, 0, 0, + 0, 2, 2, 50, 28, 2, 2, 2, 2, 2, 2, 2, 2, 8, 20, 57, + 97, 74, 132, 133, 134, 0, 0, 0, 0, 2, 135, 2, 2, 2, 2, 136, + 0, 28, 2, 40, 3, 0, 77, 13, 2, 51, 20, 137, 50, 51, 2, 2, + 103, 8, 7, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 138, 19, + 23, 0, 0, 139, 140, 0, 0, 0, 0, 2, 63, 43, 21, 78, 45, 141, + 0, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, 0, 0, 0, 0, 0, + 4, 118, 118, 118, 118, 119, 0, 0, 0, 2, 2, 2, 2, 2, 7, 2, + 2, 2, 7, 2, 28, 2, 2, 2, 2, 2, 28, 2, 2, 2, 28, 7, + 0, 125, 18, 25, 29, 0, 0, 142, 143, 2, 2, 28, 2, 28, 2, 2, + 2, 2, 2, 2, 0, 12, 35, 0, 144, 2, 2, 11, 35, 0, 28, 2, + 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28, 2, 2, + 7, 2, 2, 9, 39, 0, 0, 0, 0, 2, 2, 2, 2, 2, 25, 36, + 0, 2, 2, 2, 114, 114, 114, 114, 114, 145, 2, 7, 0, 0, 0, 0, + 0, 2, 12, 12, 0, 0, 0, 0, 0, 7, 2, 2, 7, 2, 2, 2, + 2, 28, 2, 7, 0, 28, 2, 0, 0, 146, 147, 148, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 20, 20, 18, 18, 18, 20, 20, 131, 0, 0, 0, + 0, 0, 149, 149, 149, 149, 149, 149, 149, 149, 149, 149, 2, 2, 2, 2, + 2, 51, 50, 51, 0, 0, 0, 0, 150, 9, 72, 2, 2, 2, 2, 2, + 2, 16, 17, 19, 14, 22, 35, 0, 0, 0, 29, 0, 0, 0, 0, 0, + 0, 9, 47, 2, 2, 2, 2, 2, 2, 2, 2, 2, 125, 18, 20, 151, + 20, 19, 152, 153, 2, 2, 2, 2, 2, 0, 0, 63, 154, 0, 0, 0, + 0, 2, 11, 0, 0, 0, 0, 0, 0, 2, 63, 23, 18, 18, 18, 20, + 20, 106, 155, 0, 0, 54, 156, 29, 157, 28, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 21, 17, 20, 20, 158, 42, 0, 0, 0, + 47, 125, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 7, 7, 2, 2, + 28, 2, 2, 2, 2, 2, 2, 2, 28, 2, 2, 2, 2, 2, 2, 2, + 8, 16, 17, 19, 20, 159, 29, 0, 0, 9, 9, 28, 2, 2, 2, 7, + 28, 7, 2, 28, 2, 2, 56, 15, 21, 14, 21, 45, 30, 31, 30, 32, + 0, 0, 0, 0, 33, 0, 0, 0, 2, 2, 21, 0, 9, 9, 9, 44, + 0, 9, 9, 44, 0, 0, 0, 0, 0, 2, 2, 63, 23, 18, 18, 18, + 20, 21, 123, 13, 15, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 0, + 160, 161, 0, 0, 0, 0, 0, 0, 0, 16, 17, 18, 18, 64, 97, 23, + 157, 9, 162, 7, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, + 63, 23, 18, 18, 0, 46, 46, 9, 163, 35, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 2, 2, 18, 0, 21, 17, 18, 18, 19, 14, 80, + 163, 36, 0, 0, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 8, 164, + 23, 18, 20, 20, 162, 7, 0, 0, 0, 2, 2, 2, 2, 2, 7, 41, + 133, 21, 20, 18, 74, 19, 20, 0, 0, 2, 2, 2, 7, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 2, 16, 17, 18, 19, 20, 103, 163, 35, 0, + 0, 2, 2, 2, 7, 28, 0, 2, 2, 2, 2, 28, 7, 2, 2, 2, + 2, 21, 21, 16, 30, 31, 10, 165, 166, 167, 168, 0, 0, 0, 0, 0, + 0, 2, 2, 2, 2, 0, 2, 2, 2, 63, 23, 18, 18, 0, 20, 21, + 27, 106, 0, 31, 0, 0, 0, 0, 0, 50, 18, 20, 20, 20, 137, 2, + 2, 2, 169, 170, 9, 13, 171, 70, 172, 0, 0, 1, 144, 0, 0, 0, + 0, 50, 18, 20, 14, 17, 18, 2, 2, 2, 2, 155, 155, 155, 173, 173, + 173, 173, 173, 173, 13, 174, 0, 28, 0, 20, 18, 18, 29, 20, 20, 9, + 163, 0, 59, 59, 59, 59, 59, 59, 59, 64, 19, 80, 44, 0, 0, 0, + 0, 2, 2, 2, 7, 2, 28, 2, 2, 50, 20, 20, 29, 0, 36, 20, + 25, 9, 156, 175, 171, 0, 0, 0, 0, 2, 2, 2, 28, 7, 2, 2, + 2, 2, 2, 2, 2, 2, 21, 21, 45, 20, 33, 80, 66, 0, 0, 0, + 0, 2, 176, 64, 45, 0, 0, 0, 0, 9, 177, 2, 2, 2, 2, 2, + 2, 2, 2, 21, 20, 18, 29, 0, 46, 14, 140, 0, 0, 0, 0, 0, + 0, 178, 178, 178, 106, 179, 178, 0, 0, 145, 2, 2, 180, 114, 114, 114, + 114, 114, 114, 114, 0, 0, 0, 0, 0, 9, 9, 9, 44, 0, 0, 0, + 0, 2, 2, 2, 2, 2, 7, 0, 56, 181, 18, 18, 18, 18, 18, 18, + 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 0, 0, 0, + 38, 114, 24, 0, 0, 0, 0, 0, 0, 0, 0, 7, 0, 0, 0, 0, + 0, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 2, 2, 0, 56, + 35, 0, 4, 118, 118, 118, 119, 0, 0, 9, 9, 9, 47, 2, 2, 2, + 0, 2, 2, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 2, 2, + 44, 2, 2, 2, 2, 2, 2, 9, 9, 2, 2, 2, 2, 2, 2, 20, + 20, 2, 2, 42, 42, 42, 90, 0, 0, O, O, O, GB, B, B, GB, + O, O, WJ,FMPst,FMPst, O, CGJ, B, O, B,VMAbv,VMAbv,VMAbv, O,VMAbv, B, + CMBlw,CMBlw,CMBlw,VMAbv,VMPst, VAbv, VPst,CMBlw, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, + VAbv, VAbv, VAbv, VPst, VPst, VPst, H, VPre, VPst,VMBlw, O, O, VAbv, GB,VMAbv,VMPst, + VMPst, O, B, VBlw, O, O, VPre, VPre, O, VPre, H, O, VPst,FMAbv, O,CMBlw, + O, VAbv, O, VAbv, H, O,VMBlw,VMAbv,CMAbv, GB, GB, O, MBlw,CMAbv,CMAbv, VPst, + VAbv,VMAbv, O, VPst, O, VPre, VPre,VMAbv, B, O, CS, CS,VMPst, B, VAbv, VAbv, + B, R, O, HVM, O, O,FMBlw, O,CMAbv, O,CMBlw, VAbv, VBlw, B, SUB, SUB, + SUB, O, SUB, SUB, O,FMBlw, O, B, VPst, VBlw, VPre,VMAbv,VMBlw,VMPst, IS, VAbv, + MPst, MPre, MBlw, MBlw, B, MBlw, MBlw, VPst,VMPst,VMPst, B, MBlw, VPst, VPre, VAbv, VAbv, + VMPst,VMPst,VMBlw, B,VMPst, VBlw, VPst, CGJ, CGJ, VPst,VMAbv,VMAbv,FMAbv, FAbv,CMAbv,FMAbv, + VMAbv,FMAbv, VAbv, IS,FMAbv, B,FMAbv, B, CGJ, WJ, CGJ, GB,CMAbv,CMAbv, B, GB, + B, VAbv, SUB, FPst, FPst,VMBlw, FPst, FPst, FBlw,VMAbv,FMBlw, VAbv, VPre, B, MPre, MBlw, + SUB, FAbv, FAbv, MAbv, SUB, Sk, VPst, VAbv,VMAbv,VMAbv, FAbv,CMAbv, VPst, H, B, O, + SMAbv,SMBlw,SMAbv,SMAbv,SMAbv, VPst, IS, VBlw, FAbv,VMPre,VMPre,FMAbv,CMBlw,VMBlw,VMBlw,VMAbv, + CS, O,FMAbv, ZWNJ, CGJ, WJ, WJ, WJ, O,FMPst, O, O, H, MPst, VPst, H, + VMAbv, VAbv,VMBlw, B, VBlw, FPst, VPst, FAbv,VMPst, B,CMAbv, VAbv, MBlw, MPst, MBlw, H, + O, VBlw, MPst, MPre, MAbv, MBlw, O, B, FAbv, FAbv, FPst, VBlw, B, B, VPre, O, + VMPst, IS, O,VMPst, VBlw, VPst,VMBlw,VMBlw,VMAbv, O, IS,VMBlw, B,VMPst,VMAbv,VMPst, + CS, CS, B, N, N, O, HN, VPre, VBlw, VAbv, IS,CMAbv, O, VPst, B, R, + R,CMBlw, VAbv, VPre,VMAbv,VMAbv, H, VAbv,CMBlw,FMAbv, B, CS, CS, H,CMBlw,VMPst, + H,VMPst, VAbv,VMAbv, VPst, IS, R, MPst, R, MPst,CMBlw, B,FMBlw, VBlw,VMAbv, R, + MBlw, MBlw, GB, FBlw, FBlw,CMAbv, IS, VBlw, IS, GB, VAbv, R,VMPst, H, H, B, + H, B,VMBlw, O, VBlw, +}; +static const uint16_t +hb_use_u16[448] = +{ + 0, 0, 1, 2, 3, 4, 0, 5, 6, 0, 7, 0, 8, 9, 10, 11, + 9, 12, 13, 9, 9, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, 24, + 17, 25, 26, 20, 21, 27, 28, 29, 30, 31, 32, 33, 21, 34, 35, 0, + 17, 36, 37, 20, 21, 38, 23, 39, 17, 40, 41, 42, 43, 44, 45, 46, + 30, 0, 47, 48, 21, 49, 50, 51, 17, 0, 52, 48, 21, 53, 50, 54, + 17, 55, 56, 48, 9, 57, 58, 59, 60, 61, 9, 62, 63, 64, 30, 65, + 66, 67, 9, 68, 69, 9, 70, 71, 72, 73, 74, 75, 76, 0, 9, 9, + 77, 78, 79, 80, 81, 82, 83, 84, 9, 85, 9, 86, 9, 87, 88, 89, + 9, 90, 91, 92, 2, 0, 93, 0, 9, 94, 95, 9, 96, 0, 97, 98, + 99,100, 30, 9,101,102,103, 9,104,105, 9,106, 9,107,108,109, + 2, 2,110, 9, 9,111,112, 2,113,114,115, 9,116, 9,117,118, + 119,120,121, 0, 0,122,123,124, 0,125,126,127,128, 0,129,130, + 131, 0, 0,132,133, 0, 0, 9,134,135,136, 9,137, 0, 9,138, + 139, 9, 9,140,141, 2,142,143,144, 9,145,146,147, 9, 9,148, + 149, 2,150, 98,151,152,153, 2, 9,154, 9,155,156, 0,157,158, + 159, 2,160, 0, 0,161, 0,162, 0,163,163,164, 33,165,166,167, + 9,168, 94, 0,169, 0, 9,170,171, 0,172, 2,173,170,174,175, + 176, 0, 0,177,178, 0,179, 9, 9,180,181,182,183,184,185, 9, + 9,186,187, 0,188, 9,189,190,191, 9, 9,192, 9,193,194,105, + 195,102, 9, 33,196,197,198, 0,199,200, 94, 9, 9,201,202, 2, + 203, 20, 21,204,205,206,207,208, 9,209,210,211,212, 0,195, 9, + 9,213,214, 2,215,216,217,218, 9,219,220, 2,221,222, 9,223, + 224,103,225, 0,226,227,228,229, 9,230,231, 2,232, 9, 9,233, + 234, 0,235, 9, 9,236,237,238,239,240, 21, 9,215,241, 7, 9, + 70, 18, 9,242, 73,243,244, 9, 9,245,246, 2,247, 9,248,249, + 9,250,251, 48, 9,252,253, 2, 9,254,255,256, 9,257,258,259, + 260,260,261,262,263, 0, 9,264,105, 70, 94,265, 0,266, 70,267, + 268, 0,269, 0,270, 2,271, 2,272, 2,129,129,160,160,160,129, +}; + +static inline unsigned +hb_use_b4 (const uint8_t* a, unsigned i) +{ + return (a[i>>1]>>((i&1u)<<2))&15u; +} +static inline uint_fast8_t +hb_use_get_category (unsigned u) +{ + return u<921600u?hb_use_u8[3049+(((hb_use_u8[865+(((hb_use_u16[((hb_use_u8[353+(((hb_use_u8[113+(((hb_use_b4(hb_use_u8,u>>1>>3>>1>>3>>4))<<4)+((u>>1>>3>>1>>3)&15u))])<<3)+((u>>1>>3>>1)&7u))])<<1)+((u>>1>>3)&1u)])<<3)+((u>>1)&7u))])<<1)+((u)&1u))]:O; +} + +#endif + #undef B #undef CGJ #undef CS diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper-use.cc b/thirdparty/harfbuzz/src/hb-ot-shaper-use.cc index c40ec52f9c..342aba1235 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper-use.cc +++ b/thirdparty/harfbuzz/src/hb-ot-shaper-use.cc @@ -89,19 +89,19 @@ use_other_features[] = HB_TAG('p','s','t','s'), }; -static void +static bool setup_syllables_use (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); -static void +static bool record_rphf_use (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); -static void +static bool record_pref_use (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); -static void +static bool reorder_use (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer); @@ -293,7 +293,7 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan, } } -static void +static bool setup_syllables_use (const hb_ot_shape_plan_t *plan, hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) @@ -304,9 +304,10 @@ setup_syllables_use (const hb_ot_shape_plan_t *plan, buffer->unsafe_to_break (start, end); setup_rphf_mask (plan, buffer); setup_topographical_masks (plan, buffer); + return false; } -static void +static bool record_rphf_use (const hb_ot_shape_plan_t *plan, hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) @@ -314,7 +315,7 @@ record_rphf_use (const hb_ot_shape_plan_t *plan, const use_shape_plan_t *use_plan = (const use_shape_plan_t *) plan->data; hb_mask_t mask = use_plan->rphf_mask; - if (!mask) return; + if (!mask) return false; hb_glyph_info_t *info = buffer->info; foreach_syllable (buffer, start, end) @@ -327,9 +328,10 @@ record_rphf_use (const hb_ot_shape_plan_t *plan, break; } } + return false; } -static void +static bool record_pref_use (const hb_ot_shape_plan_t *plan HB_UNUSED, hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) @@ -346,6 +348,7 @@ record_pref_use (const hb_ot_shape_plan_t *plan HB_UNUSED, break; } } + return false; } static inline bool @@ -438,17 +441,19 @@ reorder_syllable_use (hb_buffer_t *buffer, unsigned int start, unsigned int end) } } -static void +static bool reorder_use (const hb_ot_shape_plan_t *plan, hb_font_t *font, hb_buffer_t *buffer) { + bool ret = false; if (buffer->message (font, "start reordering USE")) { - hb_syllabic_insert_dotted_circles (font, buffer, - use_broken_cluster, - USE(B), - USE(R)); + if (hb_syllabic_insert_dotted_circles (font, buffer, + use_broken_cluster, + USE(B), + USE(R))) + ret = true; foreach_syllable (buffer, start, end) reorder_syllable_use (buffer, start, end); @@ -457,6 +462,8 @@ reorder_use (const hb_ot_shape_plan_t *plan, } HB_BUFFER_DEALLOCATE_VAR (buffer, use_category); + + return ret; } diff --git a/thirdparty/harfbuzz/src/hb-ot-shaper.hh b/thirdparty/harfbuzz/src/hb-ot-shaper.hh index b2d1acb39b..0207b2bbe3 100644 --- a/thirdparty/harfbuzz/src/hb-ot-shaper.hh +++ b/thirdparty/harfbuzz/src/hb-ot-shaper.hh @@ -262,11 +262,13 @@ hb_ot_shaper_categorize (const hb_ot_shape_planner_t *planner) return &_hb_ot_shaper_myanmar; +#ifndef HB_NO_OT_SHAPER_MYANMAR_ZAWGYI #define HB_SCRIPT_MYANMAR_ZAWGYI ((hb_script_t) HB_TAG ('Q','a','a','g')) case HB_SCRIPT_MYANMAR_ZAWGYI: /* https://github.com/harfbuzz/harfbuzz/issues/1162 */ return &_hb_ot_shaper_myanmar_zawgyi; +#endif /* Unicode-2.0 additions */ diff --git a/thirdparty/harfbuzz/src/hb-ot-stat-table.hh b/thirdparty/harfbuzz/src/hb-ot-stat-table.hh index af6d550c0e..59bb2daccd 100644 --- a/thirdparty/harfbuzz/src/hb-ot-stat-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-stat-table.hh @@ -320,7 +320,7 @@ struct AxisValueFormat4 unsigned total_size = min_size + axisCount * AxisValueRecord::static_size; auto *out = c->serializer->allocate_size<AxisValueFormat4> (total_size); if (unlikely (!out)) return_trace (false); - memcpy (out, this, total_size); + hb_memcpy (out, this, total_size); return_trace (true); } diff --git a/thirdparty/harfbuzz/src/hb-ot-tag.cc b/thirdparty/harfbuzz/src/hb-ot-tag.cc index 1b18270cca..f6ba3b0d47 100644 --- a/thirdparty/harfbuzz/src/hb-ot-tag.cc +++ b/thirdparty/harfbuzz/src/hb-ot-tag.cc @@ -577,7 +577,7 @@ hb_ot_tags_to_script_and_language (hb_tag_t script_tag, else { int shift; - memcpy (buf, lang_str, len); + hb_memcpy (buf, lang_str, len); if (lang_str[0] != 'x' || lang_str[1] != '-') { buf[len++] = '-'; buf[len++] = 'x'; diff --git a/thirdparty/harfbuzz/src/hb-ot-var-avar-table.hh b/thirdparty/harfbuzz/src/hb-ot-var-avar-table.hh index f60bc4a3ce..cc5c5c0068 100644 --- a/thirdparty/harfbuzz/src/hb-ot-var-avar-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-var-avar-table.hh @@ -143,7 +143,7 @@ struct avar TRACE_SANITIZE (this); if (!(version.sanitize (c) && (version.major == 1 -#ifndef HB_NO_VARIATIONS2 +#ifndef HB_NO_AVAR2 || version.major == 2 #endif ) && @@ -159,7 +159,7 @@ struct avar map = &StructAfter<SegmentMaps> (*map); } -#ifndef HB_NO_VARIATIONS2 +#ifndef HB_NO_AVAR2 if (version.major < 2) return_trace (true); @@ -182,7 +182,7 @@ struct avar map = &StructAfter<SegmentMaps> (*map); } -#ifndef HB_NO_VARIATIONS2 +#ifndef HB_NO_AVAR2 if (version.major < 2) return; diff --git a/thirdparty/harfbuzz/src/hb-ot-var-common.hh b/thirdparty/harfbuzz/src/hb-ot-var-common.hh index 1d29e3e4f9..4997c2e2e8 100644 --- a/thirdparty/harfbuzz/src/hb-ot-var-common.hh +++ b/thirdparty/harfbuzz/src/hb-ot-var-common.hh @@ -47,7 +47,7 @@ struct DeltaSetIndexMapFormat01 HBUINT8 *p = c->allocate_size<HBUINT8> (total_size); if (unlikely (!p)) return_trace (nullptr); - memcpy (p, this, HBUINT8::static_size * total_size); + hb_memcpy (p, this, HBUINT8::static_size * total_size); return_trace (out); } @@ -219,6 +219,25 @@ struct DeltaSetIndexMap DEFINE_SIZE_UNION (1, format); }; + +struct VarStoreInstancer +{ + VarStoreInstancer (const VariationStore &varStore, + const DeltaSetIndexMap &varIdxMap, + hb_array_t<int> coords) : + varStore (varStore), varIdxMap (varIdxMap), coords (coords) {} + + operator bool () const { return bool (coords); } + + float operator() (uint32_t varIdx, unsigned short offset = 0) const + { return varStore.get_delta (varIdxMap.map (VarIdx::add (varIdx, offset)), coords); } + + const VariationStore &varStore; + const DeltaSetIndexMap &varIdxMap; + hb_array_t<int> coords; +}; + + } /* namespace OT */ diff --git a/thirdparty/harfbuzz/src/hb-ot-var-fvar-table.hh b/thirdparty/harfbuzz/src/hb-ot-var-fvar-table.hh index af23862870..c1d57a002a 100644 --- a/thirdparty/harfbuzz/src/hb-ot-var-fvar-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-var-fvar-table.hh @@ -59,7 +59,7 @@ struct InstanceRecord const hb_hashmap_t<hb_tag_t, float> *axes_location = c->plan->user_axes_location; for (unsigned i = 0 ; i < axis_count; i++) { - unsigned *axis_tag; + uint32_t *axis_tag; // only keep instances whose coordinates == pinned axis location if (!c->plan->axes_old_index_tag_map->has (i, &axis_tag)) continue; @@ -337,13 +337,13 @@ struct fvar { const InstanceRecord *instance = get_instance (i); - if (hb_any (+ hb_zip (instance->get_coordinates (axisCount), hb_range ((unsigned)axisCount)) - | hb_filter (pinned_axes, hb_second) - | hb_map ([&] (const hb_pair_t<const F16DOT16&, unsigned>& _) + if (hb_any (+ hb_enumerate (instance->get_coordinates (axisCount)) + | hb_filter (pinned_axes, hb_first) + | hb_map ([&] (const hb_pair_t<unsigned, const F16DOT16&>& _) { - hb_tag_t axis_tag = pinned_axes.get (_.second); + hb_tag_t axis_tag = pinned_axes.get (_.first); float location = user_axes_location->get (axis_tag); - if (fabs ((double)location - (double)_.first.to_float ()) > 0.001) return true; + if (fabs ((double)location - (double)_.second.to_float ()) > 0.001) return true; return false; }) )) diff --git a/thirdparty/harfbuzz/src/hb-ot-var-gvar-table.hh b/thirdparty/harfbuzz/src/hb-ot-var-gvar-table.hh index bf1039d1d6..e02063ca43 100644 --- a/thirdparty/harfbuzz/src/hb-ot-var-gvar-table.hh +++ b/thirdparty/harfbuzz/src/hb-ot-var-gvar-table.hh @@ -56,12 +56,11 @@ struct contour_point_vector_t : hb_vector_t<contour_point_t> void extend (const hb_array_t<contour_point_t> &a) { unsigned int old_len = length; - if (unlikely (!resize (old_len + a.length))) + if (unlikely (!resize (old_len + a.length, false))) return; auto arrayZ = this->arrayZ + old_len; unsigned count = a.length; - for (unsigned int i = 0; i < count; i++) - arrayZ[i] = a.arrayZ[i]; + hb_memcpy (arrayZ, a.arrayZ, count * sizeof (arrayZ[0])); } void transform (const float (&matrix)[4]) @@ -231,8 +230,8 @@ struct GlyphVariationData { return (index < var_data->tupleVarCount.get_count ()) && var_data_bytes.check_range (current_tuple, TupleVariationHeader::min_size) && - var_data_bytes.check_range (current_tuple, hb_max (current_tuple->get_data_size (), current_tuple->get_size (axis_count))) && - current_tuple->get_size (axis_count); + var_data_bytes.check_range (current_tuple, hb_max (current_tuple->get_data_size (), + current_tuple->get_size (axis_count))); } bool move_to_next () @@ -281,42 +280,42 @@ struct GlyphVariationData if (unlikely (p + 1 > end)) return false; - uint16_t count = *p++; + unsigned count = *p++; if (count & POINTS_ARE_WORDS) { if (unlikely (p + 1 > end)) return false; count = ((count & POINT_RUN_COUNT_MASK) << 8) | *p++; } - if (unlikely (!points.resize (count))) return false; + if (unlikely (!points.resize (count, false))) return false; - unsigned int n = 0; - uint16_t i = 0; + unsigned n = 0; + unsigned i = 0; while (i < count) { if (unlikely (p + 1 > end)) return false; - uint16_t j; - uint8_t control = *p++; - uint16_t run_count = (control & POINT_RUN_COUNT_MASK) + 1; + unsigned control = *p++; + unsigned run_count = (control & POINT_RUN_COUNT_MASK) + 1; + if (unlikely (i + run_count > count)) return false; + unsigned j; if (control & POINTS_ARE_WORDS) { - for (j = 0; j < run_count && i < count; j++, i++) + if (unlikely (p + run_count * HBUINT16::static_size > end)) return false; + for (j = 0; j < run_count; j++, i++) { - if (unlikely (p + HBUINT16::static_size > end)) return false; n += *(const HBUINT16 *)p; - points[i] = n; + points.arrayZ[i] = n; p += HBUINT16::static_size; } } else { - for (j = 0; j < run_count && i < count; j++, i++) + if (unlikely (p + run_count > end)) return false; + for (j = 0; j < run_count; j++, i++) { - if (unlikely (p + 1 > end)) return false; n += *p++; - points[i] = n; + points.arrayZ[i] = n; } } - if (j < run_count) return false; } return true; } @@ -332,32 +331,37 @@ struct GlyphVariationData DELTA_RUN_COUNT_MASK = 0x3F }; - unsigned int i = 0; - unsigned int count = deltas.length; + unsigned i = 0; + unsigned count = deltas.length; while (i < count) { if (unlikely (p + 1 > end)) return false; - uint8_t control = *p++; - unsigned int run_count = (control & DELTA_RUN_COUNT_MASK) + 1; - unsigned int j; + unsigned control = *p++; + unsigned run_count = (control & DELTA_RUN_COUNT_MASK) + 1; + if (unlikely (i + run_count > count)) return false; + unsigned j; if (control & DELTAS_ARE_ZERO) - for (j = 0; j < run_count && i < count; j++, i++) - deltas[i] = 0; + { + for (j = 0; j < run_count; j++, i++) + deltas.arrayZ[i] = 0; + } else if (control & DELTAS_ARE_WORDS) - for (j = 0; j < run_count && i < count; j++, i++) + { + if (unlikely (p + run_count * HBUINT16::static_size > end)) return false; + for (j = 0; j < run_count; j++, i++) { - if (unlikely (p + HBUINT16::static_size > end)) return false; - deltas[i] = *(const HBINT16 *) p; + deltas.arrayZ[i] = * (const HBINT16 *) p; p += HBUINT16::static_size; } + } else - for (j = 0; j < run_count && i < count; j++, i++) + { + if (unlikely (p + run_count > end)) return false; + for (j = 0; j < run_count; j++, i++) { - if (unlikely (p + 1 > end)) return false; - deltas[i] = *(const HBINT8 *) p++; + deltas.arrayZ[i] = * (const HBINT8 *) p++; } - if (j < run_count) - return false; + } } return true; } @@ -450,7 +454,7 @@ struct gvar F2DOT14 *tuples = c->serializer->allocate_size<F2DOT14> (shared_tuple_size); if (!tuples) return_trace (false); out->sharedTuples = (char *) tuples - (char *) out; - memcpy (tuples, this+sharedTuples, shared_tuple_size); + hb_memcpy (tuples, this+sharedTuples, shared_tuple_size); } char *subset_data = c->serializer->allocate_size<char> (subset_data_size); @@ -473,7 +477,7 @@ struct gvar ((HBUINT16 *) subset_offsets)[gid] = glyph_offset / 2; if (var_data_bytes.length > 0) - memcpy (subset_data, var_data_bytes.arrayZ, var_data_bytes.length); + hb_memcpy (subset_data, var_data_bytes.arrayZ, var_data_bytes.length); subset_data += var_data_bytes.length; glyph_offset += var_data_bytes.length; } @@ -501,6 +505,7 @@ struct gvar unsigned get_offset (unsigned i) const { if (unlikely (i > glyphCount)) return 0; + _hb_compiler_memory_r_barrier (); return is_long_offset () ? get_long_offset_array ()[i] : get_short_offset_array ()[i] * 2; } @@ -521,11 +526,11 @@ struct gvar unsigned int target, unsigned int prev, unsigned int next, float contour_point_t::*m) { - float target_val = points[target].*m; - float prev_val = points[prev].*m; - float next_val = points[next].*m; - float prev_delta = deltas[prev].*m; - float next_delta = deltas[next].*m; + float target_val = points.arrayZ[target].*m; + float prev_val = points.arrayZ[prev].*m; + float next_val = points.arrayZ[next].*m; + float prev_delta = deltas.arrayZ[prev].*m; + float next_delta = deltas.arrayZ[next].*m; if (prev_val == next_val) return (prev_delta == next_delta) ? prev_delta : 0.f; @@ -543,10 +548,11 @@ struct gvar { return (i >= end) ? start : (i + 1); } public: - bool apply_deltas_to_points (hb_codepoint_t glyph, hb_font_t *font, + bool apply_deltas_to_points (hb_codepoint_t glyph, + hb_array_t<int> coords, const hb_array_t<contour_point_t> points) const { - if (!font->num_coords) return true; + if (!coords) return true; if (unlikely (glyph >= table->glyphCount)) return true; @@ -559,20 +565,20 @@ struct gvar return true; /* so isn't applied at all */ /* Save original points for inferred delta calculation */ - contour_point_vector_t orig_points; - if (unlikely (!orig_points.resize (points.length))) return false; - for (unsigned int i = 0; i < orig_points.length; i++) - orig_points.arrayZ[i] = points.arrayZ[i]; + contour_point_vector_t orig_points_vec; + orig_points_vec.extend (points); + if (unlikely (orig_points_vec.in_error ())) return false; + auto orig_points = orig_points_vec.as_array (); - contour_point_vector_t deltas; /* flag is used to indicate referenced point */ - if (unlikely (!deltas.resize (points.length))) return false; + contour_point_vector_t deltas_vec; /* flag is used to indicate referenced point */ + if (unlikely (!deltas_vec.resize (points.length, false))) return false; + auto deltas = deltas_vec.as_array (); hb_vector_t<unsigned> end_points; for (unsigned i = 0; i < points.length; ++i) - if (points[i].is_end_point) + if (points.arrayZ[i].is_end_point) end_points.push (i); - auto coords = hb_array (font->coords, font->num_coords); unsigned num_coords = table->axisCount; hb_array_t<const F2DOT14> shared_tuples = (table+table->sharedTuples).as_array (table->sharedTupleCount * table->axisCount); @@ -598,70 +604,89 @@ struct gvar bool apply_to_all = (indices.length == 0); unsigned int num_deltas = apply_to_all ? points.length : indices.length; - if (unlikely (!x_deltas.resize (num_deltas))) return false; + if (unlikely (!x_deltas.resize (num_deltas, false))) return false; if (unlikely (!GlyphVariationData::unpack_deltas (p, x_deltas, end))) return false; - if (unlikely (!y_deltas.resize (num_deltas))) return false; + if (unlikely (!y_deltas.resize (num_deltas, false))) return false; if (unlikely (!GlyphVariationData::unpack_deltas (p, y_deltas, end))) return false; - for (unsigned int i = 0; i < deltas.length; i++) - deltas[i].init (); - for (unsigned int i = 0; i < num_deltas; i++) - { - unsigned int pt_index = apply_to_all ? i : indices[i]; - if (unlikely (pt_index >= deltas.length)) continue; - deltas.arrayZ[pt_index].flag = 1; /* this point is referenced, i.e., explicit deltas specified */ - deltas.arrayZ[pt_index].x += x_deltas.arrayZ[i] * scalar; - deltas.arrayZ[pt_index].y += y_deltas.arrayZ[i] * scalar; - } + hb_memset (deltas.arrayZ, 0, deltas.get_size ()); + + unsigned ref_points = 0; + if (scalar != 1.0f) + for (unsigned int i = 0; i < num_deltas; i++) + { + unsigned int pt_index = apply_to_all ? i : indices[i]; + if (unlikely (pt_index >= deltas.length)) continue; + auto &delta = deltas.arrayZ[pt_index]; + ref_points += !delta.flag; + delta.flag = 1; /* this point is referenced, i.e., explicit deltas specified */ + delta.x += x_deltas.arrayZ[i] * scalar; + delta.y += y_deltas.arrayZ[i] * scalar; + } + else + for (unsigned int i = 0; i < num_deltas; i++) + { + unsigned int pt_index = apply_to_all ? i : indices[i]; + if (unlikely (pt_index >= deltas.length)) continue; + auto &delta = deltas.arrayZ[pt_index]; + ref_points += !delta.flag; + delta.flag = 1; /* this point is referenced, i.e., explicit deltas specified */ + delta.x += x_deltas.arrayZ[i]; + delta.y += y_deltas.arrayZ[i]; + } /* infer deltas for unreferenced points */ - unsigned start_point = 0; - for (unsigned c = 0; c < end_points.length; c++) + if (ref_points && ref_points < orig_points.length) { - unsigned end_point = end_points[c]; + unsigned start_point = 0; + for (unsigned c = 0; c < end_points.length; c++) + { + unsigned end_point = end_points.arrayZ[c]; - /* Check the number of unreferenced points in a contour. If no unref points or no ref points, nothing to do. */ - unsigned unref_count = 0; - for (unsigned i = start_point; i <= end_point; i++) - if (!deltas[i].flag) unref_count++; + /* Check the number of unreferenced points in a contour. If no unref points or no ref points, nothing to do. */ + unsigned unref_count = 0; + for (unsigned i = start_point; i < end_point + 1; i++) + unref_count += deltas.arrayZ[i].flag; + unref_count = (end_point - start_point + 1) - unref_count; - unsigned j = start_point; - if (unref_count == 0 || unref_count > end_point - start_point) - goto no_more_gaps; + unsigned j = start_point; + if (unref_count == 0 || unref_count > end_point - start_point) + goto no_more_gaps; - for (;;) - { - /* Locate the next gap of unreferenced points between two referenced points prev and next. - * Note that a gap may wrap around at left (start_point) and/or at right (end_point). - */ - unsigned int prev, next, i; - for (;;) - { - i = j; - j = next_index (i, start_point, end_point); - if (deltas[i].flag && !deltas[j].flag) break; - } - prev = j = i; - for (;;) - { - i = j; - j = next_index (i, start_point, end_point); - if (!deltas[i].flag && deltas[j].flag) break; - } - next = j; - /* Infer deltas for all unref points in the gap between prev and next */ - i = prev; for (;;) { - i = next_index (i, start_point, end_point); - if (i == next) break; - deltas[i].x = infer_delta (orig_points.as_array (), deltas.as_array (), i, prev, next, &contour_point_t::x); - deltas[i].y = infer_delta (orig_points.as_array (), deltas.as_array (), i, prev, next, &contour_point_t::y); - if (--unref_count == 0) goto no_more_gaps; + /* Locate the next gap of unreferenced points between two referenced points prev and next. + * Note that a gap may wrap around at left (start_point) and/or at right (end_point). + */ + unsigned int prev, next, i; + for (;;) + { + i = j; + j = next_index (i, start_point, end_point); + if (deltas.arrayZ[i].flag && !deltas.arrayZ[j].flag) break; + } + prev = j = i; + for (;;) + { + i = j; + j = next_index (i, start_point, end_point); + if (!deltas.arrayZ[i].flag && deltas.arrayZ[j].flag) break; + } + next = j; + /* Infer deltas for all unref points in the gap between prev and next */ + i = prev; + for (;;) + { + i = next_index (i, start_point, end_point); + if (i == next) break; + deltas.arrayZ[i].x = infer_delta (orig_points, deltas, i, prev, next, &contour_point_t::x); + deltas.arrayZ[i].y = infer_delta (orig_points, deltas, i, prev, next, &contour_point_t::y); + if (--unref_count == 0) goto no_more_gaps; + } } + no_more_gaps: + start_point = end_point + 1; } - no_more_gaps: - start_point = end_point + 1; } /* apply specified / inferred deltas to points */ diff --git a/thirdparty/harfbuzz/src/hb-pool.hh b/thirdparty/harfbuzz/src/hb-pool.hh index dcf8f6627d..e4bb64f627 100644 --- a/thirdparty/harfbuzz/src/hb-pool.hh +++ b/thirdparty/harfbuzz/src/hb-pool.hh @@ -35,15 +35,13 @@ template <typename T, unsigned ChunkLen = 16> struct hb_pool_t { hb_pool_t () : next (nullptr) {} - ~hb_pool_t () { fini (); } - - void fini () + ~hb_pool_t () { next = nullptr; - for (chunk_t *_ : chunks) hb_free (_); - - chunks.fini (); + + hb_iter (chunks) + | hb_apply (hb_free) + ; } T* alloc () @@ -60,7 +58,7 @@ struct hb_pool_t T* obj = next; next = * ((T**) next); - memset (obj, 0, sizeof (T)); + hb_memset (obj, 0, sizeof (T)); return obj; } diff --git a/thirdparty/harfbuzz/src/hb-priority-queue.hh b/thirdparty/harfbuzz/src/hb-priority-queue.hh index ffb86e30ae..ac76b7d955 100644 --- a/thirdparty/harfbuzz/src/hb-priority-queue.hh +++ b/thirdparty/harfbuzz/src/hb-priority-queue.hh @@ -63,7 +63,9 @@ struct hb_priority_queue_t heap.arrayZ[0] = heap.arrayZ[heap.length - 1]; heap.shrink (heap.length - 1); - bubble_down (0); + + if (!is_empty ()) + bubble_down (0); return result; } @@ -100,7 +102,7 @@ struct hb_priority_queue_t void bubble_down (unsigned index) { - assert (index <= heap.length); + assert (index < heap.length); unsigned left = left_child (index); unsigned right = right_child (index); @@ -112,7 +114,7 @@ struct hb_priority_queue_t bool has_right = right < heap.length; if (heap.arrayZ[index].first <= heap.arrayZ[left].first - && (!has_right || heap[index].first <= heap.arrayZ[right].first)) + && (!has_right || heap.arrayZ[index].first <= heap.arrayZ[right].first)) return; if (!has_right || heap.arrayZ[left].first < heap.arrayZ[right].first) @@ -128,7 +130,7 @@ struct hb_priority_queue_t void bubble_up (unsigned index) { - assert (index <= heap.length); + assert (index < heap.length); if (index == 0) return; @@ -142,8 +144,8 @@ struct hb_priority_queue_t void swap (unsigned a, unsigned b) { - assert (a <= heap.length); - assert (b <= heap.length); + assert (a < heap.length); + assert (b < heap.length); hb_swap (heap.arrayZ[a], heap.arrayZ[b]); } }; diff --git a/thirdparty/harfbuzz/src/hb-repacker.hh b/thirdparty/harfbuzz/src/hb-repacker.hh index c97ce6cc2c..7a3143cec3 100644 --- a/thirdparty/harfbuzz/src/hb-repacker.hh +++ b/thirdparty/harfbuzz/src/hb-repacker.hh @@ -209,7 +209,7 @@ bool _try_isolating_subgraphs (const hb_vector_t<graph::overflow_record_t>& over // Only move at most half of the roots in a space at a time. unsigned extra = roots_to_isolate.get_population () - maximum_to_move; while (extra--) { - unsigned root = HB_SET_VALUE_INVALID; + uint32_t root = HB_SET_VALUE_INVALID; roots_to_isolate.previous (&root); roots_to_isolate.del (root); } @@ -283,6 +283,11 @@ hb_resolve_graph_overflows (hb_tag_t table_tag, graph_t& sorted_graph /* IN/OUT */) { sorted_graph.sort_shortest_distance (); + if (sorted_graph.in_error ()) + { + DEBUG_MSG (SUBSET_REPACK, nullptr, "Sorted graph in error state after initial sort."); + return false; + } bool will_overflow = graph::will_overflow (sorted_graph); if (!will_overflow) @@ -376,6 +381,26 @@ hb_resolve_overflows (const T& packed, unsigned max_rounds = 20, bool recalculate_extensions = false) { graph_t sorted_graph (packed); + if (sorted_graph.in_error ()) + { + // Invalid graph definition. + return nullptr; + } + + if (!sorted_graph.is_fully_connected ()) + { + sorted_graph.print_orphaned_nodes (); + return nullptr; + } + + if (sorted_graph.in_error ()) + { + // Allocations failed somewhere + DEBUG_MSG (SUBSET_REPACK, nullptr, + "Graph is in error, likely due to a memory allocation error."); + return nullptr; + } + if (!hb_resolve_graph_overflows (table_tag, max_rounds, recalculate_extensions, sorted_graph)) return nullptr; diff --git a/thirdparty/harfbuzz/src/hb-sanitize.hh b/thirdparty/harfbuzz/src/hb-sanitize.hh index 65c2772201..bd3250e580 100644 --- a/thirdparty/harfbuzz/src/hb-sanitize.hh +++ b/thirdparty/harfbuzz/src/hb-sanitize.hh @@ -198,10 +198,11 @@ struct hb_sanitize_context_t : void start_processing () { reset_object (); - if (unlikely (hb_unsigned_mul_overflows (this->end - this->start, HB_SANITIZE_MAX_OPS_FACTOR))) + unsigned m; + if (unlikely (hb_unsigned_mul_overflows (this->end - this->start, HB_SANITIZE_MAX_OPS_FACTOR, &m))) this->max_ops = HB_SANITIZE_MAX_OPS_MAX; else - this->max_ops = hb_clamp ((unsigned) (this->end - this->start) * HB_SANITIZE_MAX_OPS_FACTOR, + this->max_ops = hb_clamp (m, (unsigned) HB_SANITIZE_MAX_OPS_MIN, (unsigned) HB_SANITIZE_MAX_OPS_MAX); this->edit_count = 0; @@ -252,8 +253,9 @@ struct hb_sanitize_context_t : unsigned int a, unsigned int b) const { - return !hb_unsigned_mul_overflows (a, b) && - this->check_range (base, a * b); + unsigned m; + return !hb_unsigned_mul_overflows (a, b, &m) && + this->check_range (base, m); } template <typename T> @@ -262,8 +264,9 @@ struct hb_sanitize_context_t : unsigned int b, unsigned int c) const { - return !hb_unsigned_mul_overflows (a, b) && - this->check_range (base, a * b, c); + unsigned m; + return !hb_unsigned_mul_overflows (a, b, &m) && + this->check_range (base, m, c); } template <typename T> diff --git a/thirdparty/harfbuzz/src/hb-serialize.hh b/thirdparty/harfbuzz/src/hb-serialize.hh index f47cde5eb5..d5573281f1 100644 --- a/thirdparty/harfbuzz/src/hb-serialize.hh +++ b/thirdparty/harfbuzz/src/hb-serialize.hh @@ -194,7 +194,6 @@ struct hb_serialize_context_t current = current->next; _->fini (); } - object_pool.fini (); } bool in_error () const { return bool (errors); } @@ -224,6 +223,7 @@ struct hb_serialize_context_t this->errors = HB_SERIALIZE_ERROR_NONE; this->head = this->start; this->tail = this->end; + this->zerocopy = nullptr; this->debug_depth = 0; fini (); @@ -326,7 +326,8 @@ struct hb_serialize_context_t if (unlikely (in_error() && !only_overflow ())) return; current = current->next; - revert (obj->head, obj->tail); + revert (zerocopy ? zerocopy : obj->head, obj->tail); + zerocopy = nullptr; obj->fini (); object_pool.release (obj); } @@ -344,8 +345,11 @@ struct hb_serialize_context_t current = current->next; obj->tail = head; obj->next = nullptr; + assert (obj->head <= obj->tail); unsigned len = obj->tail - obj->head; - head = obj->head; /* Rewind head. */ + head = zerocopy ? zerocopy : obj->head; /* Rewind head. */ + bool was_zerocopy = zerocopy; + zerocopy = nullptr; if (!len) { @@ -355,9 +359,11 @@ struct hb_serialize_context_t } objidx_t objidx; + uint32_t hash = 0; if (share) { - objidx = packed_map.get (obj); + hash = hb_hash (obj); + objidx = packed_map.get_with_hash (obj, hash); if (objidx) { merge_virtual_links (obj, objidx); @@ -367,7 +373,10 @@ struct hb_serialize_context_t } tail -= len; - memmove (tail, obj->head, len); + if (was_zerocopy) + assert (tail == obj->head); + else + memmove (tail, obj->head, len); obj->head = tail; obj->tail = tail + len; @@ -385,7 +394,7 @@ struct hb_serialize_context_t objidx = packed.length - 1; - if (share) packed_map.set (obj, objidx); + if (share) packed_map.set_with_hash (obj, hash, objidx); propagate_error (packed_map); return objidx; @@ -569,8 +578,26 @@ struct hb_serialize_context_t return !bool ((errors = (errors | err_type))); } + bool start_zerocopy (size_t size) + { + if (unlikely (in_error ())) return false; + + if (unlikely (size > INT_MAX || this->tail - this->head < ptrdiff_t (size))) + { + err (HB_SERIALIZE_ERROR_OUT_OF_ROOM); + return false; + } + + assert (!this->zerocopy); + this->zerocopy = this->head; + + assert (this->current->head == this->head); + this->current->head = this->current->tail = this->head = this->tail - size; + return true; + } + template <typename Type> - Type *allocate_size (size_t size) + Type *allocate_size (size_t size, bool clear = true) { if (unlikely (in_error ())) return nullptr; @@ -579,7 +606,8 @@ struct hb_serialize_context_t err (HB_SERIALIZE_ERROR_OUT_OF_ROOM); return nullptr; } - hb_memset (this->head, 0, size); + if (clear) + hb_memset (this->head, 0, size); char *ret = this->head; this->head += size; return reinterpret_cast<Type *> (ret); @@ -593,9 +621,9 @@ struct hb_serialize_context_t Type *embed (const Type *obj) { unsigned int size = obj->get_size (); - Type *ret = this->allocate_size<Type> (size); + Type *ret = this->allocate_size<Type> (size, false); if (unlikely (!ret)) return nullptr; - memcpy (ret, obj, size); + hb_memcpy (ret, obj, size); return ret; } template <typename Type> @@ -616,7 +644,7 @@ struct hb_serialize_context_t } /* Like embed, but active: calls obj.operator=() or obj.copy() to transfer data - * instead of memcpy(). */ + * instead of hb_memcpy(). */ template <typename Type, typename ...Ts> Type *copy (const Type &src, Ts&&... ds) { return _copy (src, hb_prioritize, std::forward<Ts> (ds)...); } @@ -634,7 +662,7 @@ struct hb_serialize_context_t hb_serialize_context_t& operator << (const Type &obj) & { embed (obj); return *this; } template <typename Type> - Type *extend_size (Type *obj, size_t size) + Type *extend_size (Type *obj, size_t size, bool clear = true) { if (unlikely (in_error ())) return nullptr; @@ -642,12 +670,12 @@ struct hb_serialize_context_t assert ((char *) obj <= this->head); assert ((size_t) (this->head - (char *) obj) <= size); if (unlikely (((char *) obj + size < (char *) obj) || - !this->allocate_size<Type> (((char *) obj) + size - this->head))) return nullptr; + !this->allocate_size<Type> (((char *) obj) + size - this->head, clear))) return nullptr; return reinterpret_cast<Type *> (obj); } template <typename Type> - Type *extend_size (Type &obj, size_t size) - { return extend_size (std::addressof (obj), size); } + Type *extend_size (Type &obj, size_t size, bool clear = true) + { return extend_size (std::addressof (obj), size, clear); } template <typename Type> Type *extend_min (Type *obj) { return extend_size (obj, obj->min_size); } @@ -676,8 +704,8 @@ struct hb_serialize_context_t char *p = (char *) hb_malloc (len); if (unlikely (!p)) return hb_bytes_t (); - memcpy (p, this->start, this->head - this->start); - memcpy (p + (this->head - this->start), this->tail, this->end - this->tail); + hb_memcpy (p, this->start, this->head - this->start); + hb_memcpy (p + (this->head - this->start), this->tail, this->end - this->tail); return hb_bytes_t (p, len); } template <typename Type> @@ -704,7 +732,7 @@ struct hb_serialize_context_t } public: - char *start, *head, *tail, *end; + char *start, *head, *tail, *end, *zerocopy; unsigned int debug_depth; hb_serialize_error_t errors; diff --git a/thirdparty/harfbuzz/src/hb-set-digest.hh b/thirdparty/harfbuzz/src/hb-set-digest.hh index fab36216e4..e8409111f2 100644 --- a/thirdparty/harfbuzz/src/hb-set-digest.hh +++ b/thirdparty/harfbuzz/src/hb-set-digest.hh @@ -28,6 +28,7 @@ #define HB_SET_DIGEST_HH #include "hb.hh" +#include "hb-machinery.hh" /* * The set-digests here implement various "filters" that support @@ -75,6 +76,8 @@ struct hb_set_digest_bits_pattern_t void init () { mask = 0; } + void add (const hb_set_digest_bits_pattern_t &o) { mask |= o.mask; } + void add (hb_codepoint_t g) { mask |= mask_for (g); } bool add_range (hb_codepoint_t a, hb_codepoint_t b) @@ -95,7 +98,7 @@ struct hb_set_digest_bits_pattern_t for (unsigned int i = 0; i < count; i++) { add (*array); - array = (const T *) (stride + (const char *) array); + array = &StructAtOffsetUnaligned<T> ((const void *) array, stride); } } template <typename T> @@ -103,16 +106,15 @@ struct hb_set_digest_bits_pattern_t template <typename T> bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T)) { - for (unsigned int i = 0; i < count; i++) - { - add (*array); - array = (const T *) (stride + (const char *) array); - } + add_array (array, count, stride); return true; } template <typename T> bool add_sorted_array (const hb_sorted_array_t<const T>& arr) { return add_sorted_array (&arr, arr.len ()); } + bool may_have (const hb_set_digest_bits_pattern_t &o) const + { return mask & o.mask; } + bool may_have (hb_codepoint_t g) const { return mask & mask_for (g); } @@ -132,6 +134,12 @@ struct hb_set_digest_combiner_t tail.init (); } + void add (const hb_set_digest_combiner_t &o) + { + head.add (o.head); + tail.add (o.tail); + } + void add (hb_codepoint_t g) { head.add (g); @@ -140,9 +148,8 @@ struct hb_set_digest_combiner_t bool add_range (hb_codepoint_t a, hb_codepoint_t b) { - head.add_range (a, b); - tail.add_range (a, b); - return true; + return head.add_range (a, b) && + tail.add_range (a, b); } template <typename T> void add_array (const T *array, unsigned int count, unsigned int stride=sizeof(T)) @@ -155,13 +162,17 @@ struct hb_set_digest_combiner_t template <typename T> bool add_sorted_array (const T *array, unsigned int count, unsigned int stride=sizeof(T)) { - head.add_sorted_array (array, count, stride); - tail.add_sorted_array (array, count, stride); - return true; + return head.add_sorted_array (array, count, stride) && + tail.add_sorted_array (array, count, stride); } template <typename T> bool add_sorted_array (const hb_sorted_array_t<const T>& arr) { return add_sorted_array (&arr, arr.len ()); } + bool may_have (const hb_set_digest_combiner_t &o) const + { + return head.may_have (o.head) && tail.may_have (o.tail); + } + bool may_have (hb_codepoint_t g) const { return head.may_have (g) && tail.may_have (g); diff --git a/thirdparty/harfbuzz/src/hb-set.hh b/thirdparty/harfbuzz/src/hb-set.hh index 5d5576cb9e..f958a081fb 100644 --- a/thirdparty/harfbuzz/src/hb-set.hh +++ b/thirdparty/harfbuzz/src/hb-set.hh @@ -105,10 +105,8 @@ struct hb_sparseset_t bool get (hb_codepoint_t g) const { return s.get (g); } /* Has interface. */ - static constexpr bool SENTINEL = false; - typedef bool value_t; - value_t operator [] (hb_codepoint_t k) const { return get (k); } - bool has (hb_codepoint_t k) const { return (*this)[k] != SENTINEL; } + bool operator [] (hb_codepoint_t k) const { return get (k); } + bool has (hb_codepoint_t k) const { return (*this)[k]; } /* Predicate. */ bool operator () (hb_codepoint_t k) const { return has (k); } diff --git a/thirdparty/harfbuzz/src/hb-shape-plan.cc b/thirdparty/harfbuzz/src/hb-shape-plan.cc index 9e513c0458..cabcbd4e72 100644 --- a/thirdparty/harfbuzz/src/hb-shape-plan.cc +++ b/thirdparty/harfbuzz/src/hb-shape-plan.cc @@ -31,6 +31,8 @@ #include "hb-buffer.hh" +#ifndef HB_NO_SHAPER + /** * SECTION:hb-shape-plan * @title: hb-shape-plan @@ -74,7 +76,7 @@ hb_shape_plan_key_t::init (bool copy, this->user_features = copy ? features : user_features; if (copy && num_user_features) { - memcpy (features, user_features, num_user_features * sizeof (hb_feature_t)); + hb_memcpy (features, user_features, num_user_features * sizeof (hb_feature_t)); /* Make start/end uniform to easier catch bugs. */ for (unsigned int i = 0; i < num_user_features; i++) { @@ -574,3 +576,6 @@ retry: return hb_shape_plan_reference (shape_plan); } + + +#endif diff --git a/thirdparty/harfbuzz/src/hb-shape.cc b/thirdparty/harfbuzz/src/hb-shape.cc index 547d0afc47..7b5bf2c5ef 100644 --- a/thirdparty/harfbuzz/src/hb-shape.cc +++ b/thirdparty/harfbuzz/src/hb-shape.cc @@ -35,6 +35,8 @@ #include "hb-machinery.hh" +#ifndef HB_NO_SHAPER + /** * SECTION:hb-shape * @title: hb-shape @@ -192,3 +194,6 @@ hb_shape (hb_font_t *font, { hb_shape_full (font, buffer, features, num_features, nullptr); } + + +#endif diff --git a/thirdparty/harfbuzz/src/hb-shaper.cc b/thirdparty/harfbuzz/src/hb-shaper.cc index a900ac6991..c4885cda94 100644 --- a/thirdparty/harfbuzz/src/hb-shaper.cc +++ b/thirdparty/harfbuzz/src/hb-shaper.cc @@ -53,7 +53,7 @@ static struct hb_shapers_lazy_loader_t : hb_lazy_loader_t<hb_shaper_entry_t, if (unlikely (!shapers)) return nullptr; - memcpy (shapers, _hb_all_shapers, sizeof (_hb_all_shapers)); + hb_memcpy (shapers, _hb_all_shapers, sizeof (_hb_all_shapers)); /* Reorder shaper list to prefer requested shapers. */ unsigned int i = 0; diff --git a/thirdparty/harfbuzz/src/hb-static.cc b/thirdparty/harfbuzz/src/hb-static.cc index 5d4c7cda1b..eac50754c2 100644 --- a/thirdparty/harfbuzz/src/hb-static.cc +++ b/thirdparty/harfbuzz/src/hb-static.cc @@ -33,6 +33,7 @@ #include "hb-aat-layout-feat-table.hh" #include "hb-ot-layout-common.hh" #include "hb-ot-cmap-table.hh" +#include "hb-ot-color-colr-table.hh" #include "hb-ot-glyf-table.hh" #include "hb-ot-head-table.hh" #include "hb-ot-maxp-table.hh" @@ -47,6 +48,7 @@ DEFINE_NULL_NAMESPACE_BYTES (OT, Index) = {0xFF,0xFF}; DEFINE_NULL_NAMESPACE_BYTES (OT, VarIdx) = {0xFF,0xFF,0xFF,0xFF}; DEFINE_NULL_NAMESPACE_BYTES (OT, LangSys) = {0x00,0x00, 0xFF,0xFF, 0x00,0x00}; DEFINE_NULL_NAMESPACE_BYTES (OT, RangeRecord) = {0x01}; +DEFINE_NULL_NAMESPACE_BYTES (OT, ClipRecord) = {0x01}; DEFINE_NULL_NAMESPACE_BYTES (OT, CmapSubtableLongGroup) = {0x00,0x00,0x00,0x01, 0x00,0x00,0x00,0x00, 0x00,0x00,0x00,0x00}; DEFINE_NULL_NAMESPACE_BYTES (AAT, SettingName) = {0xFF,0xFF, 0xFF,0xFF}; DEFINE_NULL_NAMESPACE_BYTES (AAT, Lookup) = {0xFF,0xFF}; diff --git a/thirdparty/harfbuzz/src/hb-subset-accelerator.hh b/thirdparty/harfbuzz/src/hb-subset-accelerator.hh index 34bd0534fb..63ae6d77e2 100644 --- a/thirdparty/harfbuzz/src/hb-subset-accelerator.hh +++ b/thirdparty/harfbuzz/src/hb-subset-accelerator.hh @@ -31,21 +31,34 @@ #include "hb.hh" #include "hb-map.hh" +#include "hb-multimap.hh" #include "hb-set.hh" +extern HB_INTERNAL hb_user_data_key_t _hb_subset_accelerator_user_data_key; + +namespace CFF { +struct cff_subset_accelerator_t; +} + +namespace OT { +struct SubtableUnicodesCache; +}; + struct hb_subset_accelerator_t { static hb_user_data_key_t* user_data_key() { - static hb_user_data_key_t key; - return &key; + return &_hb_subset_accelerator_user_data_key; } static hb_subset_accelerator_t* create(const hb_map_t& unicode_to_gid_, - const hb_set_t& unicodes_) { + const hb_multimap_t gid_to_unicodes_, + const hb_set_t& unicodes_, + bool has_seac_) { hb_subset_accelerator_t* accel = (hb_subset_accelerator_t*) hb_malloc (sizeof(hb_subset_accelerator_t)); - new (accel) hb_subset_accelerator_t (unicode_to_gid_, unicodes_); + new (accel) hb_subset_accelerator_t (unicode_to_gid_, gid_to_unicodes_, unicodes_); + accel->has_seac = has_seac_; return accel; } @@ -53,22 +66,54 @@ struct hb_subset_accelerator_t if (!value) return; hb_subset_accelerator_t* accel = (hb_subset_accelerator_t*) value; + + if (accel->cff_accelerator && accel->destroy_cff_accelerator) + accel->destroy_cff_accelerator ((void*) accel->cff_accelerator); + + if (accel->cmap_cache && accel->destroy_cmap_cache) + accel->destroy_cmap_cache ((void*) accel->cmap_cache); + accel->~hb_subset_accelerator_t (); hb_free (accel); } - hb_subset_accelerator_t(const hb_map_t& unicode_to_gid_, + hb_subset_accelerator_t (const hb_map_t& unicode_to_gid_, + const hb_multimap_t& gid_to_unicodes_, const hb_set_t& unicodes_) - : unicode_to_gid(unicode_to_gid_), unicodes(unicodes_) {} + : unicode_to_gid(unicode_to_gid_), gid_to_unicodes (gid_to_unicodes_), unicodes(unicodes_), + cmap_cache(nullptr), destroy_cmap_cache(nullptr), + has_seac(false), cff_accelerator(nullptr), destroy_cff_accelerator(nullptr) + { sanitized_table_cache_lock.init (); } + + ~hb_subset_accelerator_t () + { sanitized_table_cache_lock.fini (); } + + // Generic + + mutable hb_mutex_t sanitized_table_cache_lock; + mutable hb_hashmap_t<hb_tag_t, hb::unique_ptr<hb_blob_t>> sanitized_table_cache; const hb_map_t unicode_to_gid; + const hb_multimap_t gid_to_unicodes; const hb_set_t unicodes; + + // cmap + const OT::SubtableUnicodesCache* cmap_cache; + hb_destroy_func_t destroy_cmap_cache; + + // CFF + bool has_seac; + const CFF::cff_subset_accelerator_t* cff_accelerator; + hb_destroy_func_t destroy_cff_accelerator; + // TODO(garretrieger): cumulative glyf checksum map - // TODO(garretrieger): sanitized table cache. bool in_error () const { - return unicode_to_gid.in_error() || unicodes.in_error (); + return unicode_to_gid.in_error () || + gid_to_unicodes.in_error () || + unicodes.in_error () || + sanitized_table_cache.in_error (); } }; diff --git a/thirdparty/harfbuzz/src/hb-subset-cff-common.cc b/thirdparty/harfbuzz/src/hb-subset-cff-common.cc index 711b2236d6..6e1b6f713d 100644 --- a/thirdparty/harfbuzz/src/hb-subset-cff-common.cc +++ b/thirdparty/harfbuzz/src/hb-subset-cff-common.cc @@ -66,8 +66,7 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan, { /* use hb_set to determine the subset of font dicts */ - hb_set_t *set = hb_set_create (); - if (unlikely (set == &Null (hb_set_t))) return false; + hb_set_t set; hb_codepoint_t prev_fd = CFF_UNDEF_CODE; for (hb_codepoint_t i = 0; i < subset_num_glyphs; i++) { @@ -79,7 +78,7 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan, glyph = i; } fd = src.get_fd (glyph); - set->add (fd); + set.add (fd); if (fd != prev_fd) { @@ -90,12 +89,11 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan, } } - subset_fd_count = set->get_population (); + subset_fd_count = set.get_population (); if (subset_fd_count == fdCount) { /* all font dicts belong to the subset. no need to subset FDSelect & FDArray */ fdmap.identity (fdCount); - hb_set_destroy (set); } else { @@ -103,9 +101,8 @@ hb_plan_subset_cff_fdselect (const hb_subset_plan_t *plan, fdmap.reset (); hb_codepoint_t fd = CFF_UNDEF_CODE; - while (set->next (&fd)) + while (set.next (&fd)) fdmap.add (fd); - hb_set_destroy (set); if (unlikely (fdmap.get_population () != subset_fd_count)) return false; } diff --git a/thirdparty/harfbuzz/src/hb-subset-cff-common.hh b/thirdparty/harfbuzz/src/hb-subset-cff-common.hh index bb9f27eec1..8bbc017656 100644 --- a/thirdparty/harfbuzz/src/hb-subset-cff-common.hh +++ b/thirdparty/harfbuzz/src/hb-subset-cff-common.hh @@ -38,15 +38,16 @@ namespace CFF { struct str_encoder_t { str_encoder_t (str_buff_t &buff_) - : buff (buff_), error (false) {} + : buff (buff_) {} void reset () { buff.reset (); } void encode_byte (unsigned char b) { - buff.push (b); - if (unlikely (buff.in_error ())) - set_error (); + if (likely ((signed) buff.length < buff.allocated)) + buff.arrayZ[buff.length++] = b; + else + buff.push (b); } void encode_int (int v) @@ -108,27 +109,18 @@ struct str_encoder_t encode_byte (op); } - void copy_str (const hb_ubytes_t &str) + void copy_str (const unsigned char *str, unsigned length) { - unsigned int offset = buff.length; - /* Manually resize buffer since faster. */ - if ((signed) (buff.length + str.length) <= buff.allocated) - buff.length += str.length; - else if (unlikely (!buff.resize (offset + str.length))) - { - set_error (); - return; - } - memcpy (buff.arrayZ + offset, &str[0], str.length); + assert ((signed) (buff.length + length) <= buff.allocated); + hb_memcpy (buff.arrayZ + buff.length, str, length); + buff.length += length; } - bool is_error () const { return error; } + bool in_error () const { return buff.in_error (); } protected: - void set_error () { error = true; } str_buff_t &buff; - bool error; }; struct cff_sub_table_info_t { @@ -187,9 +179,12 @@ struct cff_font_dict_op_serializer_t : op_serializer_t } else { - HBUINT8 *d = c->allocate_size<HBUINT8> (opstr.str.length); + unsigned char *d = c->allocate_size<unsigned char> (opstr.length); if (unlikely (!d)) return_trace (false); - memcpy (d, &opstr.str[0], opstr.str.length); + /* Faster than hb_memcpy for small strings. */ + for (unsigned i = 0; i < opstr.length; i++) + d[i] = opstr.ptr[i]; + //hb_memcpy (d, opstr.ptr, opstr.length); } return_trace (true); } @@ -239,11 +234,10 @@ struct subr_flattener_t bool flatten (str_buff_vec_t &flat_charstrings) { - if (!flat_charstrings.resize (plan->num_output_glyphs ())) + unsigned count = plan->num_output_glyphs (); + if (!flat_charstrings.resize (count)) return false; - for (unsigned int i = 0; i < plan->num_output_glyphs (); i++) - flat_charstrings[i].init (); - for (unsigned int i = 0; i < plan->num_output_glyphs (); i++) + for (unsigned int i = 0; i < count; i++) { hb_codepoint_t glyph; if (!plan->old_gid_for_new_gid (i, &glyph)) @@ -259,7 +253,7 @@ struct subr_flattener_t ENV env (str, acc, fd); cs_interpreter_t<ENV, OPSET, flatten_param_t> interp (env); flatten_param_t param = { - flat_charstrings[i], + flat_charstrings.arrayZ[i], (bool) (plan->flags & HB_SUBSET_FLAGS_NO_HINTING) }; if (unlikely (!interp.interpret (param))) @@ -274,11 +268,9 @@ struct subr_flattener_t struct subr_closures_t { - subr_closures_t (unsigned int fd_count) : valid (false), global_closure (), local_closures () + subr_closures_t (unsigned int fd_count) : global_closure (), local_closures () { - valid = true; - if (!local_closures.resize (fd_count)) - valid = false; + local_closures.resize (fd_count); } void reset () @@ -288,47 +280,38 @@ struct subr_closures_t local_closures[i].clear(); } - bool is_valid () const { return valid; } - bool valid; + bool in_error () const { return local_closures.in_error (); } hb_set_t global_closure; hb_vector_t<hb_set_t> local_closures; }; struct parsed_cs_op_t : op_str_t { - void init (unsigned int subr_num_ = 0) - { - subr_num = subr_num_; - drop_flag = false; - keep_flag = false; - skip_flag = false; - } - - bool for_drop () const { return drop_flag; } - void set_drop () { if (!for_keep ()) drop_flag = true; } + parsed_cs_op_t (unsigned int subr_num_ = 0) : + subr_num (subr_num_) {} - bool for_keep () const { return keep_flag; } - void set_keep () { keep_flag = true; } + bool is_hinting () const { return hinting_flag; } + void set_hinting () { hinting_flag = true; } - bool for_skip () const { return skip_flag; } - void set_skip () { skip_flag = true; } - - unsigned int subr_num; + /* The layout of this struct is designed to fit within the + * padding of op_str_t! */ protected: - bool drop_flag; - bool keep_flag; - bool skip_flag; + bool hinting_flag = false; + + public: + uint16_t subr_num; }; struct parsed_cs_str_t : parsed_values_t<parsed_cs_op_t> { - void init () + parsed_cs_str_t () : + parsed (false), + hint_dropped (false), + has_prefix_ (false), + has_calls_ (false) { SUPER::init (); - parsed = false; - hint_dropped = false; - has_prefix_ = false; } void add_op (op_code_t op, const byte_str_ref_t& str_ref) @@ -341,13 +324,12 @@ struct parsed_cs_str_t : parsed_values_t<parsed_cs_op_t> { if (!is_parsed ()) { - unsigned int parsed_len = get_count (); - if (likely (parsed_len > 0)) - values[parsed_len-1].set_skip (); + has_calls_ = true; - parsed_cs_op_t val; - val.init (subr_num); - SUPER::add_op (op, str_ref, val); + /* Pop the subroutine number. */ + values.pop (); + + SUPER::add_op (op, str_ref, {subr_num}); } } @@ -377,11 +359,14 @@ struct parsed_cs_str_t : parsed_values_t<parsed_cs_op_t> op_code_t prefix_op () const { return prefix_op_; } const number_t &prefix_num () const { return prefix_num_; } + bool has_calls () const { return has_calls_; } + protected: - bool parsed; - bool hint_dropped; - bool vsindex_dropped; - bool has_prefix_; + bool parsed : 1; + bool hint_dropped : 1; + bool vsindex_dropped : 1; + bool has_prefix_ : 1; + bool has_calls_ : 1; op_code_t prefix_op_; number_t prefix_num_; @@ -395,6 +380,59 @@ struct parsed_cs_str_vec_t : hb_vector_t<parsed_cs_str_t> typedef hb_vector_t<parsed_cs_str_t> SUPER; }; +struct cff_subset_accelerator_t +{ + static cff_subset_accelerator_t* create ( + hb_blob_t* original_blob, + const parsed_cs_str_vec_t& parsed_charstrings, + const parsed_cs_str_vec_t& parsed_global_subrs, + const hb_vector_t<parsed_cs_str_vec_t>& parsed_local_subrs) { + cff_subset_accelerator_t* accel = + (cff_subset_accelerator_t*) hb_malloc (sizeof(cff_subset_accelerator_t)); + new (accel) cff_subset_accelerator_t (original_blob, + parsed_charstrings, + parsed_global_subrs, + parsed_local_subrs); + return accel; + } + + static void destroy (void* value) { + if (!value) return; + + cff_subset_accelerator_t* accel = (cff_subset_accelerator_t*) value; + accel->~cff_subset_accelerator_t (); + hb_free (accel); + } + + cff_subset_accelerator_t( + hb_blob_t* original_blob_, + const parsed_cs_str_vec_t& parsed_charstrings_, + const parsed_cs_str_vec_t& parsed_global_subrs_, + const hb_vector_t<parsed_cs_str_vec_t>& parsed_local_subrs_) + { + parsed_charstrings = parsed_charstrings_; + parsed_global_subrs = parsed_global_subrs_; + parsed_local_subrs = parsed_local_subrs_; + + // the parsed charstrings point to memory in the original CFF table so we must hold a reference + // to it to keep the memory valid. + original_blob = hb_blob_reference (original_blob_); + } + + ~cff_subset_accelerator_t() { + hb_blob_destroy (original_blob); + hb_map_destroy (glyph_to_sid_map.get_relaxed ()); + } + + parsed_cs_str_vec_t parsed_charstrings; + parsed_cs_str_vec_t parsed_global_subrs; + hb_vector_t<parsed_cs_str_vec_t> parsed_local_subrs; + mutable hb_atomic_ptr_t<hb_map_t> glyph_to_sid_map = nullptr; + + private: + hb_blob_t* original_blob; +}; + struct subr_subset_param_t { subr_subset_param_t (parsed_cs_str_t *parsed_charstring_, @@ -446,7 +484,11 @@ struct subr_subset_param_t if (unlikely (calling && !parsed_str->is_parsed () && (parsed_str->values.length > 0))) env.set_error (); else + { + if (!parsed_str->is_parsed ()) + parsed_str->alloc (env.str_ref.total_size () / 2); current_parsed_str = parsed_str; + } } parsed_cs_str_t *current_parsed_str; @@ -506,7 +548,7 @@ struct subr_remaps_t { global_remap.create (&closures.global_closure); for (unsigned int i = 0; i < local_remaps.length; i++) - local_remaps[i].create (&closures.local_closures[i]); + local_remaps.arrayZ[i].create (&closures.local_closures[i]); } subr_remap_t global_remap; @@ -517,7 +559,8 @@ template <typename SUBSETTER, typename SUBRS, typename ACC, typename ENV, typena struct subr_subsetter_t { subr_subsetter_t (ACC &acc_, const hb_subset_plan_t *plan_) - : acc (acc_), plan (plan_), closures(acc_.fdCount), remaps(acc_.fdCount) + : acc (acc_), plan (plan_), closures(acc_.fdCount), + remaps(acc_.fdCount) {} /* Subroutine subsetting with --no-desubroutinize runs in phases: @@ -536,55 +579,96 @@ struct subr_subsetter_t */ bool subset (void) { - parsed_charstrings.resize (plan->num_output_glyphs ()); - parsed_global_subrs.resize (acc.globalSubrs->count); - - if (unlikely (remaps.in_error() - || parsed_charstrings.in_error () - || parsed_global_subrs.in_error ())) { - return false; + unsigned fd_count = acc.fdCount; + const cff_subset_accelerator_t* cff_accelerator = nullptr; + if (plan->accelerator && plan->accelerator->cff_accelerator) { + cff_accelerator = plan->accelerator->cff_accelerator; + fd_count = cff_accelerator->parsed_local_subrs.length; } - if (unlikely (!parsed_local_subrs.resize (acc.fdCount))) return false; + if (cff_accelerator) { + // If we are not dropping hinting then charstrings are not modified so we can + // just use a reference to the cached copies. + cached_charstrings.resize (plan->num_output_glyphs ()); + parsed_global_subrs = &cff_accelerator->parsed_global_subrs; + parsed_local_subrs = &cff_accelerator->parsed_local_subrs; + } else { + parsed_charstrings.resize (plan->num_output_glyphs ()); + parsed_global_subrs_storage.resize (acc.globalSubrs->count); - for (unsigned int i = 0; i < acc.fdCount; i++) - { - parsed_local_subrs[i].resize (acc.privateDicts[i].localSubrs->count); - if (unlikely (parsed_local_subrs[i].in_error ())) return false; + if (unlikely (!parsed_local_subrs_storage.resize (fd_count))) return false; + + for (unsigned int i = 0; i < acc.fdCount; i++) + { + unsigned count = acc.privateDicts[i].localSubrs->count; + parsed_local_subrs_storage[i].resize (count); + if (unlikely (parsed_local_subrs_storage[i].in_error ())) return false; + } + + parsed_global_subrs = &parsed_global_subrs_storage; + parsed_local_subrs = &parsed_local_subrs_storage; } - if (unlikely (!closures.valid)) + + if (unlikely (remaps.in_error() + || cached_charstrings.in_error () + || parsed_charstrings.in_error () + || parsed_global_subrs->in_error () + || closures.in_error ())) { return false; + } /* phase 1 & 2 */ for (unsigned int i = 0; i < plan->num_output_glyphs (); i++) { hb_codepoint_t glyph; if (!plan->old_gid_for_new_gid (i, &glyph)) - continue; + continue; + const hb_ubytes_t str = (*acc.charStrings)[glyph]; unsigned int fd = acc.fdSelect->get_fd (glyph); if (unlikely (fd >= acc.fdCount)) - return false; + return false; + + if (cff_accelerator) + { + // parsed string already exists in accelerator, copy it and move + // on. + if (cached_charstrings) + cached_charstrings[i] = &cff_accelerator->parsed_charstrings[glyph]; + else + parsed_charstrings[i] = cff_accelerator->parsed_charstrings[glyph]; + + continue; + } ENV env (str, acc, fd); cs_interpreter_t<ENV, OPSET, subr_subset_param_t> interp (env); - parsed_charstrings[i].alloc (str.length); + parsed_charstrings[i].alloc (str.length / 2); subr_subset_param_t param (&parsed_charstrings[i], - &parsed_global_subrs, - &parsed_local_subrs[fd], - &closures.global_closure, - &closures.local_closures[fd], - plan->flags & HB_SUBSET_FLAGS_NO_HINTING); + &parsed_global_subrs_storage, + &parsed_local_subrs_storage[fd], + &closures.global_closure, + &closures.local_closures[fd], + plan->flags & HB_SUBSET_FLAGS_NO_HINTING); if (unlikely (!interp.interpret (param))) - return false; + return false; /* complete parsed string esp. copy CFF1 width or CFF2 vsindex to the parsed charstring for encoding */ SUBSETTER::complete_parsed_str (interp.env, param, parsed_charstrings[i]); } - if (plan->flags & HB_SUBSET_FLAGS_NO_HINTING) + // Since parsed strings were loaded from accelerator, we still need + // to compute the subroutine closures which would have normally happened during + // parsing. + if (cff_accelerator && + !closure_subroutines(*parsed_global_subrs, + *parsed_local_subrs)) + return false; + + if ((plan->flags & HB_SUBSET_FLAGS_NO_HINTING && !cff_accelerator) || + plan->inprogress_accelerator) { /* mark hint ops and arguments for drop */ for (unsigned int i = 0; i < plan->num_output_glyphs (); i++) @@ -596,8 +680,8 @@ struct subr_subsetter_t if (unlikely (fd >= acc.fdCount)) return false; subr_subset_param_t param (&parsed_charstrings[i], - &parsed_global_subrs, - &parsed_local_subrs[fd], + &parsed_global_subrs_storage, + &parsed_local_subrs_storage[fd], &closures.global_closure, &closures.local_closures[fd], plan->flags & HB_SUBSET_FLAGS_NO_HINTING); @@ -612,27 +696,14 @@ struct subr_subsetter_t } /* after dropping hints recreate closures of actually used subrs */ - closures.reset (); - for (unsigned int i = 0; i < plan->num_output_glyphs (); i++) - { - hb_codepoint_t glyph; - if (!plan->old_gid_for_new_gid (i, &glyph)) - continue; - unsigned int fd = acc.fdSelect->get_fd (glyph); - if (unlikely (fd >= acc.fdCount)) - return false; - subr_subset_param_t param (&parsed_charstrings[i], - &parsed_global_subrs, - &parsed_local_subrs[fd], - &closures.global_closure, - &closures.local_closures[fd], - plan->flags & HB_SUBSET_FLAGS_NO_HINTING); - collect_subr_refs_in_str (parsed_charstrings[i], param); - } + if (plan->flags & HB_SUBSET_FLAGS_NO_HINTING && + !cff_accelerator && + !closure_subroutines(*parsed_global_subrs, *parsed_local_subrs)) return false; } remaps.create (closures); + populate_subset_accelerator (); return true; } @@ -646,13 +717,13 @@ struct subr_subsetter_t if (!plan->old_gid_for_new_gid (i, &glyph)) { /* add an endchar only charstring for a missing glyph if CFF1 */ - if (endchar_op != OpCode_Invalid) buffArray[i].push (endchar_op); + if (endchar_op != OpCode_Invalid) buffArray.arrayZ[i].push (endchar_op); continue; } unsigned int fd = acc.fdSelect->get_fd (glyph); if (unlikely (fd >= acc.fdCount)) return false; - if (unlikely (!encode_str (parsed_charstrings[i], fd, buffArray[i]))) + if (unlikely (!encode_str (get_parsed_charstring (i), fd, buffArray.arrayZ[i]))) return false; } return true; @@ -664,26 +735,25 @@ struct subr_subsetter_t if (unlikely (!buffArray.resize (count))) return false; - for (unsigned int old_num = 0; old_num < subrs.length; old_num++) + for (unsigned int new_num = 0; new_num < count; new_num++) { - hb_codepoint_t new_num = remap[old_num]; - if (new_num != CFF_UNDEF_CODE) - { - if (unlikely (!encode_str (subrs[old_num], fd, buffArray[new_num]))) - return false; - } + hb_codepoint_t old_num = remap.backward (new_num); + assert (old_num != CFF_UNDEF_CODE); + + if (unlikely (!encode_str (subrs[old_num], fd, buffArray[new_num]))) + return false; } return true; } bool encode_globalsubrs (str_buff_vec_t &buffArray) { - return encode_subrs (parsed_global_subrs, remaps.global_remap, 0, buffArray); + return encode_subrs (*parsed_global_subrs, remaps.global_remap, 0, buffArray); } bool encode_localsubrs (unsigned int fd, str_buff_vec_t &buffArray) const { - return encode_subrs (parsed_local_subrs[fd], remaps.local_remaps[fd], fd, buffArray); + return encode_subrs ((*parsed_local_subrs)[fd], remaps.local_remaps[fd], fd, buffArray); } protected: @@ -712,7 +782,7 @@ struct subr_subsetter_t * then this entire subroutine must be a hint. drop its call. */ if (drop.ends_in_hint) { - str.values[pos].set_drop (); + str.values[pos].set_hinting (); /* if this subr call is at the end of the parent subr, propagate the flag * otherwise reset the flag */ if (!str.at_end (pos)) @@ -720,7 +790,7 @@ struct subr_subsetter_t } else if (drop.all_dropped) { - str.values[pos].set_drop (); + str.values[pos].set_hinting (); } return has_hint; @@ -731,20 +801,22 @@ struct subr_subsetter_t { bool seen_hint = false; - for (unsigned int pos = 0; pos < str.values.length; pos++) + unsigned count = str.values.length; + auto *values = str.values.arrayZ; + for (unsigned int pos = 0; pos < count; pos++) { bool has_hint = false; - switch (str.values[pos].op) + switch (values[pos].op) { case OpCode_callsubr: has_hint = drop_hints_in_subr (str, pos, - *param.parsed_local_subrs, str.values[pos].subr_num, + *param.parsed_local_subrs, values[pos].subr_num, param, drop); break; case OpCode_callgsubr: has_hint = drop_hints_in_subr (str, pos, - *param.parsed_global_subrs, str.values[pos].subr_num, + *param.parsed_global_subrs, values[pos].subr_num, param, drop); break; @@ -758,7 +830,7 @@ struct subr_subsetter_t case OpCode_cntrmask: if (drop.seen_moveto) { - str.values[pos].set_drop (); + values[pos].set_hinting (); break; } HB_FALLTHROUGH; @@ -768,13 +840,13 @@ struct subr_subsetter_t case OpCode_hstem: case OpCode_vstem: has_hint = true; - str.values[pos].set_drop (); + values[pos].set_hinting (); if (str.at_end (pos)) drop.ends_in_hint = true; break; case OpCode_dotsection: - str.values[pos].set_drop (); + values[pos].set_hinting (); break; default: @@ -785,10 +857,10 @@ struct subr_subsetter_t { for (int i = pos - 1; i >= 0; i--) { - parsed_cs_op_t &csop = str.values[(unsigned)i]; - if (csop.for_drop ()) + parsed_cs_op_t &csop = values[(unsigned)i]; + if (csop.is_hinting ()) break; - csop.set_drop (); + csop.set_hinting (); if (csop.op == OpCode_vsindexcs) drop.vsindex_dropped = true; } @@ -801,12 +873,12 @@ struct subr_subsetter_t * only (usually one) hintmask operator, then calls to this subr can be dropped. */ drop.all_dropped = true; - for (unsigned int pos = 0; pos < str.values.length; pos++) + for (unsigned int pos = 0; pos < count; pos++) { - parsed_cs_op_t &csop = str.values[pos]; + parsed_cs_op_t &csop = values[pos]; if (csop.op == OpCode_return) break; - if (!csop.for_drop ()) + if (!csop.is_hinting ()) { drop.all_dropped = false; break; @@ -816,32 +888,62 @@ struct subr_subsetter_t return seen_hint; } - void collect_subr_refs_in_subr (parsed_cs_str_t &str, unsigned int pos, - unsigned int subr_num, parsed_cs_str_vec_t &subrs, + bool closure_subroutines (const parsed_cs_str_vec_t& global_subrs, + const hb_vector_t<parsed_cs_str_vec_t>& local_subrs) + { + closures.reset (); + for (unsigned int i = 0; i < plan->num_output_glyphs (); i++) + { + hb_codepoint_t glyph; + if (!plan->old_gid_for_new_gid (i, &glyph)) + continue; + unsigned int fd = acc.fdSelect->get_fd (glyph); + if (unlikely (fd >= acc.fdCount)) + return false; + + // Note: const cast is safe here because the collect_subr_refs_in_str only performs a + // closure and does not modify any of the charstrings. + subr_subset_param_t param (const_cast<parsed_cs_str_t*> (&get_parsed_charstring (i)), + const_cast<parsed_cs_str_vec_t*> (&global_subrs), + const_cast<parsed_cs_str_vec_t*> (&local_subrs[fd]), + &closures.global_closure, + &closures.local_closures[fd], + plan->flags & HB_SUBSET_FLAGS_NO_HINTING); + collect_subr_refs_in_str (get_parsed_charstring (i), param); + } + + return true; + } + + void collect_subr_refs_in_subr (unsigned int subr_num, parsed_cs_str_vec_t &subrs, hb_set_t *closure, const subr_subset_param_t ¶m) { + if (closure->has (subr_num)) + return; closure->add (subr_num); collect_subr_refs_in_str (subrs[subr_num], param); } - void collect_subr_refs_in_str (parsed_cs_str_t &str, const subr_subset_param_t ¶m) + void collect_subr_refs_in_str (const parsed_cs_str_t &str, + const subr_subset_param_t ¶m) { - for (unsigned int pos = 0; pos < str.values.length; pos++) + if (!str.has_calls ()) + return; + + for (auto &opstr : str.values) { - if (!str.values[pos].for_drop ()) + if (!param.drop_hints || !opstr.is_hinting ()) { - switch (str.values[pos].op) + switch (opstr.op) { case OpCode_callsubr: - collect_subr_refs_in_subr (str, pos, - str.values[pos].subr_num, *param.parsed_local_subrs, + collect_subr_refs_in_subr (opstr.subr_num, *param.parsed_local_subrs, param.local_closure, param); break; case OpCode_callgsubr: - collect_subr_refs_in_subr (str, pos, - str.values[pos].subr_num, *param.parsed_global_subrs, + collect_subr_refs_in_subr (opstr.subr_num, *param.parsed_global_subrs, param.global_closure, param); break; @@ -853,42 +955,113 @@ struct subr_subsetter_t bool encode_str (const parsed_cs_str_t &str, const unsigned int fd, str_buff_t &buff) const { - unsigned count = str.get_count (); str_encoder_t encoder (buff); encoder.reset (); - buff.alloc (count * 3); + bool hinting = !(plan->flags & HB_SUBSET_FLAGS_NO_HINTING); /* if a prefix (CFF1 width or CFF2 vsindex) has been removed along with hints, * re-insert it at the beginning of charstreing */ - if (str.has_prefix () && str.is_hint_dropped ()) + if (str.has_prefix () && !hinting && str.is_hint_dropped ()) { encoder.encode_num (str.prefix_num ()); if (str.prefix_op () != OpCode_Invalid) encoder.encode_op (str.prefix_op ()); } - for (unsigned int i = 0; i < count; i++) + + unsigned size = 0; + for (auto &opstr : str.values) { - const parsed_cs_op_t &opstr = str.values[i]; - if (!opstr.for_drop () && !opstr.for_skip ()) + size += opstr.length; + if (opstr.op == OpCode_callsubr || opstr.op == OpCode_callgsubr) + size += 3; + } + if (!buff.alloc (buff.length + size)) + return false; + + for (auto &opstr : str.values) + { + if (hinting || !opstr.is_hinting ()) { switch (opstr.op) { case OpCode_callsubr: encoder.encode_int (remaps.local_remaps[fd].biased_num (opstr.subr_num)); - encoder.encode_op (OpCode_callsubr); + encoder.copy_str (opstr.ptr, opstr.length); break; case OpCode_callgsubr: encoder.encode_int (remaps.global_remap.biased_num (opstr.subr_num)); - encoder.encode_op (OpCode_callgsubr); + encoder.copy_str (opstr.ptr, opstr.length); break; default: - encoder.copy_str (opstr.str); + encoder.copy_str (opstr.ptr, opstr.length); break; } } } - return !encoder.is_error (); + return !encoder.in_error (); + } + + void compact_parsed_strings () const + { + for (auto &cs : parsed_charstrings) + compact_string (cs); + for (auto &cs : parsed_global_subrs_storage) + compact_string (cs); + for (auto &vec : parsed_local_subrs_storage) + for (auto &cs : vec) + compact_string (cs); + } + + static void compact_string (parsed_cs_str_t &str) + { + unsigned count = str.values.length; + if (unlikely (!count)) return; + auto &opstr = str.values.arrayZ; + unsigned j = 0; + for (unsigned i = 1; i < count; i++) + { + /* See if we can combine op j and op i. */ + bool combine = + (opstr[j].op != OpCode_callsubr && opstr[j].op != OpCode_callgsubr) && + (opstr[i].op != OpCode_callsubr && opstr[i].op != OpCode_callgsubr) && + (opstr[j].is_hinting () == opstr[i].is_hinting ()) && + (opstr[j].ptr + opstr[j].length == opstr[i].ptr) && + (opstr[j].length + opstr[i].length <= 255); + + if (combine) + { + opstr[j].length += opstr[i].length; + opstr[j].op = OpCode_Invalid; + } + else + { + opstr[++j] = opstr[i]; + } + } + str.values.shrink (j + 1); + } + + void populate_subset_accelerator () const + { + if (!plan->inprogress_accelerator) return; + + compact_parsed_strings (); + + plan->inprogress_accelerator->cff_accelerator = + cff_subset_accelerator_t::create(acc.blob, + parsed_charstrings, + parsed_global_subrs_storage, + parsed_local_subrs_storage); + plan->inprogress_accelerator->destroy_cff_accelerator = + cff_subset_accelerator_t::destroy; + + } + + const parsed_cs_str_t& get_parsed_charstring (unsigned i) const + { + if (cached_charstrings) return *(cached_charstrings[i]); + return parsed_charstrings[i]; } protected: @@ -897,13 +1070,17 @@ struct subr_subsetter_t subr_closures_t closures; - parsed_cs_str_vec_t parsed_charstrings; - parsed_cs_str_vec_t parsed_global_subrs; - hb_vector_t<parsed_cs_str_vec_t> parsed_local_subrs; + hb_vector_t<const parsed_cs_str_t*> cached_charstrings; + const parsed_cs_str_vec_t* parsed_global_subrs; + const hb_vector_t<parsed_cs_str_vec_t>* parsed_local_subrs; subr_remaps_t remaps; private: + + parsed_cs_str_vec_t parsed_charstrings; + parsed_cs_str_vec_t parsed_global_subrs_storage; + hb_vector_t<parsed_cs_str_vec_t> parsed_local_subrs_storage; typedef typename SUBRS::count_type subr_count_type; }; diff --git a/thirdparty/harfbuzz/src/hb-subset-cff1.cc b/thirdparty/harfbuzz/src/hb-subset-cff1.cc index 52bb13d320..538f28f5aa 100644 --- a/thirdparty/harfbuzz/src/hb-subset-cff1.cc +++ b/thirdparty/harfbuzz/src/hb-subset-cff1.cc @@ -167,9 +167,10 @@ struct cff1_top_dict_op_serializer_t : cff_top_dict_op_serializer_t<cff1_top_dic * for supplement, the original byte string is copied along with the op code */ op_str_t supp_op; supp_op.op = op; - if ( unlikely (!(opstr.str.length >= opstr.last_arg_offset + 3))) + if ( unlikely (!(opstr.length >= opstr.last_arg_offset + 3))) return_trace (false); - supp_op.str = hb_ubytes_t (&opstr.str + opstr.last_arg_offset, opstr.str.length - opstr.last_arg_offset); + supp_op.ptr = opstr.ptr + opstr.last_arg_offset; + supp_op.length = opstr.length - opstr.last_arg_offset; return_trace (UnsizedByteStr::serialize_int2 (c, mod.nameSIDs[name_dict_values_t::registry]) && UnsizedByteStr::serialize_int2 (c, mod.nameSIDs[name_dict_values_t::ordering]) && copy_opstr (c, supp_op)); @@ -442,8 +443,17 @@ struct cff_subset_plan { return; } - bool use_glyph_to_sid_map = plan->num_output_glyphs () > plan->source->get_num_glyphs () / 8.; - hb_map_t *glyph_to_sid_map = use_glyph_to_sid_map ? acc.create_glyph_to_sid_map () : nullptr; + hb_map_t *glyph_to_sid_map = (plan->accelerator && plan->accelerator->cff_accelerator) ? + plan->accelerator->cff_accelerator->glyph_to_sid_map : + nullptr; + bool created_map = false; + if (!glyph_to_sid_map && + ((plan->accelerator && plan->accelerator->cff_accelerator) || + plan->num_output_glyphs () > plan->source->get_num_glyphs () / 8.)) + { + created_map = true; + glyph_to_sid_map = acc.create_glyph_to_sid_map (); + } unsigned int glyph; for (glyph = 1; glyph < plan->num_output_glyphs (); glyph++) @@ -467,8 +477,12 @@ struct cff_subset_plan { last_sid = sid; } - if (glyph_to_sid_map) - hb_map_destroy (glyph_to_sid_map); + if (created_map) + { + if (!(plan->accelerator && plan->accelerator->cff_accelerator) || + !plan->accelerator->cff_accelerator->glyph_to_sid_map.cmpexch (nullptr, glyph_to_sid_map)) + hb_map_destroy (glyph_to_sid_map); + } bool two_byte = subset_charset_ranges.complete (glyph); @@ -728,11 +742,17 @@ static bool _serialize_cff1 (hb_serialize_context_t *c, /* CharStrings */ { + c->push<CFF1CharStrings> (); + + unsigned total_size = CFF1CharStrings::total_size (plan.subset_charstrings); + if (unlikely (!c->start_zerocopy (total_size))) + return false; + CFF1CharStrings *cs = c->start_embed<CFF1CharStrings> (); if (unlikely (!cs)) return false; - c->push (); + if (likely (cs->serialize (c, plan.subset_charstrings))) - plan.info.char_strings_link = c->pop_pack (); + plan.info.char_strings_link = c->pop_pack (false); else { c->pop_discard (); @@ -815,7 +835,7 @@ static bool _serialize_cff1 (hb_serialize_context_t *c, CFF1Subrs *dest = c->start_embed <CFF1Subrs> (); if (unlikely (!dest)) return false; if (likely (dest->serialize (c, plan.subset_globalsubrs))) - c->pop_pack (); + c->pop_pack (false); else { c->pop_discard (); diff --git a/thirdparty/harfbuzz/src/hb-subset-cff2.cc b/thirdparty/harfbuzz/src/hb-subset-cff2.cc index 08e820efcf..60946b0281 100644 --- a/thirdparty/harfbuzz/src/hb-subset-cff2.cc +++ b/thirdparty/harfbuzz/src/hb-subset-cff2.cc @@ -334,7 +334,7 @@ static bool _serialize_cff2 (hb_serialize_context_t *c, if (unlikely (!dest)) return false; c->push (); if (likely (dest->serialize (c, plan.subset_localsubrs[i]))) - subrs_link = c->pop_pack (); + subrs_link = c->pop_pack (false); else { c->pop_discard (); @@ -361,11 +361,17 @@ static bool _serialize_cff2 (hb_serialize_context_t *c, /* CharStrings */ { + c->push (); + + unsigned total_size = CFF2CharStrings::total_size (plan.subset_charstrings); + if (unlikely (!c->start_zerocopy (total_size))) + return false; + CFF2CharStrings *cs = c->start_embed<CFF2CharStrings> (); if (unlikely (!cs)) return false; - c->push (); + if (likely (cs->serialize (c, plan.subset_charstrings))) - plan.info.char_strings_link = c->pop_pack (); + plan.info.char_strings_link = c->pop_pack (false); else { c->pop_discard (); @@ -377,9 +383,10 @@ static bool _serialize_cff2 (hb_serialize_context_t *c, if (acc.fdSelect != &Null (CFF2FDSelect)) { c->push (); - if (likely (hb_serialize_cff_fdselect (c, num_glyphs, *(const FDSelect *)acc.fdSelect, plan.orig_fdcount, - plan.subset_fdselect_format, plan.subset_fdselect_size, - plan.subset_fdselect_ranges))) + if (likely (hb_serialize_cff_fdselect (c, num_glyphs, *(const FDSelect *)acc.fdSelect, + plan.orig_fdcount, + plan.subset_fdselect_format, plan.subset_fdselect_size, + plan.subset_fdselect_ranges))) plan.info.fd_select.link = c->pop_pack (); else { @@ -401,7 +408,7 @@ static bool _serialize_cff2 (hb_serialize_context_t *c, hb_iter (private_dict_infos)) ; if (unlikely (!fda->serialize (c, it, fontSzr))) return false; - plan.info.fd_array_link = c->pop_pack (); + plan.info.fd_array_link = c->pop_pack (false); } /* variation store */ @@ -410,7 +417,7 @@ static bool _serialize_cff2 (hb_serialize_context_t *c, c->push (); CFF2VariationStore *dest = c->start_embed<CFF2VariationStore> (); if (unlikely (!dest || !dest->serialize (c, acc.varStore))) return false; - plan.info.var_store_link = c->pop_pack (); + plan.info.var_store_link = c->pop_pack (false); } OT::cff2 *cff2 = c->allocate_min<OT::cff2> (); diff --git a/thirdparty/harfbuzz/src/hb-subset-input.cc b/thirdparty/harfbuzz/src/hb-subset-input.cc index fd250104bb..42434ae0ef 100644 --- a/thirdparty/harfbuzz/src/hb-subset-input.cc +++ b/thirdparty/harfbuzz/src/hb-subset-input.cc @@ -26,7 +26,7 @@ #include "hb-subset.hh" #include "hb-set.hh" - +#include "hb-utf.hh" /** * hb_subset_input_create_or_fail: * @@ -49,8 +49,15 @@ hb_subset_input_create_or_fail (void) set = hb_set_create (); input->axes_location = hb_hashmap_create<hb_tag_t, float> (); +#ifdef HB_EXPERIMENTAL_API + input->name_table_overrides = hb_hashmap_create<hb_ot_name_record_ids_t, hb_bytes_t> (); +#endif - if (!input->axes_location || input->in_error ()) + if (!input->axes_location || +#ifdef HB_EXPERIMENTAL_API + !input->name_table_overrides || +#endif + input->in_error ()) { hb_subset_input_destroy (input); return nullptr; @@ -248,6 +255,15 @@ hb_subset_input_destroy (hb_subset_input_t *input) hb_hashmap_destroy (input->axes_location); +#ifdef HB_EXPERIMENTAL_API + if (input->name_table_overrides) + { + for (auto _ : *input->name_table_overrides) + _.second.fini (); + } + hb_hashmap_destroy (input->name_table_overrides); +#endif + hb_free (input); } @@ -379,7 +395,6 @@ hb_subset_input_get_user_data (const hb_subset_input_t *input, return hb_object_get_user_data (input, key); } -#ifdef HB_EXPERIMENTAL_API #ifndef HB_NO_VAR /** * hb_subset_input_pin_axis_to_default: (skip) @@ -388,9 +403,12 @@ hb_subset_input_get_user_data (const hb_subset_input_t *input, * * Pin an axis to its default location in the given subset input object. * + * Currently only works for fonts with 'glyf' tables. CFF and CFF2 is not + * yet supported. Additionally all axes in a font must be pinned. + * * Return value: `true` if success, `false` otherwise * - * Since: EXPERIMENTAL + * Since: 6.0.0 **/ HB_EXTERN hb_bool_t hb_subset_input_pin_axis_to_default (hb_subset_input_t *input, @@ -412,9 +430,12 @@ hb_subset_input_pin_axis_to_default (hb_subset_input_t *input, * * Pin an axis to a fixed location in the given subset input object. * + * Currently only works for fonts with 'glyf' tables. CFF and CFF2 is not + * yet supported. Additionally all axes in a font must be pinned. + * * Return value: `true` if success, `false` otherwise * - * Since: EXPERIMENTAL + * Since: 6.0.0 **/ HB_EXTERN hb_bool_t hb_subset_input_pin_axis_location (hb_subset_input_t *input, @@ -430,28 +451,41 @@ hb_subset_input_pin_axis_location (hb_subset_input_t *input, return input->axes_location->set (axis_tag, val); } #endif -#endif -#ifdef HB_EXPERIMENTAL_API /** - * hb_subset_preprocess - * @input: a #hb_face_t object. + * hb_subset_preprocess: + * @source: a #hb_face_t object. * * Preprocesses the face and attaches data that will be needed by the * subsetter. Future subsetting operations can then use the precomputed data * to speed up the subsetting operation. * - * Since: EXPERIMENTAL + * See [subset-preprocessing](https://github.com/harfbuzz/harfbuzz/blob/main/docs/subset-preprocessing.md) + * for more information. + * + * Note: the preprocessed face may contain sub-blobs that reference the memory + * backing the source #hb_face_t. Therefore in the case that this memory is not + * owned by the source face you will need to ensure that memory lives + * as long as the returned #hb_face_t. + * + * Returns: a new #hb_face_t. + * + * Since: 6.0.0 **/ HB_EXTERN hb_face_t * hb_subset_preprocess (hb_face_t *source) { hb_subset_input_t* input = hb_subset_input_create_or_fail (); + if (!input) + return source; hb_set_clear (hb_subset_input_set(input, HB_SUBSET_SETS_UNICODE)); hb_set_invert (hb_subset_input_set(input, HB_SUBSET_SETS_UNICODE)); + hb_set_clear (hb_subset_input_set(input, HB_SUBSET_SETS_GLYPH_INDEX)); + hb_set_invert (hb_subset_input_set(input, HB_SUBSET_SETS_GLYPH_INDEX)); + hb_set_clear (hb_subset_input_set(input, HB_SUBSET_SETS_LAYOUT_FEATURE_TAG)); hb_set_invert (hb_subset_input_set(input, @@ -467,15 +501,100 @@ hb_subset_preprocess (hb_face_t *source) hb_set_invert (hb_subset_input_set(input, HB_SUBSET_SETS_NAME_ID)); + hb_set_clear (hb_subset_input_set(input, + HB_SUBSET_SETS_NAME_LANG_ID)); + hb_set_invert (hb_subset_input_set(input, + HB_SUBSET_SETS_NAME_LANG_ID)); + hb_subset_input_set_flags(input, HB_SUBSET_FLAGS_NOTDEF_OUTLINE | HB_SUBSET_FLAGS_GLYPH_NAMES | - HB_SUBSET_FLAGS_RETAIN_GIDS); + HB_SUBSET_FLAGS_RETAIN_GIDS | + HB_SUBSET_FLAGS_NO_PRUNE_UNICODE_RANGES); input->attach_accelerator_data = true; + // Always use long loca in the preprocessed version. This allows + // us to store the glyph bytes unpadded which allows the future subset + // operation to run faster by skipping the trim padding step. + input->force_long_loca = true; + hb_face_t* new_source = hb_subset_or_fail (source, input); hb_subset_input_destroy (input); + if (!new_source) { + DEBUG_MSG (SUBSET, nullptr, "Preprocessing failed due to subset failure."); + return source; + } + return new_source; } + +#ifdef HB_EXPERIMENTAL_API +/** + * hb_subset_input_override_name_table: + * @input: a #hb_subset_input_t object. + * @name_id: name_id of a nameRecord + * @platform_id: platform ID of a nameRecord + * @encoding_id: encoding ID of a nameRecord + * @language_id: language ID of a nameRecord + * @name_str: pointer to name string new value or null to indicate should remove + * @str_len: the size of @name_str, or -1 if it is `NULL`-terminated + * + * Override the name string of the NameRecord identified by name_id, + * platform_id, encoding_id and language_id. If a record with that name_id + * doesn't exist, create it and insert to the name table. + * + * Note: for mac platform, we only support name_str with all ascii characters, + * name_str with non-ascii characters will be ignored. + * + * Since: EXPERIMENTAL + **/ +HB_EXTERN hb_bool_t +hb_subset_input_override_name_table (hb_subset_input_t *input, + hb_ot_name_id_t name_id, + unsigned platform_id, + unsigned encoding_id, + unsigned language_id, + const char *name_str, + int str_len /* -1 means nul-terminated */) +{ + if (!name_str) + { + str_len = 0; + } + else if (str_len == -1) + { + str_len = strlen (name_str); + } + + hb_bytes_t name_bytes (nullptr, 0); + if (str_len) + { + if (platform_id == 1) + { + const uint8_t *src = reinterpret_cast<const uint8_t*> (name_str); + const uint8_t *src_end = src + str_len; + + hb_codepoint_t unicode; + const hb_codepoint_t replacement = HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT; + while (src < src_end) + { + src = hb_utf8_t::next (src, src_end, &unicode, replacement); + if (unicode >= 0x0080u) + { + printf ("Non-ascii character detected, ignored...This API supports acsii characters only for mac platform\n"); + return false; + } + } + } + char *override_name = (char *) hb_malloc (str_len); + if (unlikely (!override_name)) return false; + + hb_memcpy (override_name, name_str, str_len); + name_bytes = hb_bytes_t (override_name, str_len); + } + input->name_table_overrides->set (hb_ot_name_record_ids_t (platform_id, encoding_id, language_id, name_id), name_bytes); + return true; +} + #endif diff --git a/thirdparty/harfbuzz/src/hb-subset-input.hh b/thirdparty/harfbuzz/src/hb-subset-input.hh index dabb4918fe..ecd47b7abf 100644 --- a/thirdparty/harfbuzz/src/hb-subset-input.hh +++ b/thirdparty/harfbuzz/src/hb-subset-input.hh @@ -36,6 +36,48 @@ #include "hb-font.hh" +struct hb_ot_name_record_ids_t +{ + hb_ot_name_record_ids_t () = default; + hb_ot_name_record_ids_t (unsigned platform_id_, + unsigned encoding_id_, + unsigned language_id_, + unsigned name_id_) + :platform_id (platform_id_), + encoding_id (encoding_id_), + language_id (language_id_), + name_id (name_id_) {} + + bool operator != (const hb_ot_name_record_ids_t o) const + { return !(*this == o); } + + inline bool operator == (const hb_ot_name_record_ids_t& o) const + { + return platform_id == o.platform_id && + encoding_id == o.encoding_id && + language_id == o.language_id && + name_id == o.name_id; + } + + inline uint32_t hash () const + { + uint32_t current = 0; + current = current * 31 + hb_hash (platform_id); + current = current * 31 + hb_hash (encoding_id); + current = current * 31 + hb_hash (language_id); + current = current * 31 + hb_hash (name_id); + return current; + } + + unsigned platform_id; + unsigned encoding_id; + unsigned language_id; + unsigned name_id; +}; + +typedef struct hb_ot_name_record_ids_t hb_ot_name_record_ids_t; + + HB_MARK_AS_FLAG_T (hb_subset_flags_t); struct hb_subset_input_t @@ -60,7 +102,14 @@ struct hb_subset_input_t unsigned flags; bool attach_accelerator_data = false; + + // If set loca format will always be the long version. + bool force_long_loca = false; + hb_hashmap_t<hb_tag_t, float> *axes_location; +#ifdef HB_EXPERIMENTAL_API + hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> *name_table_overrides; +#endif inline unsigned num_sets () const { @@ -80,7 +129,11 @@ struct hb_subset_input_t return true; } - return axes_location->in_error (); + return axes_location->in_error () +#ifdef HB_EXPERIMENTAL_API + || name_table_overrides->in_error () +#endif + ; } }; diff --git a/thirdparty/harfbuzz/src/hb-subset-plan.cc b/thirdparty/harfbuzz/src/hb-subset-plan.cc index 9cf7c9e431..71bc908ffb 100644 --- a/thirdparty/harfbuzz/src/hb-subset-plan.cc +++ b/thirdparty/harfbuzz/src/hb-subset-plan.cc @@ -27,6 +27,7 @@ #include "hb-subset-plan.hh" #include "hb-subset-accelerator.hh" #include "hb-map.hh" +#include "hb-multimap.hh" #include "hb-set.hh" #include "hb-ot-cmap-table.hh" @@ -47,7 +48,7 @@ using OT::Layout::GPOS; typedef hb_hashmap_t<unsigned, hb::unique_ptr<hb_set_t>> script_langsys_map; #ifndef HB_NO_SUBSET_CFF -static inline void +static inline bool _add_cff_seac_components (const OT::cff1::accelerator_t &cff, hb_codepoint_t gid, hb_set_t *gids_to_retain) @@ -57,7 +58,9 @@ _add_cff_seac_components (const OT::cff1::accelerator_t &cff, { gids_to_retain->add (base_gid); gids_to_retain->add (accent_gid); + return true; } + return false; } #endif @@ -82,10 +85,8 @@ static void _remap_indexes (const hb_set_t *indexes, hb_map_t *mapping /* OUT */) { - unsigned count = indexes->get_population (); - - for (auto _ : + hb_zip (indexes->iter (), hb_range (count))) - mapping->set (_.first, _.second); + for (auto _ : + hb_enumerate (indexes->iter ())) + mapping->set (_.second, _.first); } @@ -344,7 +345,9 @@ _get_hb_font_with_variations (const hb_subset_plan_t *plan) vars.push (var); } +#ifndef HB_NO_VAR hb_font_set_variations (font, vars.arrayZ, plan->user_axes_location->get_population ()); +#endif return font; } @@ -521,14 +524,44 @@ _populate_unicodes_to_retain (const hb_set_t *unicodes, cmap_unicodes = &plan->accelerator->unicodes; } - for (hb_codepoint_t cp : *cmap_unicodes) + if (plan->accelerator && + unicodes->get_population () < cmap_unicodes->get_population () && + glyphs->get_population () < cmap_unicodes->get_population ()) + { + auto &gid_to_unicodes = plan->accelerator->gid_to_unicodes; + for (hb_codepoint_t gid : *glyphs) + { + auto unicodes = gid_to_unicodes.get (gid); + + for (hb_codepoint_t cp : unicodes) + { + plan->codepoint_to_glyph->set (cp, gid); + plan->unicode_to_new_gid_list.push (hb_pair (cp, gid)); + } + } + for (hb_codepoint_t cp : *unicodes) + { + /* Don't double-add entry. */ + if (plan->codepoint_to_glyph->has (cp)) + continue; + + hb_codepoint_t gid = (*unicode_glyphid_map)[cp]; + plan->codepoint_to_glyph->set (cp, gid); + plan->unicode_to_new_gid_list.push (hb_pair (cp, gid)); + } + plan->unicode_to_new_gid_list.qsort (); + } + else { - hb_codepoint_t gid = (*unicode_glyphid_map)[cp]; - if (!unicodes->has (cp) && !glyphs->has (gid)) - continue; + for (hb_codepoint_t cp : *cmap_unicodes) + { + hb_codepoint_t gid = (*unicode_glyphid_map)[cp]; + if (!unicodes->has (cp) && !glyphs->has (gid)) + continue; - plan->codepoint_to_glyph->set (cp, gid); - plan->unicode_to_new_gid_list.push (hb_pair (cp, gid)); + plan->codepoint_to_glyph->set (cp, gid); + plan->unicode_to_new_gid_list.push (hb_pair (cp, gid)); + } } /* Add gids which where requested, but not mapped in cmap */ @@ -639,9 +672,15 @@ _populate_gids_to_retain (hb_subset_plan_t* plan, else plan->_glyphset->union_ (cur_glyphset); #ifndef HB_NO_SUBSET_CFF - if (cff.is_valid ()) - for (hb_codepoint_t gid : cur_glyphset) - _add_cff_seac_components (cff, gid, plan->_glyphset); + if (!plan->accelerator || plan->accelerator->has_seac) + { + bool has_seac = false; + if (cff.is_valid ()) + for (hb_codepoint_t gid : cur_glyphset) + if (_add_cff_seac_components (cff, gid, plan->_glyphset)) + has_seac = true; + plan->has_seac = has_seac; + } #endif _remove_invalid_gids (plan->_glyphset, plan->source->get_num_glyphs ()); @@ -848,9 +887,28 @@ hb_subset_plan_create_or_fail (hb_face_t *face, plan->check_success (plan->vmtx_map = hb_hashmap_create<unsigned, hb_pair_t<unsigned, int>> ()); plan->check_success (plan->hmtx_map = hb_hashmap_create<unsigned, hb_pair_t<unsigned, int>> ()); +#ifdef HB_EXPERIMENTAL_API + plan->check_success (plan->name_table_overrides = hb_hashmap_create<hb_ot_name_record_ids_t, hb_bytes_t> ()); + if (plan->name_table_overrides && input->name_table_overrides) + { + for (auto _ : *input->name_table_overrides) + { + hb_bytes_t name_bytes = _.second; + unsigned len = name_bytes.length; + char *name_str = (char *) hb_malloc (len); + if (unlikely (!plan->check_success (name_str))) + break; + + hb_memcpy (name_str, name_bytes.arrayZ, len); + plan->name_table_overrides->set (_.first, hb_bytes_t (name_str, len)); + } + } +#endif + void* accel = hb_face_get_user_data(face, hb_subset_accelerator_t::user_data_key()); plan->attach_accelerator_data = input->attach_accelerator_data; + plan->force_long_loca = input->force_long_loca; if (accel) plan->accelerator = (hb_subset_accelerator_t*) accel; @@ -893,6 +951,28 @@ hb_subset_plan_create_or_fail (hb_face_t *face, hb_subset_plan_destroy (plan); return nullptr; } + + + if (plan->attach_accelerator_data) + { + hb_multimap_t gid_to_unicodes; + + hb_map_t &unicode_to_gid = *plan->codepoint_to_glyph; + + for (auto unicode : *plan->unicodes) + { + auto gid = unicode_to_gid[unicode]; + gid_to_unicodes.add (gid, unicode); + } + + plan->inprogress_accelerator = + hb_subset_accelerator_t::create (*plan->codepoint_to_glyph, + gid_to_unicodes, + *plan->unicodes, + plan->has_seac); + } + + return plan; } diff --git a/thirdparty/harfbuzz/src/hb-subset-plan.hh b/thirdparty/harfbuzz/src/hb-subset-plan.hh index 15fabba9c3..1b2aee7825 100644 --- a/thirdparty/harfbuzz/src/hb-subset-plan.hh +++ b/thirdparty/harfbuzz/src/hb-subset-plan.hh @@ -87,6 +87,18 @@ struct hb_subset_plan_t hb_hashmap_destroy (vmtx_map); hb_hashmap_destroy (layout_variation_idx_delta_map); +#ifdef HB_EXPERIMENTAL_API + if (name_table_overrides) + { + for (auto _ : *name_table_overrides) + _.second.fini (); + } + hb_hashmap_destroy (name_table_overrides); +#endif + + if (inprogress_accelerator) + hb_subset_accelerator_t::destroy ((void*) inprogress_accelerator); + if (user_axes_location) { hb_object_destroy (user_axes_location); @@ -99,10 +111,11 @@ struct hb_subset_plan_t bool successful; unsigned flags; bool attach_accelerator_data = false; + bool force_long_loca = false; // For each cp that we'd like to retain maps to the corresponding gid. hb_set_t *unicodes; - hb_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> unicode_to_new_gid_list; + hb_sorted_vector_t<hb_pair_t<hb_codepoint_t, hb_codepoint_t>> unicode_to_new_gid_list; // name_ids we would like to retain hb_set_t *name_ids; @@ -185,31 +198,41 @@ struct hb_subset_plan_t hb_map_t *axes_old_index_tag_map; bool all_axes_pinned; bool pinned_at_default; + bool has_seac; //hmtx metrics map: new gid->(advance, lsb) hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *hmtx_map; //vmtx metrics map: new gid->(advance, lsb) hb_hashmap_t<unsigned, hb_pair_t<unsigned, int>> *vmtx_map; +#ifdef HB_EXPERIMENTAL_API + // name table overrides map: hb_ot_name_record_ids_t-> name string new value or + // None to indicate should remove + hb_hashmap_t<hb_ot_name_record_ids_t, hb_bytes_t> *name_table_overrides; +#endif + const hb_subset_accelerator_t* accelerator; + hb_subset_accelerator_t* inprogress_accelerator; public: template<typename T> hb_blob_ptr_t<T> source_table() { - if (sanitized_table_cache - && !sanitized_table_cache->in_error () - && sanitized_table_cache->has (T::tableTag)) { - return hb_blob_reference (sanitized_table_cache->get (T::tableTag).get ()); + hb_lock_t (accelerator ? &accelerator->sanitized_table_cache_lock : nullptr); + + auto *cache = accelerator ? &accelerator->sanitized_table_cache : sanitized_table_cache; + if (cache + && !cache->in_error () + && cache->has (+T::tableTag)) { + return hb_blob_reference (cache->get (+T::tableTag).get ()); } hb::unique_ptr<hb_blob_t> table_blob {hb_sanitize_context_t ().reference_table<T> (source)}; hb_blob_t* ret = hb_blob_reference (table_blob.get ()); - if (likely (sanitized_table_cache)) - sanitized_table_cache->set (T::tableTag, - std::move (table_blob)); + if (likely (cache)) + cache->set (+T::tableTag, std::move (table_blob)); return ret; } diff --git a/thirdparty/harfbuzz/src/hb-subset.cc b/thirdparty/harfbuzz/src/hb-subset.cc index 6026aa6eff..186b12dbb8 100644 --- a/thirdparty/harfbuzz/src/hb-subset.cc +++ b/thirdparty/harfbuzz/src/hb-subset.cc @@ -82,6 +82,10 @@ using OT::Layout::GPOS; * retain glyph ids option and configure the subset to pass through the layout tables untouched. */ + +hb_user_data_key_t _hb_subset_accelerator_user_data_key = {}; + + /* * The list of tables in the open type spec. Used to check for tables that may need handling * if we are unable to list the tables in a face. @@ -409,20 +413,14 @@ _passthrough (hb_subset_plan_t *plan, hb_tag_t tag) static bool _dependencies_satisfied (hb_subset_plan_t *plan, hb_tag_t tag, - hb_set_t &visited_set, hb_set_t &revisit_set) + const hb_set_t &subsetted_tags, + const hb_set_t &pending_subset_tags) { switch (tag) { case HB_OT_TAG_hmtx: case HB_OT_TAG_vmtx: - if (!plan->pinned_at_default && - !visited_set.has (HB_OT_TAG_glyf)) - { - revisit_set.add (tag); - return false; - } - return true; - + return plan->pinned_at_default || !pending_subset_tags.has (HB_OT_TAG_glyf); default: return true; } @@ -495,12 +493,14 @@ _subset_table (hb_subset_plan_t *plan, } } -static void _attach_accelerator_data (const hb_subset_plan_t* plan, +static void _attach_accelerator_data (hb_subset_plan_t* plan, hb_face_t* face /* IN/OUT */) { - hb_subset_accelerator_t* accel = - hb_subset_accelerator_t::create (*plan->codepoint_to_glyph, - *plan->unicodes); + if (!plan->inprogress_accelerator) return; + + // Transfer the accelerator from the plan to us. + hb_subset_accelerator_t* accel = plan->inprogress_accelerator; + plan->inprogress_accelerator = nullptr; if (accel->in_error ()) { @@ -508,6 +508,11 @@ static void _attach_accelerator_data (const hb_subset_plan_t* plan, return; } + // Populate caches that need access to the final tables. + hb_blob_ptr_t<OT::cmap> cmap_ptr (hb_sanitize_context_t ().reference_table<OT::cmap> (face)); + accel->cmap_cache = OT::cmap::create_filled_cache (cmap_ptr); + accel->destroy_cmap_cache = OT::SubtableUnicodesCache::destroy; + if (!hb_face_set_user_data(face, hb_subset_accelerator_t::user_data_key(), accel, @@ -561,41 +566,63 @@ hb_subset_plan_execute_or_fail (hb_subset_plan_t *plan) return nullptr; } - hb_set_t tags_set, revisit_set; - bool success = true; hb_tag_t table_tags[32]; unsigned offset = 0, num_tables = ARRAY_LENGTH (table_tags); - hb_vector_t<char> buf; - buf.alloc (4096 - 16); + hb_set_t subsetted_tags, pending_subset_tags; while (((void) _get_table_tags (plan, offset, &num_tables, table_tags), num_tables)) { for (unsigned i = 0; i < num_tables; ++i) { hb_tag_t tag = table_tags[i]; - if (_should_drop_table (plan, tag) && !tags_set.has (tag)) continue; - if (!_dependencies_satisfied (plan, tag, tags_set, revisit_set)) continue; - tags_set.add (tag); - success = _subset_table (plan, buf, tag); - if (unlikely (!success)) goto end; + if (_should_drop_table (plan, tag)) continue; + pending_subset_tags.add (tag); + } + + offset += num_tables; + } + + hb_vector_t<char> buf; + buf.alloc (4096 - 16); + + + bool success = true; + + while (!pending_subset_tags.is_empty ()) + { + if (subsetted_tags.in_error () + || pending_subset_tags.in_error ()) { + success = false; + goto end; } - /*delayed subsetting for some tables since they might have dependency on other tables in some cases: - e.g: during instantiating glyf tables, hmetrics/vmetrics are updated and saved in subset plan, - hmtx/vmtx subsetting need to use these updated metrics values*/ - while (!revisit_set.is_empty ()) + bool made_changes = false; + for (hb_tag_t tag : pending_subset_tags) { - hb_set_t revisit_temp; - for (hb_tag_t tag : revisit_set) + if (!_dependencies_satisfied (plan, tag, + subsetted_tags, + pending_subset_tags)) { - if (!_dependencies_satisfied (plan, tag, tags_set, revisit_temp)) continue; - tags_set.add (tag); - success = _subset_table (plan, buf, tag); - if (unlikely (!success)) goto end; + // delayed subsetting for some tables since they might have dependency on other tables + // in some cases: e.g: during instantiating glyf tables, hmetrics/vmetrics are updated + // and saved in subset plan, hmtx/vmtx subsetting need to use these updated metrics values + continue; } - revisit_set = revisit_temp; + + pending_subset_tags.del (tag); + subsetted_tags.add (tag); + made_changes = true; + + success = _subset_table (plan, buf, tag); + if (unlikely (!success)) goto end; + } + + if (!made_changes) + { + DEBUG_MSG (SUBSET, nullptr, "Table dependencies unable to be satisfied. Subset failed."); + success = false; + goto end; } - offset += num_tables; } if (success && plan->attach_accelerator_data) { diff --git a/thirdparty/harfbuzz/src/hb-subset.h b/thirdparty/harfbuzz/src/hb-subset.h index 6a2c5f6114..b83264ea5e 100644 --- a/thirdparty/harfbuzz/src/hb-subset.h +++ b/thirdparty/harfbuzz/src/hb-subset.h @@ -28,6 +28,7 @@ #define HB_SUBSET_H #include "hb.h" +#include "hb-ot.h" HB_BEGIN_DECLS @@ -164,8 +165,6 @@ HB_EXTERN void hb_subset_input_set_flags (hb_subset_input_t *input, unsigned value); -#ifdef HB_EXPERIMENTAL_API -#ifndef HB_NO_VAR HB_EXTERN hb_bool_t hb_subset_input_pin_axis_to_default (hb_subset_input_t *input, hb_face_t *face, @@ -176,16 +175,22 @@ hb_subset_input_pin_axis_location (hb_subset_input_t *input, hb_face_t *face, hb_tag_t axis_tag, float axis_value); -#endif -#endif #ifdef HB_EXPERIMENTAL_API +HB_EXTERN hb_bool_t +hb_subset_input_override_name_table (hb_subset_input_t *input, + hb_ot_name_id_t name_id, + unsigned platform_id, + unsigned encoding_id, + unsigned language_id, + const char *name_str, + int str_len); + +#endif HB_EXTERN hb_face_t * hb_subset_preprocess (hb_face_t *source); -#endif - HB_EXTERN hb_face_t * hb_subset_or_fail (hb_face_t *source, const hb_subset_input_t *input); diff --git a/thirdparty/harfbuzz/src/hb-ucd-table.hh b/thirdparty/harfbuzz/src/hb-ucd-table.hh index a372a4afce..f7d76eee18 100644 --- a/thirdparty/harfbuzz/src/hb-ucd-table.hh +++ b/thirdparty/harfbuzz/src/hb-ucd-table.hh @@ -1069,7 +1069,7 @@ _hb_ucd_dm2_u64_map[388] = #ifndef HB_OPTIMIZE_SIZE static const uint8_t -_hb_ucd_u8[18260] = +_hb_ucd_u8[17868] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 11, 12, 13, 13, 13, 14, @@ -1535,191 +1535,166 @@ _hb_ucd_u8[18260] = 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, 0, 0, 40, 41, 42, 0, 43, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 0, 0, 0, 0, - 0, 0, 0, 0, 5, 0, 0, 0, 0, 0, 0, 0, 6, 7, 8, 0, - 9, 0, 10, 11, 0, 0, 12, 13, 14, 15, 16, 0, 0, 0, 0, 17, - 18, 19, 20, 0, 21, 0, 22, 23, 0, 24, 25, 0, 0, 24, 26, 27, - 0, 24, 26, 0, 0, 24, 26, 0, 0, 24, 26, 0, 0, 0, 26, 0, - 0, 24, 28, 0, 0, 24, 26, 0, 0, 29, 26, 0, 0, 0, 30, 0, - 0, 31, 32, 0, 0, 33, 34, 0, 35, 36, 0, 37, 38, 0, 39, 0, - 0, 40, 0, 0, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 0, 0, 0, 45, 0, - 0, 0, 0, 0, 0, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, - 48, 0, 0, 49, 0, 50, 51, 0, 0, 52, 53, 54, 0, 55, 0, 56, - 0, 57, 0, 0, 0, 0, 58, 59, 0, 0, 0, 0, 0, 0, 60, 61, - 0, 0, 0, 0, 0, 0, 62, 63, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 64, 0, 0, 0, 65, 0, 0, 0, 66, - 0, 67, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 69, 70, 0, 0, 71, 0, 0, 0, 0, 0, 0, 0, 0, - 72, 73, 0, 0, 0, 0, 53, 74, 0, 75, 76, 0, 0, 77, 78, 0, - 0, 0, 0, 0, 0, 79, 80, 81, 0, 0, 0, 0, 0, 0, 0, 26, - 0, 0, 0, 0, 0, 0, 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, - 0, 83, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 84, - 0, 0, 0, 0, 0, 0, 0, 85, 0, 0, 0, 86, 0, 0, 0, 0, - 87, 88, 0, 0, 0, 0, 0, 89, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 90, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 91, 0, 92, 0, 0, 93, 0, 94, 0, 0, 0, - 0, 0, 72, 95, 0, 96, 0, 0, 97, 98, 0, 77, 0, 0, 99, 0, - 0,100, 0, 0, 0, 0, 0,101, 0,102, 26,103, 0, 0, 0, 0, - 0, 0,104, 0, 0, 0,105, 0, 0, 0, 0, 0, 0, 65,106, 0, - 0, 65, 0, 0, 0,107, 0, 0, 0,108, 0, 0, 0, 0, 0, 0, - 0, 96, 0, 0, 0, 0, 0, 0, 0,109,110, 0, 0, 0, 0, 78, - 0, 44,111, 0,112, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 65, 0, 0, 0, 0, 0, 0, 0, 0,113, 0,114, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,116, 0,117, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118, - 0, 0, 0, 0,119, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,120,121,122, 0, 0, - 0, 0,123, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 124,125, 0, 0,126, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,127, 0,128, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,129, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,130, 0, 0, 0,131, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 2, 3, 4, - 5, 6, 7, 4, 4, 8, 9, 10, 1, 11, 12, 13, 14, 15, 16, 17, - 18, 1, 1, 1, 0, 0, 0, 0, 19, 1, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 20, 21, 22, 1, 23, 4, 21, 24, 25, 26, 27, 28, - 29, 30, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 31, 0, - 0, 0, 32, 33, 34, 35, 1, 36, 0, 0, 0, 0, 37, 0, 0, 0, - 0, 0, 0, 0, 0, 38, 1, 39, 14, 39, 40, 41, 0, 0, 0, 0, - 0, 0, 0, 0, 42, 0, 0, 0, 0, 0, 0, 0, 43, 36, 44, 45, - 21, 45, 46, 0, 0, 0, 0, 0, 0, 0, 19, 1, 21, 0, 0, 47, - 0, 0, 0, 0, 0, 38, 48, 1, 1, 49, 49, 50, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 0, 0, 0, 52, 1, - 0, 0, 38, 14, 4, 1, 1, 1, 53, 21, 43, 52, 54, 21, 35, 1, - 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 56, 57, 58, 0, 0, - 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59, - 0, 0, 0, 56, 0, 60, 0, 0, 0, 0, 0, 0, 0, 0, 61, 62, - 0, 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 64, 0, - 0, 0, 65, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 66, 0, - 0, 0, 67, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 68, 0, - 0, 0, 0, 0, 0, 69, 70, 0, 0, 0, 0, 0, 71, 72, 73, 74, - 75, 76, 0, 0, 0, 0, 0, 0, 0, 77, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 78, 79, 0, 0, 0, 0, 47, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 49, 0, 0, 0, 0, 0, 80, 0, 0, - 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, 63, 0, 0, 81, - 0, 0, 82, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 83, 0, - 0, 0, 0, 0, 0, 19, 84, 0, 62, 0, 0, 0, 0, 49, 1, 85, - 0, 0, 0, 0, 1, 52, 15, 86, 36, 10, 21, 87, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 55, 0, 0, 0, 62, 0, 0, 0, 0, 0, 0, - 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 88, 0, 0, 0, 0, 0, - 0, 89, 0, 0, 88, 0, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, - 0, 0, 0, 0, 87, 9, 12, 4, 90, 8, 91, 47, 0, 58, 50, 0, - 21, 1, 21, 92, 93, 1, 1, 1, 1, 1, 1, 1, 1, 94, 95, 96, - 0, 0, 0, 0, 97, 1, 98, 58, 81, 99,100, 4, 58, 0, 0, 0, - 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61, - 1, 1, 1, 1, 1, 1, 1, 1, 0, 0,101,102, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,103, 0, 0, 0, 0, 19, 0, 1, 1, 50, - 0, 0, 0, 0, 0, 0, 0, 38, 0, 0, 0, 0, 50, 0, 0, 0, - 0, 63, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 0, 0, - 1, 1, 1, 1, 50, 0, 0, 0, 0, 0,104, 68, 0, 0, 0, 0, - 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 78, 0, 0, 0, - 62, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,105,106, 58, 38, - 81, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 63, 0, 0, - 0, 0, 0, 0, 0, 0, 0,107, 1, 14, 4, 12, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 47, 84, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 38, 87, 0, 0, 0, 0,108, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,109, 61, 0,110, 0, 0, 0, 0, 0, 0, - 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 19, 58, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 51, 0,111, 14, 52, 84, 0, 0, 0, - 112, 41, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62, 0, 0, 61, - 0, 0, 0, 0, 0, 0,113, 0, 87, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 61, 62, 0, 0, 62, 0, 89, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,113, 0, 0, 0, 0,114, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 78, 55, 0, 38, 1, 58, 1, 58, 0, 0, - 63, 89, 0, 0, 0, 0, 0, 59,115, 0, 0, 0, 0, 0, 0, 0, - 55, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,115, 0, 0, - 0, 0, 61, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 79, - 78, 0, 0, 0, 0, 0, 0, 0, 0, 61, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 56, 0, 89, 80, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 61, 0, 0, 79, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 8, 91, 0, 0, 0, 0, 0, 0, 1, 87, 0, 0, - 0, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,117, - 0,118,119,120,121, 0,104, 4,122, 49, 23, 0, 0, 0, 0, 0, - 0, 0, 38, 50, 0, 0, 0, 0, 38, 58, 0, 0, 0, 0, 0, 0, - 1, 87, 1, 1, 1, 1, 39, 1, 48,105, 87, 0, 0, 0, 0, 0, - 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 59, 0, 0, 0, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 0,123, 0, 0, 0, 0, - 0, 0, 0, 0, 4,122, 0, 0, 0, 1,124, 0, 0, 0, 0, 0, - 0, 0, 0, 0,230,230,230,230,230,232,220,220,220,220,232,216, - 220,220,220,220,220,202,202,220,220,220,220,202,202,220,220,220, - 1, 1, 1, 1, 1,220,220,220,220,230,230,230,230,240,230,220, - 220,220,230,230,230,220,220, 0,230,230,230,220,220,220,220,230, - 232,220,220,230,233,234,234,233,234,234,233,230, 0, 0, 0,230, - 0,220,230,230,230,230,220,230,230,230,222,220,230,230,220,220, - 230,222,228,230, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 19, 20, - 21, 22, 0, 23, 0, 24, 25, 0,230,220, 0, 18, 30, 31, 32, 0, - 0, 0, 0, 27, 28, 29, 30, 31, 32, 33, 34,230,230,220,220,230, - 220,230,230,220, 35, 0, 0, 0, 0, 0,230,230,230, 0, 0,230, - 230, 0,220,230,230,220, 0, 0, 0, 36, 0, 0,230,220,230,230, - 220,220,230,220,220,230,220,230,220,230,230, 0, 0,220, 0, 0, - 230,230, 0,230, 0,230,230,230,230,230, 0, 0, 0,220,220,220, - 230,220,220,220,230,230, 0,220, 27, 28, 29,230, 7, 0, 0, 0, - 0, 9, 0, 0, 0,230,220,230,230, 0, 0, 0, 0, 0,230, 0, - 0, 84, 91, 0, 0, 0, 0, 9, 9, 0, 0, 0, 0, 0, 9, 0, - 103,103, 9, 0,107,107,107,107,118,118, 9, 0,122,122,122,122, - 220,220, 0, 0, 0,220, 0,220, 0,216, 0, 0, 0,129,130, 0, - 132, 0, 0, 0, 0, 0,130,130,130,130, 0, 0,130, 0,230,230, - 9, 0,230,230, 0, 0,220, 0, 0, 0, 0, 7, 0, 9, 9, 0, - 9, 9, 0, 0, 0,230, 0, 0, 0,228, 0, 0, 0,222,230,220, - 220, 0, 0, 0,230, 0, 0,220,230,220, 0,220,230,230,230, 0, - 0, 0, 9, 9, 0, 0, 7, 0,230, 0, 1, 1, 1, 0, 0, 0, - 230,234,214,220,202,230,230,230,230,230,232,228,228,220,218,230, - 233,220,230,220,230,230, 1, 1, 1, 1, 1,230, 0, 1, 1,230, - 220,230, 1, 1, 0, 0,218,228,232,222,224,224, 0, 8, 8, 0, - 0, 0, 0,220,230, 0,230,230,220, 0, 0,230, 0, 0, 26, 0, - 0,220, 0,230,230, 1,220, 0, 0,230,220, 0, 0, 0,220,220, - 0, 0,230,220, 0, 9, 7, 0, 0, 7, 9, 0, 0, 0, 9, 7, - 6, 6, 0, 0, 0, 0, 1, 0, 0,216,216, 1, 1, 1, 0, 0, - 0,226,216,216,216,216,216, 0,220,220,220, 0,232,232,220,230, - 230,230, 7, 0, 16, 17, 17, 17, 17, 17, 17, 33, 17, 17, 17, 19, - 17, 17, 17, 17, 20,101, 17,113,129,169, 17, 27, 28, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 0, 0, + 0, 0, 3, 0, 0, 0, 4, 5, 6, 7, 0, 8, 9, 10, 0, 11, + 12, 13, 14, 15, 16, 17, 16, 18, 16, 19, 16, 19, 16, 19, 0, 19, + 16, 20, 16, 19, 21, 19, 0, 22, 23, 24, 25, 26, 27, 28, 29, 30, + 31, 0, 32, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33, 0, 0, + 0, 0, 0, 0, 34, 0, 0, 35, 0, 0, 36, 0, 37, 0, 0, 0, + 38, 39, 40, 41, 42, 43, 44, 45, 46, 0, 0, 47, 0, 0, 0, 48, + 0, 0, 0, 49, 0, 0, 0, 0, 0, 0, 0, 50, 0, 51, 0, 52, + 53, 0, 54, 0, 0, 0, 0, 0, 0, 55, 56, 57, 0, 0, 0, 0, + 58, 0, 0, 59, 60, 61, 62, 63, 0, 0, 64, 65, 0, 0, 0, 66, + 0, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 69, 0, 0, 0, 70, 0, 71, 0, 0, + 72, 0, 0, 73, 0, 0, 0, 0, 0, 0, 0, 0, 74, 0, 0, 0, + 0, 0, 75, 76, 0, 77, 78, 0, 0, 79, 80, 0, 81, 62, 0, 82, + 83, 0, 0, 84, 85, 86, 0, 0, 0, 87, 0, 88, 0, 0, 51, 89, + 51, 0, 90, 0, 91, 0, 0, 0, 80, 0, 0, 0, 92, 93, 0, 94, + 95, 96, 97, 0, 0, 0, 0, 0, 51, 0, 0, 0, 0, 98, 99, 0, + 0, 0, 0, 0, 0,100, 0, 0, 0, 0, 0,101,102, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,103, 0, 0,104, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,105,106, 0, 0,107, 0, 0, 0, 0, 0, 0, + 108, 0,109, 0,102, 0, 0, 0, 0, 0,110,111, 0, 0, 0, 0, + 0, 0, 0,112, 0, 0, 0, 0, 0, 0, 0,113, 0,114, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 0, 8, 0, 0, 0, + 0, 9, 10, 11, 12, 0, 0, 0, 0, 13, 0, 0, 14, 15, 0, 16, + 0, 17, 18, 0, 0, 19, 0, 20, 21, 0, 0, 0, 0, 0, 22, 23, + 0, 24, 25, 0, 0, 26, 0, 0, 0, 27, 0, 0, 28, 29, 30, 31, + 0, 0, 0, 32, 33, 34, 0, 0, 33, 0, 0, 35, 33, 0, 0, 0, + 33, 36, 0, 0, 0, 0, 0, 37, 38, 0, 0, 0, 0, 0, 0, 39, + 40, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 43, 0, 44, + 0, 0, 0, 45, 46, 0, 0, 0, 47, 0, 0, 0, 0, 0, 0, 48, + 49, 0, 0, 0, 0, 50, 0, 0, 0, 51, 0, 52, 0, 53, 0, 0, + 0, 0, 54, 0, 0, 0, 0, 55, 0, 56, 0, 0, 0, 0, 57, 58, + 0, 0, 0, 59, 60, 0, 0, 0, 0, 0, 0, 61, 52, 0, 62, 63, + 0, 0, 64, 0, 0, 0, 65, 66, 0, 0, 0, 67, 0, 68, 69, 70, + 71, 72, 1, 73, 0, 74, 75, 76, 0, 0, 77, 78, 0, 0, 0, 79, + 0, 0, 1, 1, 0, 0, 80, 0, 0, 81, 0, 0, 0, 0, 77, 82, + 0, 83, 0, 0, 0, 0, 0, 78, 84, 0, 85, 0, 52, 0, 1, 78, + 0, 0, 86, 0, 0, 87, 0, 0, 0, 0, 0, 88, 57, 0, 0, 0, + 0, 0, 0, 89, 90, 0, 0, 84, 0, 0, 33, 0, 0, 91, 0, 0, + 0, 0, 92, 0, 0, 0, 0, 49, 0, 0, 93, 0, 0, 0, 0, 94, + 95, 0, 0, 96, 0, 0, 97, 0, 0, 0, 98, 0, 0, 0, 99, 0, + 0, 0, 0,100,101, 93, 0, 0,102, 0, 0, 0, 84, 0, 0,103, + 0, 0, 0,104,105, 0, 0,106,107, 0, 0, 0, 0, 0, 0,108, + 0, 0,109, 0, 0, 0, 0,110, 33, 0,111,112,113, 35, 0, 0, + 114, 0, 0, 0,115, 0, 0, 0, 0, 0, 0,116, 0, 0,117, 0, + 0, 0, 0,118, 88, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 52, + 119, 0, 0, 0, 0,120, 0, 0,121, 0, 0, 0, 0,119, 0, 0, + 122, 0, 0, 0, 0, 0, 0,123, 0, 0, 0,124, 0, 0, 0,125, + 0,126, 0, 0, 0, 0,127,128,129, 0,130, 0,131, 0, 0, 0, + 132,133,134, 0, 77, 0, 0, 0, 0, 0, 35, 0, 0, 0,135, 0, + 0, 0,136, 0, 0,137, 0, 0,138, 0, 0, 0, 0, 0, 0, 0, + 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 7, 4, 4, 8, 9, 10, + 1, 11, 12, 13, 14, 15, 16, 17, 18, 1, 1, 1, 19, 1, 0, 0, + 20, 21, 22, 1, 23, 4, 21, 24, 25, 26, 27, 28, 29, 30, 0, 0, + 1, 1, 31, 0, 0, 0, 32, 33, 34, 35, 1, 36, 37, 0, 0, 0, + 0, 38, 1, 39, 14, 39, 40, 41, 42, 0, 0, 0, 43, 36, 44, 45, + 21, 45, 46, 0, 0, 0, 19, 1, 21, 0, 0, 47, 0, 38, 48, 1, + 1, 49, 49, 50, 0, 0, 51, 0, 0, 0, 52, 1, 0, 0, 38, 14, + 4, 1, 1, 1, 53, 21, 43, 52, 54, 21, 35, 1, 0, 0, 0, 55, + 0, 0, 0, 56, 57, 58, 0, 0, 0, 0, 0, 59, 0, 60, 0, 0, + 0, 0, 61, 62, 0, 0, 63, 0, 0, 0, 64, 0, 0, 0, 65, 0, + 0, 0, 66, 0, 0, 0, 67, 0, 0, 0, 68, 0, 0, 69, 70, 0, + 71, 72, 73, 74, 75, 76, 0, 0, 0, 77, 0, 0, 0, 78, 79, 0, + 0, 0, 0, 47, 0, 0, 0, 49, 0, 80, 0, 0, 0, 62, 0, 0, + 63, 0, 0, 81, 0, 0, 82, 0, 0, 0, 83, 0, 0, 19, 84, 0, + 62, 0, 0, 0, 0, 49, 1, 85, 1, 52, 15, 86, 36, 10, 21, 87, + 0, 55, 0, 0, 0, 0, 19, 10, 1, 0, 0, 0, 0, 0, 88, 0, + 0, 89, 0, 0, 88, 0, 0, 0, 0, 78, 0, 0, 87, 9, 12, 4, + 90, 8, 91, 47, 0, 58, 50, 0, 21, 1, 21, 92, 93, 1, 1, 1, + 1, 94, 95, 96, 97, 1, 98, 58, 81, 99,100, 4, 58, 0, 0, 0, + 0, 0, 0, 19, 50, 0, 0, 0, 0, 0, 0, 61, 0, 0,101,102, + 0, 0,103, 0, 0, 1, 1, 50, 0, 0, 0, 38, 0, 63, 0, 0, + 0, 0, 0, 62, 0, 0,104, 68, 61, 0, 0, 0, 78, 0, 0, 0, + 105,106, 58, 38, 81, 0, 0, 0, 0, 0, 0,107, 1, 14, 4, 12, + 84, 0, 0, 0, 0, 38, 87, 0, 0, 0, 0,108, 0, 0,109, 61, + 0,110, 0, 0, 0, 1, 0, 0, 0, 0, 19, 58, 0, 0, 0, 51, + 0,111, 14, 52,112, 41, 0, 0, 62, 0, 0, 61, 0, 0,113, 0, + 87, 0, 0, 0, 61, 62, 0, 0, 62, 0, 89, 0, 0,113, 0, 0, + 0, 0,114, 0, 0, 0, 78, 55, 0, 38, 1, 58, 1, 58, 0, 0, + 63, 89, 0, 0,115, 0, 0, 0, 55, 0, 0, 0, 0,115, 0, 0, + 0, 0, 61, 0, 0, 0, 0, 79, 0, 61, 0, 0, 0, 0, 56, 0, + 89, 80, 0, 0, 79, 0, 0, 0, 8, 91, 0, 0, 1, 87, 0, 0, + 116, 0, 0, 0, 0, 0, 0,117, 0,118,119,120,121, 0,104, 4, + 122, 49, 23, 0, 0, 0, 38, 50, 38, 58, 0, 0, 1, 87, 1, 1, + 1, 1, 39, 1, 48,105, 87, 0, 0, 0, 0, 1, 0, 0, 0,123, + 4,122, 0, 0, 0, 1,124, 0, 0, 0, 0, 0,230,230,230,230, + 230,232,220,220,220,220,232,216,220,220,220,220,220,202,202,220, + 220,220,220,202,202,220,220,220, 1, 1, 1, 1, 1,220,220,220, + 220,230,230,230,230,240,230,220,220,220,230,230,230,220,220, 0, + 230,230,230,220,220,220,220,230,232,220,220,230,233,234,234,233, + 234,234,233,230, 0, 0, 0,230, 0,220,230,230,230,230,220,230, + 230,230,222,220,230,230,220,220,230,222,228,230, 10, 11, 12, 13, + 14, 15, 16, 17, 18, 19, 19, 20, 21, 22, 0, 23, 0, 24, 25, 0, + 230,220, 0, 18, 30, 31, 32, 0, 0, 0, 0, 27, 28, 29, 30, 31, + 32, 33, 34,230,230,220,220,230,220,230,230,220, 35, 0, 0, 0, + 0, 0,230,230,230, 0, 0,230,230, 0,220,230,230,220, 0, 0, + 0, 36, 0, 0,230,220,230,230,220,220,230,220,220,230,220,230, + 220,230,230, 0, 0,220, 0, 0,230,230, 0,230, 0,230,230,230, + 230,230, 0, 0, 0,220,220,220,230,220,220,220,230,230, 0,220, + 27, 28, 29,230, 7, 0, 0, 0, 0, 9, 0, 0, 0,230,220,230, + 230, 0, 0, 0, 0, 0,230, 0, 0, 84, 91, 0, 0, 0, 0, 9, + 9, 0, 0, 0, 0, 0, 9, 0,103,103, 9, 0,107,107,107,107, + 118,118, 9, 0,122,122,122,122,220,220, 0, 0, 0,220, 0,220, + 0,216, 0, 0, 0,129,130, 0,132, 0, 0, 0, 0, 0,130,130, + 130,130, 0, 0,130, 0,230,230, 9, 0,230,230, 0, 0,220, 0, + 0, 0, 0, 7, 0, 9, 9, 0, 9, 9, 0, 0, 0,230, 0, 0, + 0,228, 0, 0, 0,222,230,220,220, 0, 0, 0,230, 0, 0,220, + 230,220, 0,220,230,230,230, 0, 0, 0, 9, 9, 0, 0, 7, 0, + 230, 0, 1, 1, 1, 0, 0, 0,230,234,214,220,202,230,230,230, + 230,230,232,228,228,220,218,230,233,220,230,220,230,230, 1, 1, + 1, 1, 1,230, 0, 1, 1,230,220,230, 1, 1, 0, 0,218,228, + 232,222,224,224, 0, 8, 8, 0, 0, 0, 0,220,230, 0,230,230, + 220, 0, 0,230, 0, 0, 26, 0, 0,220, 0,230,230, 1,220, 0, + 0,230,220, 0, 0, 0,220,220, 0, 0,230,220, 0, 9, 7, 0, + 0, 7, 9, 0, 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, 1, 0, + 0,216,216, 1, 1, 1, 0, 0, 0,226,216,216,216,216,216, 0, + 220,220,220, 0,232,232,220,230,230,230, 7, 0, 16, 17, 17, 17, + 17, 17, 17, 33, 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113, + 129,169, 17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17,237, 0, 1, 2, 2, 0, 3, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 5, 0, 0, 0, 0, 6, 7, 8, 9, 0, 0, 0, 10, 11, 12, 13, - 14, 15, 16, 17, 18, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 20, - 0, 0, 21, 22, 0, 0, 0, 0, 23, 24, 25, 26, 0, 27, 0, 28, - 29, 30, 31, 32, 0, 0, 0, 0, 0, 0, 0, 33, 34, 35, 36, 0, - 0, 0, 0, 0, 37, 0, 0, 0, 0, 0, 0, 0, 0, 0, 38, 39, - 0, 0, 0, 0, 1, 2, 40, 41, 0, 1, 2, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 0, 0, 3, 4, 0, 0, 5, 0, 0, 0, 6, 0, 0, 0, 0, 0, - 0, 0, 7, 1, 0, 0, 0, 0, 0, 0, 8, 9, 0, 0, 0, 0, - 0, 0, 10, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 10, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 11, 12, - 0, 13, 0, 14, 15, 16, 0, 0, 0, 0, 0, 1, 17, 18, 0, 19, - 7, 1, 0, 0, 0, 20, 20, 7, 20, 20, 20, 20, 20, 20, 20, 8, - 21, 0, 22, 0, 7, 23, 24, 0, 20, 20, 25, 0, 0, 0, 26, 27, - 1, 7, 20, 20, 20, 20, 20, 1, 28, 29, 30, 31, 0, 0, 20, 0, - 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 0, 0, 0, 0, 20, 20, - 20, 1, 0, 0, 8, 21, 32, 4, 0, 10, 0, 33, 7, 20, 20, 20, - 0, 0, 0, 0, 8, 34, 34, 35, 36, 34, 37, 0, 38, 1, 20, 20, - 0, 0, 39, 0, 1, 1, 0, 8, 21, 1, 20, 0, 0, 0, 1, 0, - 0, 40, 1, 1, 0, 0, 8, 21, 0, 1, 0, 1, 0, 1, 0, 0, - 0, 0, 26, 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 7, 20, 41, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 21, 0, 42, 43, 44, 0, 45, - 0, 8, 21, 0, 0, 0, 0, 0, 0, 0, 0, 46, 7, 1, 10, 1, - 0, 0, 0, 1, 20, 20, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 26, 34, 9, 0, 0, 20, 20, 1, 20, 20, 0, 0, 0, 0, 0, - 0, 0, 26, 21, 0, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 3, 47, 48, 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, - 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 16, 17, 18, - 19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, 25, 26, 13, 13, - 13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 13, 42, 7, 7, 43, 7, - 44, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,237, 0, 1, 2, 2, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 6, 7, 8, + 9, 0, 0, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 21, 22, 0, 0, 0, 0, + 23, 24, 25, 26, 0, 27, 0, 28, 29, 30, 31, 32, 0, 0, 0, 0, + 0, 0, 0, 33, 34, 35, 36, 0, 0, 0, 0, 0, 37, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, 1, 2, 40, 41, + 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, + 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 5, 0, + 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, + 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, + 0, 0, 0, 0, 0, 0, 11, 12, 0, 13, 0, 14, 15, 16, 0, 0, + 0, 0, 0, 1, 17, 18, 0, 19, 7, 1, 0, 0, 0, 20, 20, 7, + 20, 20, 20, 20, 20, 20, 20, 8, 21, 0, 22, 0, 7, 23, 24, 0, + 20, 20, 25, 0, 0, 0, 26, 27, 1, 7, 20, 20, 20, 20, 20, 1, + 28, 29, 30, 31, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 10, 0, + 0, 0, 0, 0, 0, 0, 20, 20, 20, 1, 0, 0, 8, 21, 32, 4, + 0, 10, 0, 33, 7, 20, 20, 20, 0, 0, 0, 0, 8, 34, 34, 35, + 36, 34, 37, 0, 38, 1, 20, 20, 0, 0, 39, 0, 1, 1, 0, 8, + 21, 1, 20, 0, 0, 0, 1, 0, 0, 40, 1, 1, 0, 0, 8, 21, + 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 26, 34, 34, 34, 34, 34, + 34, 34, 34, 34, 21, 7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34, + 34, 21, 0, 42, 43, 44, 0, 45, 0, 8, 21, 0, 0, 0, 0, 0, + 0, 0, 0, 46, 7, 1, 10, 1, 0, 0, 0, 1, 20, 20, 1, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 34, 9, 0, 0, 20, 20, + 1, 20, 20, 0, 0, 0, 0, 0, 0, 0, 26, 21, 0, 1, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 48, 0, 0, 0, + 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 11, 11, 11, 12, 13, + 13, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 13, 22, 13, 13, 13, + 13, 23, 24, 24, 25, 26, 13, 13, 13, 27, 28, 29, 13, 30, 31, 32, + 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7, + 7, 41, 13, 42, 7, 7, 43, 7, 44, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, @@ -1740,420 +1715,420 @@ _hb_ucd_u8[18260] = 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, 0, 0, 1, - 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, - 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, - 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42, - 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, 55, 56, - 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, 61, 61, - 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 13, 13, 45, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, + 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, + 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, + 37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, + 51, 52, 2, 2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, + 59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, + 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88, - 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 79, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, + 82, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 70, 70, 97, 98, 99,100,101,101,102,103,104,105,106,107,108,109, - 110,111, 96,112,113,114,115,116,117,118,119,119,120,121,122,123, - 124,125,126,127,128,129,130,131,132, 96,133,134,135,136,137,138, - 139,140,141,142,143, 96,144,145, 96,146,147,148,149, 96,150,151, - 152,153,154,155,156, 96,157,158,159,160, 96,161,162,163,164,164, - 164,164,164,164,164,165,166,164,167, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,168,169,169, - 169,169,169,169,169,169,170, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96,171,171,171,171,172, 96, 96, 96,173,173, - 173,173,174,175,176,177, 96, 96, 96, 96,178,179,180,181,182,182, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, 97, 98, 99,100,101,101, + 102,103,104,105,106,107,108,109,110,111, 96,112,113,114,115,116, + 117,118,119,119,120,121,122,123,124,125,126,127,128,129,130,131, + 132, 96,133,134,135,136,137,138,139,140,141,142,143, 96,144,145, + 96,146,147,148,149, 96,150,151,152,153,154,155,156, 96,157,158, + 159,160, 96,161,162,163,164,164,164,164,164,164,164,165,166,164, + 167, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96,168,169,169,169,169,169,169,169,169,170, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,171,171, + 171,171,172, 96, 96, 96,173,173,173,173,174,175,176,177, 96, 96, + 96, 96,178,179,180,181,182,182,182,182,182,182,182,182,182,182, 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182, - 182,182,182,182,182,182,182,182,182,182,182,182,182,183,182,182, - 182,182,182,182,184,184,184,185,186, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,187,188,189, - 190,191,191,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96,193,194, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,195,196, 59,197, - 198,199,200,201,202, 96,203,204,205, 59, 59,206, 59,207,208,208, - 208,208,208,209, 96, 96, 96, 96, 96, 96, 96, 96,210, 96,211,212, - 213, 96, 96,214, 96, 96, 96,215, 96, 96, 96, 96, 96,216,217,218, - 219, 96, 96, 96, 96, 96,220,221,222, 96,223,224, 96, 96,225,226, - 59,227,228, 96, 59, 59, 59, 59, 59, 59, 59,229,230,231,232,233, - 59, 59,234,235, 59,236, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,237, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,238, 70,239, 70, + 182,182,182,182,182,183,182,182,182,182,182,182,184,184,184,185, + 186, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96,187,188,189,190,191,191,192, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,193,194, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96,195,196, 59,197,198,199,200,201,202, 96,203,204, + 205, 59, 59,206, 59,207,208,208,208,208,208,209, 96, 96, 96, 96, + 96, 96, 96, 96,210, 96,211,212,213, 96, 96,214, 96, 96, 96,215, + 96, 96, 96, 96, 96,216,217,218,219, 96, 96, 96, 96, 96,220,221, + 222, 96,223,224, 96, 96,225,226, 59,227,228, 96, 59, 59, 59, 59, + 59, 59, 59,229,230,231,232,233, 59, 59,234,235, 59,236, 96, 96, + 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70,237, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70,238, 70,239, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,240, 70, 70, 70, 70, - 70, 70, 70, 70, 70,241, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, - 70, 70,242, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, - 70, 70, 70, 70,243, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70, 70,244, 96, 96, 96, 96, 96, 96, 96, 96,245, 96, - 246,247, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, 4, 5, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, 0, 0, - 19, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 0, 19, 0, - 0, 0, 0, 0, 0, 0, 19, 19, 19, 19, 19, 0, 0, 0, 0, 0, - 26, 26, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 9, 9, - 9, 9, 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, 0, 9, 2, 2, - 2, 2, 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, - 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 55, 6, 6, - 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, 1, 1, 6, 2, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 2, 4, 4, 4, 2, 2, 4, 4, 4, 2, 14, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 2, - 2, 2, 2, 2, 2, 2, 14, 14, 14, 2, 2, 2, 2, 14, 14, 14, - 14, 14, 14, 2, 2, 2, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, - 3, 3, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 0, 3, 3, 3, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 3, 3, 1, 3, - 3, 3, 3, 3, 3, 3, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 37, 37, 2, 37, 37, 37, 37, 2, 2, 37, 37, 37, 38, 38, - 38, 38, 38, 38, 38, 38, 38, 38, 2, 2, 2, 2, 2, 2, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, 64, 64, 90, 90, - 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, 2, 2, 90, 90, - 90, 90, 90, 90, 90, 2, 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, - 95, 95, 2, 2, 95, 2, 37, 37, 37, 2, 2, 2, 2, 2, 3, 3, - 3, 3, 3, 3, 3, 2, 3, 3, 2, 2, 2, 2, 2, 2, 3, 3, - 0, 3, 3, 3, 3, 3, 7, 7, 7, 7, 7, 7, 7, 7, 7, 1, - 1, 1, 1, 7, 7, 7, 7, 7, 7, 7, 0, 0, 7, 7, 5, 5, - 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 5, 5, 2, - 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, - 5, 5, 5, 5, 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5, - 2, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 2, 2, 2, - 2, 2, 2, 2, 2, 5, 2, 2, 2, 2, 5, 5, 2, 5, 5, 5, - 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 2, 2, 11, - 11, 11, 2, 11, 11, 11, 11, 11, 11, 2, 2, 2, 2, 11, 11, 2, - 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, - 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 2, 11, 11, 2, 11, 11, - 2, 2, 11, 2, 11, 11, 11, 2, 2, 11, 11, 11, 2, 2, 2, 11, - 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, 2, 11, 2, 2, 2, - 2, 2, 2, 2, 11, 11, 11, 11, 11, 11, 11, 11, 11, 2, 2, 10, - 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, - 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 10, 2, - 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 2, 10, 10, 10, 10, 10, - 2, 2, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 2, 2, 10, 2, - 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, - 2, 2, 2, 2, 2, 2, 2, 10, 10, 10, 10, 10, 10, 10, 2, 21, - 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, - 2, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 21, 2, - 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 2, 21, 21, 21, 21, 21, - 2, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 2, 2, 2, 2, - 2, 2, 2, 21, 21, 21, 2, 2, 2, 2, 21, 21, 2, 21, 21, 21, - 21, 21, 2, 2, 21, 21, 2, 2, 22, 22, 2, 22, 22, 22, 22, 22, - 22, 2, 2, 2, 22, 22, 22, 2, 22, 22, 22, 22, 2, 2, 2, 22, - 22, 2, 22, 2, 22, 22, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22, - 22, 22, 22, 22, 22, 22, 22, 22, 2, 2, 2, 2, 22, 22, 22, 2, - 2, 2, 2, 2, 2, 22, 2, 2, 2, 2, 2, 2, 22, 22, 22, 22, - 22, 2, 2, 2, 2, 2, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, - 23, 23, 23, 2, 23, 23, 23, 2, 23, 23, 23, 23, 23, 23, 23, 23, - 2, 2, 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 2, - 2, 2, 2, 23, 23, 2, 23, 23, 23, 2, 2, 23, 2, 2, 23, 23, - 23, 23, 2, 2, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 16, 16, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 2, - 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 16, - 2, 2, 16, 16, 16, 16, 16, 2, 16, 16, 16, 16, 2, 2, 2, 2, - 2, 2, 2, 16, 16, 2, 16, 16, 16, 16, 2, 2, 16, 16, 2, 16, - 16, 16, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, - 20, 20, 20, 2, 20, 20, 20, 2, 20, 20, 20, 20, 20, 20, 2, 2, - 2, 2, 20, 20, 20, 20, 20, 20, 20, 20, 2, 2, 20, 20, 2, 36, - 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 2, 2, 2, 36, 36, 36, 36, 36, 36, 36, 36, - 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, 2, - 36, 2, 2, 2, 2, 36, 36, 36, 36, 36, 36, 2, 36, 2, 2, 2, - 2, 2, 2, 2, 36, 36, 2, 2, 36, 36, 36, 2, 2, 2, 2, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 2, 2, 2, 2, 0, 24, 24, 24, 24, 2, 2, 2, 2, 2, 18, - 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, 18, - 18, 18, 18, 18, 2, 2, 18, 18, 18, 18, 18, 2, 18, 2, 18, 18, - 18, 18, 18, 18, 18, 2, 18, 18, 2, 2, 18, 18, 18, 18, 25, 25, - 25, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 25, 25, - 25, 25, 25, 2, 2, 2, 25, 25, 25, 25, 25, 2, 25, 25, 25, 25, - 25, 25, 25, 0, 0, 0, 0, 25, 25, 2, 2, 2, 2, 2, 33, 33, - 33, 33, 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, - 8, 8, 8, 8, 2, 8, 2, 2, 2, 2, 2, 8, 2, 2, 8, 8, - 8, 0, 8, 8, 8, 8, 12, 12, 12, 12, 12, 12, 12, 12, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 2, 30, 30, 30, 30, 2, 2, 30, 30, - 30, 30, 30, 30, 30, 2, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, - 30, 30, 30, 2, 2, 2, 30, 30, 2, 2, 2, 2, 2, 2, 29, 29, - 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, 2, 2, 28, 28, - 28, 28, 28, 28, 28, 28, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 2, 2, 2, 35, 35, 35, 35, 35, 35, 35, 35, 35, 35, - 35, 0, 0, 0, 35, 35, 35, 2, 2, 2, 2, 2, 2, 2, 45, 45, - 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 45, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 44, 0, 0, 2, 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, - 43, 43, 2, 2, 2, 2, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, - 46, 46, 46, 2, 46, 46, 46, 2, 46, 46, 2, 2, 2, 2, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 2, 2, 31, 31, - 2, 2, 2, 2, 2, 2, 32, 32, 0, 0, 32, 0, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 2, 2, 2, 2, 2, 2, 32, 2, - 2, 2, 2, 2, 2, 2, 32, 32, 32, 2, 2, 2, 2, 2, 28, 28, - 28, 28, 28, 28, 2, 2, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, - 48, 48, 48, 48, 48, 2, 48, 48, 48, 48, 2, 2, 2, 2, 48, 2, - 2, 2, 48, 48, 48, 48, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 2, 2, 52, 52, 52, 52, 52, 2, 2, 2, 58, 58, - 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, 2, 2, 2, 2, 58, 58, - 2, 2, 2, 2, 2, 2, 58, 58, 58, 2, 2, 2, 58, 58, 54, 54, - 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91, - 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 2, 91, 91, - 91, 91, 91, 2, 2, 91, 91, 91, 2, 2, 2, 2, 2, 2, 91, 91, - 91, 91, 91, 91, 2, 2, 1, 1, 1, 1, 1, 1, 1, 2, 62, 62, - 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, 2, 2, 2, 62, 62, - 62, 62, 62, 62, 62, 2, 76, 76, 76, 76, 76, 76, 76, 76, 93, 93, - 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, 2, 2, 2, 2, 2, 2, - 2, 2, 93, 93, 93, 93, 70, 70, 70, 70, 70, 70, 70, 70, 2, 2, - 2, 70, 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 73, 73, - 73, 73, 73, 73, 73, 73, 6, 2, 2, 2, 2, 2, 2, 2, 8, 8, - 8, 2, 2, 8, 8, 8, 1, 1, 1, 0, 1, 1, 1, 1, 1, 0, - 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, - 0, 0, 1, 0, 0, 0, 1, 1, 0, 2, 2, 2, 2, 2, 19, 19, - 19, 19, 19, 19, 9, 9, 9, 9, 9, 6, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 9, 9, 9, 9, - 9, 19, 19, 19, 19, 19, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 19, 19, 9, 9, 9, 9, 9, 9, 9, 2, 2, 2, 9, - 2, 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 9, - 9, 9, 2, 2, 9, 9, 9, 9, 9, 9, 2, 9, 9, 9, 2, 2, - 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 2, 0, 0, - 0, 0, 1, 1, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 19, - 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, - 0, 0, 0, 0, 0, 2, 19, 19, 19, 19, 19, 2, 2, 2, 0, 2, - 2, 2, 2, 2, 2, 2, 1, 2, 2, 2, 2, 2, 2, 2, 0, 0, - 0, 0, 0, 0, 9, 0, 0, 0, 19, 19, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 19, 0, 19, 0, 0, 0, 2, 2, 2, 2, 0, 0, - 0, 2, 2, 2, 2, 2, 27, 27, 27, 27, 27, 27, 27, 27, 0, 0, - 0, 0, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 56, 56, - 56, 56, 56, 56, 56, 56, 55, 55, 55, 55, 2, 2, 2, 2, 2, 55, - 55, 55, 55, 55, 55, 55, 61, 61, 61, 61, 61, 61, 61, 61, 2, 2, - 2, 2, 2, 2, 2, 61, 61, 2, 2, 2, 2, 2, 2, 2, 0, 0, - 0, 0, 0, 0, 2, 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 2, 13, 13, 13, 13, 13, 13, 13, 13, 13, 2, 2, 2, 2, 13, 13, - 13, 13, 13, 13, 2, 2, 0, 0, 0, 0, 2, 2, 2, 2, 0, 0, - 0, 0, 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 1, 1, 1, 1, 12, 12, 13, 13, 13, 13, 0, 0, 0, 0, 2, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 0, 0, 17, 17, 17, 2, 2, 2, 2, 2, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 2, 12, 12, 12, 12, 12, 12, 12, 12, 12, - 12, 12, 12, 12, 12, 2, 12, 12, 12, 12, 12, 12, 12, 0, 17, 17, - 17, 17, 17, 17, 17, 0, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, - 39, 39, 39, 2, 2, 2, 39, 39, 39, 39, 39, 39, 39, 2, 86, 86, - 86, 86, 86, 86, 86, 86, 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 77, 2, 2, 2, 2, 79, 79, 79, 79, 79, 79, 79, 79, 0, 0, - 19, 19, 19, 19, 19, 19, 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, - 19, 2, 2, 2, 2, 2, 19, 19, 2, 19, 2, 19, 19, 19, 19, 19, - 2, 2, 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 60, 60, - 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 2, 2, 2, 0, 0, - 2, 2, 2, 2, 2, 2, 65, 65, 65, 65, 65, 65, 65, 65, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 2, 2, 2, 2, - 2, 2, 2, 2, 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 69, 69, - 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, 0, 69, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 74, 12, 12, 12, 12, 12, 2, 2, 2, 84, 84, - 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, 2, 0, 84, 84, - 2, 2, 2, 2, 84, 84, 33, 33, 33, 33, 33, 33, 33, 2, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 2, 68, 68, - 68, 68, 68, 68, 2, 2, 68, 68, 2, 2, 68, 68, 68, 68, 92, 92, - 92, 92, 92, 92, 92, 92, 92, 92, 92, 2, 2, 2, 2, 2, 2, 2, - 2, 92, 92, 92, 92, 92, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, - 87, 87, 87, 87, 87, 2, 2, 30, 30, 30, 30, 30, 30, 2, 19, 19, - 19, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 19, 19, 19, 19, - 0, 0, 2, 2, 2, 2, 87, 87, 87, 87, 87, 87, 2, 2, 87, 87, - 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 2, 2, 2, 2, 2, 2, - 2, 12, 12, 12, 12, 12, 13, 13, 2, 2, 2, 2, 2, 2, 19, 19, - 19, 19, 19, 19, 19, 2, 2, 2, 2, 4, 4, 4, 4, 4, 2, 2, - 2, 2, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 14, 14, - 14, 14, 14, 2, 14, 2, 14, 14, 2, 14, 14, 2, 14, 14, 3, 3, - 3, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 0, 0, 2, 2, 3, 3, 3, 3, 3, 3, 2, 2, - 2, 2, 2, 2, 2, 3, 1, 1, 1, 1, 1, 1, 6, 6, 0, 0, - 0, 2, 0, 0, 0, 0, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, - 3, 3, 3, 2, 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 2, 2, - 12, 12, 12, 12, 12, 12, 2, 2, 12, 12, 12, 2, 2, 2, 2, 0, - 0, 0, 0, 0, 2, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, - 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, - 49, 2, 49, 49, 2, 49, 49, 49, 49, 49, 49, 49, 2, 2, 49, 49, - 49, 2, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 0, 0, 0, - 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 2, 9, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 1, 2, 2, 71, 71, - 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 2, 2, 2, 67, 67, - 67, 67, 67, 67, 67, 67, 67, 2, 2, 2, 2, 2, 2, 2, 1, 0, - 0, 0, 0, 0, 0, 0, 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, - 42, 42, 2, 2, 2, 2, 2, 2, 2, 2, 2, 42, 42, 42, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 2, 2, 2, 2, 2,118,118, - 118,118,118,118,118,118,118,118,118, 2, 2, 2, 2, 2, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59, - 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, 2, 2, 2, 2, 59, 59, - 59, 59, 59, 59, 2, 2, 40, 40, 40, 40, 40, 40, 40, 40, 51, 51, - 51, 51, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, - 50, 50, 50, 50, 2, 2, 50, 50, 2, 2, 2, 2, 2, 2,135,135, - 135,135,135,135,135,135,135,135,135,135, 2, 2, 2, 2,106,106, - 106,106,106,106,106,106,104,104,104,104,104,104,104,104,104,104, - 104,104, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,104,161,161, - 161,161,161,161,161,161,161,161,161, 2,161,161,161,161,161,161, - 161, 2,161,161, 2,161,161,161, 2,161,161,161,161,161,161,161, - 2,161,161, 2, 2, 2,110,110,110,110,110,110,110,110,110,110, - 110,110,110,110,110, 2,110,110,110,110,110,110, 2, 2, 19, 19, - 19, 19, 19, 19, 2, 19, 19, 2, 19, 19, 19, 19, 19, 19, 47, 47, - 47, 47, 47, 47, 2, 2, 47, 2, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 2, 47, 47, 2, - 2, 2, 47, 2, 2, 47, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, - 81, 81, 81, 81, 2, 81,120,120,120,120,120,120,120,120,116,116, - 116,116,116,116,116,116,116,116,116,116,116,116,116, 2, 2, 2, - 2, 2, 2, 2, 2,116,128,128,128,128,128,128,128,128,128,128, - 128, 2,128,128, 2, 2, 2, 2, 2,128,128,128,128,128, 66, 66, - 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 2, 2, 2, 66, 72, 72, - 72, 72, 72, 72, 72, 72, 72, 72, 2, 2, 2, 2, 2, 72, 98, 98, - 98, 98, 98, 98, 98, 98, 97, 97, 97, 97, 97, 97, 97, 97, 2, 2, - 2, 2, 97, 97, 97, 97, 2, 2, 97, 97, 97, 97, 97, 97, 57, 57, - 57, 57, 2, 57, 57, 2, 2, 2, 2, 2, 57, 57, 57, 57, 57, 57, - 57, 57, 2, 57, 57, 57, 2, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 2, 2, 57, 57, - 57, 2, 2, 2, 2, 57, 57, 2, 2, 2, 2, 2, 2, 2, 88, 88, - 88, 88, 88, 88, 88, 88,117,117,117,117,117,117,117,117,112,112, - 112,112,112,112,112,112,112,112,112,112,112,112,112, 2, 2, 2, - 2,112,112,112,112,112, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 2, 2, 2, 78, 78, 78, 78, 78, 78, 78, 83, 83, - 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 2, 2, 82, 82, - 82, 82, 82, 82, 82, 82, 82, 82, 82, 2, 2, 2, 2, 2,122,122, - 122,122,122,122,122,122,122,122, 2, 2, 2, 2, 2, 2, 2,122, - 122,122,122, 2, 2, 2, 2,122,122,122,122,122,122,122, 89, 89, - 89, 89, 89, 89, 89, 89, 89, 2, 2, 2, 2, 2, 2, 2,130,130, - 130,130,130,130,130,130,130,130,130, 2, 2, 2, 2, 2, 2, 2, - 130,130,130,130,130,130,144,144,144,144,144,144,144,144,144,144, - 2, 2, 2, 2, 2, 2,156,156,156,156,156,156,156,156,156,156, - 2,156,156,156, 2, 2,156,156, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 3, 3, 3,147,147,147,147,147,147,147,147,148,148, - 148,148,148,148,148,148,148,148, 2, 2, 2, 2, 2, 2,158,158, - 158,158,158,158,158,158,158,158, 2, 2, 2, 2, 2, 2,153,153, - 153,153,153,153,153,153,153,153,153,153, 2, 2, 2, 2,149,149, - 149,149,149,149,149,149,149,149,149,149,149,149,149, 2, 94, 94, - 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, - 94, 94, 94, 94, 94, 94, 2, 2, 2, 2, 2, 2, 2, 94, 85, 85, - 85, 85, 85, 85, 85, 85, 85, 85, 85, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 85, 2, 2,101,101,101,101,101,101,101,101,101, 2, - 2, 2, 2, 2, 2, 2,101,101, 2, 2, 2, 2, 2, 2, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 2, 96, 96,111,111, - 111,111,111,111,111,111,111,111,111,111,111,111,111, 2,100,100, - 100,100,100,100,100,100, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 36, 2, 2, 2,108,108,108,108,108,108,108,108,108,108, - 2,108,108,108,108,108,108,108, 2, 2, 2, 2, 2, 2,129,129, - 129,129,129,129,129, 2,129, 2,129,129,129,129, 2,129,129,129, - 129,129,129,129,129,129,129,129,129,129,129,129, 2,129,129,129, - 2, 2, 2, 2, 2, 2,109,109,109,109,109,109,109,109,109,109, - 109, 2, 2, 2, 2, 2,109,109, 2, 2, 2, 2, 2, 2,107,107, - 107,107, 2,107,107,107,107,107,107,107,107, 2, 2,107,107, 2, - 2,107,107,107,107,107,107,107,107,107,107,107,107,107,107, 2, - 107,107,107,107,107,107,107, 2,107,107, 2,107,107,107,107,107, - 2, 1,107,107,107,107,107, 2, 2,107,107,107, 2, 2,107, 2, - 2, 2, 2, 2, 2,107, 2, 2, 2, 2, 2,107,107,107,107,107, - 107,107, 2, 2,107,107,107,107,107,107,107, 2, 2, 2,137,137, - 137,137,137,137,137,137,137,137,137,137, 2,137,137,137,137,137, - 2, 2, 2, 2, 2, 2,124,124,124,124,124,124,124,124,124,124, - 2, 2, 2, 2, 2, 2,123,123,123,123,123,123,123,123,123,123, - 123,123,123,123, 2, 2,114,114,114,114,114,114,114,114,114,114, - 114,114,114, 2, 2, 2,114,114, 2, 2, 2, 2, 2, 2, 32, 32, - 32, 32, 32, 2, 2, 2,102,102,102,102,102,102,102,102,102,102, - 2, 2, 2, 2, 2, 2,126,126,126,126,126,126,126,126,126,126, - 126, 2, 2,126,126,126,126,126,126,126, 2, 2, 2, 2,126,126, - 126,126,126,126,126, 2,142,142,142,142,142,142,142,142,142,142, - 142,142, 2, 2, 2, 2,125,125,125,125,125,125,125,125,125,125, - 125, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,125,154,154, - 154,154,154,154,154, 2, 2,154, 2, 2,154,154,154,154,154,154, - 154,154, 2,154,154, 2,154,154,154,154,154,154,154,154,154,154, - 154,154,154,154, 2,154,154, 2, 2,154,154,154,154,154,154,154, - 2, 2, 2, 2, 2, 2,150,150,150,150,150,150,150,150, 2, 2, - 150,150,150,150,150,150,150,150,150,150,150, 2, 2, 2,141,141, - 141,141,141,141,141,141,140,140,140,140,140,140,140,140,140,140, - 140, 2, 2, 2, 2, 2,121,121,121,121,121,121,121,121,121, 2, - 2, 2, 2, 2, 2, 2, 7, 7, 2, 2, 2, 2, 2, 2,133,133, - 133,133,133,133,133,133,133, 2,133,133,133,133,133,133,133,133, - 133,133,133,133,133, 2,133,133,133,133,133,133, 2, 2,133,133, - 133,133,133, 2, 2, 2,134,134,134,134,134,134,134,134, 2, 2, - 134,134,134,134,134,134, 2,134,134,134,134,134,134,134,134,134, - 134,134,134,134,134, 2,138,138,138,138,138,138,138, 2,138,138, - 2,138,138,138,138,138,138,138,138,138,138,138,138,138, 2, 2, - 138, 2,138,138, 2,138,138,138, 2, 2, 2, 2, 2, 2,143,143, - 143,143,143,143, 2,143,143, 2,143,143,143,143,143,143,143,143, - 143,143,143,143,143,143,143,143,143,143,143,143,143, 2,143,143, - 2,143,143,143,143,143,143, 2, 2, 2, 2, 2, 2, 2,143,143, - 2, 2, 2, 2, 2, 2,145,145,145,145,145,145,145,145,145, 2, - 2, 2, 2, 2, 2, 2,163,163,163,163,163,163,163,163,163, 2, - 163,163,163,163,163,163,163,163,163, 2, 2, 2,163,163,163,163, - 2, 2, 2, 2, 2, 2, 86, 2, 2, 2, 2, 2, 2, 2, 22, 22, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 22, 63, 63, - 63, 63, 63, 63, 63, 63, 63, 63, 2, 2, 2, 2, 2, 2, 63, 63, - 63, 63, 63, 63, 63, 2, 63, 63, 63, 63, 63, 2, 2, 2, 63, 63, - 63, 63, 2, 2, 2, 2,157,157,157,157,157,157,157,157,157,157, - 157, 2, 2, 2, 2, 2, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 2, 2,127,127,127,127,127,127,127,127,127,127, - 127,127,127,127,127, 2, 79, 2, 2, 2, 2, 2, 2, 2,115,115, - 115,115,115,115,115,115,115,115,115,115,115,115,115, 2,115,115, - 2, 2, 2, 2,115,115,159,159,159,159,159,159,159,159,159,159, - 159,159,159,159,159, 2,159,159, 2, 2, 2, 2, 2, 2,103,103, - 103,103,103,103,103,103,103,103,103,103,103,103, 2, 2,119,119, - 119,119,119,119,119,119,119,119,119,119,119,119, 2, 2,119,119, - 2,119,119,119,119,119, 2, 2, 2, 2, 2,119,119,119,146,146, - 146,146,146,146,146,146,146,146,146, 2, 2, 2, 2, 2, 99, 99, - 99, 99, 99, 99, 99, 99, 99, 99, 99, 2, 2, 2, 2, 99, 2, 2, - 2, 2, 2, 2, 2, 99,136,139, 13, 13,155, 2, 2, 2,136,136, - 136,136,136,136,136,136,155,155,155,155,155,155,155,155,155,155, - 155,155,155,155, 2, 2,136, 2, 2, 2, 2, 2, 2, 2, 17, 17, - 17, 17, 2, 17, 17, 17, 17, 17, 17, 17, 2, 17, 17, 2, 17, 15, - 15, 15, 15, 15, 15, 15, 17, 17, 17, 2, 2, 2, 2, 2, 2, 2, - 15, 2, 2, 2, 2, 2, 15, 15, 15, 2, 2, 17, 2, 2, 2, 2, - 2, 2, 17, 17, 17, 17,139,139,139,139,139,139,139,139,139,139, - 139,139, 2, 2, 2, 2,105,105,105,105,105,105,105,105,105,105, - 105, 2, 2, 2, 2, 2,105,105,105,105,105, 2, 2, 2,105, 2, - 2, 2, 2, 2, 2, 2,105,105, 2, 2,105,105,105,105, 1, 1, - 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, - 1, 0, 0, 1, 1, 1, 1, 1, 1, 1, 0, 0, 0, 0, 0, 0, - 1, 1, 1, 1, 0, 0, 2, 2, 0, 2, 2, 0, 0, 2, 2, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 2, 0, 0, 0, 0, 0, - 0, 0, 2, 0, 0, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, 0, - 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 2, 0, 2, 2, 2, - 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, 0,131,131, - 131,131,131,131,131,131,131,131,131,131, 2, 2, 2, 2, 2, 2, - 2,131,131,131,131,131, 2,131,131,131,131,131,131,131, 2, 2, - 2, 2, 2, 19, 19, 19, 56, 56, 56, 56, 56, 56, 56, 2, 56, 2, - 2, 56, 56, 56, 56, 56, 56, 56, 2, 56, 56, 2, 56, 56, 56, 56, - 56, 2, 2, 2, 2, 2, 6, 6, 6, 6, 6, 6, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 6,151,151,151,151,151,151,151,151,151,151, - 151,151,151, 2, 2, 2,151,151,151,151,151,151, 2, 2,151,151, - 2, 2, 2, 2,151,151,160,160,160,160,160,160,160,160,160,160, - 160,160,160,160,160, 2,152,152,152,152,152,152,152,152,152,152, - 2, 2, 2, 2, 2,152,164,164,164,164,164,164,164,164,164,164, - 2, 2, 2, 2, 2, 2, 30, 30, 30, 30, 2, 30, 30, 2,113,113, - 113,113,113,113,113,113,113,113,113,113,113, 2, 2,113,113,113, - 113,113,113,113,113, 2,132,132,132,132,132,132,132,132,132,132, - 132,132, 2, 2, 2, 2,132,132, 2, 2, 2, 2,132,132, 3, 3, - 3, 3, 2, 3, 3, 3, 2, 3, 3, 2, 3, 2, 2, 3, 2, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, 3, 3, 2, 3, - 2, 3, 2, 2, 2, 2, 2, 2, 3, 2, 2, 2, 2, 3, 2, 3, - 2, 3, 2, 3, 3, 3, 2, 3, 2, 3, 2, 3, 2, 3, 2, 3, - 3, 3, 3, 2, 3, 2, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, - 3, 3, 2, 2, 2, 2, 2, 3, 3, 3, 2, 3, 3, 3, 2, 2, - 2, 2, 2, 2, 0, 0, 15, 0, 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 0, 0, 13, 2, - 2, 2, 2, 2, 2, 2, 13, 13, 13, 2, 2, 2, 2, 2, 2, 0, - 2, 2, 2, 2, 2, 2, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, - 9, 9, 9, 10, 9, 11, 12, 13, 9, 9, 9, 14, 9, 9, 15, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 70, 70, 70,240, 70, 70, 70, 70, 70, 70, 70, 70, 70,241, 96, 96, + 96, 96, 96, 96, 96, 96, 70, 70, 70, 70,242, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70,243, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,244, 96, 96, + 96, 96, 96, 96, 96, 96,245, 96,246,247, 0, 1, 2, 2, 0, 1, + 2, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, + 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19, + 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, + 19, 19, 19, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1, + 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 2, 2, + 9, 9, 9, 9, 0, 9, 2, 2, 2, 2, 9, 0, 9, 0, 9, 9, + 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 2, 9, 9, 9, 9, 9, 9, 9, 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, + 6, 6, 6, 1, 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, + 4, 2, 2, 4, 4, 4, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14, + 14, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 2, 2, 2, 3, 3, + 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 0, 0, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, + 1, 1, 1, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 37, 37, + 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37, + 37, 2, 2, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, + 2, 2, 2, 2, 2, 2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, + 64, 2, 2, 64, 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, + 90, 90, 90, 90, 2, 2, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95, + 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37, + 37, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, + 2, 2, 2, 2, 2, 2, 3, 3, 0, 3, 3, 3, 3, 3, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 7, 7, + 7, 7, 0, 0, 7, 7, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, + 5, 5, 5, 2, 2, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 2, + 5, 2, 2, 2, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 2, + 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, + 2, 2, 5, 5, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, + 5, 5, 5, 5, 5, 2, 2, 11, 11, 11, 2, 11, 11, 11, 11, 11, + 11, 2, 2, 2, 2, 11, 11, 2, 2, 11, 11, 11, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 11, 11, 11, 11, 11, 2, + 11, 11, 2, 11, 11, 2, 11, 11, 2, 2, 11, 2, 11, 11, 11, 2, + 2, 11, 11, 11, 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, + 11, 11, 11, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, + 11, 11, 11, 11, 11, 2, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, + 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 2, + 10, 10, 2, 10, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, 10, 10, + 2, 10, 10, 10, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 10, 10, + 10, 10, 2, 2, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 10, + 10, 10, 10, 10, 10, 10, 2, 21, 21, 21, 2, 21, 21, 21, 21, 21, + 21, 21, 21, 2, 2, 21, 21, 2, 2, 21, 21, 21, 21, 21, 21, 21, + 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 2, + 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 21, 21, 2, + 2, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 2, 2, + 2, 2, 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, 2, + 22, 22, 2, 22, 22, 22, 22, 22, 22, 2, 2, 2, 22, 22, 22, 2, + 22, 22, 22, 22, 2, 2, 2, 22, 22, 2, 22, 2, 22, 22, 2, 2, + 2, 22, 22, 2, 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, + 2, 2, 2, 2, 22, 22, 22, 2, 2, 2, 2, 2, 2, 22, 2, 2, + 2, 2, 2, 2, 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 23, 23, + 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 23, 23, 23, 2, + 23, 23, 23, 23, 23, 23, 23, 23, 2, 2, 23, 23, 23, 23, 23, 2, + 23, 23, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 23, 2, 23, 23, + 23, 2, 2, 23, 2, 2, 23, 23, 23, 23, 2, 2, 23, 23, 2, 2, + 2, 2, 2, 2, 2, 23, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 16, 2, 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, 16, + 16, 16, 2, 16, 16, 16, 16, 16, 2, 2, 16, 16, 16, 16, 16, 2, + 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 16, 16, 2, 16, 16, + 16, 16, 2, 2, 16, 16, 2, 16, 16, 16, 2, 2, 2, 2, 20, 20, + 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2, + 20, 20, 20, 20, 20, 20, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, + 20, 20, 2, 2, 20, 20, 2, 36, 36, 36, 2, 36, 36, 36, 36, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2, + 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, + 36, 36, 2, 36, 2, 2, 2, 2, 36, 2, 2, 2, 2, 36, 36, 36, + 36, 36, 36, 2, 36, 2, 2, 2, 2, 2, 2, 2, 36, 36, 2, 2, + 36, 36, 36, 2, 2, 2, 2, 24, 24, 24, 24, 24, 24, 24, 24, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 24, 24, + 24, 24, 2, 2, 2, 2, 2, 18, 18, 2, 18, 2, 18, 18, 18, 18, + 18, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, + 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, + 18, 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 2, 18, 18, + 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25, + 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 2, 2, 25, 25, + 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, + 25, 2, 2, 2, 2, 2, 33, 33, 33, 33, 33, 33, 33, 33, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 8, 2, 2, + 2, 2, 2, 8, 2, 2, 8, 8, 8, 0, 8, 8, 8, 8, 12, 12, + 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30, 30, 30, 30, 2, + 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 2, 30, 30, + 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 2, 2, 2, 30, 30, + 2, 2, 2, 2, 2, 2, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 28, 28, 28, 28, 34, 34, + 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 2, 2, 2, 35, 35, + 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 35, 2, + 2, 2, 2, 2, 2, 2, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, + 45, 45, 45, 45, 2, 2, 2, 2, 2, 2, 2, 2, 2, 45, 44, 44, + 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 2, 43, 43, + 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 2, 2, 2, 2, 46, 46, + 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, 46, 46, 46, 2, + 46, 46, 2, 2, 2, 2, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, + 31, 31, 31, 31, 2, 2, 31, 31, 2, 2, 2, 2, 2, 2, 32, 32, + 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 2, 2, 2, 2, 2, 2, 32, 2, 2, 2, 2, 2, 2, 2, 32, 32, + 32, 2, 2, 2, 2, 2, 28, 28, 28, 28, 28, 28, 2, 2, 48, 48, + 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 2, 48, 48, + 48, 48, 2, 2, 2, 2, 48, 2, 2, 2, 48, 48, 48, 48, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 2, 2, 52, 52, + 52, 52, 52, 2, 2, 2, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 2, 2, 2, 2, 58, 58, 2, 2, 2, 2, 2, 2, 58, 58, + 58, 2, 2, 2, 58, 58, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 2, 2, 54, 54, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, + 91, 91, 91, 91, 91, 2, 91, 91, 91, 91, 91, 2, 2, 91, 91, 91, + 2, 2, 2, 2, 2, 2, 91, 91, 91, 91, 91, 91, 2, 2, 1, 1, + 1, 1, 1, 1, 1, 2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, + 62, 62, 62, 2, 2, 2, 62, 62, 62, 62, 62, 62, 62, 2, 76, 76, + 76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, + 93, 93, 2, 2, 2, 2, 2, 2, 2, 2, 93, 93, 93, 93, 70, 70, + 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 70, 70, 70, 70, + 2, 2, 2, 70, 70, 70, 73, 73, 73, 73, 73, 73, 73, 73, 6, 2, + 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 8, 8, 8, 1, 1, + 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, + 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, + 0, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9, + 9, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9, 9, + 19, 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 19, 6, 19, + 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9, + 9, 9, 9, 9, 2, 2, 2, 9, 2, 9, 2, 9, 2, 9, 9, 9, + 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, + 9, 9, 2, 9, 9, 9, 2, 2, 9, 9, 9, 2, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, + 0, 0, 0, 2, 0, 0, 0, 19, 2, 2, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 2, 19, 19, + 19, 19, 19, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 1, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, + 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 0, + 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 27, 27, + 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, + 0, 0, 0, 0, 2, 0, 56, 56, 56, 56, 56, 56, 56, 56, 55, 55, + 55, 55, 2, 2, 2, 2, 2, 55, 55, 55, 55, 55, 55, 55, 61, 61, + 61, 61, 61, 61, 61, 61, 2, 2, 2, 2, 2, 2, 2, 61, 61, 2, + 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 13, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 2, 13, 13, 13, 13, 13, 13, 13, + 13, 13, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 2, 2, 0, 0, + 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 13, 0, 13, 0, 13, + 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12, 13, 13, + 13, 13, 0, 0, 0, 0, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 1, + 1, 0, 0, 15, 15, 15, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 2, 2, + 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 12, + 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, + 12, 12, 12, 12, 12, 0, 17, 17, 17, 17, 17, 17, 17, 0, 39, 39, + 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 2, 2, 2, 39, 39, + 39, 39, 39, 39, 39, 2, 86, 86, 86, 86, 86, 86, 86, 86, 77, 77, + 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 2, 2, 2, 2, 79, 79, + 79, 79, 79, 79, 79, 79, 0, 0, 19, 19, 19, 19, 19, 19, 0, 0, + 0, 19, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2, 2, 2, 19, 19, + 2, 19, 2, 19, 19, 19, 19, 19, 2, 2, 2, 2, 2, 2, 2, 2, + 19, 19, 19, 19, 19, 19, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, + 60, 60, 60, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 65, 65, + 65, 65, 65, 65, 65, 65, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, + 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 2, 2, 75, 75, 75, 75, + 2, 2, 2, 2, 2, 2, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 74, 12, 12, + 12, 12, 12, 2, 2, 2, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, + 84, 84, 84, 84, 2, 0, 84, 84, 2, 2, 2, 2, 84, 84, 33, 33, + 33, 33, 33, 33, 33, 2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, + 68, 68, 68, 68, 68, 2, 68, 68, 68, 68, 68, 68, 2, 2, 68, 68, + 2, 2, 68, 68, 68, 68, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 92, 2, 2, 2, 2, 2, 2, 2, 2, 92, 92, 92, 92, 92, 87, 87, + 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 2, 2, 30, + 30, 30, 30, 30, 30, 2, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, + 19, 19, 19, 9, 19, 19, 19, 19, 0, 0, 2, 2, 2, 2, 87, 87, + 87, 87, 87, 87, 2, 2, 87, 87, 2, 2, 2, 2, 2, 2, 12, 12, + 12, 12, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 12, 13, 13, + 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2, + 2, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 14, 14, 14, 14, 14, + 14, 14, 14, 14, 14, 2, 14, 14, 14, 14, 14, 2, 14, 2, 14, 14, + 2, 14, 14, 2, 14, 14, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 2, 2, + 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 1, 1, + 1, 1, 1, 1, 6, 6, 0, 0, 0, 2, 0, 0, 0, 0, 3, 3, + 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 0, 2, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, + 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, 12, 12, 12, 12, 2, 2, + 12, 12, 12, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 49, 49, + 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 49, 49, 49, + 49, 49, 49, 49, 49, 2, 49, 49, 49, 2, 49, 49, 2, 49, 49, 49, + 49, 49, 49, 49, 2, 2, 49, 49, 49, 2, 2, 2, 2, 2, 0, 0, + 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, + 0, 0, 0, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 0, 0, + 0, 0, 0, 1, 2, 2, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, + 71, 71, 71, 2, 2, 2, 67, 67, 67, 67, 67, 67, 67, 67, 67, 2, + 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 42, 42, + 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 2, 2, 2, 2, 2,118,118,118,118,118,118,118,118,118,118, + 118, 2, 2, 2, 2, 2, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, + 53, 53, 53, 53, 2, 53, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, + 59, 59, 2, 2, 2, 2, 59, 59, 59, 59, 59, 59, 2, 2, 40, 40, + 40, 40, 40, 40, 40, 40, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 2, 2, 50, 50, + 2, 2, 2, 2, 2, 2,135,135,135,135,135,135,135,135,135,135, + 135,135, 2, 2, 2, 2,106,106,106,106,106,106,106,106,104,104, + 104,104,104,104,104,104,104,104,104,104, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2,104,161,161,161,161,161,161,161,161,161,161, + 161, 2,161,161,161,161,161,161,161, 2,161,161, 2,161,161,161, + 2,161,161,161,161,161,161,161, 2,161,161, 2, 2, 2,110,110, + 110,110,110,110,110,110,110,110,110,110,110,110,110, 2,110,110, + 110,110,110,110, 2, 2, 19, 19, 19, 19, 19, 19, 2, 19, 19, 2, + 19, 19, 19, 19, 19, 19, 47, 47, 47, 47, 47, 47, 2, 2, 47, 2, + 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, + 47, 47, 47, 47, 2, 47, 47, 2, 2, 2, 47, 2, 2, 47, 81, 81, + 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 2, 81,120,120, + 120,120,120,120,120,120,116,116,116,116,116,116,116,116,116,116, + 116,116,116,116,116, 2, 2, 2, 2, 2, 2, 2, 2,116,128,128, + 128,128,128,128,128,128,128,128,128, 2,128,128, 2, 2, 2, 2, + 2,128,128,128,128,128, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, + 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, + 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, + 97, 97, 97, 97, 97, 97, 2, 2, 2, 2, 97, 97, 97, 97, 2, 2, + 97, 97, 97, 97, 97, 97, 57, 57, 57, 57, 2, 57, 57, 2, 2, 2, + 2, 2, 57, 57, 57, 57, 57, 57, 57, 57, 2, 57, 57, 57, 2, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 2, 2, 57, 57, 57, 2, 2, 2, 2, 57, 57, 2, + 2, 2, 2, 2, 2, 2, 88, 88, 88, 88, 88, 88, 88, 88,117,117, + 117,117,117,117,117,117,112,112,112,112,112,112,112,112,112,112, + 112,112,112,112,112, 2, 2, 2, 2,112,112,112,112,112, 78, 78, + 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 2, 2, 2, 78, + 78, 78, 78, 78, 78, 78, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, + 83, 83, 83, 83, 2, 2, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 2, 2, 2, 2, 2,122,122,122,122,122,122,122,122,122,122, + 2, 2, 2, 2, 2, 2, 2,122,122,122,122, 2, 2, 2, 2,122, + 122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, 89, 89, 89, 2, + 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,130,130,130,130, + 130, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,144,144, + 144,144,144,144,144,144,144,144, 2, 2, 2, 2, 2, 2,156,156, + 156,156,156,156,156,156,156,156, 2,156,156,156, 2, 2,156,156, + 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,147,147, + 147,147,147,147,147,147,148,148,148,148,148,148,148,148,148,148, + 2, 2, 2, 2, 2, 2,158,158,158,158,158,158,158,158,158,158, + 2, 2, 2, 2, 2, 2,153,153,153,153,153,153,153,153,153,153, + 153,153, 2, 2, 2, 2,149,149,149,149,149,149,149,149,149,149, + 149,149,149,149,149, 2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 2, 2, + 2, 2, 2, 2, 2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, + 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 85, 2, 2,101,101, + 101,101,101,101,101,101,101, 2, 2, 2, 2, 2, 2, 2,101,101, + 2, 2, 2, 2, 2, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 2, 96, 96,111,111,111,111,111,111,111,111,111,111, + 111,111,111,111,111, 2,100,100,100,100,100,100,100,100, 2, 36, + 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2,108,108, + 108,108,108,108,108,108,108,108, 2,108,108,108,108,108,108,108, + 2, 2, 2, 2, 2, 2,129,129,129,129,129,129,129, 2,129, 2, + 129,129,129,129, 2,129,129,129,129,129,129,129,129,129,129,129, + 129,129,129,129, 2,129,129,129, 2, 2, 2, 2, 2, 2,109,109, + 109,109,109,109,109,109,109,109,109, 2, 2, 2, 2, 2,109,109, + 2, 2, 2, 2, 2, 2,107,107,107,107, 2,107,107,107,107,107, + 107,107,107, 2, 2,107,107, 2, 2,107,107,107,107,107,107,107, + 107,107,107,107,107,107,107, 2,107,107,107,107,107,107,107, 2, + 107,107, 2,107,107,107,107,107, 2, 1,107,107,107,107,107, 2, + 2,107,107,107, 2, 2,107, 2, 2, 2, 2, 2, 2,107, 2, 2, + 2, 2, 2,107,107,107,107,107,107,107, 2, 2,107,107,107,107, + 107,107,107, 2, 2, 2,137,137,137,137,137,137,137,137,137,137, + 137,137, 2,137,137,137,137,137, 2, 2, 2, 2, 2, 2,124,124, + 124,124,124,124,124,124,124,124, 2, 2, 2, 2, 2, 2,123,123, + 123,123,123,123,123,123,123,123,123,123,123,123, 2, 2,114,114, + 114,114,114,114,114,114,114,114,114,114,114, 2, 2, 2,114,114, + 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, 32, 2, 2, 2,102,102, + 102,102,102,102,102,102,102,102, 2, 2, 2, 2, 2, 2,126,126, + 126,126,126,126,126,126,126,126,126, 2, 2,126,126,126,126,126, + 126,126, 2, 2, 2, 2,126,126,126,126,126,126,126, 2,142,142, + 142,142,142,142,142,142,142,142,142,142, 2, 2, 2, 2,125,125, + 125,125,125,125,125,125,125,125,125, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2,125,154,154,154,154,154,154,154, 2, 2,154, + 2, 2,154,154,154,154,154,154,154,154, 2,154,154, 2,154,154, + 154,154,154,154,154,154,154,154,154,154,154,154, 2,154,154, 2, + 2,154,154,154,154,154,154,154, 2, 2, 2, 2, 2, 2,150,150, + 150,150,150,150,150,150, 2, 2,150,150,150,150,150,150,150,150, + 150,150,150, 2, 2, 2,141,141,141,141,141,141,141,141,140,140, + 140,140,140,140,140,140,140,140,140, 2, 2, 2, 2, 2,121,121, + 121,121,121,121,121,121,121, 2, 2, 2, 2, 2, 2, 2, 7, 7, + 2, 2, 2, 2, 2, 2,133,133,133,133,133,133,133,133,133, 2, + 133,133,133,133,133,133,133,133,133,133,133,133,133, 2,133,133, + 133,133,133,133, 2, 2,133,133,133,133,133, 2, 2, 2,134,134, + 134,134,134,134,134,134, 2, 2,134,134,134,134,134,134, 2,134, + 134,134,134,134,134,134,134,134,134,134,134,134,134, 2,138,138, + 138,138,138,138,138, 2,138,138, 2,138,138,138,138,138,138,138, + 138,138,138,138,138,138, 2, 2,138, 2,138,138, 2,138,138,138, + 2, 2, 2, 2, 2, 2,143,143,143,143,143,143, 2,143,143, 2, + 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143, + 143,143,143,143,143, 2,143,143, 2,143,143,143,143,143,143, 2, + 2, 2, 2, 2, 2, 2,143,143, 2, 2, 2, 2, 2, 2,145,145, + 145,145,145,145,145,145,145, 2, 2, 2, 2, 2, 2, 2,163,163, + 163,163,163,163,163,163,163, 2,163,163,163,163,163,163,163,163, + 163, 2, 2, 2,163,163,163,163, 2, 2, 2, 2, 2, 2, 86, 2, + 2, 2, 2, 2, 2, 2, 22, 22, 2, 2, 2, 2, 2, 2, 2, 2, + 2, 2, 2, 2, 2, 22, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, + 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, 63, 63, 63, 2, 63, 63, + 63, 63, 63, 2, 2, 2, 63, 63, 63, 63, 2, 2, 2, 2,157,157, + 157,157,157,157,157,157,157,157,157, 2, 2, 2, 2, 2, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 2, 2,127,127, + 127,127,127,127,127,127,127,127,127,127,127,127,127, 2, 79, 2, + 2, 2, 2, 2, 2, 2,115,115,115,115,115,115,115,115,115,115, + 115,115,115,115,115, 2,115,115, 2, 2, 2, 2,115,115,159,159, + 159,159,159,159,159,159,159,159,159,159,159,159,159, 2,159,159, + 2, 2, 2, 2, 2, 2,103,103,103,103,103,103,103,103,103,103, + 103,103,103,103, 2, 2,119,119,119,119,119,119,119,119,119,119, + 119,119,119,119, 2, 2,119,119, 2,119,119,119,119,119, 2, 2, + 2, 2, 2,119,119,119,146,146,146,146,146,146,146,146,146,146, + 146, 2, 2, 2, 2, 2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, + 99, 2, 2, 2, 2, 99, 2, 2, 2, 2, 2, 2, 2, 99,136,139, + 13, 13,155, 2, 2, 2,136,136,136,136,136,136,136,136,155,155, + 155,155,155,155,155,155,155,155,155,155,155,155, 2, 2,136, 2, + 2, 2, 2, 2, 2, 2, 17, 17, 17, 17, 2, 17, 17, 17, 17, 17, + 17, 17, 2, 17, 17, 2, 17, 15, 15, 15, 15, 15, 15, 15, 17, 17, + 17, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, 15, 15, + 15, 2, 2, 17, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17,139,139, + 139,139,139,139,139,139,139,139,139,139, 2, 2, 2, 2,105,105, + 105,105,105,105,105,105,105,105,105, 2, 2, 2, 2, 2,105,105, + 105,105,105, 2, 2, 2,105, 2, 2, 2, 2, 2, 2, 2,105,105, + 2, 2,105,105,105,105, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, + 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, + 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 2, 2, + 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, + 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, + 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, + 0, 0, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, + 0, 0, 0, 0, 0, 0,131,131,131,131,131,131,131,131,131,131, + 131,131, 2, 2, 2, 2, 2, 2, 2,131,131,131,131,131, 2,131, + 131,131,131,131,131,131, 2, 2, 2, 2, 2, 19, 19, 19, 56, 56, + 56, 56, 56, 56, 56, 2, 56, 2, 2, 56, 56, 56, 56, 56, 56, 56, + 2, 56, 56, 2, 56, 56, 56, 56, 56, 2, 2, 2, 2, 2, 6, 6, + 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,151,151, + 151,151,151,151,151,151,151,151,151,151,151, 2, 2, 2,151,151, + 151,151,151,151, 2, 2,151,151, 2, 2, 2, 2,151,151,160,160, + 160,160,160,160,160,160,160,160,160,160,160,160,160, 2,152,152, + 152,152,152,152,152,152,152,152, 2, 2, 2, 2, 2,152,164,164, + 164,164,164,164,164,164,164,164, 2, 2, 2, 2, 2, 2, 30, 30, + 30, 30, 2, 30, 30, 2,113,113,113,113,113,113,113,113,113,113, + 113,113,113, 2, 2,113,113,113,113,113,113,113,113, 2,132,132, + 132,132,132,132,132,132,132,132,132,132, 2, 2, 2, 2,132,132, + 2, 2, 2, 2,132,132, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, + 3, 2, 3, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, + 3, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, + 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, + 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, + 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 15, 0, + 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, + 2, 0, 0, 0, 0, 0, 13, 2, 2, 2, 2, 2, 2, 2, 13, 13, + 13, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 1, + 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, 12, 13, + 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 16, 17, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 18, 19, - 20, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 17, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -2162,57 +2137,57 @@ _hb_ucd_u8[18260] = 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 0, 0, 13, 14, - 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 24, 25, 26, 27, 28, - 29, 30, 0, 0, 31, 32, 0, 33, 0, 34, 0, 35, 0, 0, 0, 0, - 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, + 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, 0, 33, + 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 43, 44, 0, 45, 0, 0, 0, 0, 0, 0, - 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, 0, 52, 0, 0, - 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, 0, 0, 0, 0, - 55, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, 0, 0, 0, 0, - 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 61, 62, 63, 64, 65, - 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, + 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, + 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, + 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, + 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 67, 68, 0, 69, 70, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, - 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, - 99,100,101,102,103, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, 0,105,106, 0, - 107, 0, 0, 0,108, 0,109, 0,110, 0,111,112,113, 0,114, 0, - 0, 0,115, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,118,119,120,121, 0,122,123,124, - 125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 69, + 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, + 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, + 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0, + 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0,108, 0,109, 0, + 110, 0,111,112,113, 0,114, 0, 0, 0,115, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0,128,129,130,131,132,133,134,135,136,137,138,139, - 140,141,142,143,144,145,146,147,148,149,150,151,152,153,154,155, - 156,157, 0, 0, 0,158,159,160,161, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,162,163, 0, - 0, 0, 0, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,166, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,167, + 118,119,120,121, 0,122,123,124,125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,129,130,131, + 132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147, + 148,149,150,151,152,153,154,155,156,157, 0, 0, 0,158,159,160, + 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,169,170, 0, 0, 0, 0,171, - 172, 0, 0, 0,173,174,175,176,177,178,179,180,181,182,183,184, - 185,186,187,188,189,190,191,192,193,194,195,196,197,198,199,200, - 201,202,203,204,205,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 3, 4, + 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,169,170, 0, 0, 0, 0,171,172, 0, 0, 0,173,174,175,176, + 177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192, + 193,194,195,196,197,198,199,200,201,202,203,204,205,206, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, }; static const uint16_t _hb_ucd_u16[9320] = @@ -2827,7 +2802,7 @@ _hb_ucd_gc (unsigned u) static inline uint_fast8_t _hb_ucd_ccc (unsigned u) { - return u<125259u?_hb_ucd_u8[9184+(((_hb_ucd_u8[8128+(((_hb_ucd_u8[7424+(((_hb_ucd_u8[7178+(u>>2>>3>>4)])<<4)+((u>>2>>3)&15u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u))]:0; + return u<125259u?_hb_ucd_u8[8792+(((_hb_ucd_u8[8236+(((_hb_ucd_u8[7776+(((_hb_ucd_u8[7424+(((_hb_ucd_u8[7178+(u>>2>>2>>2>>3)])<<3)+((u>>2>>2>>2)&7u))])<<2)+((u>>2>>2)&3u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:0; } static inline unsigned _hb_ucd_b4 (const uint8_t* a, unsigned i) @@ -2837,24 +2812,24 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i) static inline int_fast16_t _hb_ucd_bmg (unsigned u) { - return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9932+(((_hb_ucd_u8[9812+(((_hb_ucd_b4(9684+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9540+(((_hb_ucd_u8[9420+(((_hb_ucd_b4(9292+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; } static inline uint_fast8_t _hb_ucd_sc (unsigned u) { - return u<918000u?_hb_ucd_u8[11454+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10718+(((_hb_ucd_u8[10268+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; + return u<918000u?_hb_ucd_u8[11062+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10326+(((_hb_ucd_u8[9876+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; } static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[6008+(((_hb_ucd_u8[17460+(((_hb_ucd_u8[17078+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; + return u<195102u?_hb_ucd_u16[6008+(((_hb_ucd_u8[17068+(((_hb_ucd_u8[16686+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; } #elif !defined(HB_NO_UCD_UNASSIGNED) static const uint8_t -_hb_ucd_u8[17868] = +_hb_ucd_u8[14744] = { 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 7, 7, 7, 7, 11, 12, 13, 13, 13, 14, @@ -3436,51 +3411,54 @@ _hb_ucd_u8[17868] = 0,230,220, 0, 0, 0,220,220, 0, 0,230,220, 0, 9, 7, 0, 0, 7, 9, 0, 0, 0, 9, 7, 6, 6, 0, 0, 0, 0, 1, 0, 0,216,216, 1, 1, 1, 0, 0, 0,226,216,216,216,216,216, 0, - 220,220,220, 0,232,232,220,230,230,230, 7, 0, 16, 17, 17, 17, - 17, 17, 17, 33, 17, 17, 17, 19, 17, 17, 17, 17, 20,101, 17,113, - 129,169, 17, 27, 28, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, + 220,220,220, 0,232,232,220,230,230,230, 7, 0, 16, 17, 17, 33, + 17, 49, 17, 17, 84, 97,135,145, 26, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,237, 0, 1, 2, 2, - 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 4, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 5, 0, 0, 0, 0, 6, 7, 8, - 9, 0, 0, 0, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 20, 0, 0, 21, 22, 0, 0, 0, 0, - 23, 24, 25, 26, 0, 27, 0, 28, 29, 30, 31, 32, 0, 0, 0, 0, - 0, 0, 0, 33, 34, 35, 36, 0, 0, 0, 0, 0, 37, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 38, 39, 0, 0, 0, 0, 1, 2, 40, 41, - 0, 1, 2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, - 0, 0, 0, 2, 0, 0, 0, 0, 0, 0, 3, 4, 0, 0, 5, 0, - 0, 0, 6, 0, 0, 0, 0, 0, 0, 0, 7, 1, 0, 0, 0, 0, - 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 10, 0, 0, 10, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 10, 0, 0, 0, 10, - 0, 0, 0, 0, 0, 0, 11, 12, 0, 13, 0, 14, 15, 16, 0, 0, - 0, 0, 0, 1, 17, 18, 0, 19, 7, 1, 0, 0, 0, 20, 20, 7, - 20, 20, 20, 20, 20, 20, 20, 8, 21, 0, 22, 0, 7, 23, 24, 0, - 20, 20, 25, 0, 0, 0, 26, 27, 1, 7, 20, 20, 20, 20, 20, 1, - 28, 29, 30, 31, 0, 0, 20, 0, 0, 0, 0, 0, 0, 0, 10, 0, - 0, 0, 0, 0, 0, 0, 20, 20, 20, 1, 0, 0, 8, 21, 32, 4, - 0, 10, 0, 33, 7, 20, 20, 20, 0, 0, 0, 0, 8, 34, 34, 35, - 36, 34, 37, 0, 38, 1, 20, 20, 0, 0, 39, 0, 1, 1, 0, 8, - 21, 1, 20, 0, 0, 0, 1, 0, 0, 40, 1, 1, 0, 0, 8, 21, - 0, 1, 0, 1, 0, 1, 0, 0, 0, 0, 26, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 21, 7, 20, 41, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 21, 0, 42, 43, 44, 0, 45, 0, 8, 21, 0, 0, 0, 0, 0, - 0, 0, 0, 46, 7, 1, 10, 1, 0, 0, 0, 1, 20, 20, 1, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 26, 34, 9, 0, 0, 20, 20, - 1, 20, 20, 0, 0, 0, 0, 0, 0, 0, 26, 21, 0, 1, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 3, 47, 48, 0, 0, 0, - 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 7, 8, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 9, 10, 11, 11, 11, 11, 12, 13, - 13, 13, 13, 14, 15, 16, 17, 18, 19, 20, 21, 13, 22, 13, 13, 13, - 13, 23, 24, 24, 25, 26, 13, 13, 13, 27, 28, 29, 13, 30, 31, 32, - 33, 34, 35, 36, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 7, 37, 7, 38, 39, 7, 40, 7, 7, - 7, 41, 13, 42, 7, 7, 43, 7, 44, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, + 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17,177, 0, 1, 2, 3, + 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, + 4, 3, 3, 3, 3, 3, 5, 3, 3, 3, 3, 3, 6, 7, 8, 3, + 3, 3, 3, 3, 9, 10, 11, 12, 13, 3, 3, 3, 3, 3, 3, 3, + 3, 14, 3, 15, 3, 3, 3, 3, 3, 3, 16, 17, 18, 19, 20, 21, + 3, 3, 3, 22, 23, 24, 3, 3, 3, 3, 3, 3, 25, 3, 3, 3, + 3, 3, 3, 3, 3, 26, 3, 3, 27, 28, 0, 1, 0, 0, 0, 0, + 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 3, 0, 0, 0, 0, + 0, 4, 0, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 8, 9, 0, 0, 0, 0, 0, 0, 9, 0, 9, 0, 0, + 0, 0, 0, 0, 0, 10, 11, 12, 13, 0, 0, 14, 15, 16, 6, 0, + 17, 18, 19, 19, 19, 20, 21, 22, 23, 24, 19, 25, 0, 26, 27, 19, + 19, 28, 29, 30, 0, 31, 0, 0, 0, 8, 0, 0, 0, 0, 0, 0, + 0, 19, 28, 0, 32, 33, 9, 34, 35, 19, 0, 0, 36, 37, 38, 39, + 40, 19, 0, 41, 42, 43, 44, 31, 0, 1, 45, 42, 0, 0, 0, 0, + 0, 32, 14, 14, 0, 0, 0, 0, 14, 0, 0, 46, 47, 47, 47, 47, + 48, 49, 47, 47, 47, 47, 50, 51, 52, 53, 43, 21, 0, 0, 0, 0, + 0, 0, 0, 54, 6, 55, 0, 14, 19, 1, 0, 0, 0, 0, 56, 57, + 0, 0, 0, 0, 0, 19, 58, 31, 0, 0, 0, 0, 0, 0, 0, 59, + 14, 0, 0, 0, 0, 1, 0, 2, 0, 0, 0, 3, 0, 0, 0, 60, + 61, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0, 2, 3, + 0, 4, 5, 0, 0, 6, 0, 0, 0, 7, 0, 0, 0, 1, 1, 0, + 0, 8, 9, 0, 8, 9, 0, 0, 0, 0, 8, 9, 10, 11, 12, 0, + 0, 0, 13, 0, 0, 0, 0, 14, 15, 16, 17, 0, 0, 0, 1, 0, + 0, 18, 19, 0, 0, 0, 20, 0, 0, 0, 1, 1, 1, 1, 0, 1, + 1, 1, 1, 1, 1, 1, 0, 8, 21, 9, 0, 0, 22, 0, 0, 0, + 0, 1, 0, 23, 24, 25, 0, 0, 26, 0, 0, 0, 8, 21, 27, 0, + 1, 0, 0, 1, 1, 1, 1, 0, 1, 28, 29, 30, 0, 31, 32, 20, + 1, 1, 0, 0, 0, 8, 21, 9, 1, 4, 5, 0, 0, 0, 33, 9, + 0, 1, 1, 1, 0, 8, 21, 21, 21, 21, 34, 1, 35, 21, 21, 21, + 9, 36, 0, 0, 37, 38, 1, 0, 39, 0, 0, 0, 1, 0, 1, 0, + 0, 0, 0, 8, 21, 9, 1, 0, 0, 0, 40, 0, 8, 21, 21, 21, + 21, 21, 21, 21, 21, 9, 0, 1, 1, 1, 1, 8, 21, 21, 21, 9, + 0, 0, 0, 41, 0, 42, 43, 0, 0, 0, 1, 44, 0, 0, 0, 45, + 8, 9, 1, 0, 0, 0, 8, 21, 21, 21, 9, 0, 1, 0, 1, 1, + 8, 21, 21, 9, 0, 4, 5, 8, 9, 1, 0, 0, 0, 1, 2, 3, + 4, 5, 6, 7, 7, 8, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 9, 10, 11, 11, 11, 11, 12, 13, 13, 13, 13, 14, 15, 16, 17, 18, + 19, 20, 21, 13, 22, 13, 13, 13, 13, 23, 24, 24, 25, 26, 13, 13, + 13, 27, 28, 29, 13, 30, 31, 32, 33, 34, 35, 36, 7, 7, 7, 7, + 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, 7, + 37, 7, 38, 39, 7, 40, 7, 7, 7, 41, 13, 42, 7, 7, 43, 7, + 44, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, @@ -3501,419 +3479,221 @@ _hb_ucd_u8[17868] = 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 13, 13, 45, 0, 0, 1, 2, 2, 2, 3, 4, 5, 6, 7, - 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23, - 24, 25, 26, 27, 28, 29, 30, 31, 32, 32, 33, 34, 35, 36, 37, 37, - 37, 37, 37, 38, 39, 40, 41, 42, 43, 44, 45, 46, 47, 48, 49, 50, - 51, 52, 2, 2, 53, 54, 55, 56, 57, 58, 59, 59, 59, 59, 60, 59, - 59, 59, 59, 59, 59, 59, 61, 61, 59, 59, 59, 59, 62, 63, 64, 65, - 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 59, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 13, 45, 0, 0, 1, + 2, 2, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, + 16, 17, 18, 19, 20, 21, 22, 23, 24, 25, 26, 27, 28, 29, 30, 31, + 32, 32, 33, 34, 35, 36, 37, 37, 37, 37, 37, 38, 39, 40, 41, 42, + 43, 44, 45, 46, 47, 48, 49, 50, 51, 52, 2, 2, 53, 54, 55, 56, + 57, 58, 59, 59, 59, 59, 60, 59, 59, 59, 59, 59, 59, 59, 61, 61, + 59, 59, 59, 59, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 72, 73, + 74, 75, 76, 77, 78, 59, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 79, 70, 70, 70, 70, 80, 80, 80, 80, 80, 80, 80, 80, 80, 81, - 82, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 79, 70, 70, 70, 70, 80, 80, + 80, 80, 80, 80, 80, 80, 80, 81, 82, 82, 83, 84, 85, 86, 87, 88, + 89, 90, 91, 92, 93, 94, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, 97, 98, 99,100,101,101, - 102,103,104,105,106,107,108,109,110,111, 96,112,113,114,115,116, - 117,118,119,119,120,121,122,123,124,125,126,127,128,129,130,131, - 132, 96,133,134,135,136,137,138,139,140,141,142,143, 96,144,145, - 96,146,147,148,149, 96,150,151,152,153,154,155,156, 96,157,158, - 159,160, 96,161,162,163,164,164,164,164,164,164,164,165,166,164, - 167, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96,168,169,169,169,169,169,169,169,169,170, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,171,171, - 171,171,172, 96, 96, 96,173,173,173,173,174,175,176,177, 96, 96, - 96, 96,178,179,180,181,182,182,182,182,182,182,182,182,182,182, - 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182, - 182,182,182,182,182,183,182,182,182,182,182,182,184,184,184,185, - 186, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96,187,188,189,190,191,191,192, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,193,194, + 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 95, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 96,195,196, 59,197,198,199,200,201,202, 96,203,204, - 205, 59, 59,206, 59,207,208,208,208,208,208,209, 96, 96, 96, 96, - 96, 96, 96, 96,210, 96,211,212,213, 96, 96,214, 96, 96, 96,215, - 96, 96, 96, 96, 96,216,217,218,219, 96, 96, 96, 96, 96,220,221, - 222, 96,223,224, 96, 96,225,226, 59,227,228, 96, 59, 59, 59, 59, - 59, 59, 59,229,230,231,232,233, 59, 59,234,235, 59,236, 96, 96, - 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70,237, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70, 70,238, 70,239, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 97, 98, 99,100,101,101,102,103,104,105,106,107,108,109, + 110,111, 96,112,113,114,115,116,117,118,119,119,120,121,122,123, + 124,125,126,127,128,129,130,131,132, 96,133,134,135,136,137,138, + 139,140,141,142,143, 96,144,145, 96,146,147,148,149, 96,150,151, + 152,153,154,155,156, 96,157,158,159,160, 96,161,162,163,164,164, + 164,164,164,164,164,165,166,164,167, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,168,169,169, + 169,169,169,169,169,169,170, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96,171,171,171,171,172, 96, 96, 96,173,173, + 173,173,174,175,176,177, 96, 96, 96, 96,178,179,180,181,182,182, + 182,182,182,182,182,182,182,182,182,182,182,182,182,182,182,182, + 182,182,182,182,182,182,182,182,182,182,182,182,182,183,182,182, + 182,182,182,182,184,184,184,185,186, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,187,188,189, + 190,191,191,192, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96,193,194, 96, 96, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96,195,196, 59,197, + 198,199,200,201,202, 96,203,204,205, 59, 59,206, 59,207,208,208, + 208,208,208,209, 96, 96, 96, 96, 96, 96, 96, 96,210, 96,211,212, + 213, 96, 96,214, 96, 96, 96,215, 96, 96, 96, 96, 96,216,217,218, + 219, 96, 96, 96, 96, 96,220,221,222, 96,223,224, 96, 96,225,226, + 59,227,228, 96, 59, 59, 59, 59, 59, 59, 59,229,230,231,232,233, + 59, 59,234,235, 59,236, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,237, 70, 70, 70, 70, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,238, 70,239, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, - 70, 70, 70,240, 70, 70, 70, 70, 70, 70, 70, 70, 70,241, 96, 96, - 96, 96, 96, 96, 96, 96, 70, 70, 70, 70,242, 96, 96, 96, 96, 96, - 96, 96, 96, 96, 96, 96, 70, 70, 70, 70, 70, 70,243, 70, 70, 70, - 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,244, 96, 96, - 96, 96, 96, 96, 96, 96,245, 96,246,247, 0, 1, 2, 2, 0, 1, - 2, 2, 2, 3, 4, 5, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, - 19, 0, 0, 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 19, 19, - 19, 19, 19, 19, 19, 0, 19, 0, 0, 0, 0, 0, 0, 0, 19, 19, - 19, 19, 19, 0, 0, 0, 0, 0, 26, 26, 0, 0, 0, 0, 1, 1, - 1, 1, 1, 1, 1, 1, 9, 9, 9, 9, 0, 9, 9, 9, 2, 2, - 9, 9, 9, 9, 0, 9, 2, 2, 2, 2, 9, 0, 9, 0, 9, 9, - 9, 2, 9, 2, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 2, 9, 9, 9, 9, 9, 9, 9, 55, 55, 55, 55, 55, 55, 55, 55, - 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 6, 6, 6, 6, 6, - 6, 6, 6, 1, 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, - 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 4, 4, - 4, 2, 2, 4, 4, 4, 2, 14, 14, 14, 14, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 2, 2, 2, 2, 14, 14, - 14, 2, 2, 2, 2, 14, 14, 14, 14, 14, 14, 2, 2, 2, 3, 3, - 3, 3, 3, 0, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 3, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 3, 3, 3, 0, 0, 3, - 3, 3, 3, 3, 3, 3, 3, 3, 3, 1, 1, 1, 1, 1, 1, 1, - 1, 1, 1, 1, 3, 3, 1, 3, 3, 3, 3, 3, 3, 3, 37, 37, - 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 37, 2, 37, 37, 37, - 37, 2, 2, 37, 37, 37, 38, 38, 38, 38, 38, 38, 38, 38, 38, 38, - 2, 2, 2, 2, 2, 2, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, - 64, 2, 2, 64, 64, 64, 90, 90, 90, 90, 90, 90, 90, 90, 90, 90, - 90, 90, 90, 90, 2, 2, 90, 90, 90, 90, 90, 90, 90, 2, 95, 95, - 95, 95, 95, 95, 95, 95, 95, 95, 95, 95, 2, 2, 95, 2, 37, 37, - 37, 2, 2, 2, 2, 2, 3, 3, 3, 3, 3, 3, 3, 2, 3, 3, - 2, 2, 2, 2, 2, 2, 3, 3, 0, 3, 3, 3, 3, 3, 7, 7, - 7, 7, 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 7, 7, - 7, 7, 0, 0, 7, 7, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, - 5, 5, 5, 2, 2, 5, 5, 2, 2, 5, 5, 5, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 5, 5, 2, 5, 5, 5, 5, 5, 5, 5, 2, - 5, 2, 2, 2, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, 5, 2, - 2, 5, 5, 5, 5, 2, 2, 2, 2, 2, 2, 2, 2, 5, 2, 2, - 2, 2, 5, 5, 2, 5, 5, 5, 5, 5, 2, 2, 5, 5, 5, 5, - 5, 5, 5, 5, 5, 2, 2, 11, 11, 11, 2, 11, 11, 11, 11, 11, - 11, 2, 2, 2, 2, 11, 11, 2, 2, 11, 11, 11, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 11, 11, 2, 11, 11, 11, 11, 11, 11, 11, 2, - 11, 11, 2, 11, 11, 2, 11, 11, 2, 2, 11, 2, 11, 11, 11, 2, - 2, 11, 11, 11, 2, 2, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, - 11, 11, 11, 2, 11, 2, 2, 2, 2, 2, 2, 2, 11, 11, 11, 11, - 11, 11, 11, 11, 11, 2, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 2, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, - 10, 10, 10, 10, 10, 10, 10, 2, 10, 10, 10, 10, 10, 10, 10, 2, - 10, 10, 2, 10, 10, 10, 10, 10, 2, 2, 10, 10, 10, 10, 10, 10, - 2, 10, 10, 10, 2, 2, 10, 2, 2, 2, 2, 2, 2, 2, 10, 10, - 10, 10, 2, 2, 10, 10, 10, 10, 2, 2, 2, 2, 2, 2, 2, 10, - 10, 10, 10, 10, 10, 10, 2, 21, 21, 21, 2, 21, 21, 21, 21, 21, - 21, 21, 21, 2, 2, 21, 21, 2, 2, 21, 21, 21, 21, 21, 21, 21, - 21, 21, 21, 21, 21, 21, 21, 2, 21, 21, 21, 21, 21, 21, 21, 2, - 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 21, 21, 21, 2, - 2, 21, 21, 21, 2, 2, 2, 2, 2, 2, 2, 21, 21, 21, 2, 2, - 2, 2, 21, 21, 2, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, 2, - 22, 22, 2, 22, 22, 22, 22, 22, 22, 2, 2, 2, 22, 22, 22, 2, - 22, 22, 22, 22, 2, 2, 2, 22, 22, 2, 22, 2, 22, 22, 2, 2, - 2, 22, 22, 2, 2, 2, 22, 22, 22, 22, 22, 22, 22, 22, 22, 22, - 2, 2, 2, 2, 22, 22, 22, 2, 2, 2, 2, 2, 2, 22, 2, 2, - 2, 2, 2, 2, 22, 22, 22, 22, 22, 2, 2, 2, 2, 2, 23, 23, - 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 23, 2, 23, 23, 23, 2, - 23, 23, 23, 23, 23, 23, 23, 23, 2, 2, 23, 23, 23, 23, 23, 2, - 23, 23, 23, 23, 2, 2, 2, 2, 2, 2, 2, 23, 23, 2, 23, 23, - 23, 2, 2, 23, 2, 2, 23, 23, 23, 23, 2, 2, 23, 23, 2, 2, - 2, 2, 2, 2, 2, 23, 16, 16, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 16, 2, 16, 16, 16, 2, 16, 16, 16, 16, 16, 16, 16, 16, - 16, 16, 2, 16, 16, 16, 16, 16, 2, 2, 16, 16, 16, 16, 16, 2, - 16, 16, 16, 16, 2, 2, 2, 2, 2, 2, 2, 16, 16, 2, 16, 16, - 16, 16, 2, 2, 16, 16, 2, 16, 16, 16, 2, 2, 2, 2, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 2, 20, 20, 20, 2, - 20, 20, 20, 20, 20, 20, 2, 2, 2, 2, 20, 20, 20, 20, 20, 20, - 20, 20, 2, 2, 20, 20, 2, 36, 36, 36, 2, 36, 36, 36, 36, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2, - 36, 36, 36, 36, 36, 36, 36, 36, 2, 36, 36, 36, 36, 36, 36, 36, - 36, 36, 2, 36, 2, 2, 2, 2, 36, 2, 2, 2, 2, 36, 36, 36, - 36, 36, 36, 2, 36, 2, 2, 2, 2, 2, 2, 2, 36, 36, 2, 2, - 36, 36, 36, 2, 2, 2, 2, 24, 24, 24, 24, 24, 24, 24, 24, 24, - 24, 24, 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 24, 24, - 24, 24, 2, 2, 2, 2, 2, 18, 18, 2, 18, 2, 18, 18, 18, 18, - 18, 2, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 2, 2, 18, 18, - 18, 18, 18, 2, 18, 2, 18, 18, 18, 18, 18, 18, 18, 2, 18, 18, - 2, 2, 18, 18, 18, 18, 25, 25, 25, 25, 25, 25, 25, 25, 2, 25, - 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 25, 2, 2, 2, 25, 25, - 25, 25, 25, 2, 25, 25, 25, 25, 25, 25, 25, 0, 0, 0, 0, 25, - 25, 2, 2, 2, 2, 2, 33, 33, 33, 33, 33, 33, 33, 33, 8, 8, - 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 8, 2, 8, 2, 2, - 2, 2, 2, 8, 2, 2, 8, 8, 8, 0, 8, 8, 8, 8, 12, 12, - 12, 12, 12, 12, 12, 12, 30, 30, 30, 30, 30, 30, 30, 30, 30, 2, - 30, 30, 30, 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 2, 30, 30, - 30, 2, 2, 30, 30, 30, 30, 30, 30, 30, 30, 2, 2, 2, 30, 30, - 2, 2, 2, 2, 2, 2, 29, 29, 29, 29, 29, 29, 29, 29, 29, 29, - 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 28, 28, 28, 28, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 2, 2, 2, 35, 35, - 35, 35, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, 35, 35, 35, 2, - 2, 2, 2, 2, 2, 2, 45, 45, 45, 45, 45, 45, 45, 45, 45, 45, - 45, 45, 45, 45, 2, 2, 2, 2, 2, 2, 2, 2, 2, 45, 44, 44, - 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, 0, 0, 2, 43, 43, - 43, 43, 43, 43, 43, 43, 43, 43, 43, 43, 2, 2, 2, 2, 46, 46, - 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 46, 2, 46, 46, 46, 2, - 46, 46, 2, 2, 2, 2, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 2, 2, 31, 31, 2, 2, 2, 2, 2, 2, 32, 32, - 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, - 2, 2, 2, 2, 2, 2, 32, 2, 2, 2, 2, 2, 2, 2, 32, 32, - 32, 2, 2, 2, 2, 2, 28, 28, 28, 28, 28, 28, 2, 2, 48, 48, - 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 2, 48, 48, - 48, 48, 2, 2, 2, 2, 48, 2, 2, 2, 48, 48, 48, 48, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 2, 2, 52, 52, - 52, 52, 52, 2, 2, 2, 58, 58, 58, 58, 58, 58, 58, 58, 58, 58, - 58, 58, 2, 2, 2, 2, 58, 58, 2, 2, 2, 2, 2, 2, 58, 58, - 58, 2, 2, 2, 58, 58, 54, 54, 54, 54, 54, 54, 54, 54, 54, 54, - 54, 54, 2, 2, 54, 54, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, - 91, 91, 91, 91, 91, 2, 91, 91, 91, 91, 91, 2, 2, 91, 91, 91, - 2, 2, 2, 2, 2, 2, 91, 91, 91, 91, 91, 91, 2, 2, 1, 1, - 1, 1, 1, 1, 1, 2, 62, 62, 62, 62, 62, 62, 62, 62, 62, 62, - 62, 62, 62, 2, 2, 2, 62, 62, 62, 62, 62, 62, 62, 2, 76, 76, - 76, 76, 76, 76, 76, 76, 93, 93, 93, 93, 93, 93, 93, 93, 93, 93, - 93, 93, 2, 2, 2, 2, 2, 2, 2, 2, 93, 93, 93, 93, 70, 70, - 70, 70, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 70, 70, 70, 70, - 2, 2, 2, 70, 70, 70, 73, 73, 73, 73, 73, 73, 73, 73, 6, 2, - 2, 2, 2, 2, 2, 2, 8, 8, 8, 2, 2, 8, 8, 8, 1, 1, - 1, 0, 1, 1, 1, 1, 1, 0, 1, 1, 1, 1, 1, 1, 1, 0, - 0, 0, 0, 1, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 1, 1, - 0, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9, - 9, 6, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9, 9, 9, - 19, 19, 19, 19, 9, 9, 9, 9, 9, 19, 19, 19, 19, 19, 6, 19, - 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 9, 9, 9, - 9, 9, 9, 9, 2, 2, 2, 9, 2, 9, 2, 9, 2, 9, 9, 9, - 9, 9, 9, 2, 9, 9, 9, 9, 9, 9, 2, 2, 9, 9, 9, 9, - 9, 9, 2, 9, 9, 9, 2, 2, 9, 9, 9, 2, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 2, 0, 0, 0, 0, 1, 1, 0, 0, 0, 0, - 0, 0, 0, 2, 0, 0, 0, 19, 2, 2, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 19, 0, 0, 0, 0, 0, 0, 0, 2, 19, 19, - 19, 19, 19, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 1, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 9, 0, 0, 0, - 19, 19, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 19, 0, 19, 0, - 0, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 27, 27, - 27, 27, 27, 27, 27, 27, 0, 0, 0, 0, 2, 2, 0, 0, 0, 0, - 0, 0, 0, 0, 2, 0, 56, 56, 56, 56, 56, 56, 56, 56, 55, 55, - 55, 55, 2, 2, 2, 2, 2, 55, 55, 55, 55, 55, 55, 55, 61, 61, - 61, 61, 61, 61, 61, 61, 2, 2, 2, 2, 2, 2, 2, 61, 61, 2, - 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 0, 0, 2, 2, 13, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 2, 13, 13, 13, 13, 13, 13, 13, - 13, 13, 2, 2, 2, 2, 13, 13, 13, 13, 13, 13, 2, 2, 0, 0, - 0, 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 13, 0, 13, 0, 13, - 13, 13, 13, 13, 13, 13, 13, 13, 1, 1, 1, 1, 12, 12, 13, 13, - 13, 13, 0, 0, 0, 0, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, - 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 15, 2, 2, 1, - 1, 0, 0, 15, 15, 15, 0, 17, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 0, 0, 17, 17, 17, 2, 2, - 2, 2, 2, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 2, 12, - 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 12, 2, 12, 12, - 12, 12, 12, 12, 12, 0, 17, 17, 17, 17, 17, 17, 17, 0, 39, 39, - 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 39, 2, 2, 2, 39, 39, - 39, 39, 39, 39, 39, 2, 86, 86, 86, 86, 86, 86, 86, 86, 77, 77, - 77, 77, 77, 77, 77, 77, 77, 77, 77, 77, 2, 2, 2, 2, 79, 79, - 79, 79, 79, 79, 79, 79, 0, 0, 19, 19, 19, 19, 19, 19, 0, 0, - 0, 19, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2, 2, 2, 19, 19, - 2, 19, 2, 19, 19, 19, 19, 19, 2, 2, 2, 2, 2, 2, 2, 2, - 19, 19, 19, 19, 19, 19, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, - 60, 60, 60, 2, 2, 2, 0, 0, 2, 2, 2, 2, 2, 2, 65, 65, - 65, 65, 65, 65, 65, 65, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 2, 2, 2, 2, 2, 2, 2, 2, 75, 75, 75, 75, - 2, 2, 2, 2, 2, 2, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, - 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 74, 12, 12, - 12, 12, 12, 2, 2, 2, 84, 84, 84, 84, 84, 84, 84, 84, 84, 84, - 84, 84, 84, 84, 2, 0, 84, 84, 2, 2, 2, 2, 84, 84, 33, 33, - 33, 33, 33, 33, 33, 2, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 2, 68, 68, 68, 68, 68, 68, 2, 2, 68, 68, - 2, 2, 68, 68, 68, 68, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 92, 2, 2, 2, 2, 2, 2, 2, 2, 92, 92, 92, 92, 92, 87, 87, - 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 2, 2, 30, - 30, 30, 30, 30, 30, 2, 19, 19, 19, 0, 19, 19, 19, 19, 19, 19, - 19, 19, 19, 9, 19, 19, 19, 19, 0, 0, 2, 2, 2, 2, 87, 87, - 87, 87, 87, 87, 2, 2, 87, 87, 2, 2, 2, 2, 2, 2, 12, 12, - 12, 12, 2, 2, 2, 2, 2, 2, 2, 12, 12, 12, 12, 12, 13, 13, - 2, 2, 2, 2, 2, 2, 19, 19, 19, 19, 19, 19, 19, 2, 2, 2, - 2, 4, 4, 4, 4, 4, 2, 2, 2, 2, 2, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 2, 14, 14, 14, 14, 14, 2, 14, 2, 14, 14, - 2, 14, 14, 2, 14, 14, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, - 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 0, 0, 2, 2, - 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 2, 2, 3, 1, 1, - 1, 1, 1, 1, 6, 6, 0, 0, 0, 2, 0, 0, 0, 0, 3, 3, - 3, 3, 3, 2, 3, 3, 3, 3, 3, 3, 3, 2, 2, 0, 2, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 17, 17, 17, 17, - 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, 12, 12, 12, 12, 2, 2, - 12, 12, 12, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 49, 49, - 49, 49, 49, 49, 49, 49, 49, 49, 49, 49, 2, 49, 49, 49, 49, 49, - 49, 49, 49, 49, 49, 2, 49, 49, 49, 2, 49, 49, 2, 49, 49, 49, - 49, 49, 49, 49, 2, 2, 49, 49, 49, 2, 2, 2, 2, 2, 0, 0, - 0, 2, 2, 2, 2, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, - 0, 0, 0, 2, 2, 2, 9, 2, 2, 2, 2, 2, 2, 2, 0, 0, - 0, 0, 0, 1, 2, 2, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, - 71, 71, 71, 2, 2, 2, 67, 67, 67, 67, 67, 67, 67, 67, 67, 2, - 2, 2, 2, 2, 2, 2, 1, 0, 0, 0, 0, 0, 0, 0, 42, 42, - 42, 42, 42, 42, 42, 42, 42, 42, 42, 42, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 42, 42, 42, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, - 41, 2, 2, 2, 2, 2,118,118,118,118,118,118,118,118,118,118, - 118, 2, 2, 2, 2, 2, 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 53, 53, 2, 53, 59, 59, 59, 59, 59, 59, 59, 59, 59, 59, - 59, 59, 2, 2, 2, 2, 59, 59, 59, 59, 59, 59, 2, 2, 40, 40, - 40, 40, 40, 40, 40, 40, 51, 51, 51, 51, 51, 51, 51, 51, 50, 50, - 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 2, 2, 50, 50, - 2, 2, 2, 2, 2, 2,135,135,135,135,135,135,135,135,135,135, - 135,135, 2, 2, 2, 2,106,106,106,106,106,106,106,106,104,104, - 104,104,104,104,104,104,104,104,104,104, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2,104,161,161,161,161,161,161,161,161,161,161, - 161, 2,161,161,161,161,161,161,161, 2,161,161, 2,161,161,161, - 2,161,161,161,161,161,161,161, 2,161,161, 2, 2, 2,110,110, - 110,110,110,110,110,110,110,110,110,110,110,110,110, 2,110,110, - 110,110,110,110, 2, 2, 19, 19, 19, 19, 19, 19, 2, 19, 19, 2, - 19, 19, 19, 19, 19, 19, 47, 47, 47, 47, 47, 47, 2, 2, 47, 2, - 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 47, 47, 2, 47, 47, 2, 2, 2, 47, 2, 2, 47, 81, 81, - 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 81, 2, 81,120,120, - 120,120,120,120,120,120,116,116,116,116,116,116,116,116,116,116, - 116,116,116,116,116, 2, 2, 2, 2, 2, 2, 2, 2,116,128,128, - 128,128,128,128,128,128,128,128,128, 2,128,128, 2, 2, 2, 2, - 2,128,128,128,128,128, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, - 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, 72, 72, 72, 72, 72, 72, - 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, 98, 98, 98, 98, 97, 97, - 97, 97, 97, 97, 97, 97, 2, 2, 2, 2, 97, 97, 97, 97, 2, 2, - 97, 97, 97, 97, 97, 97, 57, 57, 57, 57, 2, 57, 57, 2, 2, 2, - 2, 2, 57, 57, 57, 57, 57, 57, 57, 57, 2, 57, 57, 57, 2, 57, - 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, - 57, 57, 57, 57, 2, 2, 57, 57, 57, 2, 2, 2, 2, 57, 57, 2, - 2, 2, 2, 2, 2, 2, 88, 88, 88, 88, 88, 88, 88, 88,117,117, - 117,117,117,117,117,117,112,112,112,112,112,112,112,112,112,112, - 112,112,112,112,112, 2, 2, 2, 2,112,112,112,112,112, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 2, 2, 2, 78, - 78, 78, 78, 78, 78, 78, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 83, 83, 83, 83, 2, 2, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, - 82, 2, 2, 2, 2, 2,122,122,122,122,122,122,122,122,122,122, - 2, 2, 2, 2, 2, 2, 2,122,122,122,122, 2, 2, 2, 2,122, - 122,122,122,122,122,122, 89, 89, 89, 89, 89, 89, 89, 89, 89, 2, - 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,130,130,130,130, - 130, 2, 2, 2, 2, 2, 2, 2,130,130,130,130,130,130,144,144, - 144,144,144,144,144,144,144,144, 2, 2, 2, 2, 2, 2,156,156, - 156,156,156,156,156,156,156,156, 2,156,156,156, 2, 2,156,156, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 3, 3,147,147, - 147,147,147,147,147,147,148,148,148,148,148,148,148,148,148,148, - 2, 2, 2, 2, 2, 2,158,158,158,158,158,158,158,158,158,158, - 2, 2, 2, 2, 2, 2,153,153,153,153,153,153,153,153,153,153, - 153,153, 2, 2, 2, 2,149,149,149,149,149,149,149,149,149,149, - 149,149,149,149,149, 2, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, - 94, 94, 94, 94, 2, 2, 2, 2, 94, 94, 94, 94, 94, 94, 2, 2, - 2, 2, 2, 2, 2, 94, 85, 85, 85, 85, 85, 85, 85, 85, 85, 85, - 85, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 85, 2, 2,101,101, - 101,101,101,101,101,101,101, 2, 2, 2, 2, 2, 2, 2,101,101, - 2, 2, 2, 2, 2, 2, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, - 96, 96, 96, 2, 96, 96,111,111,111,111,111,111,111,111,111,111, - 111,111,111,111,111, 2,100,100,100,100,100,100,100,100, 2, 36, - 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 36, 2, 2, 2,108,108, - 108,108,108,108,108,108,108,108, 2,108,108,108,108,108,108,108, - 2, 2, 2, 2, 2, 2,129,129,129,129,129,129,129, 2,129, 2, - 129,129,129,129, 2,129,129,129,129,129,129,129,129,129,129,129, - 129,129,129,129, 2,129,129,129, 2, 2, 2, 2, 2, 2,109,109, - 109,109,109,109,109,109,109,109,109, 2, 2, 2, 2, 2,109,109, - 2, 2, 2, 2, 2, 2,107,107,107,107, 2,107,107,107,107,107, - 107,107,107, 2, 2,107,107, 2, 2,107,107,107,107,107,107,107, - 107,107,107,107,107,107,107, 2,107,107,107,107,107,107,107, 2, - 107,107, 2,107,107,107,107,107, 2, 1,107,107,107,107,107, 2, - 2,107,107,107, 2, 2,107, 2, 2, 2, 2, 2, 2,107, 2, 2, - 2, 2, 2,107,107,107,107,107,107,107, 2, 2,107,107,107,107, - 107,107,107, 2, 2, 2,137,137,137,137,137,137,137,137,137,137, - 137,137, 2,137,137,137,137,137, 2, 2, 2, 2, 2, 2,124,124, - 124,124,124,124,124,124,124,124, 2, 2, 2, 2, 2, 2,123,123, - 123,123,123,123,123,123,123,123,123,123,123,123, 2, 2,114,114, - 114,114,114,114,114,114,114,114,114,114,114, 2, 2, 2,114,114, - 2, 2, 2, 2, 2, 2, 32, 32, 32, 32, 32, 2, 2, 2,102,102, - 102,102,102,102,102,102,102,102, 2, 2, 2, 2, 2, 2,126,126, - 126,126,126,126,126,126,126,126,126, 2, 2,126,126,126,126,126, - 126,126, 2, 2, 2, 2,126,126,126,126,126,126,126, 2,142,142, - 142,142,142,142,142,142,142,142,142,142, 2, 2, 2, 2,125,125, - 125,125,125,125,125,125,125,125,125, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2,125,154,154,154,154,154,154,154, 2, 2,154, - 2, 2,154,154,154,154,154,154,154,154, 2,154,154, 2,154,154, - 154,154,154,154,154,154,154,154,154,154,154,154, 2,154,154, 2, - 2,154,154,154,154,154,154,154, 2, 2, 2, 2, 2, 2,150,150, - 150,150,150,150,150,150, 2, 2,150,150,150,150,150,150,150,150, - 150,150,150, 2, 2, 2,141,141,141,141,141,141,141,141,140,140, - 140,140,140,140,140,140,140,140,140, 2, 2, 2, 2, 2,121,121, - 121,121,121,121,121,121,121, 2, 2, 2, 2, 2, 2, 2, 7, 7, - 2, 2, 2, 2, 2, 2,133,133,133,133,133,133,133,133,133, 2, - 133,133,133,133,133,133,133,133,133,133,133,133,133, 2,133,133, - 133,133,133,133, 2, 2,133,133,133,133,133, 2, 2, 2,134,134, - 134,134,134,134,134,134, 2, 2,134,134,134,134,134,134, 2,134, - 134,134,134,134,134,134,134,134,134,134,134,134,134, 2,138,138, - 138,138,138,138,138, 2,138,138, 2,138,138,138,138,138,138,138, - 138,138,138,138,138,138, 2, 2,138, 2,138,138, 2,138,138,138, - 2, 2, 2, 2, 2, 2,143,143,143,143,143,143, 2,143,143, 2, - 143,143,143,143,143,143,143,143,143,143,143,143,143,143,143,143, - 143,143,143,143,143, 2,143,143, 2,143,143,143,143,143,143, 2, - 2, 2, 2, 2, 2, 2,143,143, 2, 2, 2, 2, 2, 2,145,145, - 145,145,145,145,145,145,145, 2, 2, 2, 2, 2, 2, 2,163,163, - 163,163,163,163,163,163,163, 2,163,163,163,163,163,163,163,163, - 163, 2, 2, 2,163,163,163,163, 2, 2, 2, 2, 2, 2, 86, 2, - 2, 2, 2, 2, 2, 2, 22, 22, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 22, 63, 63, 63, 63, 63, 63, 63, 63, 63, 63, - 2, 2, 2, 2, 2, 2, 63, 63, 63, 63, 63, 63, 63, 2, 63, 63, - 63, 63, 63, 2, 2, 2, 63, 63, 63, 63, 2, 2, 2, 2,157,157, - 157,157,157,157,157,157,157,157,157, 2, 2, 2, 2, 2, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 2, 2,127,127, - 127,127,127,127,127,127,127,127,127,127,127,127,127, 2, 79, 2, - 2, 2, 2, 2, 2, 2,115,115,115,115,115,115,115,115,115,115, + 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70,240, 70, 70, 70, 70, + 70, 70, 70, 70, 70,241, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, + 70, 70,242, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 96, 70, 70, + 70, 70, 70, 70,243, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, 70, + 70, 70, 70, 70, 70,244, 96, 96, 96, 96, 96, 96, 96, 96,245, 96, + 246,247, 0, 1, 2, 2, 0, 1, 2, 2, 2, 3, 4, 5, 0, 0, + 0, 0, 0, 19, 19, 19, 19, 19, 19, 19, 19, 19, 19, 0, 0, 0, + 19, 0, 19, 0, 0, 0, 0, 0, 26, 26, 1, 1, 1, 1, 9, 9, + 9, 9, 0, 9, 9, 9, 2, 2, 9, 9, 9, 9, 0, 9, 2, 2, + 2, 2, 9, 0, 9, 0, 9, 9, 9, 2, 9, 2, 9, 9, 9, 9, + 2, 9, 9, 9, 55, 55, 55, 55, 55, 55, 6, 6, 6, 6, 6, 1, + 1, 6, 2, 4, 4, 4, 4, 4, 4, 4, 4, 4, 4, 2, 2, 14, + 14, 14, 14, 14, 14, 14, 14, 14, 14, 2, 2, 2, 2, 14, 14, 2, + 2, 2, 3, 3, 3, 3, 3, 0, 3, 3, 0, 3, 3, 3, 3, 3, + 3, 0, 3, 3, 3, 1, 1, 1, 3, 3, 1, 3, 3, 3, 37, 37, + 37, 37, 37, 37, 2, 37, 37, 37, 37, 2, 2, 37, 37, 37, 38, 38, + 38, 38, 38, 38, 2, 2, 64, 64, 64, 64, 64, 64, 64, 2, 2, 64, + 64, 64, 90, 90, 90, 90, 90, 90, 2, 2, 90, 90, 90, 2, 95, 95, + 95, 95, 2, 2, 95, 2, 3, 3, 3, 2, 3, 3, 2, 2, 3, 3, + 0, 3, 7, 7, 7, 7, 7, 1, 1, 1, 1, 7, 7, 7, 0, 0, + 7, 7, 5, 5, 5, 5, 2, 5, 5, 5, 5, 2, 2, 5, 5, 2, + 5, 5, 5, 2, 5, 2, 2, 2, 5, 5, 5, 5, 2, 2, 5, 5, + 5, 2, 2, 2, 2, 5, 5, 5, 2, 5, 2, 11, 11, 11, 11, 11, + 11, 2, 2, 2, 2, 11, 11, 2, 2, 11, 11, 11, 11, 11, 11, 2, + 11, 11, 2, 11, 11, 2, 11, 11, 2, 2, 2, 11, 2, 2, 11, 2, + 11, 2, 2, 2, 11, 11, 2, 10, 10, 10, 10, 10, 10, 10, 10, 10, + 2, 10, 10, 2, 10, 10, 10, 10, 2, 2, 10, 2, 2, 2, 2, 2, + 10, 10, 2, 21, 21, 21, 21, 21, 21, 21, 21, 2, 2, 21, 21, 2, + 21, 21, 21, 21, 2, 2, 21, 21, 2, 21, 2, 2, 21, 21, 2, 2, + 22, 22, 2, 22, 22, 22, 22, 22, 22, 2, 22, 2, 22, 22, 22, 22, + 2, 2, 2, 22, 22, 2, 2, 2, 2, 22, 22, 2, 2, 2, 22, 22, + 22, 22, 23, 23, 23, 23, 23, 2, 23, 23, 23, 23, 2, 2, 2, 23, + 23, 2, 23, 23, 23, 2, 2, 23, 2, 2, 2, 2, 23, 23, 2, 2, + 2, 23, 16, 16, 16, 16, 16, 2, 16, 16, 2, 16, 16, 16, 16, 16, + 2, 2, 2, 16, 16, 2, 2, 2, 16, 16, 20, 20, 20, 20, 20, 2, + 20, 20, 2, 2, 20, 20, 2, 36, 36, 36, 36, 36, 36, 36, 36, 36, + 36, 2, 2, 2, 36, 36, 36, 36, 2, 36, 2, 36, 2, 2, 2, 2, + 36, 2, 2, 2, 2, 36, 36, 2, 36, 2, 36, 2, 2, 2, 2, 24, + 24, 24, 24, 24, 24, 24, 24, 24, 24, 2, 2, 2, 2, 0, 2, 18, + 18, 2, 18, 2, 18, 18, 18, 18, 18, 2, 18, 18, 18, 18, 2, 18, + 2, 18, 18, 18, 2, 2, 18, 2, 18, 2, 25, 25, 25, 25, 2, 25, + 25, 25, 25, 2, 2, 2, 25, 2, 25, 25, 25, 0, 0, 0, 0, 25, + 25, 2, 33, 33, 33, 33, 8, 8, 8, 8, 8, 8, 2, 8, 2, 8, + 2, 2, 8, 8, 8, 0, 12, 12, 12, 12, 30, 30, 30, 30, 30, 2, + 30, 30, 30, 30, 2, 2, 30, 30, 30, 2, 2, 30, 30, 30, 30, 2, + 2, 2, 29, 29, 29, 29, 29, 29, 2, 2, 28, 28, 28, 28, 34, 34, + 34, 34, 34, 2, 2, 2, 35, 35, 35, 35, 35, 35, 35, 0, 0, 0, + 35, 35, 35, 2, 2, 2, 45, 45, 45, 45, 45, 45, 2, 2, 2, 2, + 2, 45, 44, 44, 44, 44, 44, 0, 0, 2, 43, 43, 43, 43, 46, 46, + 46, 46, 46, 2, 46, 46, 31, 31, 31, 31, 31, 31, 2, 2, 32, 32, + 0, 0, 32, 0, 32, 32, 32, 32, 32, 32, 32, 32, 2, 2, 32, 2, + 2, 2, 32, 32, 32, 2, 28, 28, 2, 2, 48, 48, 48, 48, 48, 48, + 48, 2, 48, 2, 2, 2, 52, 52, 52, 52, 52, 52, 2, 2, 52, 2, + 2, 2, 58, 58, 58, 58, 58, 58, 2, 2, 58, 58, 58, 2, 2, 2, + 58, 58, 54, 54, 54, 54, 2, 2, 54, 54, 91, 91, 91, 91, 91, 91, + 91, 2, 91, 2, 2, 91, 91, 91, 2, 2, 1, 1, 1, 2, 62, 62, + 62, 62, 62, 2, 2, 2, 62, 62, 62, 2, 76, 76, 76, 76, 93, 93, + 93, 93, 70, 70, 70, 70, 2, 2, 2, 70, 70, 70, 2, 2, 2, 70, + 70, 70, 73, 73, 73, 73, 6, 2, 2, 2, 8, 8, 8, 2, 2, 8, + 8, 8, 1, 1, 1, 0, 1, 0, 1, 1, 1, 0, 0, 0, 0, 1, + 0, 0, 1, 1, 0, 2, 19, 19, 9, 9, 9, 9, 9, 6, 19, 9, + 9, 9, 9, 9, 19, 19, 9, 9, 9, 19, 6, 19, 19, 19, 19, 19, + 19, 9, 9, 9, 2, 2, 2, 9, 2, 9, 2, 9, 9, 9, 1, 1, + 0, 0, 0, 2, 0, 0, 0, 19, 2, 2, 0, 0, 0, 19, 0, 0, + 0, 2, 19, 2, 2, 2, 0, 2, 2, 2, 1, 2, 2, 2, 0, 0, + 9, 0, 0, 0, 19, 19, 27, 27, 27, 27, 2, 2, 0, 0, 0, 0, + 2, 0, 56, 56, 56, 56, 2, 55, 55, 55, 61, 61, 61, 61, 2, 2, + 2, 61, 61, 2, 2, 2, 0, 0, 2, 2, 13, 13, 13, 13, 13, 13, + 2, 13, 13, 13, 2, 2, 0, 13, 0, 13, 0, 13, 13, 13, 13, 13, + 1, 1, 1, 1, 12, 12, 2, 15, 15, 15, 15, 15, 15, 15, 15, 15, + 15, 2, 2, 1, 1, 0, 0, 15, 15, 15, 0, 17, 17, 17, 17, 17, + 17, 17, 17, 17, 17, 0, 2, 26, 26, 26, 26, 26, 26, 26, 2, 12, + 12, 12, 12, 12, 12, 2, 12, 12, 12, 0, 39, 39, 39, 39, 39, 2, + 2, 2, 39, 39, 39, 2, 86, 86, 86, 86, 77, 77, 77, 77, 79, 79, + 79, 79, 19, 19, 19, 2, 19, 19, 2, 19, 2, 19, 19, 19, 19, 19, + 2, 2, 2, 2, 19, 19, 60, 60, 60, 60, 60, 2, 2, 2, 65, 65, + 65, 65, 75, 75, 75, 75, 75, 75, 2, 2, 2, 2, 75, 75, 69, 69, + 69, 69, 69, 69, 0, 69, 74, 74, 74, 74, 2, 2, 2, 74, 12, 2, + 2, 2, 84, 84, 84, 84, 84, 84, 2, 0, 84, 84, 2, 2, 2, 2, + 84, 84, 33, 33, 33, 2, 68, 68, 68, 68, 68, 68, 68, 2, 68, 68, + 2, 2, 92, 92, 92, 92, 92, 92, 92, 2, 2, 2, 2, 92, 87, 87, + 87, 87, 87, 87, 87, 2, 19, 9, 19, 19, 19, 19, 0, 0, 87, 87, + 2, 2, 2, 2, 2, 12, 2, 2, 2, 4, 14, 2, 14, 2, 14, 14, + 2, 14, 14, 2, 14, 14, 2, 2, 2, 3, 3, 3, 0, 0, 2, 2, + 3, 3, 1, 1, 6, 6, 3, 2, 3, 3, 3, 2, 2, 0, 2, 0, + 0, 0, 0, 0, 17, 17, 17, 17, 0, 0, 2, 2, 12, 12, 49, 49, + 49, 49, 2, 49, 49, 49, 49, 49, 49, 2, 49, 49, 2, 49, 49, 49, + 2, 2, 9, 2, 2, 2, 0, 1, 2, 2, 71, 71, 71, 71, 71, 2, + 2, 2, 67, 67, 67, 67, 67, 2, 2, 2, 42, 42, 42, 42, 2, 42, + 42, 42, 41, 41, 41, 41, 41, 41, 41, 2,118,118,118,118,118,118, + 118, 2, 53, 53, 53, 53, 53, 53, 2, 53, 59, 59, 59, 59, 59, 59, + 2, 2, 40, 40, 40, 40, 51, 51, 51, 51, 50, 50, 50, 50, 50, 50, + 2, 2,135,135,135,135,106,106,106,106,104,104,104,104, 2, 2, + 2,104,161,161,161,161,161,161,161, 2,161,161, 2,161,161, 2, + 2, 2,110,110,110,110,110,110,110, 2,110,110, 2, 2, 19, 2, + 19, 19, 47, 47, 47, 47, 47, 47, 2, 2, 47, 2, 47, 47, 47, 47, + 2, 47, 47, 2, 2, 2, 47, 2, 2, 47, 81, 81, 81, 81, 81, 81, + 2, 81,120,120,120,120,116,116,116,116,116,116,116, 2, 2, 2, + 2,116,128,128,128,128,128,128,128, 2,128,128, 2, 2, 2, 2, + 2,128, 66, 66, 66, 66, 2, 2, 2, 66, 72, 72, 72, 72, 72, 72, + 2, 2, 2, 2, 2, 72, 98, 98, 98, 98, 97, 97, 97, 97, 2, 2, + 97, 97, 57, 57, 57, 57, 2, 57, 57, 2, 2, 57, 57, 57, 57, 57, + 2, 2, 57, 57, 57, 2, 2, 2, 2, 57, 57, 2, 2, 2, 88, 88, + 88, 88,117,117,117,117,112,112,112,112,112,112,112, 2, 2, 2, + 2,112, 78, 78, 78, 78, 78, 78, 2, 2, 2, 78, 78, 78, 83, 83, + 83, 83, 83, 83, 2, 2, 82, 82, 82, 82, 82, 82, 82, 2,122,122, + 122,122,122,122, 2, 2, 2,122,122,122,122, 2, 2, 2, 89, 89, + 89, 89, 89, 2, 2, 2,130,130,130,130,130,130,130, 2, 2, 2, + 130,130,144,144,144,144,144,144, 2, 2,156,156,156,156,156,156, + 2,156,156,156, 2, 2, 2, 3, 3, 3,147,147,147,147,148,148, + 148,148,148,148, 2, 2,158,158,158,158,158,158, 2, 2,153,153, + 153,153,149,149,149,149,149,149,149, 2, 94, 94, 94, 94, 94, 94, + 2, 2, 2, 2, 94, 94, 2, 2, 2, 94, 85, 85, 85, 85, 85, 85, + 85, 2, 2, 85, 2, 2,101,101,101,101,101, 2, 2, 2,101,101, + 2, 2, 96, 96, 96, 96, 96, 2, 96, 96,111,111,111,111,111,111, + 111, 2,100,100,100,100,108,108,108,108,108,108, 2,108,108,108, + 2, 2,129,129,129,129,129,129,129, 2,129, 2,129,129,129,129, + 2,129,129,129, 2, 2,109,109,109,109,109,109,109, 2,109,109, + 2, 2,107,107,107,107, 2,107,107,107,107, 2, 2,107,107, 2, + 107,107,107,107, 2, 1,107,107, 2, 2,107, 2, 2, 2, 2, 2, + 2,107, 2, 2,107,107,137,137,137,137, 2,137,137,137,137,137, + 2, 2,124,124,124,124,124,124, 2, 2,123,123,123,123,123,123, + 2, 2,114,114,114,114,114, 2, 2, 2,114,114, 2, 2,102,102, + 102,102,102,102, 2, 2,126,126,126,126,126,126,126, 2, 2,126, + 126,126,142,142,142,142,125,125,125,125,125,125,125, 2, 2, 2, + 2,125,154,154,154,154,154,154,154, 2, 2,154, 2, 2, 2,154, + 154, 2,154,154, 2,154,154, 2, 2,154,154,154, 2, 2,150,150, + 150,150, 2, 2,150,150,150, 2, 2, 2,141,141,141,141,140,140, + 140,140,140,140,140, 2,121,121,121,121,121, 2, 2, 2, 7, 7, + 2, 2,133,133,133,133,133, 2,133,133,133,133,133, 2,133,133, + 2, 2,133, 2, 2, 2,134,134,134,134, 2, 2,134,134, 2,134, + 134,134,134,134,134, 2,138,138,138,138,138,138,138, 2,138,138, + 2,138, 2, 2,138, 2,138,138, 2, 2,143,143,143,143,143,143, + 2,143,143, 2,143,143,143,143,143, 2,143, 2, 2, 2,143,143, + 2, 2,145,145,145,145,145, 2, 2, 2,163,163,163,163,163, 2, + 163,163,163,163,163, 2, 2, 2,163,163,163,163, 2, 2, 86, 2, + 2, 2, 63, 63, 63, 63, 63, 63, 2, 2, 63, 63, 63, 2, 63, 2, + 2, 2,157,157,157,157,157,157,157, 2, 80, 80, 80, 80, 80, 80, + 2, 2,127,127,127,127,127,127,127, 2, 79, 2, 2, 2,115,115, 115,115,115,115,115, 2,115,115, 2, 2, 2, 2,115,115,159,159, - 159,159,159,159,159,159,159,159,159,159,159,159,159, 2,159,159, - 2, 2, 2, 2, 2, 2,103,103,103,103,103,103,103,103,103,103, - 103,103,103,103, 2, 2,119,119,119,119,119,119,119,119,119,119, - 119,119,119,119, 2, 2,119,119, 2,119,119,119,119,119, 2, 2, - 2, 2, 2,119,119,119,146,146,146,146,146,146,146,146,146,146, - 146, 2, 2, 2, 2, 2, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, - 99, 2, 2, 2, 2, 99, 2, 2, 2, 2, 2, 2, 2, 99,136,139, - 13, 13,155, 2, 2, 2,136,136,136,136,136,136,136,136,155,155, - 155,155,155,155,155,155,155,155,155,155,155,155, 2, 2,136, 2, - 2, 2, 2, 2, 2, 2, 17, 17, 17, 17, 2, 17, 17, 17, 17, 17, - 17, 17, 2, 17, 17, 2, 17, 15, 15, 15, 15, 15, 15, 15, 17, 17, - 17, 2, 2, 2, 2, 2, 2, 2, 15, 2, 2, 2, 2, 2, 15, 15, - 15, 2, 2, 17, 2, 2, 2, 2, 2, 2, 17, 17, 17, 17,139,139, - 139,139,139,139,139,139,139,139,139,139, 2, 2, 2, 2,105,105, - 105,105,105,105,105,105,105,105,105, 2, 2, 2, 2, 2,105,105, - 105,105,105, 2, 2, 2,105, 2, 2, 2, 2, 2, 2, 2,105,105, - 2, 2,105,105,105,105, 1, 1, 1, 1, 1, 1, 2, 2, 0, 0, - 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 1, 1, 1, 1, 1, 1, 1, 1, 0, 0, 1, 1, 1, 1, 1, - 1, 1, 0, 0, 0, 0, 0, 0, 1, 1, 1, 1, 0, 0, 2, 2, - 0, 2, 2, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 0, 0, 0, - 2, 0, 2, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 0, - 0, 2, 2, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 2, 0, 0, - 0, 0, 0, 2, 0, 2, 2, 2, 0, 0, 0, 0, 0, 0, 0, 2, - 0, 0, 0, 0, 0, 0,131,131,131,131,131,131,131,131,131,131, - 131,131, 2, 2, 2, 2, 2, 2, 2,131,131,131,131,131, 2,131, - 131,131,131,131,131,131, 2, 2, 2, 2, 2, 19, 19, 19, 56, 56, - 56, 56, 56, 56, 56, 2, 56, 2, 2, 56, 56, 56, 56, 56, 56, 56, - 2, 56, 56, 2, 56, 56, 56, 56, 56, 2, 2, 2, 2, 2, 6, 6, - 6, 6, 6, 6, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6,151,151, - 151,151,151,151,151,151,151,151,151,151,151, 2, 2, 2,151,151, - 151,151,151,151, 2, 2,151,151, 2, 2, 2, 2,151,151,160,160, - 160,160,160,160,160,160,160,160,160,160,160,160,160, 2,152,152, - 152,152,152,152,152,152,152,152, 2, 2, 2, 2, 2,152,164,164, - 164,164,164,164,164,164,164,164, 2, 2, 2, 2, 2, 2, 30, 30, - 30, 30, 2, 30, 30, 2,113,113,113,113,113,113,113,113,113,113, - 113,113,113, 2, 2,113,113,113,113,113,113,113,113, 2,132,132, - 132,132,132,132,132,132,132,132,132,132, 2, 2, 2, 2,132,132, - 2, 2, 2, 2,132,132, 3, 3, 3, 3, 2, 3, 3, 3, 2, 3, - 3, 2, 3, 2, 2, 3, 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, - 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 2, 2, 2, 2, 2, 2, - 3, 2, 2, 2, 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 2, 3, - 2, 3, 2, 3, 2, 3, 2, 3, 3, 3, 3, 2, 3, 2, 3, 3, - 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 2, 2, 2, 2, 2, 3, - 3, 3, 2, 3, 3, 3, 2, 2, 2, 2, 2, 2, 0, 0, 15, 0, - 0, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 0, 0, 0, 2, 2, - 2, 0, 0, 0, 0, 0, 13, 2, 2, 2, 2, 2, 2, 2, 13, 13, - 13, 2, 2, 2, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 0, 1, - 2, 3, 4, 5, 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, 12, 13, - 9, 9, 9, 14, 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 159,159,159,159,159, 2,159,159, 2, 2,103,103,103,103,103,103, + 2, 2,119,119,119,119,119,119, 2, 2,119,119, 2,119, 2,119, + 119,119,146,146,146,146,146,146,146, 2, 99, 99, 99, 99, 99, 99, + 99, 2, 2, 2, 2, 99,136,139, 13, 13,155, 2, 2, 2,136,136, + 136,136,155,155,155,155,155,155, 2, 2,136, 2, 2, 2, 2, 17, + 17, 17, 2, 17, 17, 2, 17, 15, 15, 15, 17, 17, 17, 2, 2, 2, + 15, 2, 2, 17, 2, 2,139,139,139,139,105,105,105,105,105,105, + 105, 2,105, 2, 2, 2,105,105, 2, 2, 1, 1, 2, 2, 0, 0, + 0, 1, 0, 1, 1, 1, 0, 0, 1, 1, 2, 2, 0, 2, 2, 0, + 0, 2, 0, 2, 0, 2,131,131,131,131, 2, 2, 2,131, 2,131, + 131,131, 56, 56, 56, 2, 56, 2, 2, 56, 56, 56, 2, 56, 56, 2, + 56, 56, 6, 6, 2, 2, 2, 2, 2, 6,151,151,151,151,151, 2, + 2, 2,151,151, 2, 2, 2, 2,151,151,160,160,160,160,160,160, + 160, 2,152,152,152,152,152,152, 2, 2, 2, 2, 2,152,164,164, + 164,164,164,164, 2, 2, 2, 30, 30, 2,113,113,113,113,113, 2, + 2,113,113,113,113, 2,132,132,132,132,132,132, 2, 2, 2, 2, + 132,132, 2, 3, 3, 2, 3, 2, 2, 3, 2, 3, 2, 3, 2, 2, + 3, 2, 3, 2, 3, 2, 3, 3, 2, 3, 15, 0, 0, 2, 13, 2, + 2, 2, 13, 13, 13, 2, 2, 0, 2, 2, 0, 1, 2, 3, 4, 5, + 6, 7, 8, 9, 9, 9, 9, 10, 9, 11, 12, 13, 9, 9, 9, 14, + 9, 9, 15, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 16, 17, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, 9, 9, + 9, 9, 9, 9, 9, 9, 16, 17, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 18, 19, 20, 9, 21, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, + 9, 9, 22, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, @@ -3922,60 +3702,60 @@ _hb_ucd_u8[17868] = 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 23, 24, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, - 9, 10, 11, 12, 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 23, 0, 0, 24, 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, 0, 33, - 0, 34, 0, 35, 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, - 0, 45, 0, 0, 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, - 0, 49, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 50, 51, 0, 0, 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, - 54, 0, 0, 0, 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, - 56, 0, 0, 0, 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 58, 59, 60, 61, 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 66, 0, + 9, 9, 9, 9, 9, 9, 23, 24, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, + 0, 0, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 23, 0, 0, 24, + 25, 26, 27, 28, 29, 30, 0, 0, 31, 32, 0, 33, 0, 34, 0, 35, + 0, 0, 0, 0, 36, 37, 38, 39, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 40, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 41, 42, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 43, 44, 0, 45, 0, 0, + 0, 0, 0, 0, 46, 47, 0, 0, 0, 0, 0, 48, 0, 49, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 50, 51, 0, 0, + 0, 52, 0, 0, 53, 0, 0, 0, 0, 0, 0, 0, 54, 0, 0, 0, + 0, 0, 0, 0, 55, 0, 0, 0, 0, 0, 0, 0, 56, 0, 0, 0, + 0, 0, 0, 0, 0, 57, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58, 59, 60, 61, + 62, 63, 64, 65, 0, 0, 0, 0, 0, 0, 66, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 69, - 70, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, - 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 99,100,101,102,103, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0, - 0, 0, 0, 0, 0,105,106, 0,107, 0, 0, 0,108, 0,109, 0, - 110, 0,111,112,113, 0,114, 0, 0, 0,115, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 67, 68, 0, 69, 70, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 71, 72, 73, 74, 75, 76, 77, 78, + 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, + 95, 96, 97, 98, 99,100,101,102,103, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,104, 0, 0, 0, 0, 0, + 0,105,106, 0,107, 0, 0, 0,108, 0,109, 0,110, 0,111,112, + 113, 0,114, 0, 0, 0,115, 0, 0, 0,116, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 118,119,120,121, 0,122,123,124,125,126, 0,127, 0, 0, 0, 0, + 0, 0, 0, 0, 0,117, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,118,119,120,121, + 0,122,123,124,125,126, 0,127, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,128,129,130,131, - 132,133,134,135,136,137,138,139,140,141,142,143,144,145,146,147, - 148,149,150,151,152,153,154,155,156,157, 0, 0, 0,158,159,160, - 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0,162,163, 0, 0, 0, 0, 0, 0, 0,164, 0, + 0, 0, 0, 0, 0, 0, 0, 0,128,129,130,131,132,133,134,135, + 136,137,138,139,140,141,142,143,144,145,146,147,148,149,150,151, + 152,153,154,155,156,157, 0, 0, 0,158,159,160,161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0,162,163, 0, 0, 0, 0, 0, 0, 0,164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,166, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0,167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0,169,170, 0, 0, 0, 0,171,172, 0, 0, 0,173,174,175,176, - 177,178,179,180,181,182,183,184,185,186,187,188,189,190,191,192, - 193,194,195,196,197,198,199,200,201,202,203,204,205,206, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,169,170, 0, + 0, 0, 0,171,172, 0, 0, 0,173,174,175,176,177,178,179,180, + 181,182,183,184,185,186,187,188,189,190,191,192,193,194,195,196, + 197,198,199,200,201,202,203,204,205,206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 1, 2, 3, 4, + 0, 0, 0, 0, 1, 2, 3, 4, }; static const uint16_t -_hb_ucd_u16[9320] = +_hb_ucd_u16[10040] = { 0, 0, 1, 2, 3, 4, 5, 6, 0, 0, 7, 8, 9, 10, 11, 12, 13, 13, 13, 14, 15, 13, 13, 16, 17, 18, 19, 20, 21, 22, 13, 23, @@ -4104,255 +3884,300 @@ _hb_ucd_u16[9320] = 48, 48, 48, 48, 71, 48, 48, 48, 48, 48, 48, 140, 140, 140, 140, 140, 683, 140, 570, 570, 570, 570, 570, 570, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 32, 140, 391, 391, 391, 391, 391, 391, 391, 684, - 391, 391, 391, 391, 391, 391, 391, 685, 0, 0, 0, 0, 0, 0, 0, 0, - 1, 2, 2, 3, 1, 2, 2, 3, 0, 0, 0, 0, 0, 4, 0, 4, - 2, 2, 5, 2, 2, 2, 5, 2, 2, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 6, - 0, 0, 0, 0, 7, 8, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 10, 11, 12, 13, 14, 14, 15, 14, 14, 14, - 14, 14, 14, 14, 16, 17, 14, 14, 18, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 19, 18, 18, 18, 18, 18, 18, 18, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 20, 21, - 21, 21, 22, 20, 21, 21, 21, 21, 21, 23, 24, 25, 25, 25, 25, 25, - 25, 26, 25, 25, 25, 27, 28, 26, 29, 30, 31, 32, 31, 31, 31, 31, - 33, 34, 35, 31, 31, 31, 36, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 29, 31, 31, 31, 31, 37, 38, 37, 37, 37, 37, 37, 37, - 37, 39, 31, 31, 31, 31, 31, 31, 40, 40, 40, 40, 40, 40, 41, 26, - 42, 42, 42, 42, 42, 42, 42, 43, 44, 44, 44, 44, 44, 45, 44, 46, - 47, 47, 47, 48, 37, 49, 31, 31, 31, 50, 51, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 52, 31, 31, 31, 53, 53, 53, 53, 53, 53, 53, 53, - 53, 53, 54, 53, 55, 53, 53, 53, 56, 57, 58, 59, 59, 60, 61, 62, - 57, 63, 64, 65, 66, 59, 59, 67, 68, 69, 70, 71, 71, 72, 73, 74, - 69, 75, 76, 77, 78, 71, 79, 26, 80, 81, 82, 83, 83, 84, 85, 86, - 81, 87, 88, 26, 89, 83, 90, 91, 92, 93, 94, 95, 95, 96, 97, 98, - 93, 99, 100, 101, 102, 95, 95, 26, 103, 104, 105, 106, 107, 104, 108, 109, - 104, 105, 110, 26, 111, 108, 108, 112, 113, 114, 115, 113, 113, 115, 113, 116, - 114, 117, 118, 119, 120, 113, 121, 113, 122, 123, 124, 122, 122, 124, 125, 126, - 123, 127, 128, 128, 129, 122, 130, 26, 131, 132, 133, 131, 131, 131, 131, 131, - 132, 133, 134, 131, 135, 131, 131, 131, 136, 137, 138, 139, 137, 137, 140, 141, - 138, 142, 143, 137, 144, 137, 145, 26, 146, 147, 147, 147, 147, 147, 147, 148, - 147, 147, 147, 149, 26, 26, 26, 26, 150, 151, 152, 152, 153, 152, 152, 154, - 155, 156, 152, 157, 26, 26, 26, 26, 158, 158, 158, 158, 158, 158, 158, 158, - 158, 159, 158, 158, 158, 160, 159, 158, 158, 158, 158, 159, 158, 158, 158, 161, - 158, 161, 162, 163, 26, 26, 26, 26, 164, 164, 164, 164, 164, 164, 164, 164, - 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 165, 165, 165, 165, - 166, 167, 165, 165, 165, 165, 165, 168, 169, 169, 169, 169, 169, 169, 169, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, 170, 170, 170, 170, - 170, 171, 172, 171, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 171, 172, - 171, 170, 172, 170, 170, 170, 170, 170, 170, 170, 171, 170, 170, 170, 170, 170, - 170, 170, 170, 173, 170, 170, 170, 174, 170, 170, 170, 175, 176, 176, 176, 176, - 176, 176, 176, 176, 176, 176, 177, 177, 178, 178, 178, 178, 178, 178, 178, 178, - 178, 178, 178, 178, 178, 178, 178, 178, 179, 179, 179, 180, 181, 181, 181, 181, - 181, 181, 181, 181, 181, 182, 181, 183, 184, 184, 185, 186, 187, 187, 188, 26, - 189, 189, 190, 26, 191, 192, 193, 26, 194, 194, 194, 194, 194, 194, 194, 194, - 194, 194, 194, 195, 194, 196, 194, 196, 197, 198, 198, 199, 198, 198, 198, 198, - 198, 198, 198, 198, 198, 198, 198, 200, 198, 198, 198, 198, 198, 201, 178, 178, - 178, 178, 178, 178, 178, 178, 202, 26, 203, 203, 203, 204, 203, 205, 203, 205, - 206, 203, 207, 207, 207, 208, 209, 26, 210, 210, 210, 210, 210, 211, 210, 210, - 210, 212, 210, 213, 194, 194, 194, 194, 214, 214, 214, 215, 216, 216, 216, 216, - 216, 216, 216, 217, 216, 216, 216, 218, 216, 219, 216, 219, 216, 220, 9, 9, - 9, 221, 26, 26, 26, 26, 26, 26, 222, 222, 222, 222, 222, 222, 222, 222, - 222, 223, 222, 222, 222, 222, 222, 224, 225, 225, 225, 225, 225, 225, 225, 225, - 226, 226, 226, 226, 226, 226, 227, 228, 229, 229, 229, 229, 229, 229, 229, 230, - 229, 231, 232, 232, 232, 232, 232, 232, 18, 233, 165, 165, 165, 165, 165, 234, - 225, 26, 235, 9, 236, 237, 238, 239, 2, 2, 2, 2, 240, 241, 2, 2, - 2, 2, 2, 242, 243, 244, 2, 245, 2, 2, 2, 2, 2, 2, 2, 246, - 9, 9, 9, 9, 9, 9, 9, 9, 14, 14, 247, 247, 14, 14, 14, 14, - 247, 247, 14, 248, 14, 14, 14, 247, 14, 14, 14, 14, 14, 14, 249, 14, - 249, 14, 250, 251, 14, 14, 252, 253, 0, 254, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 255, 0, 256, 257, 0, 258, 2, 259, 0, 0, 0, 0, - 260, 26, 9, 9, 9, 9, 261, 26, 0, 0, 0, 0, 262, 263, 4, 0, - 0, 264, 0, 0, 2, 2, 2, 2, 2, 265, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 258, 26, 26, 26, - 0, 266, 26, 26, 0, 0, 0, 0, 267, 267, 267, 267, 267, 267, 267, 267, - 267, 267, 267, 267, 267, 267, 267, 267, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 268, 0, 0, 0, 269, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 270, 270, 270, 270, 270, 270, 270, 270, - 270, 270, 270, 270, 2, 2, 2, 2, 17, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 271, 272, 165, 165, 165, 165, 166, 167, 273, 273, - 273, 273, 273, 273, 273, 274, 275, 274, 170, 170, 172, 26, 172, 172, 172, 172, - 172, 172, 172, 172, 18, 18, 18, 18, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 276, 26, 26, 26, 26, 277, 277, 277, 278, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 279, 26, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 280, 26, 26, 26, 0, 281, 282, 0, 0, 0, 283, 284, 0, 285, - 286, 287, 287, 287, 287, 287, 287, 287, 287, 287, 288, 289, 290, 291, 291, 291, - 291, 291, 291, 291, 291, 291, 291, 292, 293, 294, 294, 294, 294, 294, 295, 169, - 169, 169, 169, 169, 169, 169, 169, 169, 169, 296, 0, 0, 294, 294, 294, 294, - 0, 0, 0, 0, 281, 26, 291, 291, 169, 169, 169, 296, 0, 0, 0, 0, - 0, 0, 0, 0, 169, 169, 169, 297, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 291, 291, 291, 291, 291, 298, 291, 291, 291, 291, 291, 291, 291, 291, - 291, 291, 291, 0, 0, 0, 0, 0, 277, 277, 277, 277, 277, 277, 277, 277, - 0, 0, 0, 0, 0, 0, 0, 0, 299, 299, 299, 299, 299, 299, 299, 299, - 299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 299, 299, 299, 299, 299, 299, - 301, 26, 302, 302, 302, 302, 302, 302, 303, 303, 303, 303, 303, 303, 303, 303, - 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, 304, 26, 26, - 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 18, 305, 305, 305, 305, - 305, 305, 305, 305, 305, 305, 305, 26, 0, 0, 0, 0, 306, 2, 2, 2, - 2, 2, 2, 2, 2, 2, 2, 2, 2, 307, 2, 2, 2, 2, 2, 2, - 2, 308, 309, 310, 26, 26, 311, 2, 312, 312, 312, 312, 312, 313, 0, 314, - 315, 315, 315, 315, 315, 315, 315, 26, 316, 316, 316, 316, 316, 316, 316, 316, - 317, 318, 316, 319, 53, 53, 53, 53, 320, 320, 320, 320, 320, 321, 322, 322, - 322, 322, 323, 324, 169, 169, 169, 325, 326, 326, 326, 326, 326, 326, 326, 326, - 326, 327, 326, 328, 164, 164, 164, 329, 330, 330, 330, 330, 330, 330, 331, 26, - 330, 332, 330, 333, 164, 164, 164, 164, 334, 334, 334, 334, 334, 334, 334, 334, - 335, 26, 26, 336, 337, 337, 338, 26, 339, 339, 339, 26, 172, 172, 2, 2, - 2, 2, 2, 340, 341, 342, 176, 176, 176, 176, 176, 176, 176, 176, 176, 176, - 337, 337, 337, 337, 337, 343, 337, 344, 169, 169, 169, 169, 345, 26, 169, 169, - 296, 346, 169, 169, 169, 169, 169, 345, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 280, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 347, 26, 26, 26, 26, 348, 26, 349, 350, 25, 25, 351, 352, - 353, 25, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 354, 26, 355, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 356, - 31, 31, 31, 31, 31, 31, 31, 31, 31, 31, 357, 31, 31, 31, 31, 31, - 31, 358, 26, 26, 26, 26, 31, 31, 9, 9, 0, 314, 9, 359, 0, 0, - 0, 0, 360, 0, 258, 281, 361, 31, 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 362, 363, 0, 0, 0, 1, 2, 2, 3, - 1, 2, 2, 3, 364, 291, 290, 291, 291, 291, 291, 365, 169, 169, 169, 296, - 366, 366, 366, 367, 258, 258, 26, 368, 369, 370, 369, 369, 371, 369, 369, 372, - 369, 373, 369, 373, 26, 26, 26, 26, 369, 369, 369, 369, 369, 369, 369, 369, - 369, 369, 369, 369, 369, 369, 369, 374, 375, 0, 0, 0, 0, 0, 376, 0, - 14, 14, 14, 14, 14, 14, 14, 14, 14, 253, 0, 377, 378, 26, 26, 26, - 26, 26, 0, 0, 0, 0, 0, 379, 380, 380, 380, 381, 382, 382, 382, 382, - 382, 382, 383, 26, 384, 0, 0, 281, 385, 385, 385, 385, 386, 387, 388, 388, - 388, 389, 390, 390, 390, 390, 390, 391, 392, 392, 392, 393, 394, 394, 394, 394, - 395, 394, 396, 26, 26, 26, 26, 26, 397, 397, 397, 397, 397, 397, 397, 397, - 397, 397, 398, 398, 398, 398, 398, 398, 399, 399, 399, 400, 399, 401, 402, 402, - 402, 402, 403, 402, 402, 402, 402, 403, 404, 404, 404, 404, 404, 26, 405, 405, - 405, 405, 405, 405, 406, 407, 408, 409, 408, 409, 410, 408, 411, 408, 411, 412, - 26, 26, 26, 26, 26, 26, 26, 26, 413, 413, 413, 413, 413, 413, 413, 413, - 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 413, 414, 26, - 413, 413, 415, 26, 413, 26, 26, 26, 416, 2, 2, 2, 2, 2, 417, 308, - 26, 26, 26, 26, 26, 26, 26, 26, 418, 419, 420, 420, 420, 420, 421, 422, - 423, 423, 424, 423, 425, 425, 425, 425, 426, 426, 426, 427, 428, 426, 26, 26, - 26, 26, 26, 26, 429, 429, 430, 431, 432, 432, 432, 433, 434, 434, 434, 435, - 26, 26, 26, 26, 26, 26, 26, 26, 436, 436, 436, 436, 437, 437, 437, 438, - 437, 437, 439, 437, 437, 437, 437, 437, 440, 441, 442, 443, 444, 444, 445, 446, - 444, 447, 444, 447, 448, 448, 448, 448, 449, 449, 449, 449, 26, 26, 26, 26, - 450, 450, 450, 450, 451, 452, 451, 26, 453, 453, 453, 453, 453, 453, 454, 455, - 456, 456, 457, 456, 458, 458, 459, 458, 460, 460, 461, 462, 26, 463, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 464, 464, 464, 464, 464, 464, 464, 464, - 464, 465, 26, 26, 26, 26, 26, 26, 466, 466, 466, 466, 466, 466, 467, 26, - 466, 466, 466, 466, 466, 466, 467, 468, 469, 469, 469, 469, 469, 26, 469, 470, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 31, 31, 31, 50, 471, 471, 471, 471, 471, 472, 473, 26, - 26, 26, 26, 26, 26, 26, 26, 474, 475, 475, 475, 475, 475, 26, 476, 476, - 476, 476, 476, 477, 26, 26, 478, 478, 478, 479, 26, 26, 26, 26, 480, 480, - 480, 481, 26, 26, 482, 482, 483, 26, 484, 484, 484, 484, 484, 484, 484, 484, - 484, 485, 486, 484, 484, 484, 485, 487, 488, 488, 488, 488, 488, 488, 488, 488, - 489, 490, 491, 491, 491, 492, 491, 493, 494, 494, 494, 494, 494, 494, 495, 494, - 494, 26, 496, 496, 496, 496, 497, 26, 498, 498, 498, 498, 498, 498, 498, 498, - 498, 498, 498, 498, 499, 137, 500, 26, 501, 501, 502, 501, 501, 501, 501, 501, - 503, 26, 26, 26, 26, 26, 26, 26, 504, 505, 506, 507, 506, 508, 509, 509, - 509, 509, 509, 509, 509, 510, 509, 511, 512, 513, 514, 515, 515, 516, 517, 518, - 513, 519, 520, 521, 522, 523, 523, 26, 524, 524, 524, 524, 524, 524, 524, 524, - 524, 524, 524, 525, 526, 26, 26, 26, 527, 527, 527, 527, 527, 527, 527, 527, - 527, 26, 527, 528, 26, 26, 26, 26, 529, 529, 529, 529, 529, 529, 530, 529, - 529, 529, 529, 530, 26, 26, 26, 26, 531, 531, 531, 531, 531, 531, 531, 531, - 532, 26, 531, 533, 198, 534, 26, 26, 535, 535, 535, 535, 535, 535, 535, 536, - 535, 536, 26, 26, 26, 26, 26, 26, 537, 537, 537, 538, 537, 539, 537, 537, - 540, 26, 26, 26, 26, 26, 26, 26, 541, 541, 541, 541, 541, 541, 541, 542, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 543, 543, 543, 543, - 543, 543, 543, 543, 543, 543, 544, 545, 546, 547, 548, 549, 549, 549, 550, 551, - 546, 26, 549, 552, 26, 26, 26, 26, 26, 26, 26, 26, 553, 554, 553, 553, - 553, 553, 553, 554, 555, 26, 26, 26, 556, 556, 556, 556, 556, 556, 556, 556, - 556, 26, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 558, 26, 178, 178, - 559, 559, 559, 559, 559, 559, 559, 560, 53, 561, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 562, 563, 562, 562, 562, 562, 564, 562, - 565, 26, 562, 562, 562, 566, 567, 567, 567, 567, 568, 567, 567, 569, 570, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 571, 572, 573, 573, 573, 573, 571, 574, - 573, 26, 573, 575, 576, 577, 578, 578, 578, 579, 580, 581, 578, 582, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 583, 583, 583, 584, 585, 585, 586, 585, 585, 585, 585, 587, - 585, 585, 585, 588, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 589, 26, - 108, 108, 108, 108, 108, 108, 590, 591, 592, 592, 592, 592, 592, 592, 592, 592, - 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 593, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 592, 592, 592, 592, 592, 592, 592, 592, - 592, 592, 592, 592, 592, 594, 595, 26, 592, 592, 592, 592, 592, 592, 592, 592, - 596, 26, 26, 26, 26, 26, 26, 26, 26, 26, 597, 597, 597, 597, 597, 597, - 597, 597, 597, 597, 597, 597, 598, 26, 599, 599, 599, 599, 599, 599, 599, 599, - 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, 599, - 599, 599, 600, 26, 26, 26, 26, 26, 601, 601, 601, 601, 601, 601, 601, 601, - 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, 601, - 602, 26, 26, 26, 26, 26, 26, 26, 305, 305, 305, 305, 305, 305, 305, 305, - 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 305, 603, - 604, 604, 604, 605, 604, 606, 607, 607, 607, 607, 607, 607, 607, 607, 607, 608, - 607, 609, 610, 610, 610, 611, 611, 26, 612, 612, 612, 612, 612, 612, 612, 612, - 613, 26, 612, 614, 614, 612, 612, 615, 612, 612, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 616, 617, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 618, 618, 618, 618, 618, 618, 618, 618, - 618, 619, 618, 618, 618, 618, 618, 618, 618, 620, 618, 618, 26, 26, 26, 26, - 26, 26, 26, 26, 621, 26, 347, 26, 622, 622, 622, 622, 622, 622, 622, 622, - 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, 622, - 622, 622, 622, 622, 622, 622, 622, 26, 623, 623, 623, 623, 623, 623, 623, 623, - 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, - 623, 623, 624, 26, 26, 26, 26, 26, 622, 625, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 626, 627, 628, 287, 287, 287, 287, 287, 287, 287, - 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, - 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 629, 26, 630, 26, - 26, 26, 631, 26, 632, 26, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, - 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, - 633, 633, 633, 633, 633, 633, 633, 634, 635, 635, 635, 635, 635, 635, 635, 635, - 635, 635, 635, 635, 635, 636, 635, 637, 635, 638, 635, 639, 281, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 9, 9, 9, 9, 9, 640, 9, 9, - 221, 26, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 281, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 276, 26, 0, 0, 0, 0, 258, 363, 0, 0, - 0, 0, 0, 0, 641, 642, 0, 643, 644, 645, 0, 0, 0, 646, 0, 0, - 0, 0, 0, 0, 0, 266, 26, 26, 14, 14, 14, 14, 14, 14, 14, 14, - 247, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 0, 0, 281, 26, 0, 0, 281, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 258, 26, 0, 0, 0, 260, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 255, 0, 0, 0, 0, 0, 0, 0, 0, 255, 647, 648, 0, 649, - 650, 0, 0, 0, 0, 0, 0, 0, 269, 651, 255, 255, 0, 0, 0, 652, - 653, 654, 655, 0, 0, 0, 0, 0, 0, 0, 0, 0, 276, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 268, 0, 0, 0, 0, 0, 0, 656, 656, 656, 656, 656, 656, 656, 656, - 656, 656, 656, 656, 656, 656, 656, 656, 656, 657, 26, 658, 659, 656, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 2, 2, 2, 348, 660, 308, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 661, 270, 270, 662, 663, 664, 18, 18, - 18, 18, 18, 18, 18, 665, 26, 26, 26, 666, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 667, 667, 667, 667, 667, 668, 667, 669, - 667, 670, 26, 26, 26, 26, 26, 26, 26, 26, 671, 671, 671, 672, 26, 26, - 673, 673, 673, 673, 673, 673, 673, 674, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 675, 675, 675, 675, 675, 676, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 172, 677, 170, 172, 678, 678, 678, 678, 678, 678, 678, 678, - 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, 678, - 679, 678, 680, 26, 26, 26, 26, 26, 681, 681, 681, 681, 681, 681, 681, 681, - 681, 682, 681, 683, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 363, 0, 0, 0, 0, 0, 0, 0, 377, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 363, 0, 0, 0, 0, 0, 0, 276, - 26, 26, 26, 26, 26, 26, 26, 26, 684, 31, 31, 31, 685, 686, 687, 688, - 689, 690, 685, 691, 685, 687, 687, 692, 31, 693, 31, 694, 695, 693, 31, 694, - 26, 26, 26, 26, 26, 26, 51, 26, 0, 0, 0, 0, 0, 281, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 281, 26, 0, 258, 363, 0, - 363, 0, 363, 0, 0, 0, 276, 26, 0, 0, 0, 0, 0, 276, 26, 26, - 26, 26, 26, 26, 696, 0, 0, 0, 697, 26, 0, 0, 0, 0, 0, 281, - 0, 260, 314, 26, 276, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 698, 0, 377, 0, 377, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 258, 699, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 314, 0, 281, 260, 26, 0, 281, 0, 0, 0, 0, 0, 0, - 0, 26, 0, 314, 0, 0, 0, 0, 0, 26, 0, 0, 0, 276, 314, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 281, 26, 0, 276, 0, 377, 0, 260, 0, 0, 0, 0, 0, 269, - 276, 696, 0, 281, 0, 260, 0, 260, 0, 0, 360, 0, 0, 0, 0, 0, - 0, 266, 26, 26, 26, 26, 0, 314, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 347, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 280, 277, 277, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 347, 26, 277, 277, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 277, 277, 277, 700, 26, 26, 26, 277, 277, 277, 280, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 277, 277, 277, 277, 277, 277, 277, 277, - 277, 701, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 26, 702, 26, 26, 26, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, 9, - 9, 9, 9, 9, 9, 9, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 391, 391, 391, 391, 391, 391, 391, 685, 0, 0, 0, 0, 1, 2, 1, 2, + 0, 0, 3, 3, 4, 5, 4, 5, 4, 4, 4, 4, 4, 4, 4, 4, + 4, 4, 4, 6, 0, 0, 7, 0, 8, 8, 8, 8, 8, 8, 8, 9, + 10, 11, 12, 11, 11, 11, 13, 11, 14, 14, 14, 14, 14, 14, 14, 14, + 15, 14, 14, 14, 14, 14, 14, 14, 14, 14, 14, 16, 17, 18, 17, 17, + 19, 20, 21, 21, 22, 21, 23, 24, 25, 26, 27, 27, 28, 29, 27, 30, + 27, 27, 27, 27, 27, 31, 27, 27, 32, 33, 33, 33, 34, 27, 27, 27, + 35, 35, 35, 36, 37, 37, 37, 38, 39, 39, 40, 41, 42, 43, 44, 27, + 45, 46, 27, 27, 27, 27, 47, 27, 48, 48, 48, 48, 48, 49, 50, 48, + 51, 52, 53, 54, 55, 56, 57, 58, 59, 60, 61, 62, 63, 64, 65, 66, + 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, + 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 96, 97, 98, + 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 109, 110, 111, 112, 109, + 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 122, 123, 122, 124, 125, 125, + 126, 127, 128, 129, 130, 131, 125, 125, 132, 132, 132, 132, 133, 132, 134, 135, + 132, 133, 132, 136, 136, 137, 125, 125, 138, 138, 138, 138, 138, 138, 138, 138, + 138, 138, 139, 139, 140, 139, 139, 141, 142, 142, 142, 142, 142, 142, 142, 142, + 143, 143, 143, 143, 144, 145, 143, 143, 144, 143, 143, 146, 147, 148, 143, 143, + 143, 147, 143, 143, 143, 149, 143, 150, 143, 151, 152, 152, 152, 152, 152, 153, + 154, 154, 154, 154, 154, 154, 154, 154, 155, 156, 157, 157, 157, 157, 158, 159, + 160, 161, 162, 163, 164, 165, 166, 167, 168, 168, 168, 168, 168, 169, 170, 170, + 171, 172, 173, 173, 173, 173, 173, 174, 173, 173, 175, 154, 154, 154, 154, 176, + 177, 178, 179, 179, 180, 181, 182, 183, 184, 184, 185, 184, 186, 187, 168, 168, + 188, 189, 190, 190, 190, 191, 190, 192, 193, 193, 194, 8, 195, 125, 125, 125, + 196, 196, 196, 196, 197, 196, 196, 198, 199, 199, 199, 199, 200, 200, 200, 201, + 202, 202, 202, 203, 204, 205, 205, 205, 206, 139, 139, 207, 208, 209, 210, 211, + 4, 4, 212, 4, 4, 213, 214, 215, 4, 4, 4, 216, 8, 8, 8, 8, + 11, 217, 11, 11, 217, 218, 11, 219, 11, 11, 11, 220, 220, 221, 11, 222, + 223, 0, 0, 0, 0, 0, 224, 225, 226, 227, 0, 0, 228, 8, 8, 229, + 0, 0, 230, 231, 232, 0, 4, 4, 233, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 234, 125, 235, 125, 0, 0, + 236, 236, 236, 236, 236, 236, 236, 236, 0, 0, 0, 0, 0, 0, 0, 237, + 0, 238, 0, 0, 0, 0, 0, 0, 239, 239, 239, 239, 239, 239, 4, 4, + 240, 240, 240, 240, 240, 240, 240, 241, 139, 139, 140, 242, 242, 242, 243, 244, + 143, 245, 246, 246, 246, 246, 14, 14, 0, 0, 0, 0, 0, 247, 125, 125, + 248, 249, 248, 248, 248, 248, 248, 250, 248, 248, 248, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 251, 125, 252, 253, 0, 254, 255, 256, 257, 257, 257, + 257, 258, 259, 260, 260, 260, 260, 261, 262, 263, 263, 264, 142, 142, 142, 142, + 265, 0, 263, 263, 0, 0, 266, 260, 142, 265, 0, 0, 0, 0, 142, 267, + 0, 0, 0, 0, 0, 260, 260, 268, 260, 260, 260, 260, 260, 269, 0, 0, + 248, 248, 248, 248, 0, 0, 0, 0, 270, 270, 270, 270, 270, 270, 270, 270, + 271, 270, 270, 270, 272, 273, 273, 273, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 275, 125, 14, 14, 14, 14, 14, 14, 276, 276, 276, 276, 276, 277, + 0, 0, 278, 4, 4, 4, 4, 4, 279, 4, 4, 4, 280, 281, 125, 282, + 283, 283, 284, 285, 286, 286, 286, 287, 288, 288, 288, 288, 289, 290, 48, 48, + 291, 291, 292, 293, 293, 294, 142, 295, 296, 296, 296, 296, 297, 298, 138, 299, + 300, 300, 300, 301, 302, 303, 138, 138, 304, 304, 304, 304, 305, 306, 307, 308, + 309, 310, 246, 4, 4, 311, 312, 152, 152, 152, 152, 152, 307, 307, 313, 314, + 142, 142, 315, 142, 316, 142, 142, 317, 125, 125, 125, 125, 125, 125, 125, 125, + 248, 248, 248, 248, 248, 248, 318, 248, 248, 248, 248, 248, 248, 319, 125, 125, + 320, 321, 21, 322, 323, 27, 27, 27, 27, 27, 27, 27, 324, 325, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 326, 27, 27, 27, 27, + 27, 327, 27, 27, 328, 125, 125, 27, 8, 285, 329, 0, 0, 330, 331, 332, + 27, 27, 27, 27, 27, 27, 27, 333, 334, 0, 1, 2, 1, 2, 335, 259, + 260, 336, 142, 265, 337, 338, 339, 340, 341, 342, 343, 344, 345, 345, 125, 125, + 342, 342, 342, 342, 342, 342, 342, 346, 347, 0, 0, 348, 11, 11, 11, 11, + 349, 350, 351, 125, 125, 0, 0, 352, 353, 354, 355, 355, 355, 356, 357, 252, + 358, 358, 359, 360, 361, 362, 362, 363, 364, 365, 366, 366, 367, 368, 125, 125, + 369, 369, 369, 369, 369, 370, 370, 370, 371, 372, 373, 374, 374, 375, 374, 376, + 377, 377, 378, 379, 379, 379, 380, 381, 381, 382, 383, 384, 125, 125, 125, 125, + 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 385, 386, 385, 387, 388, 125, + 389, 4, 4, 390, 125, 125, 125, 125, 391, 392, 392, 393, 394, 395, 396, 396, + 397, 398, 399, 125, 125, 125, 400, 401, 402, 403, 404, 405, 125, 125, 125, 125, + 406, 406, 407, 408, 407, 409, 407, 407, 410, 411, 412, 413, 414, 414, 415, 415, + 416, 416, 125, 125, 417, 417, 418, 419, 420, 420, 420, 421, 422, 423, 424, 425, + 426, 427, 428, 125, 125, 125, 125, 125, 429, 429, 429, 429, 430, 125, 125, 125, + 431, 431, 431, 432, 431, 431, 431, 433, 434, 434, 435, 436, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 27, 45, 437, 437, 438, 439, 125, 125, 125, 440, + 441, 441, 442, 443, 443, 444, 125, 445, 446, 125, 125, 447, 448, 125, 449, 450, + 451, 451, 451, 451, 452, 453, 451, 454, 455, 455, 455, 455, 456, 457, 458, 459, + 460, 460, 460, 461, 462, 463, 463, 464, 465, 465, 465, 465, 465, 465, 466, 467, + 468, 469, 468, 468, 470, 125, 125, 125, 471, 472, 473, 474, 474, 474, 475, 476, + 477, 478, 479, 480, 481, 482, 483, 484, 485, 485, 485, 485, 485, 486, 487, 125, + 488, 488, 488, 488, 489, 490, 125, 125, 491, 491, 491, 492, 491, 493, 125, 125, + 494, 494, 494, 494, 495, 496, 497, 125, 498, 498, 498, 499, 499, 125, 125, 125, + 500, 501, 502, 500, 503, 125, 125, 125, 504, 504, 504, 505, 125, 125, 125, 125, + 125, 125, 506, 506, 506, 506, 506, 507, 508, 509, 510, 511, 512, 513, 125, 125, + 125, 125, 514, 515, 515, 514, 516, 125, 517, 517, 517, 517, 518, 519, 519, 519, + 519, 519, 520, 154, 521, 521, 521, 522, 523, 125, 125, 125, 125, 125, 125, 125, + 524, 525, 525, 526, 527, 525, 528, 529, 529, 530, 531, 532, 125, 125, 125, 125, + 533, 534, 534, 535, 536, 537, 538, 539, 540, 541, 542, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 543, 544, 545, 546, 545, 547, 545, 548, 125, 125, + 125, 125, 125, 549, 550, 550, 550, 551, 552, 552, 552, 552, 552, 552, 552, 552, + 552, 553, 125, 125, 125, 125, 125, 125, 552, 552, 552, 552, 552, 552, 554, 555, + 552, 552, 552, 552, 556, 125, 125, 125, 125, 557, 557, 557, 557, 557, 557, 558, + 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 559, 560, 125, 125, + 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 561, 562, 125, 125, 125, + 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 276, 563, 564, 565, 566, 567, + 567, 567, 567, 568, 569, 570, 571, 572, 573, 573, 573, 573, 574, 575, 576, 577, + 573, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 125, 578, 578, 578, 578, + 578, 579, 125, 125, 125, 125, 125, 125, 580, 580, 580, 580, 581, 580, 580, 580, + 582, 580, 125, 125, 125, 125, 583, 584, 585, 585, 585, 585, 585, 585, 585, 585, + 585, 585, 585, 585, 585, 585, 585, 586, 587, 587, 587, 587, 587, 587, 587, 587, + 587, 587, 587, 587, 587, 588, 125, 125, 589, 125, 125, 125, 125, 125, 125, 125, + 125, 125, 125, 125, 125, 125, 125, 590, 591, 257, 257, 257, 257, 257, 257, 257, + 257, 257, 257, 257, 257, 257, 257, 257, 257, 257, 592, 593, 125, 594, 595, 596, + 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, + 598, 598, 598, 598, 598, 598, 599, 600, 601, 602, 266, 125, 125, 125, 125, 125, + 8, 8, 603, 8, 604, 0, 0, 0, 0, 0, 0, 0, 266, 125, 125, 125, + 0, 0, 0, 0, 0, 0, 0, 605, 0, 0, 606, 0, 0, 0, 607, 608, + 609, 0, 610, 0, 0, 0, 235, 125, 11, 11, 11, 11, 611, 125, 125, 125, + 125, 125, 125, 125, 0, 266, 0, 266, 0, 0, 0, 0, 0, 234, 0, 612, + 0, 0, 0, 0, 0, 224, 0, 0, 0, 613, 614, 615, 616, 0, 0, 0, + 617, 618, 0, 619, 620, 621, 0, 0, 0, 0, 622, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 623, 0, 0, 0, 624, 624, 624, 624, 624, 624, 624, 624, + 625, 626, 627, 125, 125, 125, 125, 125, 4, 628, 629, 125, 125, 125, 125, 125, + 630, 631, 632, 14, 14, 14, 633, 125, 634, 125, 125, 125, 125, 125, 125, 125, + 635, 635, 636, 637, 638, 125, 125, 125, 125, 639, 640, 125, 641, 641, 641, 642, + 125, 125, 125, 125, 125, 643, 643, 644, 125, 125, 125, 125, 125, 125, 645, 646, + 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 647, 648, 649, 125, 125, + 650, 650, 650, 650, 651, 652, 125, 125, 125, 125, 125, 125, 125, 125, 125, 334, + 0, 0, 0, 653, 125, 125, 125, 125, 334, 0, 0, 247, 125, 125, 125, 125, + 654, 27, 655, 656, 657, 658, 659, 660, 661, 662, 663, 662, 125, 125, 125, 664, + 0, 0, 252, 0, 0, 0, 0, 0, 0, 266, 226, 334, 334, 334, 0, 605, + 0, 0, 247, 125, 125, 125, 665, 0, 666, 0, 0, 252, 612, 667, 605, 125, + 0, 0, 0, 0, 0, 668, 350, 350, 0, 0, 0, 0, 0, 0, 0, 669, + 0, 0, 0, 0, 0, 285, 252, 228, 252, 0, 0, 0, 670, 285, 0, 0, + 670, 0, 247, 667, 125, 125, 125, 125, 0, 0, 0, 0, 0, 266, 247, 350, + 612, 0, 0, 671, 672, 252, 612, 612, 0, 330, 0, 0, 235, 125, 125, 285, + 248, 248, 248, 248, 248, 248, 125, 125, 248, 248, 248, 319, 248, 248, 248, 248, + 248, 318, 248, 248, 248, 248, 248, 248, 248, 248, 584, 248, 248, 248, 248, 248, + 248, 248, 248, 248, 248, 248, 673, 125, 248, 318, 125, 125, 125, 125, 125, 125, + 248, 248, 248, 248, 674, 248, 248, 248, 248, 248, 248, 125, 125, 125, 125, 125, + 675, 125, 0, 0, 0, 0, 0, 0, 8, 8, 8, 8, 8, 8, 8, 8, + 8, 8, 8, 8, 8, 8, 8, 0, 0, 0, 0, 0, 1, 2, 2, 2, + 2, 2, 3, 0, 0, 0, 4, 0, 2, 2, 2, 2, 2, 3, 2, 2, + 2, 2, 5, 0, 2, 5, 6, 0, 7, 7, 7, 7, 8, 9, 10, 11, + 12, 13, 14, 15, 8, 8, 8, 8, 16, 8, 8, 8, 17, 18, 18, 18, + 19, 19, 19, 19, 19, 20, 19, 19, 21, 22, 22, 22, 22, 22, 22, 22, + 22, 23, 21, 22, 22, 22, 23, 21, 24, 25, 25, 25, 25, 25, 25, 25, + 25, 25, 12, 12, 25, 25, 26, 27, 25, 28, 12, 12, 29, 30, 29, 31, + 29, 29, 32, 32, 29, 29, 29, 29, 31, 29, 33, 7, 7, 34, 29, 29, + 35, 29, 29, 29, 29, 29, 29, 30, 36, 36, 36, 37, 36, 36, 36, 36, + 36, 36, 38, 39, 40, 40, 40, 40, 41, 12, 12, 12, 42, 42, 42, 42, + 42, 42, 43, 44, 45, 45, 45, 45, 45, 45, 45, 46, 45, 45, 45, 47, + 48, 48, 48, 48, 48, 48, 48, 49, 36, 36, 38, 12, 29, 29, 29, 50, + 51, 12, 29, 29, 52, 29, 29, 29, 53, 53, 53, 53, 54, 55, 53, 53, + 53, 56, 53, 53, 57, 58, 57, 59, 59, 57, 57, 57, 57, 57, 60, 57, + 61, 62, 63, 57, 57, 59, 59, 64, 12, 65, 12, 66, 57, 62, 57, 57, + 57, 57, 57, 64, 67, 67, 68, 69, 70, 71, 71, 71, 71, 71, 72, 71, + 72, 73, 74, 72, 68, 69, 70, 74, 75, 12, 67, 76, 12, 77, 71, 71, + 71, 68, 12, 12, 78, 78, 79, 80, 80, 79, 79, 79, 79, 79, 81, 79, + 81, 78, 82, 79, 79, 80, 80, 82, 83, 12, 12, 12, 79, 84, 79, 79, + 82, 12, 78, 79, 85, 85, 86, 87, 87, 86, 86, 86, 86, 86, 88, 86, + 88, 85, 89, 86, 86, 87, 87, 89, 12, 85, 12, 90, 86, 91, 86, 86, + 86, 86, 12, 12, 92, 93, 94, 92, 95, 96, 97, 95, 98, 99, 94, 92, + 100, 100, 96, 92, 94, 92, 95, 96, 99, 98, 12, 12, 12, 92, 100, 100, + 100, 100, 94, 12, 101, 101, 101, 102, 102, 101, 101, 101, 101, 101, 102, 101, + 101, 101, 103, 101, 101, 102, 102, 103, 12, 104, 105, 106, 101, 107, 101, 101, + 12, 108, 101, 101, 109, 109, 109, 110, 110, 109, 109, 109, 109, 109, 110, 109, + 109, 111, 112, 109, 109, 110, 110, 112, 12, 113, 12, 113, 109, 114, 109, 109, + 111, 12, 12, 12, 115, 115, 115, 116, 116, 115, 115, 115, 115, 115, 115, 115, + 115, 116, 116, 115, 12, 115, 115, 115, 115, 117, 115, 115, 118, 118, 119, 119, + 119, 120, 121, 119, 119, 119, 119, 119, 122, 119, 119, 123, 119, 120, 124, 125, + 119, 126, 119, 119, 12, 121, 119, 119, 121, 127, 12, 12, 128, 129, 129, 129, + 129, 129, 129, 129, 129, 129, 130, 131, 129, 129, 129, 12, 12, 12, 12, 12, + 132, 133, 134, 135, 135, 135, 135, 135, 135, 136, 135, 135, 135, 135, 135, 137, + 135, 138, 135, 134, 135, 135, 137, 135, 139, 139, 139, 139, 139, 139, 140, 139, + 139, 139, 139, 141, 140, 139, 139, 139, 139, 139, 139, 142, 139, 143, 144, 12, + 145, 145, 145, 145, 146, 146, 146, 146, 146, 147, 12, 148, 146, 146, 149, 146, + 150, 150, 150, 150, 151, 151, 151, 151, 151, 151, 152, 153, 151, 154, 152, 153, + 152, 153, 151, 154, 152, 153, 151, 151, 151, 154, 151, 151, 151, 151, 154, 155, + 151, 151, 151, 156, 151, 151, 153, 12, 157, 157, 157, 157, 157, 158, 157, 158, + 159, 159, 159, 159, 160, 160, 160, 160, 160, 160, 160, 161, 162, 162, 162, 162, + 162, 162, 163, 164, 162, 162, 165, 12, 166, 166, 166, 166, 166, 167, 12, 168, + 169, 169, 169, 169, 169, 170, 12, 12, 171, 171, 171, 171, 171, 12, 12, 12, + 172, 172, 172, 173, 173, 12, 12, 12, 174, 174, 174, 174, 174, 174, 174, 175, + 174, 174, 175, 12, 176, 177, 178, 178, 178, 178, 179, 12, 178, 178, 178, 178, + 178, 178, 180, 12, 178, 178, 181, 12, 159, 182, 12, 12, 183, 183, 183, 183, + 183, 183, 183, 184, 183, 183, 183, 12, 185, 183, 183, 183, 186, 186, 186, 186, + 186, 186, 186, 187, 186, 188, 12, 12, 189, 189, 189, 189, 189, 189, 189, 12, + 189, 189, 190, 12, 189, 189, 191, 192, 193, 193, 193, 193, 193, 193, 193, 194, + 195, 195, 195, 195, 195, 195, 195, 196, 195, 195, 195, 197, 195, 195, 198, 12, + 195, 195, 195, 198, 7, 7, 7, 199, 200, 200, 200, 200, 200, 200, 200, 201, + 200, 200, 200, 202, 203, 203, 203, 203, 204, 204, 204, 204, 204, 12, 12, 204, + 205, 205, 205, 205, 205, 205, 206, 205, 205, 205, 207, 208, 209, 209, 209, 209, + 19, 19, 210, 12, 146, 146, 211, 212, 203, 203, 12, 12, 213, 7, 7, 7, + 214, 7, 215, 216, 0, 215, 217, 12, 2, 218, 219, 2, 2, 2, 2, 220, + 221, 218, 222, 2, 2, 2, 223, 2, 2, 2, 2, 224, 8, 225, 8, 225, + 8, 8, 226, 226, 8, 8, 8, 225, 8, 15, 8, 8, 8, 10, 8, 227, + 10, 15, 8, 14, 0, 0, 0, 228, 0, 229, 0, 0, 230, 0, 0, 231, + 0, 0, 0, 232, 2, 2, 2, 233, 234, 12, 12, 12, 235, 12, 12, 12, + 0, 236, 237, 0, 4, 0, 0, 0, 0, 0, 0, 4, 2, 2, 5, 12, + 0, 232, 12, 12, 0, 0, 232, 12, 238, 238, 238, 238, 0, 239, 0, 0, + 0, 240, 0, 0, 241, 241, 241, 241, 18, 18, 18, 18, 18, 12, 242, 18, + 243, 243, 243, 243, 243, 243, 12, 244, 245, 12, 12, 244, 151, 154, 12, 12, + 151, 154, 151, 154, 0, 0, 0, 246, 247, 247, 247, 247, 247, 247, 248, 247, + 247, 12, 12, 12, 247, 249, 12, 12, 0, 0, 0, 12, 0, 250, 0, 0, + 251, 247, 252, 253, 0, 0, 247, 0, 254, 255, 255, 255, 255, 255, 255, 255, + 255, 256, 257, 258, 259, 260, 260, 260, 260, 260, 260, 260, 260, 260, 261, 259, + 12, 262, 263, 263, 263, 263, 263, 263, 264, 150, 150, 150, 150, 150, 150, 265, + 0, 12, 12, 12, 150, 150, 150, 266, 260, 260, 260, 261, 260, 260, 0, 0, + 267, 267, 267, 267, 267, 267, 267, 268, 267, 269, 12, 12, 270, 270, 270, 270, + 271, 271, 271, 271, 271, 271, 271, 12, 272, 272, 272, 272, 272, 272, 12, 12, + 237, 2, 2, 2, 2, 2, 231, 2, 2, 2, 273, 12, 274, 275, 276, 12, + 277, 2, 2, 2, 278, 278, 278, 278, 278, 278, 278, 279, 0, 0, 246, 12, + 280, 280, 280, 280, 280, 280, 12, 12, 281, 281, 281, 281, 281, 282, 12, 283, + 281, 281, 282, 12, 284, 284, 284, 284, 284, 284, 284, 285, 286, 286, 286, 286, + 286, 12, 12, 287, 150, 150, 150, 288, 289, 289, 289, 289, 289, 289, 289, 290, + 289, 289, 291, 292, 145, 145, 145, 293, 294, 294, 294, 294, 294, 295, 12, 12, + 294, 294, 294, 296, 294, 294, 296, 294, 297, 297, 297, 297, 298, 12, 12, 12, + 12, 12, 299, 297, 300, 300, 300, 300, 300, 301, 12, 12, 155, 154, 155, 154, + 155, 154, 12, 12, 2, 2, 3, 2, 2, 302, 303, 12, 300, 300, 300, 304, + 300, 300, 304, 12, 150, 12, 12, 12, 150, 265, 305, 150, 150, 150, 150, 12, + 247, 247, 247, 249, 247, 247, 249, 12, 2, 273, 12, 12, 306, 22, 12, 24, + 25, 26, 25, 307, 308, 309, 25, 25, 50, 12, 12, 12, 310, 29, 29, 29, + 29, 29, 29, 311, 312, 29, 29, 29, 29, 29, 12, 310, 7, 7, 7, 313, + 232, 0, 0, 0, 0, 232, 0, 12, 29, 314, 29, 29, 29, 29, 29, 315, + 316, 0, 0, 0, 0, 317, 260, 260, 260, 260, 260, 318, 319, 150, 319, 150, + 319, 150, 319, 288, 0, 232, 0, 232, 12, 12, 316, 246, 320, 320, 320, 321, + 320, 320, 320, 320, 320, 322, 320, 320, 320, 320, 322, 323, 320, 320, 320, 324, + 320, 320, 322, 12, 232, 131, 0, 0, 0, 131, 0, 0, 8, 8, 8, 14, + 0, 0, 0, 234, 325, 12, 12, 12, 0, 0, 0, 326, 327, 327, 327, 327, + 327, 327, 327, 328, 329, 329, 329, 329, 330, 12, 12, 12, 215, 0, 0, 0, + 331, 331, 331, 331, 331, 12, 12, 332, 333, 333, 333, 333, 333, 333, 334, 12, + 335, 335, 335, 335, 335, 335, 336, 12, 337, 337, 337, 337, 337, 337, 337, 338, + 339, 339, 339, 339, 339, 12, 339, 339, 339, 340, 12, 12, 341, 341, 341, 341, + 342, 342, 342, 342, 343, 343, 343, 343, 343, 343, 343, 344, 343, 343, 344, 12, + 345, 345, 345, 345, 345, 12, 345, 345, 345, 345, 345, 12, 346, 346, 346, 346, + 346, 346, 12, 12, 347, 347, 347, 347, 347, 12, 12, 348, 349, 349, 350, 349, + 350, 351, 349, 349, 351, 349, 349, 349, 351, 349, 351, 352, 353, 353, 353, 353, + 353, 354, 12, 12, 353, 355, 12, 12, 353, 353, 12, 12, 2, 274, 2, 2, + 356, 2, 273, 12, 357, 358, 359, 357, 357, 357, 357, 357, 357, 360, 361, 362, + 363, 363, 363, 363, 363, 364, 363, 363, 365, 365, 365, 365, 366, 366, 366, 366, + 366, 366, 366, 367, 12, 368, 366, 366, 369, 369, 369, 369, 370, 371, 372, 369, + 373, 373, 373, 373, 373, 373, 373, 374, 375, 375, 375, 375, 375, 375, 376, 377, + 378, 378, 378, 378, 379, 379, 379, 379, 379, 379, 12, 379, 380, 379, 379, 379, + 381, 382, 12, 381, 381, 383, 383, 381, 381, 381, 381, 381, 381, 384, 385, 386, + 381, 381, 387, 12, 388, 388, 388, 388, 389, 389, 389, 389, 390, 390, 390, 390, + 390, 391, 392, 390, 390, 391, 12, 12, 393, 393, 393, 393, 393, 394, 395, 393, + 396, 396, 396, 396, 396, 397, 396, 396, 398, 398, 398, 398, 399, 12, 398, 398, + 400, 400, 400, 400, 401, 12, 402, 403, 12, 12, 402, 400, 404, 404, 404, 404, + 404, 404, 405, 12, 406, 406, 406, 406, 407, 12, 12, 12, 407, 12, 408, 406, + 409, 409, 409, 409, 409, 409, 12, 12, 409, 409, 410, 12, 411, 411, 411, 411, + 411, 411, 412, 413, 413, 12, 12, 12, 12, 12, 12, 414, 415, 415, 415, 415, + 415, 415, 12, 12, 416, 416, 416, 416, 416, 416, 417, 12, 418, 418, 418, 418, + 418, 418, 419, 12, 420, 420, 420, 420, 420, 420, 420, 12, 421, 421, 421, 421, + 421, 422, 12, 12, 423, 423, 423, 423, 423, 423, 423, 424, 425, 423, 423, 423, + 423, 424, 12, 426, 427, 427, 427, 427, 428, 12, 12, 429, 430, 430, 430, 430, + 430, 430, 431, 12, 430, 430, 432, 12, 433, 433, 433, 433, 433, 434, 433, 433, + 433, 433, 12, 12, 435, 435, 435, 435, 435, 436, 12, 12, 437, 437, 437, 437, + 118, 119, 119, 119, 119, 127, 12, 12, 438, 438, 438, 438, 439, 438, 438, 438, + 440, 12, 12, 12, 441, 442, 443, 444, 441, 441, 441, 444, 441, 441, 445, 12, + 446, 446, 446, 446, 446, 446, 447, 12, 446, 446, 448, 12, 449, 450, 449, 451, + 451, 449, 449, 449, 449, 449, 452, 449, 452, 450, 453, 449, 449, 451, 451, 454, + 455, 456, 12, 450, 449, 457, 449, 455, 449, 455, 12, 12, 458, 458, 458, 458, + 458, 458, 458, 459, 460, 12, 12, 12, 461, 461, 461, 461, 461, 461, 12, 12, + 461, 461, 462, 12, 463, 463, 463, 463, 463, 464, 463, 463, 463, 463, 463, 464, + 465, 465, 465, 465, 465, 466, 12, 12, 465, 465, 467, 12, 178, 178, 178, 180, + 468, 468, 468, 468, 468, 468, 469, 12, 470, 470, 470, 470, 470, 470, 471, 472, + 470, 470, 470, 12, 470, 471, 12, 12, 473, 473, 473, 473, 473, 473, 473, 12, + 474, 474, 474, 474, 475, 12, 12, 476, 477, 478, 479, 477, 477, 480, 477, 477, + 477, 477, 477, 477, 477, 481, 482, 477, 477, 478, 12, 12, 477, 477, 483, 12, + 484, 484, 485, 484, 484, 484, 484, 484, 484, 486, 12, 12, 487, 487, 487, 487, + 487, 487, 12, 12, 488, 488, 488, 488, 489, 12, 12, 12, 490, 490, 490, 490, + 490, 490, 491, 12, 53, 53, 492, 12, 493, 493, 494, 493, 493, 493, 493, 493, + 493, 495, 493, 493, 493, 496, 12, 12, 493, 493, 493, 497, 498, 498, 498, 498, + 499, 498, 498, 498, 498, 498, 500, 498, 498, 501, 12, 12, 502, 503, 504, 502, + 502, 502, 502, 502, 502, 503, 505, 504, 502, 502, 12, 12, 502, 502, 506, 12, + 507, 508, 509, 507, 507, 507, 507, 507, 507, 507, 507, 510, 508, 507, 511, 12, + 507, 507, 512, 12, 513, 513, 513, 513, 513, 513, 514, 12, 515, 515, 515, 515, + 516, 515, 515, 515, 515, 515, 517, 518, 515, 515, 519, 12, 520, 12, 12, 12, + 100, 100, 100, 100, 96, 12, 12, 98, 521, 521, 521, 521, 521, 521, 522, 12, + 521, 521, 521, 523, 521, 524, 12, 12, 521, 12, 12, 12, 525, 525, 525, 525, + 526, 12, 12, 12, 527, 527, 527, 527, 527, 528, 12, 12, 529, 529, 529, 529, + 529, 530, 12, 12, 272, 272, 531, 12, 532, 532, 532, 532, 532, 532, 532, 533, + 532, 532, 534, 535, 536, 536, 536, 536, 536, 536, 536, 537, 536, 536, 538, 12, + 539, 539, 539, 539, 539, 539, 539, 540, 539, 540, 12, 12, 541, 541, 541, 541, + 541, 542, 12, 12, 541, 541, 543, 541, 543, 541, 541, 541, 541, 541, 12, 544, + 545, 545, 545, 545, 545, 545, 546, 12, 547, 547, 547, 547, 547, 547, 548, 549, + 547, 547, 12, 549, 550, 551, 12, 12, 249, 12, 12, 12, 552, 552, 552, 552, + 552, 552, 12, 12, 553, 553, 553, 553, 553, 554, 12, 12, 552, 552, 555, 12, + 260, 556, 260, 557, 558, 255, 255, 255, 559, 12, 12, 12, 560, 12, 12, 12, + 256, 561, 12, 12, 12, 260, 12, 12, 562, 562, 562, 562, 562, 562, 562, 12, + 563, 563, 563, 563, 563, 563, 564, 12, 563, 563, 563, 565, 563, 563, 565, 12, + 563, 563, 566, 563, 7, 7, 7, 567, 7, 199, 12, 12, 0, 246, 12, 12, + 0, 232, 316, 0, 0, 568, 228, 0, 0, 0, 568, 7, 213, 569, 7, 0, + 0, 0, 570, 228, 8, 225, 12, 12, 0, 0, 234, 12, 0, 0, 0, 229, + 571, 572, 316, 229, 0, 0, 240, 316, 0, 316, 0, 0, 0, 240, 232, 316, + 0, 229, 0, 229, 0, 0, 240, 232, 0, 573, 239, 0, 229, 0, 0, 0, + 0, 246, 0, 0, 0, 0, 0, 239, 574, 574, 574, 574, 574, 574, 574, 12, + 12, 12, 575, 574, 576, 574, 574, 574, 2, 2, 2, 273, 12, 275, 273, 12, + 241, 577, 241, 241, 241, 241, 578, 241, 579, 580, 577, 12, 19, 19, 19, 581, + 12, 12, 12, 582, 583, 583, 583, 583, 583, 583, 583, 584, 583, 583, 583, 585, + 583, 583, 585, 586, 587, 587, 587, 587, 587, 587, 587, 588, 589, 589, 589, 589, + 589, 589, 590, 591, 592, 592, 592, 592, 592, 592, 593, 12, 151, 154, 151, 594, + 151, 151, 151, 154, 595, 595, 595, 595, 595, 596, 595, 595, 595, 597, 12, 12, + 598, 598, 598, 598, 598, 598, 598, 12, 598, 598, 599, 600, 0, 234, 12, 12, + 29, 414, 29, 29, 601, 602, 414, 29, 50, 29, 603, 12, 604, 310, 603, 414, + 601, 602, 603, 603, 601, 602, 50, 29, 50, 29, 414, 605, 29, 29, 606, 29, + 29, 29, 29, 12, 414, 414, 606, 29, 51, 12, 12, 12, 12, 239, 0, 0, + 607, 12, 12, 12, 246, 12, 12, 12, 0, 0, 12, 0, 0, 232, 131, 0, + 0, 0, 12, 12, 0, 0, 0, 240, 0, 246, 12, 239, 608, 12, 12, 12, + 247, 247, 609, 12, 610, 12, 12, 12, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 939, 940, 941, 942, 946, 948, 0, 962, 969, 970, 971, 976,1001,1002,1003,1008, 0,1033,1040,1041,1042,1043,1047, 0, 0,1080,1081,1082,1086,1110, 0, 0,1124,1125,1126,1127,1131,1133, 0,1147, @@ -4562,21 +4387,14 @@ _hb_ucd_u16[9320] = 817, 818, 819, 820, 821, 935, 0, 0, }; static const int16_t -_hb_ucd_i16[196] = +_hb_ucd_i16[92] = { - 0, 0, 0, 0, 1, -1, 0, 0, 2, 0, -2, 0, 0, 0, 0, 2, - 0, -2, 0, 0, 0, 0, 0, 16, 0, 0, 0, -16, 0, 0, 1, -1, - 0, 0, 0, 1, -1, 0, 0, 0, 0, 1, -1, 0, 3, 3, 3, -3, - -3, -3, 0, 0, 0, 2016, 0, 0, 0, 0, 0, 2527, 1923, 1914, 1918, 0, - 2250, 0, 0, 0, 0, 0, 0, 138, 0, 7, 0, 0, -7, 0, 0, 0, - 1, -1, 1, -1, -1, 1, -1, 0, 1824, 0, 0, 0, 0, 0, 2104, 0, - 2108, 2106, 0, 2106, 1316, 0, 0, 0, 0, 1, -1, 1, -1, -138, 0, 0, - 1, -1, 8, 8, 8, 0, 7, 7, 0, 0, -8, -8, -8, -7, -7, 0, - 1, -1, 0, 2,-1316, 1, -1, 0, -1, 1, -1, 1, -1, 3, 1, -1, - -3, 1, -1, 1, -1, 0, 0,-1914,-1918, 0, 0,-1923,-1824, 0, 0, 0, - 0,-2016, 0, 0, 1, -1, 0, 1, 0, 0,-2104, 0, 0, 0, 0,-2106, - -2108,-2106, 0, 0, 1, -1,-2250, 0, 0, 0,-2527, 0, 0, -2, 0, 1, - -1, 0, 1, -1, + 0, 0, 1, -1, 2, 0, -2, 0, 0, 2, 0, -2, 0, 16, 0, -16, + 0, 1, -1, 0, 3, 3, 3, -3, -3, -3, 0, 2016, 0, 2527, 1923, 1914, + 1918, 0, 2250, 0, 0, 138, 0, 7, -7, 0, -1, 1, 1824, 0, 2104, 0, + 2108, 2106, 0, 2106, 1316, 0, -1, -138, 8, 8, 8, 0, 7, 7, -8, -8, + -8, -7,-1316, 1, -1, 3, -3, 1, 0,-1914,-1918, 0, 0,-1923,-1824, 0, + 0,-2016,-2104, 0, 0,-2106,-2108,-2106,-2250, 0,-2527, 0, }; static inline uint_fast8_t @@ -4597,17 +4415,17 @@ _hb_ucd_b4 (const uint8_t* a, unsigned i) static inline int_fast16_t _hb_ucd_bmg (unsigned u) { - return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9540+(((_hb_ucd_u8[9420+(((_hb_ucd_b4(9292+_hb_ucd_u8,u>>2>>3>>3))<<3)+((u>>2>>3)&7u))])<<3)+((u>>2)&7u))])<<2)+((u)&3u)]:0; + return u<65380u?_hb_ucd_i16[((_hb_ucd_u8[9684+(((_hb_ucd_u8[9452+(((_hb_ucd_u8[9356+(((_hb_ucd_b4(9292+_hb_ucd_u8,u>>1>>2>>3>>3))<<3)+((u>>1>>2>>3)&7u))])<<3)+((u>>1>>2)&7u))])<<2)+((u>>1)&3u))])<<1)+((u)&1u)]:0; } static inline uint_fast8_t _hb_ucd_sc (unsigned u) { - return u<918000u?_hb_ucd_u8[11062+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10326+(((_hb_ucd_u8[9876+(u>>3>>4>>4)])<<4)+((u>>3>>4)&15u))])<<4)+((u>>3)&15u))])<<3)+((u)&7u))]:2; + return u<918000u?_hb_ucd_u8[11118+(((_hb_ucd_u16[4024+(((_hb_ucd_u16[2040+(((_hb_ucd_u8[10382+(((_hb_ucd_u8[9932+(u>>2>>2>>3>>4)])<<4)+((u>>2>>2>>3)&15u))])<<3)+((u>>2>>2)&7u))])<<2)+((u>>2)&3u))])<<2)+((u)&3u))]:2; } static inline uint_fast16_t _hb_ucd_dm (unsigned u) { - return u<195102u?_hb_ucd_u16[6008+(((_hb_ucd_u8[17068+(((_hb_ucd_u8[16686+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; + return u<195102u?_hb_ucd_u16[6728+(((_hb_ucd_u8[13944+(((_hb_ucd_u8[13562+(u>>4>>5)])<<5)+((u>>4)&31u))])<<4)+((u)&15u))]:0; } diff --git a/thirdparty/harfbuzz/src/hb-ucd.cc b/thirdparty/harfbuzz/src/hb-ucd.cc index baea224a25..4c8b1ee5e6 100644 --- a/thirdparty/harfbuzz/src/hb-ucd.cc +++ b/thirdparty/harfbuzz/src/hb-ucd.cc @@ -129,12 +129,16 @@ hb_ucd_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED, hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab, void *user_data HB_UNUSED) { + // Hangul is handled algorithmically. if (_hb_ucd_compose_hangul (a, b, ab)) return true; hb_codepoint_t u = 0; if ((a & 0xFFFFF800u) == 0x0000u && (b & 0xFFFFFF80) == 0x0300u) { + /* If "a" is small enough and "b" is in the U+0300 range, + * the composition data is encoded in a 32bit array sorted + * by "a,b" pair. */ uint32_t k = HB_CODEPOINT_ENCODE3_11_7_14 (a, b, 0); const uint32_t *v = hb_bsearch (k, _hb_ucd_dm2_u32_map, @@ -146,6 +150,8 @@ hb_ucd_compose (hb_unicode_funcs_t *ufuncs HB_UNUSED, } else { + /* Otherwise it is stored in a 64bit array sorted by + * "a,b" pair. */ uint64_t k = HB_CODEPOINT_ENCODE3 (a, b, 0); const uint64_t *v = hb_bsearch (k, _hb_ucd_dm2_u64_map, @@ -170,15 +176,22 @@ hb_ucd_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, unsigned i = _hb_ucd_dm (ab); + /* If no data, there's no decomposition. */ if (likely (!i)) return false; i--; + /* Check if it's a single-character decomposition. */ if (i < ARRAY_LENGTH (_hb_ucd_dm1_p0_map) + ARRAY_LENGTH (_hb_ucd_dm1_p2_map)) { + /* Single-character decompositions currently are only in plane 0 or plane 2. */ if (i < ARRAY_LENGTH (_hb_ucd_dm1_p0_map)) + { + /* Plane 0. */ *a = _hb_ucd_dm1_p0_map[i]; + } else { + /* Plane 2. */ i -= ARRAY_LENGTH (_hb_ucd_dm1_p0_map); *a = 0x20000 | _hb_ucd_dm1_p2_map[i]; } @@ -187,8 +200,10 @@ hb_ucd_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, } i -= ARRAY_LENGTH (_hb_ucd_dm1_p0_map) + ARRAY_LENGTH (_hb_ucd_dm1_p2_map); + /* Otherwise they are encoded either in a 32bit array or a 64bit array. */ if (i < ARRAY_LENGTH (_hb_ucd_dm2_u32_map)) { + /* 32bit array. */ uint32_t v = _hb_ucd_dm2_u32_map[i]; *a = HB_CODEPOINT_DECODE3_11_7_14_1 (v); *b = HB_CODEPOINT_DECODE3_11_7_14_2 (v); @@ -196,6 +211,7 @@ hb_ucd_decompose (hb_unicode_funcs_t *ufuncs HB_UNUSED, } i -= ARRAY_LENGTH (_hb_ucd_dm2_u32_map); + /* 64bit array. */ uint64_t v = _hb_ucd_dm2_u64_map[i]; *a = HB_CODEPOINT_DECODE3_1 (v); *b = HB_CODEPOINT_DECODE3_2 (v); diff --git a/thirdparty/harfbuzz/src/hb-unicode.cc b/thirdparty/harfbuzz/src/hb-unicode.cc index c1795dc7f2..9a6471e52c 100644 --- a/thirdparty/harfbuzz/src/hb-unicode.cc +++ b/thirdparty/harfbuzz/src/hb-unicode.cc @@ -377,20 +377,30 @@ hb_unicode_funcs_set_##name##_func (hb_unicode_funcs_t *ufuncs, \ hb_destroy_func_t destroy) \ { \ if (hb_object_is_immutable (ufuncs)) \ - return; \ + goto fail; \ + \ + if (!func) \ + { \ + if (destroy) \ + destroy (user_data); \ + destroy = nullptr; \ + user_data = ufuncs->parent->user_data.name; \ + } \ \ if (ufuncs->destroy.name) \ ufuncs->destroy.name (ufuncs->user_data.name); \ \ - if (func) { \ + if (func) \ ufuncs->func.name = func; \ - ufuncs->user_data.name = user_data; \ - ufuncs->destroy.name = destroy; \ - } else { \ + else \ ufuncs->func.name = ufuncs->parent->func.name; \ - ufuncs->user_data.name = ufuncs->parent->user_data.name; \ - ufuncs->destroy.name = nullptr; \ - } \ + ufuncs->user_data.name = user_data; \ + ufuncs->destroy.name = destroy; \ + return; \ + \ +fail: \ + if (destroy) \ + destroy (user_data); \ } HB_UNICODE_FUNCS_IMPLEMENT_CALLBACKS diff --git a/thirdparty/harfbuzz/src/hb-uniscribe.cc b/thirdparty/harfbuzz/src/hb-uniscribe.cc index 50f71ce9ce..9648e02663 100644 --- a/thirdparty/harfbuzz/src/hb-uniscribe.cc +++ b/thirdparty/harfbuzz/src/hb-uniscribe.cc @@ -355,7 +355,7 @@ _hb_rename_font (hb_blob_t *blob, wchar_t *new_name) return nullptr; } - memcpy(new_sfnt_data, orig_sfnt_data, length); + hb_memcpy(new_sfnt_data, orig_sfnt_data, length); OT::name &name = StructAtOffset<OT::name> (new_sfnt_data, name_table_offset); name.format = 0; @@ -478,11 +478,11 @@ populate_log_font (LOGFONTW *lf, hb_font_t *font, unsigned int font_size) { - memset (lf, 0, sizeof (*lf)); + hb_memset (lf, 0, sizeof (*lf)); lf->lfHeight = - (int) font_size; lf->lfCharSet = DEFAULT_CHARSET; - memcpy (lf->lfFaceName, font->face->data.uniscribe->face_name, sizeof (lf->lfFaceName)); + hb_memcpy (lf->lfFaceName, font->face->data.uniscribe->face_name, sizeof (lf->lfFaceName)); return true; } diff --git a/thirdparty/harfbuzz/src/hb-vector.hh b/thirdparty/harfbuzz/src/hb-vector.hh index a6d9f6b3fb..9b52f5ca95 100644 --- a/thirdparty/harfbuzz/src/hb-vector.hh +++ b/thirdparty/harfbuzz/src/hb-vector.hh @@ -35,7 +35,7 @@ template <typename Type, bool sorted=false> -struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty_t>::type +struct hb_vector_t { typedef Type item_t; static constexpr unsigned item_size = hb_static_size (Type); @@ -53,9 +53,10 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty hb_requires (hb_is_iterable (Iterable))> hb_vector_t (const Iterable &o) : hb_vector_t () { - if (hb_iter (o).is_random_access_iterator) - alloc (hb_len (hb_iter (o))); - hb_copy (o, *this); + auto iter = hb_iter (o); + if (iter.is_random_access_iterator) + alloc (hb_len (iter)); + hb_copy (iter, *this); } hb_vector_t (const hb_vector_t &o) : hb_vector_t () { @@ -83,6 +84,9 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty allocated = length = 0; arrayZ = nullptr; } + void init0 () + { + } void fini () { @@ -94,7 +98,11 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty void reset () { if (unlikely (in_error ())) - allocated = length; // Big hack! + /* Big Hack! We don't know the true allocated size before + * an allocation failure happened. But we know it was at + * least as big as length. Restore it to that and continue + * as if error did not happen. */ + allocated = length; resize (0); } @@ -122,7 +130,7 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty } hb_bytes_t as_bytes () const - { return hb_bytes_t ((const char *) arrayZ, length * item_size); } + { return hb_bytes_t ((const char *) arrayZ, get_size ()); } bool operator == (const hb_vector_t &o) const { return as_array () == o.as_array (); } bool operator != (const hb_vector_t &o) const { return !(*this == o); } @@ -164,14 +172,10 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty operator iter_t () const { return iter (); } operator writer_t () { return writer (); } - c_array_t sub_array (unsigned int start_offset, unsigned int count) const - { return as_array ().sub_array (start_offset, count); } - c_array_t sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) const - { return as_array ().sub_array (start_offset, count); } - array_t sub_array (unsigned int start_offset, unsigned int count) - { return as_array ().sub_array (start_offset, count); } - array_t sub_array (unsigned int start_offset, unsigned int *count = nullptr /* IN/OUT */) - { return as_array ().sub_array (start_offset, count); } + /* Faster range-based for loop. */ + Type *begin () const { return arrayZ; } + Type *end () const { return arrayZ + length; } + hb_sorted_array_t<Type> as_sorted_array () { return hb_sorted_array (arrayZ, length); } @@ -240,12 +244,11 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty if (likely (new_array)) { for (unsigned i = 0; i < length; i++) + { new (std::addressof (new_array[i])) Type (); - for (unsigned i = 0; i < (unsigned) length; i++) new_array[i] = std::move (arrayZ[i]); - unsigned old_length = length; - shrink_vector (0); - length = old_length; + arrayZ[i].~Type (); + } hb_free (arrayZ); } return new_array; @@ -277,7 +280,14 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty copy_vector (const hb_vector_t &other) { length = other.length; - hb_memcpy ((void *) arrayZ, (const void *) other.arrayZ, length * item_size); +#ifndef HB_OPTIMIZE_SIZE + if (sizeof (T) >= sizeof (long long)) + /* This runs faster because of alignment. */ + for (unsigned i = 0; i < length; i++) + arrayZ[i] = other.arrayZ[i]; + else +#endif + hb_memcpy ((void *) arrayZ, (const void *) other.arrayZ, length * item_size); } template <typename T = Type, hb_enable_if (!hb_is_trivially_copyable (T) && @@ -309,15 +319,6 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty } } - template <typename T = Type, - hb_enable_if (hb_is_trivially_destructible(T))> - void - shrink_vector (unsigned size) - { - length = size; - } - template <typename T = Type, - hb_enable_if (!hb_is_trivially_destructible(T))> void shrink_vector (unsigned size) { @@ -328,17 +329,6 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty } } - template <typename T = Type, - hb_enable_if (hb_is_trivially_copy_assignable(T))> - void - shift_down_vector (unsigned i) - { - memmove (static_cast<void *> (&arrayZ[i - 1]), - static_cast<void *> (&arrayZ[i]), - (length - i) * sizeof (Type)); - } - template <typename T = Type, - hb_enable_if (!hb_is_trivially_copy_assignable(T))> void shift_down_vector (unsigned i) { @@ -381,16 +371,22 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty return true; } - bool resize (int size_) + bool resize (int size_, bool initialize = true) { unsigned int size = size_ < 0 ? 0u : (unsigned int) size_; if (!alloc (size)) return false; if (size > length) - grow_vector (size); + { + if (initialize) + grow_vector (size); + } else if (size < length) - shrink_vector (size); + { + if (initialize) + shrink_vector (size); + } length = size; return true; @@ -399,13 +395,13 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty Type pop () { if (!length) return Null (Type); - Type v = arrayZ[length - 1]; + Type v {std::move (arrayZ[length - 1])}; arrayZ[length - 1].~Type (); length--; return v; } - void remove (unsigned int i) + void remove_ordered (unsigned int i) { if (unlikely (i >= length)) return; @@ -414,6 +410,18 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty length--; } + template <bool Sorted = sorted, + hb_enable_if (!Sorted)> + void remove_unordered (unsigned int i) + { + if (unlikely (i >= length)) + return; + if (i != length - 1) + arrayZ[i] = std::move (arrayZ[length - 1]); + arrayZ[length - 1].~Type (); + length--; + } + void shrink (int size_) { unsigned int size = size_ < 0 ? 0u : (unsigned int) size_; @@ -425,10 +433,8 @@ struct hb_vector_t : std::conditional<sorted, hb_vector_t<Type, false>, hb_empty /* Sorting API. */ - void qsort (int (*cmp)(const void*, const void*)) + void qsort (int (*cmp)(const void*, const void*) = Type::cmp) { as_array ().qsort (cmp); } - void qsort (unsigned int start = 0, unsigned int end = (unsigned int) -1) - { as_array ().qsort (start, end); } /* Unsorted search API. */ template <typename T> diff --git a/thirdparty/harfbuzz/src/hb-version.h b/thirdparty/harfbuzz/src/hb-version.h index 8d6ec66e13..1070262a3b 100644 --- a/thirdparty/harfbuzz/src/hb-version.h +++ b/thirdparty/harfbuzz/src/hb-version.h @@ -41,26 +41,26 @@ HB_BEGIN_DECLS * * The major component of the library version available at compile-time. */ -#define HB_VERSION_MAJOR 5 +#define HB_VERSION_MAJOR 6 /** * HB_VERSION_MINOR: * * The minor component of the library version available at compile-time. */ -#define HB_VERSION_MINOR 3 +#define HB_VERSION_MINOR 0 /** * HB_VERSION_MICRO: * * The micro component of the library version available at compile-time. */ -#define HB_VERSION_MICRO 1 +#define HB_VERSION_MICRO 0 /** * HB_VERSION_STRING: * * A string literal containing the library version available at compile-time. */ -#define HB_VERSION_STRING "5.3.1" +#define HB_VERSION_STRING "6.0.0" /** * HB_VERSION_ATLEAST: diff --git a/thirdparty/harfbuzz/src/hb.hh b/thirdparty/harfbuzz/src/hb.hh index 8ec638a2b4..410d090d36 100644 --- a/thirdparty/harfbuzz/src/hb.hh +++ b/thirdparty/harfbuzz/src/hb.hh @@ -126,6 +126,7 @@ /* Ignored intentionally. */ #ifndef HB_NO_PRAGMA_GCC_DIAGNOSTIC_IGNORED #pragma GCC diagnostic ignored "-Wclass-memaccess" +#pragma GCC diagnostic ignored "-Wcast-function-type-strict" // https://github.com/harfbuzz/harfbuzz/pull/3859#issuecomment-1295409126 #pragma GCC diagnostic ignored "-Wformat-nonliteral" #pragma GCC diagnostic ignored "-Wformat-zero-length" #pragma GCC diagnostic ignored "-Wmissing-field-initializers" diff --git a/thirdparty/libpng/arm/arm_init.c b/thirdparty/libpng/arm/arm_init.c index ab22525b38..84d05556f8 100644 --- a/thirdparty/libpng/arm/arm_init.c +++ b/thirdparty/libpng/arm/arm_init.c @@ -36,7 +36,10 @@ #ifndef PNG_ARM_NEON_FILE # if defined(__aarch64__) || defined(_M_ARM64) /* ARM Neon is expected to be unconditionally available on ARM64. */ -# error "PNG_ARM_NEON_CHECK_SUPPORTED must not be defined on this platform" +# error "PNG_ARM_NEON_CHECK_SUPPORTED must not be defined on ARM64" +# elif defined(__ARM_NEON__) || defined(__ARM_NEON) + /* ARM Neon is expected to be available on the target CPU architecture. */ +# error "PNG_ARM_NEON_CHECK_SUPPORTED must not be defined on this CPU arch" # elif defined(__linux__) # define PNG_ARM_NEON_FILE "contrib/arm-neon/linux.c" # else diff --git a/thirdparty/libpng/png.c b/thirdparty/libpng/png.c index fc09564262..4f3e8bbd31 100644 --- a/thirdparty/libpng/png.c +++ b/thirdparty/libpng/png.c @@ -14,7 +14,7 @@ #include "pngpriv.h" /* Generate a compiler error if there is an old png.h in the search path. */ -typedef png_libpng_version_1_6_38 Your_png_h_is_not_version_1_6_38; +typedef png_libpng_version_1_6_39 Your_png_h_is_not_version_1_6_39; #ifdef __GNUC__ /* The version tests may need to be added to, but the problem warning has @@ -815,7 +815,7 @@ png_get_copyright(png_const_structrp png_ptr) return PNG_STRING_COPYRIGHT #else return PNG_STRING_NEWLINE \ - "libpng version 1.6.38" PNG_STRING_NEWLINE \ + "libpng version 1.6.39" PNG_STRING_NEWLINE \ "Copyright (c) 2018-2022 Cosmin Truta" PNG_STRING_NEWLINE \ "Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson" \ PNG_STRING_NEWLINE \ @@ -2710,7 +2710,7 @@ png_check_IHDR(png_const_structrp png_ptr, int /* PRIVATE */ png_check_fp_number(png_const_charp string, size_t size, int *statep, - png_size_tp whereami) + size_t *whereami) { int state = *statep; size_t i = *whereami; diff --git a/thirdparty/libpng/png.h b/thirdparty/libpng/png.h index 5fb494fb1a..f109cdf336 100644 --- a/thirdparty/libpng/png.h +++ b/thirdparty/libpng/png.h @@ -1,7 +1,7 @@ /* png.h - header file for PNG reference library * - * libpng version 1.6.38 - September 14, 2022 + * libpng version 1.6.39 - November 20, 2022 * * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson @@ -15,7 +15,7 @@ * libpng versions 0.89, June 1996, through 0.96, May 1997: Andreas Dilger * libpng versions 0.97, January 1998, through 1.6.35, July 2018: * Glenn Randers-Pehrson - * libpng versions 1.6.36, December 2018, through 1.6.38, September 2022: + * libpng versions 1.6.36, December 2018, through 1.6.39, November 2022: * Cosmin Truta * See also "Contributing Authors", below. */ @@ -239,7 +239,7 @@ * ... * 1.5.30 15 10530 15.so.15.30[.0] * ... - * 1.6.38 16 10638 16.so.16.38[.0] + * 1.6.39 16 10639 16.so.16.39[.0] * * Henceforth the source version will match the shared-library major and * minor numbers; the shared-library major version number will be used for @@ -278,8 +278,8 @@ */ /* Version information for png.h - this should match the version in png.c */ -#define PNG_LIBPNG_VER_STRING "1.6.38" -#define PNG_HEADER_VERSION_STRING " libpng version 1.6.38 - September 14, 2022\n" +#define PNG_LIBPNG_VER_STRING "1.6.39" +#define PNG_HEADER_VERSION_STRING " libpng version 1.6.39 - November 20, 2022\n" #define PNG_LIBPNG_VER_SONUM 16 #define PNG_LIBPNG_VER_DLLNUM 16 @@ -287,7 +287,7 @@ /* These should match the first 3 components of PNG_LIBPNG_VER_STRING: */ #define PNG_LIBPNG_VER_MAJOR 1 #define PNG_LIBPNG_VER_MINOR 6 -#define PNG_LIBPNG_VER_RELEASE 38 +#define PNG_LIBPNG_VER_RELEASE 39 /* This should be zero for a public release, or non-zero for a * development version. [Deprecated] @@ -318,7 +318,7 @@ * From version 1.0.1 it is: * XXYYZZ, where XX=major, YY=minor, ZZ=release */ -#define PNG_LIBPNG_VER 10638 /* 1.6.38 */ +#define PNG_LIBPNG_VER 10639 /* 1.6.39 */ /* Library configuration: these options cannot be changed after * the library has been built. @@ -428,7 +428,7 @@ extern "C" { /* This triggers a compiler error in png.c, if png.c and png.h * do not agree upon the version number. */ -typedef char* png_libpng_version_1_6_38; +typedef char* png_libpng_version_1_6_39; /* Basic control structions. Read libpng-manual.txt or libpng.3 for more info. * diff --git a/thirdparty/libpng/pngconf.h b/thirdparty/libpng/pngconf.h index 89d28f83a0..fcb4b43069 100644 --- a/thirdparty/libpng/pngconf.h +++ b/thirdparty/libpng/pngconf.h @@ -1,7 +1,7 @@ /* pngconf.h - machine-configurable file for libpng * - * libpng version 1.6.38 + * libpng version 1.6.39 * * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2016,2018 Glenn Randers-Pehrson diff --git a/thirdparty/libpng/pnglibconf.h b/thirdparty/libpng/pnglibconf.h index 89d5b4c8ad..e5948c8ce1 100644 --- a/thirdparty/libpng/pnglibconf.h +++ b/thirdparty/libpng/pnglibconf.h @@ -1,6 +1,6 @@ /* pnglibconf.h - library build configuration */ -/* libpng version 1.6.38 */ +/* libpng version 1.6.39 */ /* Copyright (c) 2018-2022 Cosmin Truta */ /* Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson */ diff --git a/thirdparty/libpng/pngpriv.h b/thirdparty/libpng/pngpriv.h index 2e426cf47d..b8a73b685d 100644 --- a/thirdparty/libpng/pngpriv.h +++ b/thirdparty/libpng/pngpriv.h @@ -1946,7 +1946,7 @@ PNG_INTERNAL_FUNCTION(void,png_ascii_from_fixed,(png_const_structrp png_ptr, * the problem character.) This has not been tested within libpng. */ PNG_INTERNAL_FUNCTION(int,png_check_fp_number,(png_const_charp string, - size_t size, int *statep, png_size_tp whereami),PNG_EMPTY); + size_t size, int *statep, size_t *whereami),PNG_EMPTY); /* This is the same but it checks a complete string and returns true * only if it just contains a floating point number. As of 1.5.4 this diff --git a/thirdparty/libpng/pngread.c b/thirdparty/libpng/pngread.c index 5ab9224038..96996ced5b 100644 --- a/thirdparty/libpng/pngread.c +++ b/thirdparty/libpng/pngread.c @@ -3762,13 +3762,13 @@ png_image_read_direct(png_voidp argument) mode = PNG_ALPHA_PNG; output_gamma = PNG_DEFAULT_sRGB; } - + if ((change & PNG_FORMAT_FLAG_ASSOCIATED_ALPHA) != 0) { mode = PNG_ALPHA_OPTIMIZED; change &= ~PNG_FORMAT_FLAG_ASSOCIATED_ALPHA; } - + /* If 'do_local_background' is set check for the presence of gamma * correction; this is part of the work-round for the libpng bug * described above. diff --git a/thirdparty/libpng/pngrutil.c b/thirdparty/libpng/pngrutil.c index ca060dd15f..068ab193a3 100644 --- a/thirdparty/libpng/pngrutil.c +++ b/thirdparty/libpng/pngrutil.c @@ -3186,7 +3186,7 @@ png_check_chunk_length(png_const_structrp png_ptr, png_uint_32 length) { png_debug2(0," length = %lu, limit = %lu", (unsigned long)length,(unsigned long)limit); - png_chunk_error(png_ptr, "chunk data is too large"); + png_benign_error(png_ptr, "chunk data is too large"); } } diff --git a/thirdparty/libpng/pngwrite.c b/thirdparty/libpng/pngwrite.c index 06c45d16ab..4e58d776a9 100644 --- a/thirdparty/libpng/pngwrite.c +++ b/thirdparty/libpng/pngwrite.c @@ -75,10 +75,10 @@ write_unknown_chunks(png_structrp png_ptr, png_const_inforp info_ptr, * library. If you have a new chunk to add, make a function to write it, * and put it in the correct location here. If you want the chunk written * after the image data, put it in png_write_end(). I strongly encourage - * you to supply a PNG_INFO_ flag, and check info_ptr->valid before writing - * the chunk, as that will keep the code from breaking if you want to just - * write a plain PNG file. If you have long comments, I suggest writing - * them in png_write_end(), and compressing them. + * you to supply a PNG_INFO_<chunk> flag, and check info_ptr->valid before + * writing the chunk, as that will keep the code from breaking if you want + * to just write a plain PNG file. If you have long comments, I suggest + * writing them in png_write_end(), and compressing them. */ void PNGAPI png_write_info_before_PLTE(png_structrp png_ptr, png_const_inforp info_ptr) diff --git a/thirdparty/libpng/pngwutil.c b/thirdparty/libpng/pngwutil.c index 16345e4c0b..01f0607c70 100644 --- a/thirdparty/libpng/pngwutil.c +++ b/thirdparty/libpng/pngwutil.c @@ -1,7 +1,7 @@ /* pngwutil.c - utilities to write a PNG file * - * Copyright (c) 2018 Cosmin Truta + * Copyright (c) 2018-2022 Cosmin Truta * Copyright (c) 1998-2002,2004,2006-2018 Glenn Randers-Pehrson * Copyright (c) 1996-1997 Andreas Dilger * Copyright (c) 1995-1996 Guy Eric Schalnat, Group 42, Inc. @@ -1747,7 +1747,7 @@ png_write_pCAL(png_structrp png_ptr, png_charp purpose, png_int_32 X0, { png_uint_32 purpose_len; size_t units_len, total_len; - png_size_tp params_len; + size_t *params_len; png_byte buf[10]; png_byte new_purpose[80]; int i; @@ -1769,7 +1769,7 @@ png_write_pCAL(png_structrp png_ptr, png_charp purpose, png_int_32 X0, png_debug1(3, "pCAL units length = %d", (int)units_len); total_len = purpose_len + units_len + 10; - params_len = (png_size_tp)png_malloc(png_ptr, + params_len = (size_t *)png_malloc(png_ptr, (png_alloc_size_t)((png_alloc_size_t)nparams * (sizeof (size_t)))); /* Find the length of each parameter, making sure we don't count the diff --git a/thirdparty/mbedtls/include/mbedtls/asn1write.h b/thirdparty/mbedtls/include/mbedtls/asn1write.h index 44afae0e56..5da7654bb4 100644 --- a/thirdparty/mbedtls/include/mbedtls/asn1write.h +++ b/thirdparty/mbedtls/include/mbedtls/asn1write.h @@ -90,7 +90,7 @@ int mbedtls_asn1_write_raw_buffer( unsigned char **p, unsigned char *start, #if defined(MBEDTLS_BIGNUM_C) /** - * \brief Write a arbitrary-precision number (#MBEDTLS_ASN1_INTEGER) + * \brief Write an arbitrary-precision number (#MBEDTLS_ASN1_INTEGER) * in ASN.1 format. * * \note This function works backwards in data buffer. diff --git a/thirdparty/mbedtls/include/mbedtls/bignum.h b/thirdparty/mbedtls/include/mbedtls/bignum.h index dd594c512d..c61db82c6d 100644 --- a/thirdparty/mbedtls/include/mbedtls/bignum.h +++ b/thirdparty/mbedtls/include/mbedtls/bignum.h @@ -182,6 +182,20 @@ #endif /* !MBEDTLS_NO_UDBL_DIVISION */ #endif /* !MBEDTLS_HAVE_INT64 */ +/** \typedef mbedtls_mpi_uint + * \brief The type of machine digits in a bignum, called _limbs_. + * + * This is always an unsigned integer type with no padding bits. The size + * is platform-dependent. + */ + +/** \typedef mbedtls_mpi_sint + * \brief The signed type corresponding to #mbedtls_mpi_uint. + * + * This is always a signed integer type with no padding bits. The size + * is platform-dependent. + */ + #ifdef __cplusplus extern "C" { #endif @@ -191,9 +205,27 @@ extern "C" { */ typedef struct mbedtls_mpi { - int s; /*!< Sign: -1 if the mpi is negative, 1 otherwise */ - size_t n; /*!< total # of limbs */ - mbedtls_mpi_uint *p; /*!< pointer to limbs */ + /** Sign: -1 if the mpi is negative, 1 otherwise. + * + * The number 0 must be represented with `s = +1`. Although many library + * functions treat all-limbs-zero as equivalent to a valid representation + * of 0 regardless of the sign bit, there are exceptions, so bignum + * functions and external callers must always set \c s to +1 for the + * number zero. + * + * Note that this implies that calloc() or `... = {0}` does not create + * a valid MPI representation. You must call mbedtls_mpi_init(). + */ + int s; + + /** Total number of limbs in \c p. */ + size_t n; + + /** Pointer to limbs. + * + * This may be \c NULL if \c n is 0. + */ + mbedtls_mpi_uint *p; } mbedtls_mpi; @@ -280,7 +312,7 @@ void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y ); * \param Y The MPI to be assigned from. This must point to an * initialized MPI. * \param assign The condition deciding whether to perform the - * assignment or not. Possible values: + * assignment or not. Must be either 0 or 1: * * \c 1: Perform the assignment `X = Y`. * * \c 0: Keep the original value of \p X. * @@ -291,6 +323,10 @@ void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y ); * information through branch prediction and/or memory access * patterns analysis). * + * \warning If \p assign is neither 0 nor 1, the result of this function + * is indeterminate, and the resulting value in \p X might be + * neither its original value nor the value in \p Y. + * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on other kinds of failure. @@ -303,24 +339,28 @@ int mbedtls_mpi_safe_cond_assign( mbedtls_mpi *X, const mbedtls_mpi *Y, unsigned * * \param X The first MPI. This must be initialized. * \param Y The second MPI. This must be initialized. - * \param assign The condition deciding whether to perform - * the swap or not. Possible values: + * \param swap The condition deciding whether to perform + * the swap or not. Must be either 0 or 1: * * \c 1: Swap the values of \p X and \p Y. * * \c 0: Keep the original values of \p X and \p Y. * * \note This function is equivalent to - * if( assign ) mbedtls_mpi_swap( X, Y ); + * if( swap ) mbedtls_mpi_swap( X, Y ); * except that it avoids leaking any information about whether - * the assignment was done or not (the above code may leak + * the swap was done or not (the above code may leak * information through branch prediction and/or memory access * patterns analysis). * + * \warning If \p swap is neither 0 nor 1, the result of this function + * is indeterminate, and both \p X and \p Y might end up with + * values different to either of the original ones. + * * \return \c 0 if successful. * \return #MBEDTLS_ERR_MPI_ALLOC_FAILED if memory allocation failed. * \return Another negative error code on other kinds of failure. * */ -int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char assign ); +int mbedtls_mpi_safe_cond_swap( mbedtls_mpi *X, mbedtls_mpi *Y, unsigned char swap ); /** * \brief Store integer value in MPI. @@ -753,11 +793,11 @@ int mbedtls_mpi_mul_int( mbedtls_mpi *X, const mbedtls_mpi *A, * * \param Q The destination MPI for the quotient. * This may be \c NULL if the value of the - * quotient is not needed. + * quotient is not needed. This must not alias A or B. * \param R The destination MPI for the remainder value. * This may be \c NULL if the value of the - * remainder is not needed. - * \param A The dividend. This must point to an initialized MPi. + * remainder is not needed. This must not alias A or B. + * \param A The dividend. This must point to an initialized MPI. * \param B The divisor. This must point to an initialized MPI. * * \return \c 0 if successful. @@ -774,10 +814,10 @@ int mbedtls_mpi_div_mpi( mbedtls_mpi *Q, mbedtls_mpi *R, const mbedtls_mpi *A, * * \param Q The destination MPI for the quotient. * This may be \c NULL if the value of the - * quotient is not needed. + * quotient is not needed. This must not alias A. * \param R The destination MPI for the remainder value. * This may be \c NULL if the value of the - * remainder is not needed. + * remainder is not needed. This must not alias A. * \param A The dividend. This must point to an initialized MPi. * \param b The divisor. * @@ -832,6 +872,7 @@ int mbedtls_mpi_mod_int( mbedtls_mpi_uint *r, const mbedtls_mpi *A, * \brief Perform a sliding-window exponentiation: X = A^E mod N * * \param X The destination MPI. This must point to an initialized MPI. + * This must not alias E or N. * \param A The base of the exponentiation. * This must point to an initialized MPI. * \param E The exponent MPI. This must point to an initialized MPI. diff --git a/thirdparty/mbedtls/include/mbedtls/bn_mul.h b/thirdparty/mbedtls/include/mbedtls/bn_mul.h index 31137cd4c2..a3fc363815 100644 --- a/thirdparty/mbedtls/include/mbedtls/bn_mul.h +++ b/thirdparty/mbedtls/include/mbedtls/bn_mul.h @@ -95,12 +95,28 @@ ( !defined(__ARMCC_VERSION) || __ARMCC_VERSION >= 6000000 ) /* + * GCC < 5.0 treated the x86 ebx (which is used for the GOT) as a + * fixed reserved register when building as PIC, leading to errors + * like: bn_mul.h:46:13: error: PIC register clobbered by 'ebx' in 'asm' + * + * This is fixed by an improved register allocator in GCC 5+. From the + * release notes: + * Register allocation improvements: Reuse of the PIC hard register, + * instead of using a fixed register, was implemented on x86/x86-64 + * targets. This improves generated PIC code performance as more hard + * registers can be used. + */ +#if defined(__GNUC__) && __GNUC__ < 5 && defined(__PIC__) +#define MULADDC_CANNOT_USE_EBX +#endif + +/* * Disable use of the i386 assembly code below if option -O0, to disable all * compiler optimisations, is passed, detected with __OPTIMIZE__ * This is done as the number of registers used in the assembly code doesn't * work with the -O0 option. */ -#if defined(__i386__) && defined(__OPTIMIZE__) +#if defined(__i386__) && defined(__OPTIMIZE__) && !defined(MULADDC_CANNOT_USE_EBX) #define MULADDC_INIT \ asm( \ @@ -563,10 +579,20 @@ "andi r7, r6, 0xffff \n\t" \ "bsrli r6, r6, 16 \n\t" -#define MULADDC_CORE \ +#if(__BYTE_ORDER__ == __ORDER_LITTLE_ENDIAN__) +#define MULADDC_LHUI \ + "lhui r9, r3, 0 \n\t" \ + "addi r3, r3, 2 \n\t" \ + "lhui r8, r3, 0 \n\t" +#else +#define MULADDC_LHUI \ "lhui r8, r3, 0 \n\t" \ "addi r3, r3, 2 \n\t" \ - "lhui r9, r3, 0 \n\t" \ + "lhui r9, r3, 0 \n\t" +#endif + +#define MULADDC_CORE \ + MULADDC_LHUI \ "addi r3, r3, 2 \n\t" \ "mul r10, r9, r6 \n\t" \ "mul r11, r8, r7 \n\t" \ diff --git a/thirdparty/mbedtls/include/mbedtls/check_config.h b/thirdparty/mbedtls/include/mbedtls/check_config.h index be5c548e56..7ae1ff94db 100644 --- a/thirdparty/mbedtls/include/mbedtls/check_config.h +++ b/thirdparty/mbedtls/include/mbedtls/check_config.h @@ -525,6 +525,20 @@ #error "MBEDTLS_PLATFORM_SNPRINTF_MACRO and MBEDTLS_PLATFORM_STD_SNPRINTF/MBEDTLS_PLATFORM_SNPRINTF_ALT cannot be defined simultaneously" #endif +#if defined(MBEDTLS_PLATFORM_VSNPRINTF_ALT) && !defined(MBEDTLS_PLATFORM_C) +#error "MBEDTLS_PLATFORM_VSNPRINTF_ALT defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_VSNPRINTF_MACRO) && !defined(MBEDTLS_PLATFORM_C) +#error "MBEDTLS_PLATFORM_VSNPRINTF_MACRO defined, but not all prerequisites" +#endif + +#if defined(MBEDTLS_PLATFORM_VSNPRINTF_MACRO) &&\ + ( defined(MBEDTLS_PLATFORM_STD_VSNPRINTF) ||\ + defined(MBEDTLS_PLATFORM_VSNPRINTF_ALT) ) +#error "MBEDTLS_PLATFORM_VSNPRINTF_MACRO and MBEDTLS_PLATFORM_STD_VSNPRINTF/MBEDTLS_PLATFORM_VSNPRINTF_ALT cannot be defined simultaneously" +#endif + #if defined(MBEDTLS_PLATFORM_STD_MEM_HDR) &&\ !defined(MBEDTLS_PLATFORM_NO_STD_FUNCTIONS) #error "MBEDTLS_PLATFORM_STD_MEM_HDR defined, but not all prerequisites" @@ -650,10 +664,9 @@ MBEDTLS_ECDSA_C requires MBEDTLS_PK_WRITE_C to be defined." #endif -#if defined(MBEDTLS_RSA_C) && defined(MBEDTLS_PKCS1_V15) && \ - !defined(MBEDTLS_PK_WRITE_C) && defined(MBEDTLS_PSA_CRYPTO_C) -#error "MBEDTLS_PSA_CRYPTO_C, MBEDTLS_RSA_C and MBEDTLS_PKCS1_V15 defined, \ - but not all prerequisites" +#if defined(MBEDTLS_PSA_CRYPTO_C) && defined(MBEDTLS_RSA_C) && \ + !( defined(MBEDTLS_PK_PARSE_C) && defined(MBEDTLS_PK_WRITE_C) ) +#error "MBEDTLS_PSA_CRYPTO_C with MBEDTLS_RSA_C requires MBEDTLS_PK_PARSE_C and MBEDTLS_PK_WRITE_C" #endif #if defined(MBEDTLS_RSA_C) && ( !defined(MBEDTLS_BIGNUM_C) || \ @@ -812,6 +825,11 @@ #error "MBEDTLS_SSL_TICKET_C defined, but not all prerequisites" #endif +#if defined(MBEDTLS_SSL_TICKET_C) && \ + !( defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) || defined(MBEDTLS_CHACHAPOLY_C) ) +#error "MBEDTLS_SSL_TICKET_C defined, but not all prerequisites" +#endif + #if defined(MBEDTLS_SSL_CBC_RECORD_SPLITTING) && \ !defined(MBEDTLS_SSL_PROTO_SSL3) && !defined(MBEDTLS_SSL_PROTO_TLS1) #error "MBEDTLS_SSL_CBC_RECORD_SPLITTING defined, but not all prerequisites" @@ -926,6 +944,10 @@ #error "MBEDTLS_SSL_VARIABLE_BUFFER_LENGTH defined, but not all prerequisites" #endif +#if defined(MBEDTLS_SSL_CONTEXT_SERIALIZATION) && !( defined(MBEDTLS_GCM_C) || defined(MBEDTLS_CCM_C) || defined(MBEDTLS_CHACHAPOLY_C) ) +#error "MBEDTLS_SSL_CONTEXT_SERIALIZATION defined, but not all prerequisites" +#endif + /* * Avoid warning from -pedantic. This is a convenient place for this * workaround since this is included by every single file before the diff --git a/thirdparty/mbedtls/include/mbedtls/config.h b/thirdparty/mbedtls/include/mbedtls/config.h index 1cd6eb6634..61db79362f 100644 --- a/thirdparty/mbedtls/include/mbedtls/config.h +++ b/thirdparty/mbedtls/include/mbedtls/config.h @@ -1329,7 +1329,7 @@ * Include backtrace information with each allocated block. * * Requires: MBEDTLS_MEMORY_BUFFER_ALLOC_C - * GLIBC-compatible backtrace() an backtrace_symbols() support + * GLIBC-compatible backtrace() and backtrace_symbols() support * * Uncomment this macro to include backtrace information */ @@ -1620,6 +1620,8 @@ * saved after the handshake to allow for more efficient serialization, so if * you don't need this feature you'll save RAM by disabling it. * + * Requires: MBEDTLS_GCM_C or MBEDTLS_CCM_C or MBEDTLS_CHACHAPOLY_C + * * Comment to disable the context serialization APIs. */ #define MBEDTLS_SSL_CONTEXT_SERIALIZATION @@ -2425,7 +2427,7 @@ * MBEDTLS_TLS_PSK_WITH_RC4_128_SHA * * \warning ARC4 is considered a weak cipher and its use constitutes a - * security risk. If possible, we recommend avoidng dependencies on + * security risk. If possible, we recommend avoiding dependencies on * it, and considering stronger ciphers instead. * */ @@ -3030,7 +3032,7 @@ * * \note See also our Knowledge Base article about porting to a new * environment: - * https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS + * https://mbed-tls.readthedocs.io/en/latest/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS * * Module: library/net_sockets.c * @@ -3400,7 +3402,8 @@ * Module: library/ssl_ticket.c * Caller: * - * Requires: MBEDTLS_CIPHER_C + * Requires: MBEDTLS_CIPHER_C && + * ( MBEDTLS_GCM_C || MBEDTLS_CCM_C || MBEDTLS_CHACHAPOLY_C ) */ #define MBEDTLS_SSL_TICKET_C @@ -3456,7 +3459,7 @@ * contexts are not shared between threads. If you do intend to use contexts * between threads, you will need to enable this layer to prevent race * conditions. See also our Knowledge Base article about threading: - * https://tls.mbed.org/kb/development/thread-safety-and-multi-threading + * https://mbed-tls.readthedocs.io/en/latest/kb/development/thread-safety-and-multi-threading * * Module: library/threading.c * @@ -3488,7 +3491,7 @@ * * \note See also our Knowledge Base article about porting to a new * environment: - * https://tls.mbed.org/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS + * https://mbed-tls.readthedocs.io/en/latest/kb/how-to/how-do-i-port-mbed-tls-to-a-new-environment-OS * * Module: library/timing.c * Caller: library/havege.c diff --git a/thirdparty/mbedtls/include/mbedtls/ecdsa.h b/thirdparty/mbedtls/include/mbedtls/ecdsa.h index 264a638bb5..118f7cedb1 100644 --- a/thirdparty/mbedtls/include/mbedtls/ecdsa.h +++ b/thirdparty/mbedtls/include/mbedtls/ecdsa.h @@ -309,10 +309,8 @@ int mbedtls_ecdsa_sign_det_ext( mbedtls_ecp_group *grp, mbedtls_mpi *r, * This must be initialized. * * \return \c 0 on success. - * \return #MBEDTLS_ERR_ECP_BAD_INPUT_DATA if the signature - * is invalid. * \return An \c MBEDTLS_ERR_ECP_XXX or \c MBEDTLS_MPI_XXX - * error code on failure for any other reason. + * error code on failure. */ int mbedtls_ecdsa_verify( mbedtls_ecp_group *grp, const unsigned char *buf, size_t blen, diff --git a/thirdparty/mbedtls/include/mbedtls/md.h b/thirdparty/mbedtls/include/mbedtls/md.h index 84fafd2ac7..9cea40a89c 100644 --- a/thirdparty/mbedtls/include/mbedtls/md.h +++ b/thirdparty/mbedtls/include/mbedtls/md.h @@ -215,7 +215,7 @@ MBEDTLS_CHECK_RETURN_TYPICAL int mbedtls_md_setup( mbedtls_md_context_t *ctx, const mbedtls_md_info_t *md_info, int hmac ); /** - * \brief This function clones the state of an message-digest + * \brief This function clones the state of a message-digest * context. * * \note You must call mbedtls_md_setup() on \c dst before calling diff --git a/thirdparty/mbedtls/include/mbedtls/platform.h b/thirdparty/mbedtls/include/mbedtls/platform.h index 06dd192eab..eaf5122bec 100644 --- a/thirdparty/mbedtls/include/mbedtls/platform.h +++ b/thirdparty/mbedtls/include/mbedtls/platform.h @@ -11,6 +11,13 @@ * implementations of these functions, or implementations specific to * their platform, which can be statically linked to the library or * dynamically configured at runtime. + * + * When all compilation options related to platform abstraction are + * disabled, this header just defines `mbedtls_xxx` function names + * as aliases to the standard `xxx` function. + * + * Most modules in the library and example programs are expected to + * include this header. */ /* * Copyright The Mbed TLS Contributors diff --git a/thirdparty/mbedtls/include/mbedtls/ripemd160.h b/thirdparty/mbedtls/include/mbedtls/ripemd160.h index 63270d1239..f890aefaee 100644 --- a/thirdparty/mbedtls/include/mbedtls/ripemd160.h +++ b/thirdparty/mbedtls/include/mbedtls/ripemd160.h @@ -74,7 +74,7 @@ void mbedtls_ripemd160_init( mbedtls_ripemd160_context *ctx ); void mbedtls_ripemd160_free( mbedtls_ripemd160_context *ctx ); /** - * \brief Clone (the state of) an RIPEMD-160 context + * \brief Clone (the state of) a RIPEMD-160 context * * \param dst The destination context * \param src The context to be cloned diff --git a/thirdparty/mbedtls/include/mbedtls/rsa.h b/thirdparty/mbedtls/include/mbedtls/rsa.h index 062df73aa0..8559f67bb9 100644 --- a/thirdparty/mbedtls/include/mbedtls/rsa.h +++ b/thirdparty/mbedtls/include/mbedtls/rsa.h @@ -491,7 +491,7 @@ int mbedtls_rsa_check_pubkey( const mbedtls_rsa_context *ctx ); * the current function does not have access to them, * and therefore cannot check them. See mbedtls_rsa_complete(). * If you want to check the consistency of the entire - * content of an PKCS1-encoded RSA private key, for example, you + * content of a PKCS1-encoded RSA private key, for example, you * should use mbedtls_rsa_validate_params() before setting * up the RSA context. * Additionally, if the implementation performs empirical checks, diff --git a/thirdparty/mbedtls/include/mbedtls/ssl.h b/thirdparty/mbedtls/include/mbedtls/ssl.h index 5064ec5689..aecac93f33 100644 --- a/thirdparty/mbedtls/include/mbedtls/ssl.h +++ b/thirdparty/mbedtls/include/mbedtls/ssl.h @@ -624,7 +624,7 @@ typedef int mbedtls_ssl_recv_t( void *ctx, * \param ctx Context for the receive callback (typically a file descriptor) * \param buf Buffer to write the received data to * \param len Length of the receive buffer - * \param timeout Maximum nomber of millisecondes to wait for data + * \param timeout Maximum number of milliseconds to wait for data * 0 means no timeout (potentially waiting forever) * * \return The callback must return the number of bytes received, @@ -652,7 +652,7 @@ typedef int mbedtls_ssl_recv_timeout_t( void *ctx, * for the associated \c mbedtls_ssl_get_timer_t callback to * return correct information. * - * \note If using a event-driven style of programming, an event must + * \note If using an event-driven style of programming, an event must * be generated when the final delay is passed. The event must * cause a call to \c mbedtls_ssl_handshake() with the proper * SSL context to be scheduled. Care must be taken to ensure @@ -2000,7 +2000,7 @@ int mbedtls_ssl_check_record( mbedtls_ssl_context const *ssl, * here, except if using an event-driven style. * * \note See also the "DTLS tutorial" article in our knowledge base. - * https://tls.mbed.org/kb/how-to/dtls-tutorial + * https://mbed-tls.readthedocs.io/en/latest/kb/how-to/dtls-tutorial */ void mbedtls_ssl_set_timer_cb( mbedtls_ssl_context *ssl, void *p_timer, diff --git a/thirdparty/mbedtls/include/mbedtls/ssl_internal.h b/thirdparty/mbedtls/include/mbedtls/ssl_internal.h index 46ade67b9c..77ad755477 100644 --- a/thirdparty/mbedtls/include/mbedtls/ssl_internal.h +++ b/thirdparty/mbedtls/include/mbedtls/ssl_internal.h @@ -782,7 +782,7 @@ struct mbedtls_ssl_transform #if defined(MBEDTLS_SSL_DTLS_CONNECTION_ID) uint8_t in_cid_len; uint8_t out_cid_len; - unsigned char in_cid [ MBEDTLS_SSL_CID_OUT_LEN_MAX ]; + unsigned char in_cid [ MBEDTLS_SSL_CID_IN_LEN_MAX ]; unsigned char out_cid[ MBEDTLS_SSL_CID_OUT_LEN_MAX ]; #endif /* MBEDTLS_SSL_DTLS_CONNECTION_ID */ diff --git a/thirdparty/mbedtls/include/mbedtls/version.h b/thirdparty/mbedtls/include/mbedtls/version.h index 44adcbfe03..b3b441d46b 100644 --- a/thirdparty/mbedtls/include/mbedtls/version.h +++ b/thirdparty/mbedtls/include/mbedtls/version.h @@ -38,16 +38,16 @@ */ #define MBEDTLS_VERSION_MAJOR 2 #define MBEDTLS_VERSION_MINOR 28 -#define MBEDTLS_VERSION_PATCH 1 +#define MBEDTLS_VERSION_PATCH 2 /** * The single version number has the following structure: * MMNNPP00 * Major version | Minor version | Patch version */ -#define MBEDTLS_VERSION_NUMBER 0x021C0100 -#define MBEDTLS_VERSION_STRING "2.28.1" -#define MBEDTLS_VERSION_STRING_FULL "mbed TLS 2.28.1" +#define MBEDTLS_VERSION_NUMBER 0x021C0200 +#define MBEDTLS_VERSION_STRING "2.28.2" +#define MBEDTLS_VERSION_STRING_FULL "mbed TLS 2.28.2" #if defined(MBEDTLS_VERSION_C) diff --git a/thirdparty/mbedtls/library/aes.c b/thirdparty/mbedtls/library/aes.c index 03d8b7ea61..74ea2672b0 100644 --- a/thirdparty/mbedtls/library/aes.c +++ b/thirdparty/mbedtls/library/aes.c @@ -40,14 +40,7 @@ #include "mbedtls/aesni.h" #endif -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_AES_ALT) @@ -1170,7 +1163,7 @@ int mbedtls_aes_crypt_xts( mbedtls_aes_xts_context *ctx, { /* We are on the last block in a decrypt operation that has * leftover bytes, so we need to use the next tweak for this block, - * and this tweak for the lefover bytes. Save the current tweak for + * and this tweak for the leftover bytes. Save the current tweak for * the leftovers and then update the current tweak for use on this, * the last full block. */ memcpy( prev_tweak, tweak, sizeof( tweak ) ); @@ -1770,7 +1763,8 @@ int mbedtls_aes_self_test( int verbose ) unsigned char key[32]; unsigned char buf[64]; const unsigned char *aes_tests; -#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) +#if defined(MBEDTLS_CIPHER_MODE_CBC) || defined(MBEDTLS_CIPHER_MODE_CFB) || \ + defined(MBEDTLS_CIPHER_MODE_OFB) unsigned char iv[16]; #endif #if defined(MBEDTLS_CIPHER_MODE_CBC) diff --git a/thirdparty/mbedtls/library/arc4.c b/thirdparty/mbedtls/library/arc4.c index b34dc5e754..dcc13d539a 100644 --- a/thirdparty/mbedtls/library/arc4.c +++ b/thirdparty/mbedtls/library/arc4.c @@ -31,14 +31,7 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_ARC4_ALT) diff --git a/thirdparty/mbedtls/library/aria.c b/thirdparty/mbedtls/library/aria.c index bc05c4a319..5e52eea91e 100644 --- a/thirdparty/mbedtls/library/aria.c +++ b/thirdparty/mbedtls/library/aria.c @@ -31,24 +31,12 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_ARIA_ALT) #include "mbedtls/platform_util.h" -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - /* Parameter validation macros */ #define ARIA_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_ARIA_BAD_INPUT_DATA ) @@ -895,15 +883,17 @@ static const uint8_t aria_test2_ctr_ct[3][48] = // CTR ciphertext }; #endif /* MBEDTLS_CIPHER_MODE_CFB */ -#define ARIA_SELF_TEST_IF_FAIL \ - { \ - if( verbose ) \ - mbedtls_printf( "failed\n" ); \ - goto exit; \ - } else { \ - if( verbose ) \ - mbedtls_printf( "passed\n" ); \ - } +#define ARIA_SELF_TEST_ASSERT( cond ) \ + do { \ + if( cond ) { \ + if( verbose ) \ + mbedtls_printf( "failed\n" ); \ + goto exit; \ + } else { \ + if( verbose ) \ + mbedtls_printf( "passed\n" ); \ + } \ + } while( 0 ) /* * Checkup routine @@ -937,16 +927,18 @@ int mbedtls_aria_self_test( int verbose ) mbedtls_printf( " ARIA-ECB-%d (enc): ", 128 + 64 * i ); mbedtls_aria_setkey_enc( &ctx, aria_test1_ecb_key, 128 + 64 * i ); mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_pt, blk ); - if( memcmp( blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE ) != 0 ) - ARIA_SELF_TEST_IF_FAIL; + ARIA_SELF_TEST_ASSERT( + memcmp( blk, aria_test1_ecb_ct[i], MBEDTLS_ARIA_BLOCKSIZE ) + != 0 ); /* test ECB decryption */ if( verbose ) mbedtls_printf( " ARIA-ECB-%d (dec): ", 128 + 64 * i ); mbedtls_aria_setkey_dec( &ctx, aria_test1_ecb_key, 128 + 64 * i ); mbedtls_aria_crypt_ecb( &ctx, aria_test1_ecb_ct[i], blk ); - if( memcmp( blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE ) != 0 ) - ARIA_SELF_TEST_IF_FAIL; + ARIA_SELF_TEST_ASSERT( + memcmp( blk, aria_test1_ecb_pt, MBEDTLS_ARIA_BLOCKSIZE ) + != 0 ); } if( verbose ) mbedtls_printf( "\n" ); @@ -965,8 +957,8 @@ int mbedtls_aria_self_test( int verbose ) memset( buf, 0x55, sizeof( buf ) ); mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, iv, aria_test2_pt, buf ); - if( memcmp( buf, aria_test2_cbc_ct[i], 48 ) != 0 ) - ARIA_SELF_TEST_IF_FAIL; + ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_cbc_ct[i], 48 ) + != 0 ); /* Test CBC decryption */ if( verbose ) @@ -976,8 +968,7 @@ int mbedtls_aria_self_test( int verbose ) memset( buf, 0xAA, sizeof( buf ) ); mbedtls_aria_crypt_cbc( &ctx, MBEDTLS_ARIA_DECRYPT, 48, iv, aria_test2_cbc_ct[i], buf ); - if( memcmp( buf, aria_test2_pt, 48 ) != 0 ) - ARIA_SELF_TEST_IF_FAIL; + ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_pt, 48 ) != 0 ); } if( verbose ) mbedtls_printf( "\n" ); @@ -996,8 +987,7 @@ int mbedtls_aria_self_test( int verbose ) j = 0; mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_ENCRYPT, 48, &j, iv, aria_test2_pt, buf ); - if( memcmp( buf, aria_test2_cfb_ct[i], 48 ) != 0 ) - ARIA_SELF_TEST_IF_FAIL; + ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_cfb_ct[i], 48 ) != 0 ); /* Test CFB decryption */ if( verbose ) @@ -1008,8 +998,7 @@ int mbedtls_aria_self_test( int verbose ) j = 0; mbedtls_aria_crypt_cfb128( &ctx, MBEDTLS_ARIA_DECRYPT, 48, &j, iv, aria_test2_cfb_ct[i], buf ); - if( memcmp( buf, aria_test2_pt, 48 ) != 0 ) - ARIA_SELF_TEST_IF_FAIL; + ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_pt, 48 ) != 0 ); } if( verbose ) mbedtls_printf( "\n" ); @@ -1027,8 +1016,7 @@ int mbedtls_aria_self_test( int verbose ) j = 0; mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk, aria_test2_pt, buf ); - if( memcmp( buf, aria_test2_ctr_ct[i], 48 ) != 0 ) - ARIA_SELF_TEST_IF_FAIL; + ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_ctr_ct[i], 48 ) != 0 ); /* Test CTR decryption */ if( verbose ) @@ -1039,8 +1027,7 @@ int mbedtls_aria_self_test( int verbose ) j = 0; mbedtls_aria_crypt_ctr( &ctx, 48, &j, iv, blk, aria_test2_ctr_ct[i], buf ); - if( memcmp( buf, aria_test2_pt, 48 ) != 0 ) - ARIA_SELF_TEST_IF_FAIL; + ARIA_SELF_TEST_ASSERT( memcmp( buf, aria_test2_pt, 48 ) != 0 ); } if( verbose ) mbedtls_printf( "\n" ); diff --git a/thirdparty/mbedtls/library/asn1parse.c b/thirdparty/mbedtls/library/asn1parse.c index 22747d3ba4..bf97585289 100644 --- a/thirdparty/mbedtls/library/asn1parse.c +++ b/thirdparty/mbedtls/library/asn1parse.c @@ -31,13 +31,7 @@ #include "mbedtls/bignum.h" #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif /* * ASN.1 DER decoding routines diff --git a/thirdparty/mbedtls/library/asn1write.c b/thirdparty/mbedtls/library/asn1write.c index afa26a6be9..4b59927cbb 100644 --- a/thirdparty/mbedtls/library/asn1write.c +++ b/thirdparty/mbedtls/library/asn1write.c @@ -26,13 +26,7 @@ #include <string.h> -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif int mbedtls_asn1_write_len( unsigned char **p, unsigned char *start, size_t len ) { @@ -78,9 +72,11 @@ int mbedtls_asn1_write_len( unsigned char **p, unsigned char *start, size_t len return( 4 ); } + int len_is_valid = 1; #if SIZE_MAX > 0xFFFFFFFF - if( len <= 0xFFFFFFFF ) + len_is_valid = ( len <= 0xFFFFFFFF ); #endif + if( len_is_valid ) { if( *p - start < 5 ) return( MBEDTLS_ERR_ASN1_BUF_TOO_SMALL ); @@ -93,9 +89,7 @@ int mbedtls_asn1_write_len( unsigned char **p, unsigned char *start, size_t len return( 5 ); } -#if SIZE_MAX > 0xFFFFFFFF return( MBEDTLS_ERR_ASN1_INVALID_LENGTH ); -#endif } int mbedtls_asn1_write_tag( unsigned char **p, unsigned char *start, unsigned char tag ) diff --git a/thirdparty/mbedtls/library/base64.c b/thirdparty/mbedtls/library/base64.c index 83daa0bcc6..9021a041bb 100644 --- a/thirdparty/mbedtls/library/base64.c +++ b/thirdparty/mbedtls/library/base64.c @@ -28,12 +28,7 @@ #if defined(MBEDTLS_SELF_TEST) #include <string.h> -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ #endif /* MBEDTLS_SELF_TEST */ #define BASE64_SIZE_T_MAX ( (size_t) -1 ) /* SIZE_T_MAX is not standard */ diff --git a/thirdparty/mbedtls/library/bignum.c b/thirdparty/mbedtls/library/bignum.c index 32578e2c68..37193f55a8 100644 --- a/thirdparty/mbedtls/library/bignum.c +++ b/thirdparty/mbedtls/library/bignum.c @@ -46,15 +46,7 @@ #include <limits.h> #include <string.h> -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#include <stdlib.h> -#define mbedtls_printf printf -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #define MPI_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_MPI_BAD_INPUT_DATA ) @@ -270,6 +262,17 @@ void mbedtls_mpi_swap( mbedtls_mpi *X, mbedtls_mpi *Y ) memcpy( Y, &T, sizeof( mbedtls_mpi ) ); } +static inline mbedtls_mpi_uint mpi_sint_abs( mbedtls_mpi_sint z ) +{ + if( z >= 0 ) + return( z ); + /* Take care to handle the most negative value (-2^(biL-1)) correctly. + * A naive -z would have undefined behavior. + * Write this in a way that makes popular compilers happy (GCC, Clang, + * MSVC). */ + return( (mbedtls_mpi_uint) 0 - (mbedtls_mpi_uint) z ); +} + /* * Set value from integer */ @@ -281,7 +284,7 @@ int mbedtls_mpi_lset( mbedtls_mpi *X, mbedtls_mpi_sint z ) MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, 1 ) ); memset( X->p, 0, X->n * ciL ); - X->p[0] = ( z < 0 ) ? -z : z; + X->p[0] = mpi_sint_abs( z ); X->s = ( z < 0 ) ? -1 : 1; cleanup: @@ -1101,7 +1104,7 @@ int mbedtls_mpi_cmp_int( const mbedtls_mpi *X, mbedtls_mpi_sint z ) mbedtls_mpi_uint p[1]; MPI_VALIDATE_RET( X != NULL ); - *p = ( z < 0 ) ? -z : z; + *p = mpi_sint_abs( z ); Y.s = ( z < 0 ) ? -1 : 1; Y.n = 1; Y.p = p; @@ -1138,6 +1141,11 @@ int mbedtls_mpi_add_abs( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi if( B->p[j - 1] != 0 ) break; + /* Exit early to avoid undefined behavior on NULL+0 when X->n == 0 + * and B is 0 (of any size). */ + if( j == 0 ) + return( 0 ); + MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) ); o = B->p; p = X->p; c = 0; @@ -1257,10 +1265,12 @@ cleanup: return( ret ); } -/* - * Signed addition: X = A + B +/* Common function for signed addition and subtraction. + * Calculate A + B * flip_B where flip_B is 1 or -1. */ -int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) +static int add_sub_mpi( mbedtls_mpi *X, + const mbedtls_mpi *A, const mbedtls_mpi *B, + int flip_B ) { int ret, s; MPI_VALIDATE_RET( X != NULL ); @@ -1268,16 +1278,21 @@ int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi MPI_VALIDATE_RET( B != NULL ); s = A->s; - if( A->s * B->s < 0 ) + if( A->s * B->s * flip_B < 0 ) { - if( mbedtls_mpi_cmp_abs( A, B ) >= 0 ) + int cmp = mbedtls_mpi_cmp_abs( A, B ); + if( cmp >= 0 ) { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, A, B ) ); - X->s = s; + /* If |A| = |B|, the result is 0 and we must set the sign bit + * to +1 regardless of which of A or B was negative. Otherwise, + * since |A| > |B|, the sign is the sign of A. */ + X->s = cmp == 0 ? 1 : s; } else { MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, B, A ) ); + /* Since |A| < |B|, the sign is the opposite of A. */ X->s = -s; } } @@ -1293,38 +1308,19 @@ cleanup: } /* + * Signed addition: X = A + B + */ +int mbedtls_mpi_add_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) +{ + return( add_sub_mpi( X, A, B, 1 ) ); +} + +/* * Signed subtraction: X = A - B */ int mbedtls_mpi_sub_mpi( mbedtls_mpi *X, const mbedtls_mpi *A, const mbedtls_mpi *B ) { - int ret, s; - MPI_VALIDATE_RET( X != NULL ); - MPI_VALIDATE_RET( A != NULL ); - MPI_VALIDATE_RET( B != NULL ); - - s = A->s; - if( A->s * B->s > 0 ) - { - if( mbedtls_mpi_cmp_abs( A, B ) >= 0 ) - { - MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, A, B ) ); - X->s = s; - } - else - { - MBEDTLS_MPI_CHK( mbedtls_mpi_sub_abs( X, B, A ) ); - X->s = -s; - } - } - else - { - MBEDTLS_MPI_CHK( mbedtls_mpi_add_abs( X, A, B ) ); - X->s = s; - } - -cleanup: - - return( ret ); + return( add_sub_mpi( X, A, B, -1 ) ); } /* @@ -1337,7 +1333,7 @@ int mbedtls_mpi_add_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); - p[0] = ( b < 0 ) ? -b : b; + p[0] = mpi_sint_abs( b ); B.s = ( b < 0 ) ? -1 : 1; B.n = 1; B.p = p; @@ -1355,7 +1351,7 @@ int mbedtls_mpi_sub_int( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi_sint MPI_VALIDATE_RET( X != NULL ); MPI_VALIDATE_RET( A != NULL ); - p[0] = ( b < 0 ) ? -b : b; + p[0] = mpi_sint_abs( b ); B.s = ( b < 0 ) ? -1 : 1; B.n = 1; B.p = p; @@ -1776,7 +1772,7 @@ int mbedtls_mpi_div_int( mbedtls_mpi *Q, mbedtls_mpi *R, mbedtls_mpi_uint p[1]; MPI_VALIDATE_RET( A != NULL ); - p[0] = ( b < 0 ) ? -b : b; + p[0] = mpi_sint_abs( b ); B.s = ( b < 0 ) ? -1 : 1; B.n = 1; B.p = p; @@ -2009,11 +2005,11 @@ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, mbedtls_mpi *prec_RR ) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; - size_t wbits, wsize, one = 1; + size_t window_bitsize; size_t i, j, nblimbs; size_t bufsize, nbits; mbedtls_mpi_uint ei, mm, state; - mbedtls_mpi RR, T, W[ 1 << MBEDTLS_MPI_WINDOW_SIZE ], WW, Apos; + mbedtls_mpi RR, T, W[ (size_t) 1 << MBEDTLS_MPI_WINDOW_SIZE ], WW, Apos; int neg; MPI_VALIDATE_RET( X != NULL ); @@ -2042,21 +2038,59 @@ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, i = mbedtls_mpi_bitlen( E ); - wsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 : + window_bitsize = ( i > 671 ) ? 6 : ( i > 239 ) ? 5 : ( i > 79 ) ? 4 : ( i > 23 ) ? 3 : 1; #if( MBEDTLS_MPI_WINDOW_SIZE < 6 ) - if( wsize > MBEDTLS_MPI_WINDOW_SIZE ) - wsize = MBEDTLS_MPI_WINDOW_SIZE; + if( window_bitsize > MBEDTLS_MPI_WINDOW_SIZE ) + window_bitsize = MBEDTLS_MPI_WINDOW_SIZE; #endif + const size_t w_table_used_size = (size_t) 1 << window_bitsize; + + /* + * This function is not constant-trace: its memory accesses depend on the + * exponent value. To defend against timing attacks, callers (such as RSA + * and DHM) should use exponent blinding. However this is not enough if the + * adversary can find the exponent in a single trace, so this function + * takes extra precautions against adversaries who can observe memory + * access patterns. + * + * This function performs a series of multiplications by table elements and + * squarings, and we want the prevent the adversary from finding out which + * table element was used, and from distinguishing between multiplications + * and squarings. Firstly, when multiplying by an element of the window + * W[i], we do a constant-trace table lookup to obfuscate i. This leaves + * squarings as having a different memory access patterns from other + * multiplications. So secondly, we put the accumulator X in the table as + * well, and also do a constant-trace table lookup to multiply by X. + * + * This way, all multiplications take the form of a lookup-and-multiply. + * The number of lookup-and-multiply operations inside each iteration of + * the main loop still depends on the bits of the exponent, but since the + * other operations in the loop don't have an easily recognizable memory + * trace, an adversary is unlikely to be able to observe the exact + * patterns. + * + * An adversary may still be able to recover the exponent if they can + * observe both memory accesses and branches. However, branch prediction + * exploitation typically requires many traces of execution over the same + * data, which is defeated by randomized blinding. + * + * To achieve this, we make a copy of X and we use the table entry in each + * calculation from this point on. + */ + const size_t x_index = 0; + mbedtls_mpi_init( &W[x_index] ); + mbedtls_mpi_copy( &W[x_index], X ); + j = N->n + 1; /* All W[i] and X must have at least N->n limbs for the mpi_montmul() * and mpi_montred() calls later. Here we ensure that W[1] and X are * large enough, and later we'll grow other W[i] to the same length. * They must not be shrunk midway through this function! */ - MBEDTLS_MPI_CHK( mbedtls_mpi_grow( X, j ) ); + MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[x_index], j ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[1], j ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &T, j * 2 ) ); @@ -2105,28 +2139,36 @@ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, mpi_montmul( &W[1], &RR, N, mm, &T ); /* - * X = R^2 * R^-1 mod N = R mod N + * W[x_index] = R^2 * R^-1 mod N = R mod N */ - MBEDTLS_MPI_CHK( mbedtls_mpi_copy( X, &RR ) ); - mpi_montred( X, N, mm, &T ); + MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[x_index], &RR ) ); + mpi_montred( &W[x_index], N, mm, &T ); + - if( wsize > 1 ) + if( window_bitsize > 1 ) { /* - * W[1 << (wsize - 1)] = W[1] ^ (wsize - 1) + * W[i] = W[1] ^ i + * + * The first bit of the sliding window is always 1 and therefore we + * only need to store the second half of the table. + * + * (There are two special elements in the table: W[0] for the + * accumulator/result and W[1] for A in Montgomery form. Both of these + * are already set at this point.) */ - j = one << ( wsize - 1 ); + j = w_table_used_size / 2; MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[j], N->n + 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[j], &W[1] ) ); - for( i = 0; i < wsize - 1; i++ ) + for( i = 0; i < window_bitsize - 1; i++ ) mpi_montmul( &W[j], &W[j], N, mm, &T ); /* * W[i] = W[i - 1] * W[1] */ - for( i = j + 1; i < ( one << wsize ); i++ ) + for( i = j + 1; i < w_table_used_size; i++ ) { MBEDTLS_MPI_CHK( mbedtls_mpi_grow( &W[i], N->n + 1 ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_copy( &W[i], &W[i - 1] ) ); @@ -2138,7 +2180,7 @@ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, nblimbs = E->n; bufsize = 0; nbits = 0; - wbits = 0; + size_t exponent_bits_in_window = 0; state = 0; while( 1 ) @@ -2166,9 +2208,10 @@ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, if( ei == 0 && state == 1 ) { /* - * out of window, square X + * out of window, square W[x_index] */ - mpi_montmul( X, X, N, mm, &T ); + MBEDTLS_MPI_CHK( mpi_select( &WW, W, w_table_used_size, x_index ) ); + mpi_montmul( &W[x_index], &WW, N, mm, &T ); continue; } @@ -2178,25 +2221,30 @@ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, state = 2; nbits++; - wbits |= ( ei << ( wsize - nbits ) ); + exponent_bits_in_window |= ( ei << ( window_bitsize - nbits ) ); - if( nbits == wsize ) + if( nbits == window_bitsize ) { /* - * X = X^wsize R^-1 mod N + * W[x_index] = W[x_index]^window_bitsize R^-1 mod N */ - for( i = 0; i < wsize; i++ ) - mpi_montmul( X, X, N, mm, &T ); + for( i = 0; i < window_bitsize; i++ ) + { + MBEDTLS_MPI_CHK( mpi_select( &WW, W, w_table_used_size, + x_index ) ); + mpi_montmul( &W[x_index], &WW, N, mm, &T ); + } /* - * X = X * W[wbits] R^-1 mod N + * W[x_index] = W[x_index] * W[exponent_bits_in_window] R^-1 mod N */ - MBEDTLS_MPI_CHK( mpi_select( &WW, W, (size_t) 1 << wsize, wbits ) ); - mpi_montmul( X, &WW, N, mm, &T ); + MBEDTLS_MPI_CHK( mpi_select( &WW, W, w_table_used_size, + exponent_bits_in_window ) ); + mpi_montmul( &W[x_index], &WW, N, mm, &T ); state--; nbits = 0; - wbits = 0; + exponent_bits_in_window = 0; } } @@ -2205,31 +2253,45 @@ int mbedtls_mpi_exp_mod( mbedtls_mpi *X, const mbedtls_mpi *A, */ for( i = 0; i < nbits; i++ ) { - mpi_montmul( X, X, N, mm, &T ); + MBEDTLS_MPI_CHK( mpi_select( &WW, W, w_table_used_size, x_index ) ); + mpi_montmul( &W[x_index], &WW, N, mm, &T ); - wbits <<= 1; + exponent_bits_in_window <<= 1; - if( ( wbits & ( one << wsize ) ) != 0 ) - mpi_montmul( X, &W[1], N, mm, &T ); + if( ( exponent_bits_in_window & ( (size_t) 1 << window_bitsize ) ) != 0 ) + { + MBEDTLS_MPI_CHK( mpi_select( &WW, W, w_table_used_size, 1 ) ); + mpi_montmul( &W[x_index], &WW, N, mm, &T ); + } } /* - * X = A^E * R * R^-1 mod N = A^E mod N + * W[x_index] = A^E * R * R^-1 mod N = A^E mod N */ - mpi_montred( X, N, mm, &T ); + mpi_montred( &W[x_index], N, mm, &T ); if( neg && E->n != 0 && ( E->p[0] & 1 ) != 0 ) { - X->s = -1; - MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( X, N, X ) ); + W[x_index].s = -1; + MBEDTLS_MPI_CHK( mbedtls_mpi_add_mpi( &W[x_index], N, &W[x_index] ) ); } + /* + * Load the result in the output variable. + */ + mbedtls_mpi_copy( X, &W[x_index] ); + cleanup: - for( i = ( one << ( wsize - 1 ) ); i < ( one << wsize ); i++ ) + /* The first bit of the sliding window is always 1 and therefore the first + * half of the table was unused. */ + for( i = w_table_used_size/2; i < w_table_used_size; i++ ) mbedtls_mpi_free( &W[i] ); - mbedtls_mpi_free( &W[1] ); mbedtls_mpi_free( &T ); mbedtls_mpi_free( &Apos ); + mbedtls_mpi_free( &W[x_index] ); + mbedtls_mpi_free( &W[1] ); + mbedtls_mpi_free( &T ); + mbedtls_mpi_free( &Apos ); mbedtls_mpi_free( &WW ); if( prec_RR == NULL || prec_RR->p == NULL ) @@ -2862,7 +2924,7 @@ int mbedtls_mpi_gen_prime( mbedtls_mpi *X, size_t nbits, int flags, else { /* - * An necessary condition for Y and X = 2Y + 1 to be prime + * A necessary condition for Y and X = 2Y + 1 to be prime * is X = 2 mod 3 (which is equivalent to Y = 2 mod 3). * Make sure it is satisfied, while keeping X = 3 mod 4 */ diff --git a/thirdparty/mbedtls/library/camellia.c b/thirdparty/mbedtls/library/camellia.c index 29d730ab53..e90cd7f134 100644 --- a/thirdparty/mbedtls/library/camellia.c +++ b/thirdparty/mbedtls/library/camellia.c @@ -32,14 +32,7 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_CAMELLIA_ALT) diff --git a/thirdparty/mbedtls/library/ccm.c b/thirdparty/mbedtls/library/ccm.c index a21a37f55f..e0d43334f9 100644 --- a/thirdparty/mbedtls/library/ccm.c +++ b/thirdparty/mbedtls/library/ccm.c @@ -36,14 +36,7 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #if !defined(MBEDTLS_CCM_ALT) diff --git a/thirdparty/mbedtls/library/chacha20.c b/thirdparty/mbedtls/library/chacha20.c index 658f046901..bd0701482c 100644 --- a/thirdparty/mbedtls/library/chacha20.c +++ b/thirdparty/mbedtls/library/chacha20.c @@ -32,22 +32,10 @@ #include <stddef.h> #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_CHACHA20_ALT) -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - /* Parameter validation macros */ #define CHACHA20_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CHACHA20_BAD_INPUT_DATA ) diff --git a/thirdparty/mbedtls/library/chachapoly.c b/thirdparty/mbedtls/library/chachapoly.c index dc75b2030a..4adf846857 100644 --- a/thirdparty/mbedtls/library/chachapoly.c +++ b/thirdparty/mbedtls/library/chachapoly.c @@ -28,14 +28,7 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_CHACHAPOLY_ALT) diff --git a/thirdparty/mbedtls/library/cipher.c b/thirdparty/mbedtls/library/cipher.c index f3b4bd29ce..67e3274587 100644 --- a/thirdparty/mbedtls/library/cipher.c +++ b/thirdparty/mbedtls/library/cipher.c @@ -63,12 +63,7 @@ #include "mbedtls/nist_kw.h" #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #define CIPHER_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_CIPHER_BAD_INPUT_DATA ) diff --git a/thirdparty/mbedtls/library/cipher_wrap.c b/thirdparty/mbedtls/library/cipher_wrap.c index 57eb3cb67f..c76bdcc0f8 100644 --- a/thirdparty/mbedtls/library/cipher_wrap.c +++ b/thirdparty/mbedtls/library/cipher_wrap.c @@ -76,13 +76,7 @@ #include <string.h> #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #if defined(MBEDTLS_GCM_C) /* shared by all GCM ciphers */ diff --git a/thirdparty/mbedtls/library/common.h b/thirdparty/mbedtls/library/common.h index c06472418d..1663d50226 100644 --- a/thirdparty/mbedtls/library/common.h +++ b/thirdparty/mbedtls/library/common.h @@ -29,8 +29,15 @@ #include "mbedtls/config.h" #endif +#include <stddef.h> #include <stdint.h> +/* Define `inline` on some non-C99-compliant compilers. */ +#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ + !defined(inline) && !defined(__cplusplus) +#define inline __inline +#endif + /** Helper to define a function as static except when building invasive tests. * * If a function is only used inside its own source file and should be @@ -52,6 +59,44 @@ #define MBEDTLS_STATIC_TESTABLE static #endif +/** Return an offset into a buffer. + * + * This is just the addition of an offset to a pointer, except that this + * function also accepts an offset of 0 into a buffer whose pointer is null. + * (`p + n` has undefined behavior when `p` is null, even when `n == 0`. + * A null pointer is a valid buffer pointer when the size is 0, for example + * as the result of `malloc(0)` on some platforms.) + * + * \param p Pointer to a buffer of at least n bytes. + * This may be \p NULL if \p n is zero. + * \param n An offset in bytes. + * \return Pointer to offset \p n in the buffer \p p. + * Note that this is only a valid pointer if the size of the + * buffer is at least \p n + 1. + */ +static inline unsigned char *mbedtls_buffer_offset( + unsigned char *p, size_t n ) +{ + return( p == NULL ? NULL : p + n ); +} + +/** Return an offset into a read-only buffer. + * + * Similar to mbedtls_buffer_offset(), but for const pointers. + * + * \param p Pointer to a buffer of at least n bytes. + * This may be \p NULL if \p n is zero. + * \param n An offset in bytes. + * \return Pointer to offset \p n in the buffer \p p. + * Note that this is only a valid pointer if the size of the + * buffer is at least \p n + 1. + */ +static inline const unsigned char *mbedtls_buffer_offset_const( + const unsigned char *p, size_t n ) +{ + return( p == NULL ? NULL : p + n ); +} + /** Byte Reading Macros * * Given a multi-byte integer \p x, MBEDTLS_BYTE_n retrieves the n-th diff --git a/thirdparty/mbedtls/library/constant_time.c b/thirdparty/mbedtls/library/constant_time.c index e276d23ca0..2401b0434a 100644 --- a/thirdparty/mbedtls/library/constant_time.c +++ b/thirdparty/mbedtls/library/constant_time.c @@ -81,7 +81,7 @@ unsigned mbedtls_ct_uint_mask( unsigned value ) #endif } -#if defined(MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC) +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) size_t mbedtls_ct_size_mask( size_t value ) { @@ -97,7 +97,7 @@ size_t mbedtls_ct_size_mask( size_t value ) #endif } -#endif /* MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC */ +#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ #if defined(MBEDTLS_BIGNUM_C) @@ -272,7 +272,7 @@ unsigned mbedtls_ct_uint_if( unsigned condition, * \note if1 and if0 must be either 1 or -1, otherwise the result * is undefined. * - * \param condition Condition to test. + * \param condition Condition to test; must be either 0 or 1. * \param if1 The first sign; must be either +1 or -1. * \param if0 The second sign; must be either +1 or -1. * @@ -404,8 +404,7 @@ static void mbedtls_ct_mem_move_to_left( void *start, #endif /* MBEDTLS_PKCS1_V15 && MBEDTLS_RSA_C && ! MBEDTLS_RSA_ALT */ -#if defined(MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC) - +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) void mbedtls_ct_memcpy_if_eq( unsigned char *dest, const unsigned char *src, size_t len, @@ -527,7 +526,7 @@ cleanup: return( ret ); } -#endif /* MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC */ +#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ #if defined(MBEDTLS_BIGNUM_C) diff --git a/thirdparty/mbedtls/library/constant_time_internal.h b/thirdparty/mbedtls/library/constant_time_internal.h index a550b38fa5..ff2d0ff92c 100644 --- a/thirdparty/mbedtls/library/constant_time_internal.h +++ b/thirdparty/mbedtls/library/constant_time_internal.h @@ -32,7 +32,6 @@ #include <stddef.h> - /** Turn a value into a mask: * - if \p value == 0, return the all-bits 0 mask, aka 0 * - otherwise, return the all-bits 1 mask, aka (unsigned) -1 @@ -46,7 +45,7 @@ */ unsigned mbedtls_ct_uint_mask( unsigned value ); -#if defined(MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC) +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) /** Turn a value into a mask: * - if \p value == 0, return the all-bits 0 mask, aka 0 @@ -61,7 +60,7 @@ unsigned mbedtls_ct_uint_mask( unsigned value ); */ size_t mbedtls_ct_size_mask( size_t value ); -#endif /* MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC */ +#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ #if defined(MBEDTLS_BIGNUM_C) @@ -196,7 +195,7 @@ signed char mbedtls_ct_base64_dec_value( unsigned char c ); #endif /* MBEDTLS_BASE64_C */ -#if defined(MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC) +#if defined(MBEDTLS_SSL_SOME_MODES_USE_MAC) /** Conditional memcpy without branches. * @@ -292,7 +291,7 @@ int mbedtls_ct_hmac( mbedtls_md_context_t *ctx, size_t max_data_len, unsigned char *output ); -#endif /* MBEDTLS_SSL_SOME_SUITES_USE_TLS_CBC */ +#endif /* MBEDTLS_SSL_SOME_MODES_USE_MAC */ #if defined(MBEDTLS_PKCS1_V15) && defined(MBEDTLS_RSA_C) && !defined(MBEDTLS_RSA_ALT) diff --git a/thirdparty/mbedtls/library/ctr_drbg.c b/thirdparty/mbedtls/library/ctr_drbg.c index a00d66ce87..ed31576a7b 100644 --- a/thirdparty/mbedtls/library/ctr_drbg.c +++ b/thirdparty/mbedtls/library/ctr_drbg.c @@ -36,14 +36,7 @@ #include <stdio.h> #endif -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ /* * CTR_DRBG context initialization diff --git a/thirdparty/mbedtls/library/debug.c b/thirdparty/mbedtls/library/debug.c index e1086008af..353b4bf07b 100644 --- a/thirdparty/mbedtls/library/debug.c +++ b/thirdparty/mbedtls/library/debug.c @@ -21,16 +21,7 @@ #if defined(MBEDTLS_DEBUG_C) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#define mbedtls_time_t time_t -#define mbedtls_snprintf snprintf -#define mbedtls_vsnprintf vsnprintf -#endif #include "mbedtls/debug.h" #include "mbedtls/error.h" @@ -39,11 +30,6 @@ #include <stdio.h> #include <string.h> -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - #define DEBUG_BUF_SIZE 512 static int debug_threshold = 0; diff --git a/thirdparty/mbedtls/library/des.c b/thirdparty/mbedtls/library/des.c index 91d22b5d90..65f5681cf1 100644 --- a/thirdparty/mbedtls/library/des.c +++ b/thirdparty/mbedtls/library/des.c @@ -33,14 +33,7 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_DES_ALT) diff --git a/thirdparty/mbedtls/library/dhm.c b/thirdparty/mbedtls/library/dhm.c index 88e148bb80..4d2e33e689 100644 --- a/thirdparty/mbedtls/library/dhm.c +++ b/thirdparty/mbedtls/library/dhm.c @@ -43,15 +43,7 @@ #include "mbedtls/asn1.h" #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#include <stdio.h> -#define mbedtls_printf printf -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #if !defined(MBEDTLS_DHM_ALT) diff --git a/thirdparty/mbedtls/library/ecdh.c b/thirdparty/mbedtls/library/ecdh.c index 60c6e429de..724c938a71 100644 --- a/thirdparty/mbedtls/library/ecdh.c +++ b/thirdparty/mbedtls/library/ecdh.c @@ -77,10 +77,12 @@ static int ecdh_gen_public_restartable( mbedtls_ecp_group *grp, { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; - /* If multiplication is in progress, we already generated a privkey */ + int restarting = 0; #if defined(MBEDTLS_ECP_RESTARTABLE) - if( rs_ctx == NULL || rs_ctx->rsm == NULL ) + restarting = ( rs_ctx != NULL && rs_ctx->rsm != NULL ); #endif + /* If multiplication is in progress, we already generated a privkey */ + if( !restarting ) MBEDTLS_MPI_CHK( mbedtls_ecp_gen_privkey( grp, d, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_mul_restartable( grp, Q, d, &grp->G, diff --git a/thirdparty/mbedtls/library/ecdsa.c b/thirdparty/mbedtls/library/ecdsa.c index 640eb24a26..4bae6a93fd 100644 --- a/thirdparty/mbedtls/library/ecdsa.c +++ b/thirdparty/mbedtls/library/ecdsa.c @@ -36,13 +36,7 @@ #include "mbedtls/hmac_drbg.h" #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #include "mbedtls/platform_util.h" #include "mbedtls/error.h" diff --git a/thirdparty/mbedtls/library/ecjpake.c b/thirdparty/mbedtls/library/ecjpake.c index 0b9bffb93e..fe0b9d93e9 100644 --- a/thirdparty/mbedtls/library/ecjpake.c +++ b/thirdparty/mbedtls/library/ecjpake.c @@ -794,12 +794,7 @@ cleanup: #if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif #if !defined(MBEDTLS_ECP_DP_SECP256R1_ENABLED) || \ !defined(MBEDTLS_SHA256_C) diff --git a/thirdparty/mbedtls/library/ecp.c b/thirdparty/mbedtls/library/ecp.c index 890f364a08..ad19e05fb2 100644 --- a/thirdparty/mbedtls/library/ecp.c +++ b/thirdparty/mbedtls/library/ecp.c @@ -90,15 +90,7 @@ #define ECP_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#include <stdio.h> -#define mbedtls_printf printf -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #include "mbedtls/ecp_internal.h" @@ -112,11 +104,6 @@ #endif #endif /* MBEDTLS_ECP_NO_INTERNAL_RNG */ -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - #if defined(MBEDTLS_SELF_TEST) /* * Counts of point addition and doubling, and field multiplications. @@ -2056,9 +2043,13 @@ static int ecp_mul_comb_core( const mbedtls_ecp_group *grp, mbedtls_ecp_point *R i = d; MBEDTLS_MPI_CHK( ecp_select_comb( grp, R, T, T_size, x[i] ) ); MBEDTLS_MPI_CHK( mbedtls_mpi_lset( &R->Z, 1 ) ); + + int have_rng = 1; #if defined(MBEDTLS_ECP_NO_INTERNAL_RNG) - if( f_rng != 0 ) + if( f_rng == NULL ) + have_rng = 0; #endif + if( have_rng ) MBEDTLS_MPI_CHK( ecp_randomize_jac( grp, R, f_rng, p_rng ) ); } @@ -2192,9 +2183,12 @@ final_norm: * * Avoid the leak by randomizing coordinates before we normalize them. */ + int have_rng = 1; #if defined(MBEDTLS_ECP_NO_INTERNAL_RNG) - if( f_rng != 0 ) + if( f_rng == NULL ) + have_rng = 0; #endif + if( have_rng ) MBEDTLS_MPI_CHK( ecp_randomize_jac( grp, RR, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( ecp_normalize_jac( grp, RR ) ); @@ -2403,12 +2397,14 @@ cleanup: mbedtls_free( T ); } - /* don't free R while in progress in case R == P */ + /* prevent caller from using invalid value */ + int should_free_R = ( ret != 0 ); #if defined(MBEDTLS_ECP_RESTARTABLE) - if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) + /* don't free R while in progress in case R == P */ + if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) + should_free_R = 0; #endif - /* prevent caller from using invalid value */ - if( ret != 0 ) + if( should_free_R ) mbedtls_ecp_point_free( R ); ECP_RS_LEAVE( rsm ); @@ -2596,13 +2592,16 @@ static int ecp_mul_mxz( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, MOD_ADD( RP.X ); /* Randomize coordinates of the starting point */ + int have_rng = 1; #if defined(MBEDTLS_ECP_NO_INTERNAL_RNG) - if( f_rng != NULL ) + if( f_rng == NULL ) + have_rng = 0; #endif + if( have_rng ) MBEDTLS_MPI_CHK( ecp_randomize_mxz( grp, &RP, f_rng, p_rng ) ); /* Loop invariant: R = result so far, RP = R + P */ - i = mbedtls_mpi_bitlen( m ); /* one past the (zero-based) most significant bit */ + i = grp->nbits + 1; /* one past the (zero-based) required msb for private keys */ while( i-- > 0 ) { b = mbedtls_mpi_get_bit( m, i ); @@ -2631,9 +2630,12 @@ static int ecp_mul_mxz( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, * * Avoid the leak by randomizing coordinates before we normalize them. */ + have_rng = 1; #if defined(MBEDTLS_ECP_NO_INTERNAL_RNG) - if( f_rng != NULL ) + if( f_rng == NULL ) + have_rng = 0; #endif + if( have_rng ) MBEDTLS_MPI_CHK( ecp_randomize_mxz( grp, R, f_rng, p_rng ) ); MBEDTLS_MPI_CHK( ecp_normalize_mxz( grp, R ) ); @@ -2680,10 +2682,12 @@ int mbedtls_ecp_mul_restartable( mbedtls_ecp_group *grp, mbedtls_ecp_point *R, MBEDTLS_MPI_CHK( mbedtls_internal_ecp_init( grp ) ); #endif /* MBEDTLS_ECP_INTERNAL_ALT */ + int restarting = 0; #if defined(MBEDTLS_ECP_RESTARTABLE) - /* skip argument check when restarting */ - if( rs_ctx == NULL || rs_ctx->rsm == NULL ) + restarting = ( rs_ctx != NULL && rs_ctx->rsm != NULL ); #endif + /* skip argument check when restarting */ + if( !restarting ) { /* check_privkey is free */ MBEDTLS_ECP_BUDGET( MBEDTLS_ECP_OPS_CHK ); @@ -2797,14 +2801,17 @@ static int mbedtls_ecp_mul_shortcuts( mbedtls_ecp_group *grp, if( mbedtls_mpi_cmp_int( m, 0 ) == 0 ) { + MBEDTLS_MPI_CHK( mbedtls_ecp_check_pubkey( grp, P ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_set_zero( R ) ); } else if( mbedtls_mpi_cmp_int( m, 1 ) == 0 ) { + MBEDTLS_MPI_CHK( mbedtls_ecp_check_pubkey( grp, P ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, P ) ); } else if( mbedtls_mpi_cmp_int( m, -1 ) == 0 ) { + MBEDTLS_MPI_CHK( mbedtls_ecp_check_pubkey( grp, P ) ); MBEDTLS_MPI_CHK( mbedtls_ecp_copy( R, P ) ); if( mbedtls_mpi_cmp_int( &R->Y, 0 ) != 0 ) MBEDTLS_MPI_CHK( mbedtls_mpi_sub_mpi( &R->Y, &grp->P, &R->Y ) ); diff --git a/thirdparty/mbedtls/library/ecp_curves.c b/thirdparty/mbedtls/library/ecp_curves.c index 2199be6461..47761eef4e 100644 --- a/thirdparty/mbedtls/library/ecp_curves.c +++ b/thirdparty/mbedtls/library/ecp_curves.c @@ -38,11 +38,6 @@ #define ECP_VALIDATE( cond ) \ MBEDTLS_INTERNAL_VALIDATE( cond ) -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - #define ECP_MPI_INIT(s, n, p) {s, (n), (mbedtls_mpi_uint *)(p)} #define ECP_MPI_INIT_ARRAY(x) \ diff --git a/thirdparty/mbedtls/library/entropy.c b/thirdparty/mbedtls/library/entropy.c index 12fd3b9b5f..e3b337ff35 100644 --- a/thirdparty/mbedtls/library/entropy.c +++ b/thirdparty/mbedtls/library/entropy.c @@ -38,18 +38,9 @@ #include <stdio.h> #endif -#if defined(MBEDTLS_ENTROPY_NV_SEED) #include "mbedtls/platform.h" -#endif -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #if defined(MBEDTLS_HAVEGE_C) #include "mbedtls/havege.h" diff --git a/thirdparty/mbedtls/library/entropy_poll.c b/thirdparty/mbedtls/library/entropy_poll.c index 40f23fd2a6..69ac29e4f7 100644 --- a/thirdparty/mbedtls/library/entropy_poll.c +++ b/thirdparty/mbedtls/library/entropy_poll.c @@ -38,9 +38,7 @@ #if defined(MBEDTLS_HAVEGE_C) #include "mbedtls/havege.h" #endif -#if defined(MBEDTLS_ENTROPY_NV_SEED) #include "mbedtls/platform.h" -#endif #if !defined(MBEDTLS_NO_PLATFORM_ENTROPY) diff --git a/thirdparty/mbedtls/library/error.c b/thirdparty/mbedtls/library/error.c index afad38904f..8573369a32 100644 --- a/thirdparty/mbedtls/library/error.c +++ b/thirdparty/mbedtls/library/error.c @@ -25,11 +25,7 @@ #if defined(MBEDTLS_ERROR_C) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#define mbedtls_snprintf snprintf -#endif #include <stdio.h> #include <string.h> @@ -961,7 +957,7 @@ void mbedtls_strerror( int ret, char *buf, size_t buflen ) #else /* MBEDTLS_ERROR_C */ /* - * Provide an non-function in case MBEDTLS_ERROR_C is not defined + * Provide a dummy implementation when MBEDTLS_ERROR_C is not defined */ void mbedtls_strerror( int ret, char *buf, size_t buflen ) { diff --git a/thirdparty/mbedtls/library/gcm.c b/thirdparty/mbedtls/library/gcm.c index 43a5e1bec6..d0b73379a6 100644 --- a/thirdparty/mbedtls/library/gcm.c +++ b/thirdparty/mbedtls/library/gcm.c @@ -32,6 +32,7 @@ #if defined(MBEDTLS_GCM_C) #include "mbedtls/gcm.h" +#include "mbedtls/platform.h" #include "mbedtls/platform_util.h" #include "mbedtls/error.h" @@ -41,15 +42,6 @@ #include "mbedtls/aesni.h" #endif -#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) -#include "mbedtls/aes.h" -#include "mbedtls/platform.h" -#if !defined(MBEDTLS_PLATFORM_C) -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ - #if !defined(MBEDTLS_GCM_ALT) /* Parameter validation macros */ diff --git a/thirdparty/mbedtls/library/hmac_drbg.c b/thirdparty/mbedtls/library/hmac_drbg.c index de9706885c..69272fa73d 100644 --- a/thirdparty/mbedtls/library/hmac_drbg.c +++ b/thirdparty/mbedtls/library/hmac_drbg.c @@ -37,14 +37,7 @@ #include <stdio.h> #endif -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_SELF_TEST */ -#endif /* MBEDTLS_PLATFORM_C */ /* * HMAC_DRBG context initialization diff --git a/thirdparty/mbedtls/library/md.c b/thirdparty/mbedtls/library/md.c index a10a835634..53a84b01c6 100644 --- a/thirdparty/mbedtls/library/md.c +++ b/thirdparty/mbedtls/library/md.c @@ -38,13 +38,7 @@ #include "mbedtls/sha256.h" #include "mbedtls/sha512.h" -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #include <string.h> diff --git a/thirdparty/mbedtls/library/md2.c b/thirdparty/mbedtls/library/md2.c index 7264e30313..f8293a1df3 100644 --- a/thirdparty/mbedtls/library/md2.c +++ b/thirdparty/mbedtls/library/md2.c @@ -33,14 +33,7 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_MD2_ALT) diff --git a/thirdparty/mbedtls/library/md4.c b/thirdparty/mbedtls/library/md4.c index eaa679a0a6..a412213480 100644 --- a/thirdparty/mbedtls/library/md4.c +++ b/thirdparty/mbedtls/library/md4.c @@ -33,14 +33,7 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_MD4_ALT) diff --git a/thirdparty/mbedtls/library/md5.c b/thirdparty/mbedtls/library/md5.c index 4b53fcf367..e53bfe6306 100644 --- a/thirdparty/mbedtls/library/md5.c +++ b/thirdparty/mbedtls/library/md5.c @@ -32,14 +32,7 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_MD5_ALT) diff --git a/thirdparty/mbedtls/library/mps_reader.c b/thirdparty/mbedtls/library/mps_reader.c index 9af5073cc9..0c30a75d05 100644 --- a/thirdparty/mbedtls/library/mps_reader.c +++ b/thirdparty/mbedtls/library/mps_reader.c @@ -29,11 +29,6 @@ #include <string.h> -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - #if defined(MBEDTLS_MPS_ENABLE_TRACE) static int mbedtls_mps_trace_id = MBEDTLS_MPS_TRACE_BIT_READER; #endif /* MBEDTLS_MPS_ENABLE_TRACE */ @@ -535,7 +530,7 @@ int mbedtls_mps_reader_reclaim( mbedtls_mps_reader *rd, * of the accumulator. */ memmove( acc, acc + acc_backup_offset, acc_backup_len ); - /* Copy uncmmitted parts of the current fragment to the + /* Copy uncommitted parts of the current fragment to the * accumulator. */ memcpy( acc + acc_backup_len, frag + frag_backup_offset, frag_backup_len ); diff --git a/thirdparty/mbedtls/library/mps_trace.h b/thirdparty/mbedtls/library/mps_trace.h index 7c2360118a..820a1b66c2 100644 --- a/thirdparty/mbedtls/library/mps_trace.h +++ b/thirdparty/mbedtls/library/mps_trace.h @@ -30,13 +30,7 @@ #include "mps_common.h" #include "mps_trace.h" -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#define mbedtls_vsnprintf vsnprintf -#endif /* MBEDTLS_PLATFORM_C */ #if defined(MBEDTLS_MPS_ENABLE_TRACE) diff --git a/thirdparty/mbedtls/library/net_sockets.c b/thirdparty/mbedtls/library/net_sockets.c index 8c765e1c8c..b2cab503f2 100644 --- a/thirdparty/mbedtls/library/net_sockets.c +++ b/thirdparty/mbedtls/library/net_sockets.c @@ -37,11 +37,7 @@ #error "This module only works on Unix and Windows, see MBEDTLS_NET_C in config.h" #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#endif #include "mbedtls/net_sockets.h" #include "mbedtls/error.h" diff --git a/thirdparty/mbedtls/library/nist_kw.c b/thirdparty/mbedtls/library/nist_kw.c index 1aea0b6345..495c23d06a 100644 --- a/thirdparty/mbedtls/library/nist_kw.c +++ b/thirdparty/mbedtls/library/nist_kw.c @@ -39,14 +39,7 @@ #include <stdint.h> #include <string.h> -#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_AES_C) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST && MBEDTLS_AES_C */ #if !defined(MBEDTLS_NIST_KW_ALT) diff --git a/thirdparty/mbedtls/library/oid.c b/thirdparty/mbedtls/library/oid.c index 19c8ac207c..53e5350eb3 100644 --- a/thirdparty/mbedtls/library/oid.c +++ b/thirdparty/mbedtls/library/oid.c @@ -30,11 +30,7 @@ #include <stdio.h> #include <string.h> -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#define mbedtls_snprintf snprintf -#endif /* * Macro to automatically add the size of #define'd OIDs diff --git a/thirdparty/mbedtls/library/pem.c b/thirdparty/mbedtls/library/pem.c index fcfde94799..cb1c82b3e4 100644 --- a/thirdparty/mbedtls/library/pem.c +++ b/thirdparty/mbedtls/library/pem.c @@ -32,13 +32,7 @@ #include <string.h> -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #if defined(MBEDTLS_PEM_PARSE_C) void mbedtls_pem_init( mbedtls_pem_context *ctx ) diff --git a/thirdparty/mbedtls/library/pk_wrap.c b/thirdparty/mbedtls/library/pk_wrap.c index 107e912ace..f35abf21a4 100644 --- a/thirdparty/mbedtls/library/pk_wrap.c +++ b/thirdparty/mbedtls/library/pk_wrap.c @@ -50,13 +50,7 @@ #include "mbedtls/asn1.h" #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #include <limits.h> #include <stdint.h> @@ -872,7 +866,7 @@ static void *pk_opaque_alloc_wrap( void ) { void *ctx = mbedtls_calloc( 1, sizeof( psa_key_id_t ) ); - /* no _init() function to call, an calloc() already zeroized */ + /* no _init() function to call, as calloc() already zeroized */ return( ctx ); } diff --git a/thirdparty/mbedtls/library/pkcs11.c b/thirdparty/mbedtls/library/pkcs11.c index 4deccf3f60..a7207cfc93 100644 --- a/thirdparty/mbedtls/library/pkcs11.c +++ b/thirdparty/mbedtls/library/pkcs11.c @@ -29,13 +29,7 @@ #include "mbedtls/oid.h" #include "mbedtls/x509_crt.h" -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #include <string.h> diff --git a/thirdparty/mbedtls/library/pkcs5.c b/thirdparty/mbedtls/library/pkcs5.c index 2b014d91c8..f9d01371a7 100644 --- a/thirdparty/mbedtls/library/pkcs5.c +++ b/thirdparty/mbedtls/library/pkcs5.c @@ -42,12 +42,7 @@ #include <string.h> -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif #if defined(MBEDTLS_ASN1_PARSE_C) static int pkcs5_parse_pbkdf2_params( const mbedtls_asn1_buf *params, diff --git a/thirdparty/mbedtls/library/pkparse.c b/thirdparty/mbedtls/library/pkparse.c index ea5c6b69cb..6170d6d012 100644 --- a/thirdparty/mbedtls/library/pkparse.c +++ b/thirdparty/mbedtls/library/pkparse.c @@ -48,13 +48,7 @@ #include "mbedtls/pkcs12.h" #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif /* Parameter validation macros based on platform_util.h */ #define PK_VALIDATE_RET( cond ) \ diff --git a/thirdparty/mbedtls/library/pkwrite.c b/thirdparty/mbedtls/library/pkwrite.c index 566153dd93..c1ce0e3f02 100644 --- a/thirdparty/mbedtls/library/pkwrite.c +++ b/thirdparty/mbedtls/library/pkwrite.c @@ -48,13 +48,7 @@ #include "psa/crypto.h" #include "mbedtls/psa_util.h" #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif /* Parameter validation macros based on platform_util.h */ #define PK_VALIDATE_RET( cond ) \ diff --git a/thirdparty/mbedtls/library/poly1305.c b/thirdparty/mbedtls/library/poly1305.c index 7375a0c572..a1c5b19d8e 100644 --- a/thirdparty/mbedtls/library/poly1305.c +++ b/thirdparty/mbedtls/library/poly1305.c @@ -28,22 +28,10 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_POLY1305_ALT) -#if ( defined(__ARMCC_VERSION) || defined(_MSC_VER) ) && \ - !defined(inline) && !defined(__cplusplus) -#define inline __inline -#endif - /* Parameter validation macros */ #define POLY1305_VALIDATE_RET( cond ) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_POLY1305_BAD_INPUT_DATA ) diff --git a/thirdparty/mbedtls/library/ripemd160.c b/thirdparty/mbedtls/library/ripemd160.c index aed7322cff..55e259e192 100644 --- a/thirdparty/mbedtls/library/ripemd160.c +++ b/thirdparty/mbedtls/library/ripemd160.c @@ -33,14 +33,7 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_RIPEMD160_ALT) diff --git a/thirdparty/mbedtls/library/rsa.c b/thirdparty/mbedtls/library/rsa.c index d1f6ddb177..9c39fa5d91 100644 --- a/thirdparty/mbedtls/library/rsa.c +++ b/thirdparty/mbedtls/library/rsa.c @@ -57,14 +57,7 @@ #include <stdlib.h> #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #if !defined(MBEDTLS_RSA_ALT) diff --git a/thirdparty/mbedtls/library/sha1.c b/thirdparty/mbedtls/library/sha1.c index 0a5edafaff..7f0c8757db 100644 --- a/thirdparty/mbedtls/library/sha1.c +++ b/thirdparty/mbedtls/library/sha1.c @@ -32,14 +32,7 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #define SHA1_VALIDATE_RET(cond) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA1_BAD_INPUT_DATA ) diff --git a/thirdparty/mbedtls/library/sha256.c b/thirdparty/mbedtls/library/sha256.c index db675efd1b..6f1306ee66 100644 --- a/thirdparty/mbedtls/library/sha256.c +++ b/thirdparty/mbedtls/library/sha256.c @@ -32,17 +32,7 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#include <stdlib.h> -#define mbedtls_printf printf -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #define SHA256_VALIDATE_RET(cond) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA256_BAD_INPUT_DATA ) diff --git a/thirdparty/mbedtls/library/sha512.c b/thirdparty/mbedtls/library/sha512.c index 02a135ca92..1a6872c8aa 100644 --- a/thirdparty/mbedtls/library/sha512.c +++ b/thirdparty/mbedtls/library/sha512.c @@ -38,17 +38,7 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#include <stdlib.h> -#define mbedtls_printf printf -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #define SHA512_VALIDATE_RET(cond) \ MBEDTLS_INTERNAL_VALIDATE_RET( cond, MBEDTLS_ERR_SHA512_BAD_INPUT_DATA ) @@ -428,9 +418,11 @@ int mbedtls_sha512_finish_ret( mbedtls_sha512_context *ctx, sha512_put_uint64_be( ctx->state[4], output, 32 ); sha512_put_uint64_be( ctx->state[5], output, 40 ); + int truncated = 0; #if !defined(MBEDTLS_SHA512_NO_SHA384) - if( ctx->is384 == 0 ) + truncated = ctx->is384; #endif + if( !truncated ) { sha512_put_uint64_be( ctx->state[6], output, 48 ); sha512_put_uint64_be( ctx->state[7], output, 56 ); diff --git a/thirdparty/mbedtls/library/ssl_cache.c b/thirdparty/mbedtls/library/ssl_cache.c index 32188cf3f6..7a600cad18 100644 --- a/thirdparty/mbedtls/library/ssl_cache.c +++ b/thirdparty/mbedtls/library/ssl_cache.c @@ -25,13 +25,7 @@ #if defined(MBEDTLS_SSL_CACHE_C) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #include "mbedtls/ssl_cache.h" #include "mbedtls/ssl_internal.h" diff --git a/thirdparty/mbedtls/library/ssl_ciphersuites.c b/thirdparty/mbedtls/library/ssl_ciphersuites.c index ceec77efb0..2bc8a9bba0 100644 --- a/thirdparty/mbedtls/library/ssl_ciphersuites.c +++ b/thirdparty/mbedtls/library/ssl_ciphersuites.c @@ -23,11 +23,7 @@ #if defined(MBEDTLS_SSL_TLS_C) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#endif #include "mbedtls/ssl_ciphersuites.h" #include "mbedtls/ssl.h" diff --git a/thirdparty/mbedtls/library/ssl_cli.c b/thirdparty/mbedtls/library/ssl_cli.c index 72351c9757..b40ddb70b4 100644 --- a/thirdparty/mbedtls/library/ssl_cli.c +++ b/thirdparty/mbedtls/library/ssl_cli.c @@ -21,13 +21,7 @@ #if defined(MBEDTLS_SSL_CLI_C) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #include "mbedtls/ssl.h" #include "mbedtls/ssl_internal.h" @@ -174,7 +168,7 @@ static int ssl_write_renegotiation_ext( mbedtls_ssl_context *ssl, *olen = 0; - /* We're always including an TLS_EMPTY_RENEGOTIATION_INFO_SCSV in the + /* We're always including a TLS_EMPTY_RENEGOTIATION_INFO_SCSV in the * initial ClientHello, in which case also adding the renegotiation * info extension is NOT RECOMMENDED as per RFC 5746 Section 3.4. */ if( ssl->renego_status != MBEDTLS_SSL_RENEGOTIATION_IN_PROGRESS ) @@ -1004,9 +998,12 @@ static int ssl_write_client_hello( mbedtls_ssl_context *ssl ) return( MBEDTLS_ERR_SSL_NO_RNG ); } + int renegotiating = 0; #if defined(MBEDTLS_SSL_RENEGOTIATION) - if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE ) + if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) + renegotiating = 1; #endif + if( !renegotiating ) { ssl->major_ver = ssl->conf->min_major_ver; ssl->minor_ver = ssl->conf->min_minor_ver; @@ -1092,9 +1089,7 @@ static int ssl_write_client_hello( mbedtls_ssl_context *ssl ) * RFC 5077 section 3.4: "When presenting a ticket, the client MAY * generate and include a Session ID in the TLS ClientHello." */ -#if defined(MBEDTLS_SSL_RENEGOTIATION) - if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE ) -#endif + if( !renegotiating ) { if( ssl->session_negotiate->ticket != NULL && ssl->session_negotiate->ticket_len != 0 ) @@ -1209,9 +1204,7 @@ static int ssl_write_client_hello( mbedtls_ssl_context *ssl ) /* * Add TLS_EMPTY_RENEGOTIATION_INFO_SCSV */ -#if defined(MBEDTLS_SSL_RENEGOTIATION) - if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE ) -#endif + if( !renegotiating ) { MBEDTLS_SSL_DEBUG_MSG( 3, ( "adding EMPTY_RENEGOTIATION_INFO_SCSV" ) ); MBEDTLS_SSL_CHK_BUF_PTR( p, end, 2 ); @@ -2062,6 +2055,30 @@ static int ssl_parse_hello_verify_request( mbedtls_ssl_context *ssl ) } #endif /* MBEDTLS_SSL_PROTO_DTLS */ +static int is_compression_bad( mbedtls_ssl_context *ssl, unsigned char comp ) +{ + int bad_comp = 0; + + /* Suppress warnings in some configurations */ + (void) ssl; +#if defined(MBEDTLS_ZLIB_SUPPORT) + /* See comments in ssl_write_client_hello() */ +#if defined(MBEDTLS_SSL_PROTO_DTLS) + if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM && + comp != MBEDTLS_SSL_COMPRESS_NULL ) + bad_comp = 1; +#endif + + if( comp != MBEDTLS_SSL_COMPRESS_NULL && + comp != MBEDTLS_SSL_COMPRESS_DEFLATE ) + bad_comp = 1; +#else /* MBEDTLS_ZLIB_SUPPORT */ + if( comp != MBEDTLS_SSL_COMPRESS_NULL ) + bad_comp = 1; +#endif/* MBEDTLS_ZLIB_SUPPORT */ + return bad_comp; +} + MBEDTLS_CHECK_RETURN_CRITICAL static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) { @@ -2070,9 +2087,6 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) size_t ext_len; unsigned char *buf, *ext; unsigned char comp; -#if defined(MBEDTLS_ZLIB_SUPPORT) - int accept_comp; -#endif #if defined(MBEDTLS_SSL_RENEGOTIATION) int renegotiation_info_seen = 0; #endif @@ -2241,20 +2255,7 @@ static int ssl_parse_server_hello( mbedtls_ssl_context *ssl ) */ comp = buf[37 + n]; -#if defined(MBEDTLS_ZLIB_SUPPORT) - /* See comments in ssl_write_client_hello() */ -#if defined(MBEDTLS_SSL_PROTO_DTLS) - if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) - accept_comp = 0; - else -#endif - accept_comp = 1; - - if( comp != MBEDTLS_SSL_COMPRESS_NULL && - ( comp != MBEDTLS_SSL_COMPRESS_DEFLATE || accept_comp == 0 ) ) -#else /* MBEDTLS_ZLIB_SUPPORT */ - if( comp != MBEDTLS_SSL_COMPRESS_NULL ) -#endif/* MBEDTLS_ZLIB_SUPPORT */ + if( is_compression_bad( ssl, comp ) ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "server hello, bad compression: %d", comp ) ); @@ -2687,7 +2688,7 @@ static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl ) grp_id = ssl->handshake->ecdh_ctx.grp.id; #else grp_id = ssl->handshake->ecdh_ctx.grp_id; -#endif +#endif /* MBEDTLS_ECDH_LEGACY_CONTEXT */ curve_info = mbedtls_ecp_curve_info_from_grp_id( grp_id ); if( curve_info == NULL ) @@ -2700,11 +2701,12 @@ static int ssl_check_server_ecdh_params( const mbedtls_ssl_context *ssl ) #if defined(MBEDTLS_ECP_C) if( mbedtls_ssl_check_curve( ssl, grp_id ) != 0 ) + return( -1 ); #else if( ssl->handshake->ecdh_ctx.grp.nbits < 163 || ssl->handshake->ecdh_ctx.grp.nbits > 521 ) -#endif return( -1 ); +#endif /* MBEDTLS_ECP_C */ MBEDTLS_SSL_DEBUG_ECDH( 3, &ssl->handshake->ecdh_ctx, MBEDTLS_DEBUG_ECDH_QP ); @@ -2858,8 +2860,8 @@ static int ssl_parse_server_psk_hint( mbedtls_ssl_context *ssl, } /* - * Note: we currently ignore the PKS identity hint, as we only allow one - * PSK to be provisionned on the client. This could be changed later if + * Note: we currently ignore the PSK identity hint, as we only allow one + * PSK to be provisioned on the client. This could be changed later if * someone needs that feature. */ *p += len; @@ -3452,23 +3454,23 @@ start_processing: #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) if( ssl->handshake->ecrs_enabled ) rs_ctx = &ssl->handshake->ecrs_ctx.pk; -#endif +#endif /* MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED */ if( ( ret = mbedtls_pk_verify_restartable( peer_pk, md_alg, hash, hashlen, p, sig_len, rs_ctx ) ) != 0 ) { #if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) - if( ret != MBEDTLS_ERR_ECP_IN_PROGRESS ) -#endif - mbedtls_ssl_send_alert_message( - ssl, - MBEDTLS_SSL_ALERT_LEVEL_FATAL, - MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR ); - MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret ); -#if defined(MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED) if( ret == MBEDTLS_ERR_ECP_IN_PROGRESS ) - ret = MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS; -#endif + { + MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret ); + return( MBEDTLS_ERR_SSL_CRYPTO_IN_PROGRESS ); + } +#endif /* MBEDTLS_SSL_ECP_RESTARTABLE_ENABLED */ + mbedtls_ssl_send_alert_message( + ssl, + MBEDTLS_SSL_ALERT_LEVEL_FATAL, + MBEDTLS_SSL_ALERT_MSG_DECRYPT_ERROR ); + MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_pk_verify", ret ); return( ret ); } diff --git a/thirdparty/mbedtls/library/ssl_cookie.c b/thirdparty/mbedtls/library/ssl_cookie.c index 3781796b72..f12f28e849 100644 --- a/thirdparty/mbedtls/library/ssl_cookie.c +++ b/thirdparty/mbedtls/library/ssl_cookie.c @@ -25,12 +25,7 @@ #if defined(MBEDTLS_SSL_COOKIE_C) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #include "mbedtls/ssl_cookie.h" #include "mbedtls/ssl_internal.h" diff --git a/thirdparty/mbedtls/library/ssl_msg.c b/thirdparty/mbedtls/library/ssl_msg.c index e47c538888..d7bebe04d6 100644 --- a/thirdparty/mbedtls/library/ssl_msg.c +++ b/thirdparty/mbedtls/library/ssl_msg.c @@ -30,13 +30,7 @@ #if defined(MBEDTLS_SSL_TLS_C) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #include "mbedtls/ssl.h" #include "mbedtls/ssl_internal.h" @@ -441,9 +435,12 @@ static void ssl_extract_add_data_from_record( unsigned char* add_data, unsigned char *cur = add_data; + int is_tls13 = 0; #if defined(MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL) - if( minor_ver != MBEDTLS_SSL_MINOR_VERSION_4 ) + if( minor_ver == MBEDTLS_SSL_MINOR_VERSION_4 ) + is_tls13 = 1; #endif /* MBEDTLS_SSL_PROTO_TLS1_3_EXPERIMENTAL */ + if( !is_tls13 ) { ((void) minor_ver); memcpy( cur, rec->ctr, sizeof( rec->ctr ) ); @@ -1887,8 +1884,7 @@ int mbedtls_ssl_fetch_input( mbedtls_ssl_context *ssl, size_t nb_want ) if( ssl->f_recv == NULL && ssl->f_recv_timeout == NULL ) { - MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad usage of mbedtls_ssl_set_bio() " - "or mbedtls_ssl_set_bio()" ) ); + MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad usage of mbedtls_ssl_set_bio() " ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } @@ -2103,8 +2099,7 @@ int mbedtls_ssl_flush_output( mbedtls_ssl_context *ssl ) if( ssl->f_send == NULL ) { - MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad usage of mbedtls_ssl_set_bio() " - "or mbedtls_ssl_set_bio()" ) ); + MBEDTLS_SSL_DEBUG_MSG( 1, ( "Bad usage of mbedtls_ssl_set_bio() " ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } @@ -3950,8 +3945,8 @@ int mbedtls_ssl_read_record( mbedtls_ssl_context *ssl, if( ssl_record_is_in_progress( ssl ) == 0 ) { + int dtls_have_buffered = 0; #if defined(MBEDTLS_SSL_PROTO_DTLS) - int have_buffered = 0; /* We only check for buffered messages if the * current datagram is fully consumed. */ @@ -3959,11 +3954,11 @@ int mbedtls_ssl_read_record( mbedtls_ssl_context *ssl, ssl_next_record_is_in_datagram( ssl ) == 0 ) { if( ssl_load_buffered_message( ssl ) == 0 ) - have_buffered = 1; + dtls_have_buffered = 1; } - if( have_buffered == 0 ) #endif /* MBEDTLS_SSL_PROTO_DTLS */ + if( dtls_have_buffered == 0 ) { ret = ssl_get_next_record( ssl ); if( ret == MBEDTLS_ERR_SSL_CONTINUE_PROCESSING ) @@ -4037,7 +4032,7 @@ static int ssl_load_buffered_message( mbedtls_ssl_context *ssl ) if( hs == NULL ) return( -1 ); - MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> ssl_load_buffered_messsage" ) ); + MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> ssl_load_buffered_message" ) ); if( ssl->state == MBEDTLS_SSL_CLIENT_CHANGE_CIPHER_SPEC || ssl->state == MBEDTLS_SSL_SERVER_CHANGE_CIPHER_SPEC ) diff --git a/thirdparty/mbedtls/library/ssl_srv.c b/thirdparty/mbedtls/library/ssl_srv.c index 2efb13cc33..0563c0b590 100644 --- a/thirdparty/mbedtls/library/ssl_srv.c +++ b/thirdparty/mbedtls/library/ssl_srv.c @@ -21,13 +21,7 @@ #if defined(MBEDTLS_SSL_SRV_C) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #include "mbedtls/ssl.h" #include "mbedtls/ssl_internal.h" @@ -1460,6 +1454,7 @@ static int ssl_parse_client_hello( mbedtls_ssl_context *ssl ) MBEDTLS_SSL_DEBUG_MSG( 2, ( "=> parse client hello" ) ); + int renegotiating = 0; #if defined(MBEDTLS_SSL_DTLS_ANTI_REPLAY) read_record_header: #endif @@ -1469,8 +1464,10 @@ read_record_header: * ClientHello, which doesn't use the same record layer format. */ #if defined(MBEDTLS_SSL_RENEGOTIATION) - if( ssl->renego_status == MBEDTLS_SSL_INITIAL_HANDSHAKE ) + if( ssl->renego_status != MBEDTLS_SSL_INITIAL_HANDSHAKE ) + renegotiating = 1; #endif + if( !renegotiating ) { if( ( ret = mbedtls_ssl_fetch_input( ssl, 5 ) ) != 0 ) { @@ -1483,9 +1480,12 @@ read_record_header: buf = ssl->in_hdr; #if defined(MBEDTLS_SSL_SRV_SUPPORT_SSLV2_CLIENT_HELLO) + int is_dtls = 0; #if defined(MBEDTLS_SSL_PROTO_DTLS) - if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_STREAM ) + if( ssl->conf->transport == MBEDTLS_SSL_TRANSPORT_DATAGRAM ) + is_dtls = 1; #endif + if( !is_dtls ) if( ( buf[0] & 0x80 ) != 0 ) return( ssl_parse_client_hello_v2( ssl ) ); #endif @@ -3903,8 +3903,14 @@ static int ssl_decrypt_encrypted_pms( mbedtls_ssl_context *ssl, size_t peer_pmssize ) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + + mbedtls_x509_crt *own_cert = mbedtls_ssl_own_cert( ssl ); + if( own_cert == NULL ) { + MBEDTLS_SSL_DEBUG_MSG( 1, ( "got no local certificate" ) ); + return( MBEDTLS_ERR_SSL_NO_CLIENT_CERTIFICATE ); + } + mbedtls_pk_context *public_key = &own_cert->pk; mbedtls_pk_context *private_key = mbedtls_ssl_own_key( ssl ); - mbedtls_pk_context *public_key = &mbedtls_ssl_own_cert( ssl )->pk; size_t len = mbedtls_pk_get_len( public_key ); #if defined(MBEDTLS_SSL_ASYNC_PRIVATE) diff --git a/thirdparty/mbedtls/library/ssl_ticket.c b/thirdparty/mbedtls/library/ssl_ticket.c index e0126cc9d1..8a57789f10 100644 --- a/thirdparty/mbedtls/library/ssl_ticket.c +++ b/thirdparty/mbedtls/library/ssl_ticket.c @@ -21,13 +21,7 @@ #if defined(MBEDTLS_SSL_TICKET_C) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #include "mbedtls/ssl_internal.h" #include "mbedtls/ssl_ticket.h" @@ -152,27 +146,45 @@ int mbedtls_ssl_ticket_setup( mbedtls_ssl_ticket_context *ctx, if( cipher_info->key_bitlen > 8 * MAX_KEY_BYTES ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); + int do_mbedtls_cipher_setup = 1; #if defined(MBEDTLS_USE_PSA_CRYPTO) ret = mbedtls_cipher_setup_psa( &ctx->keys[0].ctx, cipher_info, TICKET_AUTH_TAG_BYTES ); - if( ret != 0 && ret != MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ) - return( ret ); - /* We don't yet expect to support all ciphers through PSA, - * so allow fallback to ordinary mbedtls_cipher_setup(). */ - if( ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ) + + switch( ret ) + { + case 0: + do_mbedtls_cipher_setup = 0; + break; + case MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE: + /* We don't yet expect to support all ciphers through PSA, + * so allow fallback to ordinary mbedtls_cipher_setup(). */ + do_mbedtls_cipher_setup = 1; + break; + default: + return( ret ); + } #endif /* MBEDTLS_USE_PSA_CRYPTO */ - if( ( ret = mbedtls_cipher_setup( &ctx->keys[0].ctx, cipher_info ) ) != 0 ) - return( ret ); + if( do_mbedtls_cipher_setup ) + if( ( ret = mbedtls_cipher_setup( &ctx->keys[0].ctx, cipher_info ) ) + != 0 ) + return( ret ); + do_mbedtls_cipher_setup = 1; #if defined(MBEDTLS_USE_PSA_CRYPTO) + do_mbedtls_cipher_setup = 0; + ret = mbedtls_cipher_setup_psa( &ctx->keys[1].ctx, cipher_info, TICKET_AUTH_TAG_BYTES ); if( ret != 0 && ret != MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ) return( ret ); if( ret == MBEDTLS_ERR_CIPHER_FEATURE_UNAVAILABLE ) + do_mbedtls_cipher_setup = 1; #endif /* MBEDTLS_USE_PSA_CRYPTO */ - if( ( ret = mbedtls_cipher_setup( &ctx->keys[1].ctx, cipher_info ) ) != 0 ) - return( ret ); + if( do_mbedtls_cipher_setup ) + if( ( ret = mbedtls_cipher_setup( &ctx->keys[1].ctx, cipher_info ) ) + != 0 ) + return( ret ); if( ( ret = ssl_ticket_gen_key( ctx, 0 ) ) != 0 || ( ret = ssl_ticket_gen_key( ctx, 1 ) ) != 0 ) diff --git a/thirdparty/mbedtls/library/ssl_tls.c b/thirdparty/mbedtls/library/ssl_tls.c index 7badec51ae..70196a4861 100644 --- a/thirdparty/mbedtls/library/ssl_tls.c +++ b/thirdparty/mbedtls/library/ssl_tls.c @@ -29,13 +29,7 @@ #if defined(MBEDTLS_SSL_TLS_C) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif #include "mbedtls/ssl.h" #include "mbedtls/ssl_internal.h" @@ -766,7 +760,9 @@ static int tls_prf_generic( mbedtls_md_type_t md_type, exit: mbedtls_md_free( &md_ctx ); - mbedtls_platform_zeroize( tmp, tmp_len ); + if ( tmp != NULL ) + mbedtls_platform_zeroize( tmp, tmp_len ); + mbedtls_platform_zeroize( h_i, sizeof( h_i ) ); mbedtls_free( tmp ); @@ -985,6 +981,7 @@ static int ssl_populate_transform( mbedtls_ssl_transform *transform, #if defined(MBEDTLS_USE_PSA_CRYPTO) int psa_fallthrough; #endif /* MBEDTLS_USE_PSA_CRYPTO */ + int do_mbedtls_cipher_setup; unsigned char keyblk[256]; unsigned char *key1; unsigned char *key2; @@ -1363,6 +1360,7 @@ static int ssl_populate_transform( mbedtls_ssl_transform *transform, } #endif + do_mbedtls_cipher_setup = 1; #if defined(MBEDTLS_USE_PSA_CRYPTO) /* Only use PSA-based ciphers for TLS-1.2. @@ -1398,15 +1396,18 @@ static int ssl_populate_transform( mbedtls_ssl_transform *transform, psa_fallthrough = 1; #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ - if( psa_fallthrough == 1 ) + if( psa_fallthrough == 0 ) + do_mbedtls_cipher_setup = 0; #endif /* MBEDTLS_USE_PSA_CRYPTO */ - if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc, - cipher_info ) ) != 0 ) + if( do_mbedtls_cipher_setup && + ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_enc, + cipher_info ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret ); goto end; } + do_mbedtls_cipher_setup = 1; #if defined(MBEDTLS_USE_PSA_CRYPTO) /* Only use PSA-based ciphers for TLS-1.2. * That's relevant at least for TLS-1.0, where @@ -1441,10 +1442,12 @@ static int ssl_populate_transform( mbedtls_ssl_transform *transform, psa_fallthrough = 1; #endif /* MBEDTLS_SSL_PROTO_TLS1_2 */ - if( psa_fallthrough == 1 ) + if( psa_fallthrough == 0 ) + do_mbedtls_cipher_setup = 0; #endif /* MBEDTLS_USE_PSA_CRYPTO */ - if( ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_dec, - cipher_info ) ) != 0 ) + if( do_mbedtls_cipher_setup && + ( ret = mbedtls_cipher_setup( &transform->cipher_ctx_dec, + cipher_info ) ) != 0 ) { MBEDTLS_SSL_DEBUG_RET( 1, "mbedtls_cipher_setup", ret ); goto end; @@ -3411,7 +3414,7 @@ static void ssl_calc_finished_tls_sha384( sha512.state, sizeof( sha512.state ) ); #endif /* mbedtls_sha512_finish_ret's output parameter is declared as a - * 64-byte buffer, but sice we're using SHA-384, we know that the + * 64-byte buffer, but since we're using SHA-384, we know that the * output fits in 48 bytes. This is correct C, but GCC 11.1 warns * about it. */ @@ -4089,9 +4092,12 @@ int mbedtls_ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial ) memset( ssl->out_buf, 0, out_buf_len ); + int clear_in_buf = 1; #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) && defined(MBEDTLS_SSL_SRV_C) - if( partial == 0 ) + if( partial != 0 ) + clear_in_buf = 0; #endif /* MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE && MBEDTLS_SSL_SRV_C */ + if( clear_in_buf ) { ssl->in_left = 0; memset( ssl->in_buf, 0, in_buf_len ); @@ -4128,9 +4134,12 @@ int mbedtls_ssl_session_reset_int( mbedtls_ssl_context *ssl, int partial ) #endif #if defined(MBEDTLS_SSL_DTLS_HELLO_VERIFY) && defined(MBEDTLS_SSL_SRV_C) + int free_cli_id = 1; #if defined(MBEDTLS_SSL_DTLS_CLIENT_PORT_REUSE) - if( partial == 0 ) + if( partial != 0 ) + free_cli_id = 0; #endif + if( free_cli_id ) { mbedtls_free( ssl->cli_id ); ssl->cli_id = NULL; @@ -4471,7 +4480,7 @@ static void ssl_conf_remove_psk( mbedtls_ssl_config *conf ) conf->psk_opaque = MBEDTLS_SVC_KEY_ID_INIT; } /* This and the following branch should never - * be taken simultaenously as we maintain the + * be taken simultaneously as we maintain the * invariant that raw and opaque PSKs are never * configured simultaneously. As a safeguard, * though, `else` is omitted here. */ @@ -6335,7 +6344,7 @@ int mbedtls_ssl_context_save( mbedtls_ssl_context *ssl, MBEDTLS_SSL_DEBUG_MSG( 1, ( "There is pending outgoing data" ) ); return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); } - /* Protocol must be DLTS, not TLS */ + /* Protocol must be DTLS, not TLS */ if( ssl->conf->transport != MBEDTLS_SSL_TRANSPORT_DATAGRAM ) { MBEDTLS_SSL_DEBUG_MSG( 1, ( "Only DTLS is supported" ) ); @@ -6510,24 +6519,41 @@ int mbedtls_ssl_context_save( mbedtls_ssl_context *ssl, * Helper to get TLS 1.2 PRF from ciphersuite * (Duplicates bits of logic from ssl_set_handshake_prfs().) */ +#if defined(MBEDTLS_SHA256_C) || \ + (defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384)) typedef int (*tls_prf_fn)( const unsigned char *secret, size_t slen, const char *label, const unsigned char *random, size_t rlen, unsigned char *dstbuf, size_t dlen ); static tls_prf_fn ssl_tls12prf_from_cs( int ciphersuite_id ) { -#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) const mbedtls_ssl_ciphersuite_t * const ciphersuite_info = mbedtls_ssl_ciphersuite_from_id( ciphersuite_id ); + if( ciphersuite_info == NULL ) + return( NULL ); + +#if defined(MBEDTLS_SHA512_C) && !defined(MBEDTLS_SHA512_NO_SHA384) if( ciphersuite_info->mac == MBEDTLS_MD_SHA384 ) return( tls_prf_sha384 ); -#else - (void) ciphersuite_id; + else +#endif +#if defined(MBEDTLS_SHA256_C) + { + if( ciphersuite_info->mac == MBEDTLS_MD_SHA256 ) + return( tls_prf_sha256 ); + } #endif - return( tls_prf_sha256 ); +#if !defined(MBEDTLS_SHA256_C) && \ + (!defined(MBEDTLS_SHA512_C) || defined(MBEDTLS_SHA512_NO_SHA384)) + (void) ciphersuite_info; +#endif + return( NULL ); } +#endif /* MBEDTLS_SHA256_C || + (MBEDTLS_SHA512_C && !MBEDTLS_SHA512_NO_SHA384) */ + /* * Deserialize context, see mbedtls_ssl_context_save() for format. * @@ -6543,6 +6569,7 @@ static int ssl_context_load( mbedtls_ssl_context *ssl, const unsigned char * const end = buf + len; size_t session_len; int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + tls_prf_fn prf_func = NULL; /* * The context should have been freshly setup or reset. @@ -6630,6 +6657,10 @@ static int ssl_context_load( mbedtls_ssl_context *ssl, ssl->transform_out = ssl->transform; ssl->transform_negotiate = NULL; + prf_func = ssl_tls12prf_from_cs( ssl->session->ciphersuite ); + if( prf_func == NULL ) + return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); + /* Read random bytes and populate structure */ if( (size_t)( end - p ) < sizeof( ssl->transform->randbytes ) ) return( MBEDTLS_ERR_SSL_BAD_INPUT_DATA ); @@ -6648,7 +6679,7 @@ static int ssl_context_load( mbedtls_ssl_context *ssl, #if defined(MBEDTLS_ZLIB_SUPPORT) ssl->session->compression, #endif - ssl_tls12prf_from_cs( ssl->session->ciphersuite ), + prf_func, p, /* currently pointing to randbytes */ MBEDTLS_SSL_MINOR_VERSION_3, /* (D)TLS 1.2 is forced */ ssl->conf->endpoint, @@ -6921,7 +6952,7 @@ void mbedtls_ssl_free( mbedtls_ssl_context *ssl ) } /* - * Initialze mbedtls_ssl_config + * Initialize mbedtls_ssl_config */ void mbedtls_ssl_config_init( mbedtls_ssl_config *conf ) { diff --git a/thirdparty/mbedtls/library/ssl_tls13_keys.c b/thirdparty/mbedtls/library/ssl_tls13_keys.c index 3de6f03fb8..cc68773d3a 100644 --- a/thirdparty/mbedtls/library/ssl_tls13_keys.c +++ b/thirdparty/mbedtls/library/ssl_tls13_keys.c @@ -24,6 +24,7 @@ #include "mbedtls/hkdf.h" #include "mbedtls/ssl_internal.h" #include "ssl_tls13_keys.h" +#include "psa/crypto_sizes.h" #include <stdint.h> #include <string.h> @@ -31,6 +32,9 @@ #define MBEDTLS_SSL_TLS1_3_LABEL( name, string ) \ .name = string, +#define TLS1_3_EVOLVE_INPUT_SIZE ( PSA_HASH_MAX_SIZE > PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE ) ? \ + PSA_HASH_MAX_SIZE : PSA_RAW_KEY_AGREEMENT_OUTPUT_MAX_SIZE + struct mbedtls_ssl_tls1_3_labels_struct const mbedtls_ssl_tls1_3_labels = { /* This seems to work in C, despite the string literal being one @@ -292,8 +296,8 @@ int mbedtls_ssl_tls1_3_evolve_secret( { int ret = MBEDTLS_ERR_SSL_INTERNAL_ERROR; size_t hlen, ilen; - unsigned char tmp_secret[ MBEDTLS_MD_MAX_SIZE ] = { 0 }; - unsigned char tmp_input [ MBEDTLS_MD_MAX_SIZE ] = { 0 }; + unsigned char tmp_secret[ PSA_MAC_MAX_SIZE ] = { 0 }; + unsigned char tmp_input [ TLS1_3_EVOLVE_INPUT_SIZE ] = { 0 }; const mbedtls_md_info_t *md; md = mbedtls_md_info_from_type( hash_alg ); diff --git a/thirdparty/mbedtls/library/timing.c b/thirdparty/mbedtls/library/timing.c index 78bfa10cfb..151292e325 100644 --- a/thirdparty/mbedtls/library/timing.c +++ b/thirdparty/mbedtls/library/timing.c @@ -19,12 +19,7 @@ #include "common.h" -#if defined(MBEDTLS_SELF_TEST) && defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif #if defined(MBEDTLS_TIMING_C) @@ -269,7 +264,7 @@ static void TimerProc( void *TimerContext ) Sleep( alarmMs ); mbedtls_timing_alarmed = 1; /* _endthread will be called implicitly on return - * That ensures execution of thread funcition's epilogue */ + * That ensures execution of thread function's epilogue */ } void mbedtls_set_alarm( int seconds ) diff --git a/thirdparty/mbedtls/library/x509.c b/thirdparty/mbedtls/library/x509.c index 3997ebd1f3..54c8666d23 100644 --- a/thirdparty/mbedtls/library/x509.c +++ b/thirdparty/mbedtls/library/x509.c @@ -43,16 +43,7 @@ #include "mbedtls/pem.h" #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#include <stdlib.h> -#define mbedtls_free free -#define mbedtls_calloc calloc -#define mbedtls_printf printf -#define mbedtls_snprintf snprintf -#endif #if defined(MBEDTLS_HAVE_TIME) #include "mbedtls/platform_time.h" @@ -198,7 +189,7 @@ static int x509_get_hash_alg( const mbedtls_x509_buf *alg, mbedtls_md_type_t *md * * RFC 4055 (which defines use of RSASSA-PSS in PKIX) states that the value * of trailerField MUST be 1, and PKCS#1 v2.2 doesn't even define any other - * option. Enfore this at parsing time. + * option. Enforce this at parsing time. */ int mbedtls_x509_get_rsassa_pss_params( const mbedtls_x509_buf *params, mbedtls_md_type_t *md_alg, mbedtls_md_type_t *mgf_md, @@ -424,6 +415,11 @@ static int x509_get_attr_type_value( unsigned char **p, * For the general case we still use a flat list, but we mark elements of the * same set so that they are "merged" together in the functions that consume * this list, eg mbedtls_x509_dn_gets(). + * + * On success, this function may allocate a linked list starting at cur->next + * that must later be free'd by the caller using mbedtls_free(). In error + * cases, this function frees all allocated memory internally and the caller + * has no freeing responsibilities. */ int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end, mbedtls_x509_name *cur ) @@ -431,6 +427,8 @@ int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end, int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; size_t set_len; const unsigned char *end_set; + mbedtls_x509_name *head = cur; + mbedtls_x509_name *prev, *allocated; /* don't use recursion, we'd risk stack overflow if not optimized */ while( 1 ) @@ -440,14 +438,17 @@ int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end, */ if( ( ret = mbedtls_asn1_get_tag( p, end, &set_len, MBEDTLS_ASN1_CONSTRUCTED | MBEDTLS_ASN1_SET ) ) != 0 ) - return( MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_NAME, ret ) ); + { + ret = MBEDTLS_ERROR_ADD( MBEDTLS_ERR_X509_INVALID_NAME, ret ); + goto error; + } end_set = *p + set_len; while( 1 ) { if( ( ret = x509_get_attr_type_value( p, end_set, cur ) ) != 0 ) - return( ret ); + goto error; if( *p == end_set ) break; @@ -458,7 +459,10 @@ int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end, cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) ); if( cur->next == NULL ) - return( MBEDTLS_ERR_X509_ALLOC_FAILED ); + { + ret = MBEDTLS_ERR_X509_ALLOC_FAILED; + goto error; + } cur = cur->next; } @@ -472,10 +476,30 @@ int mbedtls_x509_get_name( unsigned char **p, const unsigned char *end, cur->next = mbedtls_calloc( 1, sizeof( mbedtls_x509_name ) ); if( cur->next == NULL ) - return( MBEDTLS_ERR_X509_ALLOC_FAILED ); + { + ret = MBEDTLS_ERR_X509_ALLOC_FAILED; + goto error; + } cur = cur->next; } + +error: + /* Skip the first element as we did not allocate it */ + allocated = head->next; + + while( allocated != NULL ) + { + prev = allocated; + allocated = allocated->next; + + mbedtls_platform_zeroize( prev, sizeof( *prev ) ); + mbedtls_free( prev ); + } + + mbedtls_platform_zeroize( head, sizeof( *head ) ); + + return( ret ); } static int x509_parse_int( unsigned char **p, size_t n, int *res ) diff --git a/thirdparty/mbedtls/library/x509_crl.c b/thirdparty/mbedtls/library/x509_crl.c index d2d8042029..b943a8d6da 100644 --- a/thirdparty/mbedtls/library/x509_crl.c +++ b/thirdparty/mbedtls/library/x509_crl.c @@ -1,5 +1,5 @@ /* - * X.509 Certidicate Revocation List (CRL) parsing + * X.509 Certificate Revocation List (CRL) parsing * * Copyright The Mbed TLS Contributors * SPDX-License-Identifier: Apache-2.0 @@ -42,15 +42,7 @@ #include "mbedtls/pem.h" #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#include <stdio.h> -#define mbedtls_free free -#define mbedtls_calloc calloc -#define mbedtls_snprintf snprintf -#endif #if defined(MBEDTLS_HAVE_TIME) #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) diff --git a/thirdparty/mbedtls/library/x509_crt.c b/thirdparty/mbedtls/library/x509_crt.c index 96477e4c9d..4361f43ed0 100644 --- a/thirdparty/mbedtls/library/x509_crt.c +++ b/thirdparty/mbedtls/library/x509_crt.c @@ -49,15 +49,7 @@ #include "mbedtls/psa_util.h" #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#include <stdlib.h> -#define mbedtls_free free -#define mbedtls_calloc calloc -#define mbedtls_snprintf snprintf -#endif #if defined(MBEDTLS_THREADING_C) #include "mbedtls/threading.h" @@ -90,6 +82,7 @@ #include <sys/types.h> #include <sys/stat.h> #include <dirent.h> +#include <errno.h> #endif /* !_WIN32 || EFIX64 || EFI32 */ #endif @@ -1278,9 +1271,12 @@ static int x509_crt_parse_der_core( mbedtls_x509_crt *crt, } } + int extensions_allowed = 1; #if !defined(MBEDTLS_X509_ALLOW_EXTENSIONS_NON_V3) - if( crt->version == 3 ) + if( crt->version != 3 ) + extensions_allowed = 0; #endif + if( extensions_allowed ) { ret = x509_get_crt_ext( &p, end, crt, cb, p_ctx ); if( ret != 0 ) @@ -1668,8 +1664,22 @@ cleanup: } else if( stat( entry_name, &sb ) == -1 ) { - ret = MBEDTLS_ERR_X509_FILE_IO_ERROR; - goto cleanup; + if( errno == ENOENT ) + { + /* Broken symbolic link - ignore this entry. + stat(2) will return this error for either (a) a dangling + symlink or (b) a missing file. + Given that we have just obtained the filename from readdir, + assume that it does exist and therefore treat this as a + dangling symlink. */ + continue; + } + else + { + /* Some other file error; report the error. */ + ret = MBEDTLS_ERR_X509_FILE_IO_ERROR; + goto cleanup; + } } if( !S_ISREG( sb.st_mode ) ) @@ -1798,6 +1808,7 @@ static int x509_info_subject_alt_name( char **buf, size_t *size, const char *prefix ) { int ret = MBEDTLS_ERR_ERROR_CORRUPTION_DETECTED; + size_t i; size_t n = *size; char *p = *buf; const mbedtls_x509_sequence *cur = subject_alt_name; @@ -1850,18 +1861,11 @@ static int x509_info_subject_alt_name( char **buf, size_t *size, ret = mbedtls_snprintf( p, n, "\n%s hardware serial number : ", prefix ); MBEDTLS_X509_SAFE_SNPRINTF; - if( other_name->value.hardware_module_name.val.len >= n ) + for( i = 0; i < other_name->value.hardware_module_name.val.len; i++ ) { - *p = '\0'; - return( MBEDTLS_ERR_X509_BUFFER_TOO_SMALL ); + ret = mbedtls_snprintf( p, n, "%02X", other_name->value.hardware_module_name.val.p[i] ); + MBEDTLS_X509_SAFE_SNPRINTF; } - - memcpy( p, other_name->value.hardware_module_name.val.p, - other_name->value.hardware_module_name.val.len ); - p += other_name->value.hardware_module_name.val.len; - - n -= other_name->value.hardware_module_name.val.len; - }/* MBEDTLS_OID_ON_HW_MODULE_NAME */ } break; diff --git a/thirdparty/mbedtls/library/x509_csr.c b/thirdparty/mbedtls/library/x509_csr.c index e259410d07..1a22b77086 100644 --- a/thirdparty/mbedtls/library/x509_csr.c +++ b/thirdparty/mbedtls/library/x509_csr.c @@ -42,15 +42,7 @@ #include "mbedtls/pem.h" #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#include <stdio.h> -#define mbedtls_free free -#define mbedtls_calloc calloc -#define mbedtls_snprintf snprintf -#endif #if defined(MBEDTLS_FS_IO) || defined(EFIX64) || defined(EFI32) #include <stdio.h> diff --git a/thirdparty/mbedtls/library/x509write_csr.c b/thirdparty/mbedtls/library/x509write_csr.c index afda950341..707dd001f0 100644 --- a/thirdparty/mbedtls/library/x509write_csr.c +++ b/thirdparty/mbedtls/library/x509write_csr.c @@ -44,13 +44,7 @@ #include "mbedtls/pem.h" #endif -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdlib.h> -#define mbedtls_calloc calloc -#define mbedtls_free free -#endif void mbedtls_x509write_csr_init( mbedtls_x509write_csr *ctx ) { diff --git a/thirdparty/mbedtls/library/xtea.c b/thirdparty/mbedtls/library/xtea.c index 77f6cb6f67..28e6972aa8 100644 --- a/thirdparty/mbedtls/library/xtea.c +++ b/thirdparty/mbedtls/library/xtea.c @@ -1,5 +1,5 @@ /* - * An 32-bit implementation of the XTEA algorithm + * A 32-bit implementation of the XTEA algorithm * * Copyright The Mbed TLS Contributors * SPDX-License-Identifier: Apache-2.0 @@ -26,14 +26,7 @@ #include <string.h> -#if defined(MBEDTLS_SELF_TEST) -#if defined(MBEDTLS_PLATFORM_C) #include "mbedtls/platform.h" -#else -#include <stdio.h> -#define mbedtls_printf printf -#endif /* MBEDTLS_PLATFORM_C */ -#endif /* MBEDTLS_SELF_TEST */ #if !defined(MBEDTLS_XTEA_ALT) diff --git a/thirdparty/mbedtls/patches/1453.diff b/thirdparty/mbedtls/patches/1453.diff index b1c9c43ed2..4a7ca1570b 100644 --- a/thirdparty/mbedtls/patches/1453.diff +++ b/thirdparty/mbedtls/patches/1453.diff @@ -1,8 +1,8 @@ -diff --git a/library/entropy_poll.c b/library/entropy_poll.c -index 4556f88a5..ba56b70f7 100644 ---- a/library/entropy_poll.c -+++ b/library/entropy_poll.c -@@ -61,28 +61,43 @@ +diff --git a/thirdparty/mbedtls/library/entropy_poll.c b/thirdparty/mbedtls/library/entropy_poll.c +index a858c1892b..69ac29e4f7 100644 +--- a/thirdparty/mbedtls/library/entropy_poll.c ++++ b/thirdparty/mbedtls/library/entropy_poll.c +@@ -54,28 +54,43 @@ #define _WIN32_WINNT 0x0400 #endif #include <windows.h> @@ -53,12 +53,12 @@ index 4556f88a5..ba56b70f7 100644 *olen = len; return( 0 ); -diff --git a/library/x509_crt.c b/library/x509_crt.c -index 76558342e..35a134950 100644 ---- a/library/x509_crt.c -+++ b/library/x509_crt.c -@@ -65,6 +65,19 @@ - +diff --git a/thirdparty/mbedtls/library/x509_crt.c b/thirdparty/mbedtls/library/x509_crt.c +index def1414eca..4361f43ed0 100644 +--- a/thirdparty/mbedtls/library/x509_crt.c ++++ b/thirdparty/mbedtls/library/x509_crt.c +@@ -58,6 +58,19 @@ + #if defined(MBEDTLS_HAVE_TIME) #if defined(_WIN32) && !defined(EFIX64) && !defined(EFI32) #include <windows.h> +#if defined(_MSC_VER) && _MSC_VER <= 1600 @@ -77,7 +77,7 @@ index 76558342e..35a134950 100644 #else #include <time.h> #endif -@@ -1278,6 +1291,7 @@ int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ) +@@ -1549,6 +1562,7 @@ int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ) char filename[MAX_PATH]; char *p; size_t len = strlen( path ); @@ -85,7 +85,7 @@ index 76558342e..35a134950 100644 WIN32_FIND_DATAW file_data; HANDLE hFind; -@@ -1292,7 +1306,18 @@ int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ) +@@ -1563,7 +1577,18 @@ int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ) p = filename + len; filename[len++] = '*'; @@ -105,7 +105,7 @@ index 76558342e..35a134950 100644 MAX_PATH - 3 ); if( w_ret == 0 ) return( MBEDTLS_ERR_X509_BAD_INPUT_DATA ); -@@ -1309,8 +1334,11 @@ int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ) +@@ -1580,8 +1605,11 @@ int mbedtls_x509_crt_parse_path( mbedtls_x509_crt *chain, const char *path ) if( file_data.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY ) continue; diff --git a/thirdparty/mbedtls/patches/windows-arm64-hardclock.diff b/thirdparty/mbedtls/patches/windows-arm64-hardclock.diff new file mode 100644 index 0000000000..c7c5a7e282 --- /dev/null +++ b/thirdparty/mbedtls/patches/windows-arm64-hardclock.diff @@ -0,0 +1,16 @@ +diff --git a/thirdparty/mbedtls/library/timing.c b/thirdparty/mbedtls/library/timing.c +index 6c14a4fd01..151292e325 100644 +--- a/thirdparty/mbedtls/library/timing.c ++++ b/thirdparty/mbedtls/library/timing.c +@@ -190,8 +190,10 @@ unsigned long mbedtls_timing_hardclock( void ) + #endif /* !HAVE_HARDCLOCK && MBEDTLS_HAVE_ASM && + __GNUC__ && __ia64__ */ + +-#if !defined(HAVE_HARDCLOCK) && defined(_MSC_VER) && \ ++// -- GODOT start -- ++#if !defined(HAVE_HARDCLOCK) && defined(_WIN32) && \ + !defined(EFIX64) && !defined(EFI32) ++// -- GODOT end -- + + #define HAVE_HARDCLOCK + diff --git a/thirdparty/openxr/include/openxr/openxr.h b/thirdparty/openxr/include/openxr/openxr.h index 6f9b71aa68..3663f9f14d 100644 --- a/thirdparty/openxr/include/openxr/openxr.h +++ b/thirdparty/openxr/include/openxr/openxr.h @@ -25,7 +25,7 @@ extern "C" { ((((major) & 0xffffULL) << 48) | (((minor) & 0xffffULL) << 32) | ((patch) & 0xffffffffULL)) // OpenXR current version number. -#define XR_CURRENT_API_VERSION XR_MAKE_VERSION(1, 0, 25) +#define XR_CURRENT_API_VERSION XR_MAKE_VERSION(1, 0, 26) #define XR_VERSION_MAJOR(version) (uint16_t)(((uint64_t)(version) >> 48)& 0xffffULL) #define XR_VERSION_MINOR(version) (uint16_t)(((uint64_t)(version) >> 32) & 0xffffULL) @@ -450,6 +450,15 @@ typedef enum XrStructureType { XR_TYPE_VULKAN_SWAPCHAIN_CREATE_INFO_META = 1000227000, XR_TYPE_PERFORMANCE_METRICS_STATE_META = 1000232001, XR_TYPE_PERFORMANCE_METRICS_COUNTER_META = 1000232002, + XR_TYPE_SYSTEM_HEADSET_ID_PROPERTIES_META = 1000245000, + XR_TYPE_PASSTHROUGH_CREATE_INFO_HTC = 1000317001, + XR_TYPE_PASSTHROUGH_COLOR_HTC = 1000317002, + XR_TYPE_PASSTHROUGH_MESH_TRANSFORM_INFO_HTC = 1000317003, + XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_HTC = 1000317004, + XR_TYPE_FOVEATION_APPLY_INFO_HTC = 1000318000, + XR_TYPE_FOVEATION_DYNAMIC_MODE_INFO_HTC = 1000318001, + XR_TYPE_FOVEATION_CUSTOM_MODE_INFO_HTC = 1000318002, + XR_TYPE_ACTIVE_ACTION_SET_PRIORITIES_EXT = 1000373000, XR_TYPE_GRAPHICS_BINDING_VULKAN2_KHR = XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR, XR_TYPE_SWAPCHAIN_IMAGE_VULKAN2_KHR = XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN2_KHR = XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR, @@ -536,6 +545,7 @@ typedef enum XrObjectType { XR_OBJECT_TYPE_PASSTHROUGH_LAYER_FB = 1000118002, XR_OBJECT_TYPE_GEOMETRY_INSTANCE_FB = 1000118004, XR_OBJECT_TYPE_SPATIAL_ANCHOR_STORE_CONNECTION_MSFT = 1000142000, + XR_OBJECT_TYPE_PASSTHROUGH_HTC = 1000317000, XR_OBJECT_TYPE_MAX_ENUM = 0x7FFFFFFF } XrObjectType; typedef XrFlags64 XrInstanceCreateFlags; @@ -1631,7 +1641,7 @@ typedef struct XrBindingModificationsKHR { #define XR_EXT_performance_settings 1 -#define XR_EXT_performance_settings_SPEC_VERSION 3 +#define XR_EXT_performance_settings_SPEC_VERSION 4 #define XR_EXT_PERFORMANCE_SETTINGS_EXTENSION_NAME "XR_EXT_performance_settings" typedef enum XrPerfSettingsDomainEXT { @@ -3007,7 +3017,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrRequestDisplayRefreshRateFB( #define XR_HTCX_vive_tracker_interaction 1 -#define XR_HTCX_vive_tracker_interaction_SPEC_VERSION 1 +#define XR_HTCX_vive_tracker_interaction_SPEC_VERSION 2 #define XR_HTCX_VIVE_TRACKER_INTERACTION_EXTENSION_NAME "XR_HTCX_vive_tracker_interaction" typedef struct XrViveTrackerPathsHTCX { XrStructureType type; @@ -3043,7 +3053,7 @@ XRAPI_ATTR XrResult XRAPI_CALL xrEnumerateViveTrackerPathsHTCX( #define XR_FACIAL_EXPRESSION_LIP_COUNT_HTC 37 XR_DEFINE_HANDLE(XrFacialTrackerHTC) -#define XR_HTC_facial_tracking_SPEC_VERSION 1 +#define XR_HTC_facial_tracking_SPEC_VERSION 2 #define XR_HTC_FACIAL_TRACKING_EXTENSION_NAME "XR_HTC_facial_tracking" typedef enum XrEyeExpressionHTC { @@ -4508,7 +4518,7 @@ typedef struct XrCompositionLayerSettingsFB { #define XR_META_performance_metrics 1 -#define XR_META_performance_metrics_SPEC_VERSION 1 +#define XR_META_performance_metrics_SPEC_VERSION 2 #define XR_META_PERFORMANCE_METRICS_EXTENSION_NAME "XR_META_performance_metrics" typedef enum XrPerformanceMetricsCounterUnitMETA { @@ -4570,10 +4580,167 @@ XRAPI_ATTR XrResult XRAPI_CALL xrQueryPerformanceMetricsCounterMETA( #endif /* !XR_NO_PROTOTYPES */ +#define XR_META_headset_id 1 +#define XR_META_headset_id_SPEC_VERSION 1 +#define XR_META_HEADSET_ID_EXTENSION_NAME "XR_META_headset_id" +// XrSystemHeadsetIdPropertiesMETA extends XrSystemProperties +typedef struct XrSystemHeadsetIdPropertiesMETA { + XrStructureType type; + void* XR_MAY_ALIAS next; + XrUuidEXT id; +} XrSystemHeadsetIdPropertiesMETA; + + + #define XR_EXT_uuid 1 #define XR_EXT_uuid_SPEC_VERSION 1 #define XR_EXT_UUID_EXTENSION_NAME "XR_EXT_uuid" + +#define XR_HTC_passthrough 1 +XR_DEFINE_HANDLE(XrPassthroughHTC) +#define XR_HTC_passthrough_SPEC_VERSION 1 +#define XR_HTC_PASSTHROUGH_EXTENSION_NAME "XR_HTC_passthrough" + +typedef enum XrPassthroughFormHTC { + XR_PASSTHROUGH_FORM_PLANAR_HTC = 0, + XR_PASSTHROUGH_FORM_PROJECTED_HTC = 1, + XR_PASSTHROUGH_FORM_MAX_ENUM_HTC = 0x7FFFFFFF +} XrPassthroughFormHTC; +typedef struct XrPassthroughCreateInfoHTC { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrPassthroughFormHTC form; +} XrPassthroughCreateInfoHTC; + +typedef struct XrPassthroughColorHTC { + XrStructureType type; + const void* XR_MAY_ALIAS next; + float alpha; +} XrPassthroughColorHTC; + +// XrPassthroughMeshTransformInfoHTC extends XrCompositionLayerPassthroughHTC +typedef struct XrPassthroughMeshTransformInfoHTC { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t vertexCount; + const XrVector3f* vertices; + uint32_t indexCount; + const uint32_t* indices; + XrSpace baseSpace; + XrTime time; + XrPosef pose; + XrVector3f scale; +} XrPassthroughMeshTransformInfoHTC; + +typedef struct XrCompositionLayerPassthroughHTC { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrCompositionLayerFlags layerFlags; + XrSpace space; + XrPassthroughHTC passthrough; + XrPassthroughColorHTC color; +} XrCompositionLayerPassthroughHTC; + +typedef XrResult (XRAPI_PTR *PFN_xrCreatePassthroughHTC)(XrSession session, const XrPassthroughCreateInfoHTC* createInfo, XrPassthroughHTC* passthrough); +typedef XrResult (XRAPI_PTR *PFN_xrDestroyPassthroughHTC)(XrPassthroughHTC passthrough); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrCreatePassthroughHTC( + XrSession session, + const XrPassthroughCreateInfoHTC* createInfo, + XrPassthroughHTC* passthrough); + +XRAPI_ATTR XrResult XRAPI_CALL xrDestroyPassthroughHTC( + XrPassthroughHTC passthrough); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_HTC_foveation 1 +#define XR_HTC_foveation_SPEC_VERSION 1 +#define XR_HTC_FOVEATION_EXTENSION_NAME "XR_HTC_foveation" + +typedef enum XrFoveationModeHTC { + XR_FOVEATION_MODE_DISABLE_HTC = 0, + XR_FOVEATION_MODE_FIXED_HTC = 1, + XR_FOVEATION_MODE_DYNAMIC_HTC = 2, + XR_FOVEATION_MODE_CUSTOM_HTC = 3, + XR_FOVEATION_MODE_MAX_ENUM_HTC = 0x7FFFFFFF +} XrFoveationModeHTC; + +typedef enum XrFoveationLevelHTC { + XR_FOVEATION_LEVEL_NONE_HTC = 0, + XR_FOVEATION_LEVEL_LOW_HTC = 1, + XR_FOVEATION_LEVEL_MEDIUM_HTC = 2, + XR_FOVEATION_LEVEL_HIGH_HTC = 3, + XR_FOVEATION_LEVEL_MAX_ENUM_HTC = 0x7FFFFFFF +} XrFoveationLevelHTC; +typedef XrFlags64 XrFoveationDynamicFlagsHTC; + +// Flag bits for XrFoveationDynamicFlagsHTC +static const XrFoveationDynamicFlagsHTC XR_FOVEATION_DYNAMIC_LEVEL_ENABLED_BIT_HTC = 0x00000001; +static const XrFoveationDynamicFlagsHTC XR_FOVEATION_DYNAMIC_CLEAR_FOV_ENABLED_BIT_HTC = 0x00000002; +static const XrFoveationDynamicFlagsHTC XR_FOVEATION_DYNAMIC_FOCAL_CENTER_OFFSET_ENABLED_BIT_HTC = 0x00000004; + +typedef struct XrFoveationApplyInfoHTC { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrFoveationModeHTC mode; + uint32_t subImageCount; + XrSwapchainSubImage* subImages; +} XrFoveationApplyInfoHTC; + +typedef struct XrFoveationConfigurationHTC { + XrFoveationLevelHTC level; + float clearFovDegree; + XrVector2f focalCenterOffset; +} XrFoveationConfigurationHTC; + +// XrFoveationDynamicModeInfoHTC extends XrFoveationApplyInfoHTC +typedef struct XrFoveationDynamicModeInfoHTC { + XrStructureType type; + const void* XR_MAY_ALIAS next; + XrFoveationDynamicFlagsHTC dynamicFlags; +} XrFoveationDynamicModeInfoHTC; + +// XrFoveationCustomModeInfoHTC extends XrFoveationApplyInfoHTC +typedef struct XrFoveationCustomModeInfoHTC { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t configCount; + const XrFoveationConfigurationHTC* configs; +} XrFoveationCustomModeInfoHTC; + +typedef XrResult (XRAPI_PTR *PFN_xrApplyFoveationHTC)(XrSession session, const XrFoveationApplyInfoHTC* applyInfo); + +#ifndef XR_NO_PROTOTYPES +#ifdef XR_EXTENSION_PROTOTYPES +XRAPI_ATTR XrResult XRAPI_CALL xrApplyFoveationHTC( + XrSession session, + const XrFoveationApplyInfoHTC* applyInfo); +#endif /* XR_EXTENSION_PROTOTYPES */ +#endif /* !XR_NO_PROTOTYPES */ + + +#define XR_EXT_active_action_set_priority 1 +#define XR_EXT_active_action_set_priority_SPEC_VERSION 1 +#define XR_EXT_ACTIVE_ACTION_SET_PRIORITY_EXTENSION_NAME "XR_EXT_active_action_set_priority" +typedef struct XrActiveActionSetPriorityEXT { + XrActionSet actionSet; + uint32_t priorityOverride; +} XrActiveActionSetPriorityEXT; + +// XrActiveActionSetPrioritiesEXT extends XrActionsSyncInfo +typedef struct XrActiveActionSetPrioritiesEXT { + XrStructureType type; + const void* XR_MAY_ALIAS next; + uint32_t actionSetPriorityCount; + const XrActiveActionSetPriorityEXT* actionSetPriorities; +} XrActiveActionSetPrioritiesEXT; + + #ifdef __cplusplus } #endif diff --git a/thirdparty/openxr/include/openxr/openxr_reflection.h b/thirdparty/openxr/include/openxr/openxr_reflection.h index ac6f452377..1a873c1770 100644 --- a/thirdparty/openxr/include/openxr/openxr_reflection.h +++ b/thirdparty/openxr/include/openxr/openxr_reflection.h @@ -351,6 +351,15 @@ XR_ENUM_STR(XrResult); _(XR_TYPE_VULKAN_SWAPCHAIN_CREATE_INFO_META, 1000227000) \ _(XR_TYPE_PERFORMANCE_METRICS_STATE_META, 1000232001) \ _(XR_TYPE_PERFORMANCE_METRICS_COUNTER_META, 1000232002) \ + _(XR_TYPE_SYSTEM_HEADSET_ID_PROPERTIES_META, 1000245000) \ + _(XR_TYPE_PASSTHROUGH_CREATE_INFO_HTC, 1000317001) \ + _(XR_TYPE_PASSTHROUGH_COLOR_HTC, 1000317002) \ + _(XR_TYPE_PASSTHROUGH_MESH_TRANSFORM_INFO_HTC, 1000317003) \ + _(XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_HTC, 1000317004) \ + _(XR_TYPE_FOVEATION_APPLY_INFO_HTC, 1000318000) \ + _(XR_TYPE_FOVEATION_DYNAMIC_MODE_INFO_HTC, 1000318001) \ + _(XR_TYPE_FOVEATION_CUSTOM_MODE_INFO_HTC, 1000318002) \ + _(XR_TYPE_ACTIVE_ACTION_SET_PRIORITIES_EXT, 1000373000) \ _(XR_STRUCTURE_TYPE_MAX_ENUM, 0x7FFFFFFF) #define XR_LIST_ENUM_XrFormFactor(_) \ @@ -426,6 +435,7 @@ XR_ENUM_STR(XrResult); _(XR_OBJECT_TYPE_PASSTHROUGH_LAYER_FB, 1000118002) \ _(XR_OBJECT_TYPE_GEOMETRY_INSTANCE_FB, 1000118004) \ _(XR_OBJECT_TYPE_SPATIAL_ANCHOR_STORE_CONNECTION_MSFT, 1000142000) \ + _(XR_OBJECT_TYPE_PASSTHROUGH_HTC, 1000317000) \ _(XR_OBJECT_TYPE_MAX_ENUM, 0x7FFFFFFF) #define XR_LIST_ENUM_XrAndroidThreadTypeKHR(_) \ @@ -748,6 +758,25 @@ XR_ENUM_STR(XrResult); _(XR_PERFORMANCE_METRICS_COUNTER_UNIT_HERTZ_META, 4) \ _(XR_PERFORMANCE_METRICS_COUNTER_UNIT_MAX_ENUM_META, 0x7FFFFFFF) +#define XR_LIST_ENUM_XrPassthroughFormHTC(_) \ + _(XR_PASSTHROUGH_FORM_PLANAR_HTC, 0) \ + _(XR_PASSTHROUGH_FORM_PROJECTED_HTC, 1) \ + _(XR_PASSTHROUGH_FORM_MAX_ENUM_HTC, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrFoveationModeHTC(_) \ + _(XR_FOVEATION_MODE_DISABLE_HTC, 0) \ + _(XR_FOVEATION_MODE_FIXED_HTC, 1) \ + _(XR_FOVEATION_MODE_DYNAMIC_HTC, 2) \ + _(XR_FOVEATION_MODE_CUSTOM_HTC, 3) \ + _(XR_FOVEATION_MODE_MAX_ENUM_HTC, 0x7FFFFFFF) + +#define XR_LIST_ENUM_XrFoveationLevelHTC(_) \ + _(XR_FOVEATION_LEVEL_NONE_HTC, 0) \ + _(XR_FOVEATION_LEVEL_LOW_HTC, 1) \ + _(XR_FOVEATION_LEVEL_MEDIUM_HTC, 2) \ + _(XR_FOVEATION_LEVEL_HIGH_HTC, 3) \ + _(XR_FOVEATION_LEVEL_MAX_ENUM_HTC, 0x7FFFFFFF) + #define XR_LIST_BITS_XrInstanceCreateFlags(_) #define XR_LIST_BITS_XrSessionCreateFlags(_) @@ -891,6 +920,12 @@ XR_ENUM_STR(XrResult); _(XR_PERFORMANCE_METRICS_COUNTER_UINT_VALUE_VALID_BIT_META, 0x00000002) \ _(XR_PERFORMANCE_METRICS_COUNTER_FLOAT_VALUE_VALID_BIT_META, 0x00000004) \ +#define XR_LIST_BITS_XrFoveationDynamicFlagsHTC(_) \ + _(XR_FOVEATION_DYNAMIC_LEVEL_ENABLED_BIT_HTC, 0x00000001) \ + _(XR_FOVEATION_DYNAMIC_CLEAR_FOV_ENABLED_BIT_HTC, 0x00000002) \ + _(XR_FOVEATION_DYNAMIC_FOCAL_CENTER_OFFSET_ENABLED_BIT_HTC, 0x00000004) \ + +/// Calls your macro with the name of each member of XrApiLayerProperties, in order. #define XR_LIST_STRUCT_XrApiLayerProperties(_) \ _(type) \ _(next) \ @@ -899,12 +934,14 @@ XR_ENUM_STR(XrResult); _(layerVersion) \ _(description) \ +/// Calls your macro with the name of each member of XrExtensionProperties, in order. #define XR_LIST_STRUCT_XrExtensionProperties(_) \ _(type) \ _(next) \ _(extensionName) \ _(extensionVersion) \ +/// Calls your macro with the name of each member of XrApplicationInfo, in order. #define XR_LIST_STRUCT_XrApplicationInfo(_) \ _(applicationName) \ _(applicationVersion) \ @@ -912,6 +949,7 @@ XR_ENUM_STR(XrResult); _(engineVersion) \ _(apiVersion) \ +/// Calls your macro with the name of each member of XrInstanceCreateInfo, in order. #define XR_LIST_STRUCT_XrInstanceCreateInfo(_) \ _(type) \ _(next) \ @@ -922,31 +960,37 @@ XR_ENUM_STR(XrResult); _(enabledExtensionCount) \ _(enabledExtensionNames) \ +/// Calls your macro with the name of each member of XrInstanceProperties, in order. #define XR_LIST_STRUCT_XrInstanceProperties(_) \ _(type) \ _(next) \ _(runtimeVersion) \ _(runtimeName) \ +/// Calls your macro with the name of each member of XrEventDataBuffer, in order. #define XR_LIST_STRUCT_XrEventDataBuffer(_) \ _(type) \ _(next) \ _(varying) \ +/// Calls your macro with the name of each member of XrSystemGetInfo, in order. #define XR_LIST_STRUCT_XrSystemGetInfo(_) \ _(type) \ _(next) \ _(formFactor) \ +/// Calls your macro with the name of each member of XrSystemGraphicsProperties, in order. #define XR_LIST_STRUCT_XrSystemGraphicsProperties(_) \ _(maxSwapchainImageHeight) \ _(maxSwapchainImageWidth) \ _(maxLayerCount) \ +/// Calls your macro with the name of each member of XrSystemTrackingProperties, in order. #define XR_LIST_STRUCT_XrSystemTrackingProperties(_) \ _(orientationTracking) \ _(positionTracking) \ +/// Calls your macro with the name of each member of XrSystemProperties, in order. #define XR_LIST_STRUCT_XrSystemProperties(_) \ _(type) \ _(next) \ @@ -956,17 +1000,20 @@ XR_ENUM_STR(XrResult); _(graphicsProperties) \ _(trackingProperties) \ +/// Calls your macro with the name of each member of XrSessionCreateInfo, in order. #define XR_LIST_STRUCT_XrSessionCreateInfo(_) \ _(type) \ _(next) \ _(createFlags) \ _(systemId) \ +/// Calls your macro with the name of each member of XrVector3f, in order. #define XR_LIST_STRUCT_XrVector3f(_) \ _(x) \ _(y) \ _(z) \ +/// Calls your macro with the name of each member of XrSpaceVelocity, in order. #define XR_LIST_STRUCT_XrSpaceVelocity(_) \ _(type) \ _(next) \ @@ -974,26 +1021,31 @@ XR_ENUM_STR(XrResult); _(linearVelocity) \ _(angularVelocity) \ +/// Calls your macro with the name of each member of XrQuaternionf, in order. #define XR_LIST_STRUCT_XrQuaternionf(_) \ _(x) \ _(y) \ _(z) \ _(w) \ +/// Calls your macro with the name of each member of XrPosef, in order. #define XR_LIST_STRUCT_XrPosef(_) \ _(orientation) \ _(position) \ +/// Calls your macro with the name of each member of XrReferenceSpaceCreateInfo, in order. #define XR_LIST_STRUCT_XrReferenceSpaceCreateInfo(_) \ _(type) \ _(next) \ _(referenceSpaceType) \ _(poseInReferenceSpace) \ +/// Calls your macro with the name of each member of XrExtent2Df, in order. #define XR_LIST_STRUCT_XrExtent2Df(_) \ _(width) \ _(height) \ +/// Calls your macro with the name of each member of XrActionSpaceCreateInfo, in order. #define XR_LIST_STRUCT_XrActionSpaceCreateInfo(_) \ _(type) \ _(next) \ @@ -1001,18 +1053,21 @@ XR_ENUM_STR(XrResult); _(subactionPath) \ _(poseInActionSpace) \ +/// Calls your macro with the name of each member of XrSpaceLocation, in order. #define XR_LIST_STRUCT_XrSpaceLocation(_) \ _(type) \ _(next) \ _(locationFlags) \ _(pose) \ +/// Calls your macro with the name of each member of XrViewConfigurationProperties, in order. #define XR_LIST_STRUCT_XrViewConfigurationProperties(_) \ _(type) \ _(next) \ _(viewConfigurationType) \ _(fovMutable) \ +/// Calls your macro with the name of each member of XrViewConfigurationView, in order. #define XR_LIST_STRUCT_XrViewConfigurationView(_) \ _(type) \ _(next) \ @@ -1023,6 +1078,7 @@ XR_ENUM_STR(XrResult); _(recommendedSwapchainSampleCount) \ _(maxSwapchainSampleCount) \ +/// Calls your macro with the name of each member of XrSwapchainCreateInfo, in order. #define XR_LIST_STRUCT_XrSwapchainCreateInfo(_) \ _(type) \ _(next) \ @@ -1036,32 +1092,39 @@ XR_ENUM_STR(XrResult); _(arraySize) \ _(mipCount) \ +/// Calls your macro with the name of each member of XrSwapchainImageBaseHeader, in order. #define XR_LIST_STRUCT_XrSwapchainImageBaseHeader(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrSwapchainImageAcquireInfo, in order. #define XR_LIST_STRUCT_XrSwapchainImageAcquireInfo(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrSwapchainImageWaitInfo, in order. #define XR_LIST_STRUCT_XrSwapchainImageWaitInfo(_) \ _(type) \ _(next) \ _(timeout) \ +/// Calls your macro with the name of each member of XrSwapchainImageReleaseInfo, in order. #define XR_LIST_STRUCT_XrSwapchainImageReleaseInfo(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrSessionBeginInfo, in order. #define XR_LIST_STRUCT_XrSessionBeginInfo(_) \ _(type) \ _(next) \ _(primaryViewConfigurationType) \ +/// Calls your macro with the name of each member of XrFrameWaitInfo, in order. #define XR_LIST_STRUCT_XrFrameWaitInfo(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrFrameState, in order. #define XR_LIST_STRUCT_XrFrameState(_) \ _(type) \ _(next) \ @@ -1069,16 +1132,19 @@ XR_ENUM_STR(XrResult); _(predictedDisplayPeriod) \ _(shouldRender) \ +/// Calls your macro with the name of each member of XrFrameBeginInfo, in order. #define XR_LIST_STRUCT_XrFrameBeginInfo(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrCompositionLayerBaseHeader, in order. #define XR_LIST_STRUCT_XrCompositionLayerBaseHeader(_) \ _(type) \ _(next) \ _(layerFlags) \ _(space) \ +/// Calls your macro with the name of each member of XrFrameEndInfo, in order. #define XR_LIST_STRUCT_XrFrameEndInfo(_) \ _(type) \ _(next) \ @@ -1087,6 +1153,7 @@ XR_ENUM_STR(XrResult); _(layerCount) \ _(layers) \ +/// Calls your macro with the name of each member of XrViewLocateInfo, in order. #define XR_LIST_STRUCT_XrViewLocateInfo(_) \ _(type) \ _(next) \ @@ -1094,23 +1161,27 @@ XR_ENUM_STR(XrResult); _(displayTime) \ _(space) \ +/// Calls your macro with the name of each member of XrViewState, in order. #define XR_LIST_STRUCT_XrViewState(_) \ _(type) \ _(next) \ _(viewStateFlags) \ +/// Calls your macro with the name of each member of XrFovf, in order. #define XR_LIST_STRUCT_XrFovf(_) \ _(angleLeft) \ _(angleRight) \ _(angleUp) \ _(angleDown) \ +/// Calls your macro with the name of each member of XrView, in order. #define XR_LIST_STRUCT_XrView(_) \ _(type) \ _(next) \ _(pose) \ _(fov) \ +/// Calls your macro with the name of each member of XrActionSetCreateInfo, in order. #define XR_LIST_STRUCT_XrActionSetCreateInfo(_) \ _(type) \ _(next) \ @@ -1118,6 +1189,7 @@ XR_ENUM_STR(XrResult); _(localizedActionSetName) \ _(priority) \ +/// Calls your macro with the name of each member of XrActionCreateInfo, in order. #define XR_LIST_STRUCT_XrActionCreateInfo(_) \ _(type) \ _(next) \ @@ -1127,10 +1199,12 @@ XR_ENUM_STR(XrResult); _(subactionPaths) \ _(localizedActionName) \ +/// Calls your macro with the name of each member of XrActionSuggestedBinding, in order. #define XR_LIST_STRUCT_XrActionSuggestedBinding(_) \ _(action) \ _(binding) \ +/// Calls your macro with the name of each member of XrInteractionProfileSuggestedBinding, in order. #define XR_LIST_STRUCT_XrInteractionProfileSuggestedBinding(_) \ _(type) \ _(next) \ @@ -1138,23 +1212,27 @@ XR_ENUM_STR(XrResult); _(countSuggestedBindings) \ _(suggestedBindings) \ +/// Calls your macro with the name of each member of XrSessionActionSetsAttachInfo, in order. #define XR_LIST_STRUCT_XrSessionActionSetsAttachInfo(_) \ _(type) \ _(next) \ _(countActionSets) \ _(actionSets) \ +/// Calls your macro with the name of each member of XrInteractionProfileState, in order. #define XR_LIST_STRUCT_XrInteractionProfileState(_) \ _(type) \ _(next) \ _(interactionProfile) \ +/// Calls your macro with the name of each member of XrActionStateGetInfo, in order. #define XR_LIST_STRUCT_XrActionStateGetInfo(_) \ _(type) \ _(next) \ _(action) \ _(subactionPath) \ +/// Calls your macro with the name of each member of XrActionStateBoolean, in order. #define XR_LIST_STRUCT_XrActionStateBoolean(_) \ _(type) \ _(next) \ @@ -1163,6 +1241,7 @@ XR_ENUM_STR(XrResult); _(lastChangeTime) \ _(isActive) \ +/// Calls your macro with the name of each member of XrActionStateFloat, in order. #define XR_LIST_STRUCT_XrActionStateFloat(_) \ _(type) \ _(next) \ @@ -1171,10 +1250,12 @@ XR_ENUM_STR(XrResult); _(lastChangeTime) \ _(isActive) \ +/// Calls your macro with the name of each member of XrVector2f, in order. #define XR_LIST_STRUCT_XrVector2f(_) \ _(x) \ _(y) \ +/// Calls your macro with the name of each member of XrActionStateVector2f, in order. #define XR_LIST_STRUCT_XrActionStateVector2f(_) \ _(type) \ _(next) \ @@ -1183,67 +1264,81 @@ XR_ENUM_STR(XrResult); _(lastChangeTime) \ _(isActive) \ +/// Calls your macro with the name of each member of XrActionStatePose, in order. #define XR_LIST_STRUCT_XrActionStatePose(_) \ _(type) \ _(next) \ _(isActive) \ +/// Calls your macro with the name of each member of XrActiveActionSet, in order. #define XR_LIST_STRUCT_XrActiveActionSet(_) \ _(actionSet) \ _(subactionPath) \ +/// Calls your macro with the name of each member of XrActionsSyncInfo, in order. #define XR_LIST_STRUCT_XrActionsSyncInfo(_) \ _(type) \ _(next) \ _(countActiveActionSets) \ _(activeActionSets) \ +/// Calls your macro with the name of each member of XrBoundSourcesForActionEnumerateInfo, in order. #define XR_LIST_STRUCT_XrBoundSourcesForActionEnumerateInfo(_) \ _(type) \ _(next) \ _(action) \ +/// Calls your macro with the name of each member of XrInputSourceLocalizedNameGetInfo, in order. #define XR_LIST_STRUCT_XrInputSourceLocalizedNameGetInfo(_) \ _(type) \ _(next) \ _(sourcePath) \ _(whichComponents) \ +/// Calls your macro with the name of each member of XrHapticActionInfo, in order. #define XR_LIST_STRUCT_XrHapticActionInfo(_) \ _(type) \ _(next) \ _(action) \ _(subactionPath) \ +/// Calls your macro with the name of each member of XrHapticBaseHeader, in order. #define XR_LIST_STRUCT_XrHapticBaseHeader(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrBaseInStructure, in order. #define XR_LIST_STRUCT_XrBaseInStructure(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrBaseOutStructure, in order. #define XR_LIST_STRUCT_XrBaseOutStructure(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrOffset2Di, in order. #define XR_LIST_STRUCT_XrOffset2Di(_) \ _(x) \ _(y) \ +/// Calls your macro with the name of each member of XrExtent2Di, in order. #define XR_LIST_STRUCT_XrExtent2Di(_) \ _(width) \ _(height) \ +/// Calls your macro with the name of each member of XrRect2Di, in order. #define XR_LIST_STRUCT_XrRect2Di(_) \ _(offset) \ _(extent) \ +/// Calls your macro with the name of each member of XrSwapchainSubImage, in order. #define XR_LIST_STRUCT_XrSwapchainSubImage(_) \ _(swapchain) \ _(imageRect) \ _(imageArrayIndex) \ +/// Calls your macro with the name of each member of XrCompositionLayerProjectionView, in order. #define XR_LIST_STRUCT_XrCompositionLayerProjectionView(_) \ _(type) \ _(next) \ @@ -1251,6 +1346,7 @@ XR_ENUM_STR(XrResult); _(fov) \ _(subImage) \ +/// Calls your macro with the name of each member of XrCompositionLayerProjection, in order. #define XR_LIST_STRUCT_XrCompositionLayerProjection(_) \ _(type) \ _(next) \ @@ -1259,6 +1355,7 @@ XR_ENUM_STR(XrResult); _(viewCount) \ _(views) \ +/// Calls your macro with the name of each member of XrCompositionLayerQuad, in order. #define XR_LIST_STRUCT_XrCompositionLayerQuad(_) \ _(type) \ _(next) \ @@ -1269,20 +1366,24 @@ XR_ENUM_STR(XrResult); _(pose) \ _(size) \ +/// Calls your macro with the name of each member of XrEventDataBaseHeader, in order. #define XR_LIST_STRUCT_XrEventDataBaseHeader(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrEventDataEventsLost, in order. #define XR_LIST_STRUCT_XrEventDataEventsLost(_) \ _(type) \ _(next) \ _(lostEventCount) \ +/// Calls your macro with the name of each member of XrEventDataInstanceLossPending, in order. #define XR_LIST_STRUCT_XrEventDataInstanceLossPending(_) \ _(type) \ _(next) \ _(lossTime) \ +/// Calls your macro with the name of each member of XrEventDataSessionStateChanged, in order. #define XR_LIST_STRUCT_XrEventDataSessionStateChanged(_) \ _(type) \ _(next) \ @@ -1290,6 +1391,7 @@ XR_ENUM_STR(XrResult); _(state) \ _(time) \ +/// Calls your macro with the name of each member of XrEventDataReferenceSpaceChangePending, in order. #define XR_LIST_STRUCT_XrEventDataReferenceSpaceChangePending(_) \ _(type) \ _(next) \ @@ -1299,11 +1401,13 @@ XR_ENUM_STR(XrResult); _(poseValid) \ _(poseInPreviousSpace) \ +/// Calls your macro with the name of each member of XrEventDataInteractionProfileChanged, in order. #define XR_LIST_STRUCT_XrEventDataInteractionProfileChanged(_) \ _(type) \ _(next) \ _(session) \ +/// Calls your macro with the name of each member of XrHapticVibration, in order. #define XR_LIST_STRUCT_XrHapticVibration(_) \ _(type) \ _(next) \ @@ -1311,26 +1415,31 @@ XR_ENUM_STR(XrResult); _(frequency) \ _(amplitude) \ +/// Calls your macro with the name of each member of XrOffset2Df, in order. #define XR_LIST_STRUCT_XrOffset2Df(_) \ _(x) \ _(y) \ +/// Calls your macro with the name of each member of XrRect2Df, in order. #define XR_LIST_STRUCT_XrRect2Df(_) \ _(offset) \ _(extent) \ +/// Calls your macro with the name of each member of XrVector4f, in order. #define XR_LIST_STRUCT_XrVector4f(_) \ _(x) \ _(y) \ _(z) \ _(w) \ +/// Calls your macro with the name of each member of XrColor4f, in order. #define XR_LIST_STRUCT_XrColor4f(_) \ _(r) \ _(g) \ _(b) \ _(a) \ +/// Calls your macro with the name of each member of XrCompositionLayerCubeKHR, in order. #define XR_LIST_STRUCT_XrCompositionLayerCubeKHR(_) \ _(type) \ _(next) \ @@ -1341,12 +1450,14 @@ XR_ENUM_STR(XrResult); _(imageArrayIndex) \ _(orientation) \ +/// Calls your macro with the name of each member of XrInstanceCreateInfoAndroidKHR, in order. #define XR_LIST_STRUCT_XrInstanceCreateInfoAndroidKHR(_) \ _(type) \ _(next) \ _(applicationVM) \ _(applicationActivity) \ +/// Calls your macro with the name of each member of XrCompositionLayerDepthInfoKHR, in order. #define XR_LIST_STRUCT_XrCompositionLayerDepthInfoKHR(_) \ _(type) \ _(next) \ @@ -1356,12 +1467,14 @@ XR_ENUM_STR(XrResult); _(nearZ) \ _(farZ) \ +/// Calls your macro with the name of each member of XrVulkanSwapchainFormatListCreateInfoKHR, in order. #define XR_LIST_STRUCT_XrVulkanSwapchainFormatListCreateInfoKHR(_) \ _(type) \ _(next) \ _(viewFormatCount) \ _(viewFormats) \ +/// Calls your macro with the name of each member of XrCompositionLayerCylinderKHR, in order. #define XR_LIST_STRUCT_XrCompositionLayerCylinderKHR(_) \ _(type) \ _(next) \ @@ -1374,6 +1487,7 @@ XR_ENUM_STR(XrResult); _(centralAngle) \ _(aspectRatio) \ +/// Calls your macro with the name of each member of XrCompositionLayerEquirectKHR, in order. #define XR_LIST_STRUCT_XrCompositionLayerEquirectKHR(_) \ _(type) \ _(next) \ @@ -1386,12 +1500,14 @@ XR_ENUM_STR(XrResult); _(scale) \ _(bias) \ +/// Calls your macro with the name of each member of XrGraphicsBindingOpenGLWin32KHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingOpenGLWin32KHR(_) \ _(type) \ _(next) \ _(hDC) \ _(hGLRC) \ +/// Calls your macro with the name of each member of XrGraphicsBindingOpenGLXlibKHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingOpenGLXlibKHR(_) \ _(type) \ _(next) \ @@ -1401,6 +1517,7 @@ XR_ENUM_STR(XrResult); _(glxDrawable) \ _(glxContext) \ +/// Calls your macro with the name of each member of XrGraphicsBindingOpenGLXcbKHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingOpenGLXcbKHR(_) \ _(type) \ _(next) \ @@ -1411,22 +1528,26 @@ XR_ENUM_STR(XrResult); _(glxDrawable) \ _(glxContext) \ +/// Calls your macro with the name of each member of XrGraphicsBindingOpenGLWaylandKHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingOpenGLWaylandKHR(_) \ _(type) \ _(next) \ _(display) \ +/// Calls your macro with the name of each member of XrSwapchainImageOpenGLKHR, in order. #define XR_LIST_STRUCT_XrSwapchainImageOpenGLKHR(_) \ _(type) \ _(next) \ _(image) \ +/// Calls your macro with the name of each member of XrGraphicsRequirementsOpenGLKHR, in order. #define XR_LIST_STRUCT_XrGraphicsRequirementsOpenGLKHR(_) \ _(type) \ _(next) \ _(minApiVersionSupported) \ _(maxApiVersionSupported) \ +/// Calls your macro with the name of each member of XrGraphicsBindingOpenGLESAndroidKHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingOpenGLESAndroidKHR(_) \ _(type) \ _(next) \ @@ -1434,17 +1555,20 @@ XR_ENUM_STR(XrResult); _(config) \ _(context) \ +/// Calls your macro with the name of each member of XrSwapchainImageOpenGLESKHR, in order. #define XR_LIST_STRUCT_XrSwapchainImageOpenGLESKHR(_) \ _(type) \ _(next) \ _(image) \ +/// Calls your macro with the name of each member of XrGraphicsRequirementsOpenGLESKHR, in order. #define XR_LIST_STRUCT_XrGraphicsRequirementsOpenGLESKHR(_) \ _(type) \ _(next) \ _(minApiVersionSupported) \ _(maxApiVersionSupported) \ +/// Calls your macro with the name of each member of XrGraphicsBindingVulkanKHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingVulkanKHR(_) \ _(type) \ _(next) \ @@ -1454,50 +1578,59 @@ XR_ENUM_STR(XrResult); _(queueFamilyIndex) \ _(queueIndex) \ +/// Calls your macro with the name of each member of XrSwapchainImageVulkanKHR, in order. #define XR_LIST_STRUCT_XrSwapchainImageVulkanKHR(_) \ _(type) \ _(next) \ _(image) \ +/// Calls your macro with the name of each member of XrGraphicsRequirementsVulkanKHR, in order. #define XR_LIST_STRUCT_XrGraphicsRequirementsVulkanKHR(_) \ _(type) \ _(next) \ _(minApiVersionSupported) \ _(maxApiVersionSupported) \ +/// Calls your macro with the name of each member of XrGraphicsBindingD3D11KHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingD3D11KHR(_) \ _(type) \ _(next) \ _(device) \ +/// Calls your macro with the name of each member of XrSwapchainImageD3D11KHR, in order. #define XR_LIST_STRUCT_XrSwapchainImageD3D11KHR(_) \ _(type) \ _(next) \ _(texture) \ +/// Calls your macro with the name of each member of XrGraphicsRequirementsD3D11KHR, in order. #define XR_LIST_STRUCT_XrGraphicsRequirementsD3D11KHR(_) \ _(type) \ _(next) \ _(adapterLuid) \ _(minFeatureLevel) \ +/// Calls your macro with the name of each member of XrGraphicsBindingD3D12KHR, in order. #define XR_LIST_STRUCT_XrGraphicsBindingD3D12KHR(_) \ _(type) \ _(next) \ _(device) \ _(queue) \ +/// Calls your macro with the name of each member of XrSwapchainImageD3D12KHR, in order. #define XR_LIST_STRUCT_XrSwapchainImageD3D12KHR(_) \ _(type) \ _(next) \ _(texture) \ +/// Calls your macro with the name of each member of XrGraphicsRequirementsD3D12KHR, in order. #define XR_LIST_STRUCT_XrGraphicsRequirementsD3D12KHR(_) \ _(type) \ _(next) \ _(adapterLuid) \ _(minFeatureLevel) \ +/// Calls your macro with the name of each member of XrVisibilityMaskKHR, in order. #define XR_LIST_STRUCT_XrVisibilityMaskKHR(_) \ _(type) \ _(next) \ @@ -1508,6 +1641,7 @@ XR_ENUM_STR(XrResult); _(indexCountOutput) \ _(indices) \ +/// Calls your macro with the name of each member of XrEventDataVisibilityMaskChangedKHR, in order. #define XR_LIST_STRUCT_XrEventDataVisibilityMaskChangedKHR(_) \ _(type) \ _(next) \ @@ -1515,22 +1649,26 @@ XR_ENUM_STR(XrResult); _(viewConfigurationType) \ _(viewIndex) \ +/// Calls your macro with the name of each member of XrCompositionLayerColorScaleBiasKHR, in order. #define XR_LIST_STRUCT_XrCompositionLayerColorScaleBiasKHR(_) \ _(type) \ _(next) \ _(colorScale) \ _(colorBias) \ +/// Calls your macro with the name of each member of XrLoaderInitInfoBaseHeaderKHR, in order. #define XR_LIST_STRUCT_XrLoaderInitInfoBaseHeaderKHR(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrLoaderInitInfoAndroidKHR, in order. #define XR_LIST_STRUCT_XrLoaderInitInfoAndroidKHR(_) \ _(type) \ _(next) \ _(applicationVM) \ _(applicationContext) \ +/// Calls your macro with the name of each member of XrVulkanInstanceCreateInfoKHR, in order. #define XR_LIST_STRUCT_XrVulkanInstanceCreateInfoKHR(_) \ _(type) \ _(next) \ @@ -1540,6 +1678,7 @@ XR_ENUM_STR(XrResult); _(vulkanCreateInfo) \ _(vulkanAllocator) \ +/// Calls your macro with the name of each member of XrVulkanDeviceCreateInfoKHR, in order. #define XR_LIST_STRUCT_XrVulkanDeviceCreateInfoKHR(_) \ _(type) \ _(next) \ @@ -1550,12 +1689,14 @@ XR_ENUM_STR(XrResult); _(vulkanCreateInfo) \ _(vulkanAllocator) \ +/// Calls your macro with the name of each member of XrVulkanGraphicsDeviceGetInfoKHR, in order. #define XR_LIST_STRUCT_XrVulkanGraphicsDeviceGetInfoKHR(_) \ _(type) \ _(next) \ _(systemId) \ _(vulkanInstance) \ +/// Calls your macro with the name of each member of XrCompositionLayerEquirect2KHR, in order. #define XR_LIST_STRUCT_XrCompositionLayerEquirect2KHR(_) \ _(type) \ _(next) \ @@ -1569,16 +1710,19 @@ XR_ENUM_STR(XrResult); _(upperVerticalAngle) \ _(lowerVerticalAngle) \ +/// Calls your macro with the name of each member of XrBindingModificationBaseHeaderKHR, in order. #define XR_LIST_STRUCT_XrBindingModificationBaseHeaderKHR(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrBindingModificationsKHR, in order. #define XR_LIST_STRUCT_XrBindingModificationsKHR(_) \ _(type) \ _(next) \ _(bindingModificationCount) \ _(bindingModifications) \ +/// Calls your macro with the name of each member of XrEventDataPerfSettingsEXT, in order. #define XR_LIST_STRUCT_XrEventDataPerfSettingsEXT(_) \ _(type) \ _(next) \ @@ -1587,6 +1731,7 @@ XR_ENUM_STR(XrResult); _(fromLevel) \ _(toLevel) \ +/// Calls your macro with the name of each member of XrDebugUtilsObjectNameInfoEXT, in order. #define XR_LIST_STRUCT_XrDebugUtilsObjectNameInfoEXT(_) \ _(type) \ _(next) \ @@ -1594,11 +1739,13 @@ XR_ENUM_STR(XrResult); _(objectHandle) \ _(objectName) \ +/// Calls your macro with the name of each member of XrDebugUtilsLabelEXT, in order. #define XR_LIST_STRUCT_XrDebugUtilsLabelEXT(_) \ _(type) \ _(next) \ _(labelName) \ +/// Calls your macro with the name of each member of XrDebugUtilsMessengerCallbackDataEXT, in order. #define XR_LIST_STRUCT_XrDebugUtilsMessengerCallbackDataEXT(_) \ _(type) \ _(next) \ @@ -1610,6 +1757,7 @@ XR_ENUM_STR(XrResult); _(sessionLabelCount) \ _(sessionLabels) \ +/// Calls your macro with the name of each member of XrDebugUtilsMessengerCreateInfoEXT, in order. #define XR_LIST_STRUCT_XrDebugUtilsMessengerCreateInfoEXT(_) \ _(type) \ _(next) \ @@ -1618,28 +1766,33 @@ XR_ENUM_STR(XrResult); _(userCallback) \ _(userData) \ +/// Calls your macro with the name of each member of XrSystemEyeGazeInteractionPropertiesEXT, in order. #define XR_LIST_STRUCT_XrSystemEyeGazeInteractionPropertiesEXT(_) \ _(type) \ _(next) \ _(supportsEyeGazeInteraction) \ +/// Calls your macro with the name of each member of XrEyeGazeSampleTimeEXT, in order. #define XR_LIST_STRUCT_XrEyeGazeSampleTimeEXT(_) \ _(type) \ _(next) \ _(time) \ +/// Calls your macro with the name of each member of XrSessionCreateInfoOverlayEXTX, in order. #define XR_LIST_STRUCT_XrSessionCreateInfoOverlayEXTX(_) \ _(type) \ _(next) \ _(createFlags) \ _(sessionLayersPlacement) \ +/// Calls your macro with the name of each member of XrEventDataMainSessionVisibilityChangedEXTX, in order. #define XR_LIST_STRUCT_XrEventDataMainSessionVisibilityChangedEXTX(_) \ _(type) \ _(next) \ _(visible) \ _(flags) \ +/// Calls your macro with the name of each member of XrSpatialAnchorCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSpatialAnchorCreateInfoMSFT(_) \ _(type) \ _(next) \ @@ -1647,17 +1800,20 @@ XR_ENUM_STR(XrResult); _(pose) \ _(time) \ +/// Calls your macro with the name of each member of XrSpatialAnchorSpaceCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSpatialAnchorSpaceCreateInfoMSFT(_) \ _(type) \ _(next) \ _(anchor) \ _(poseInAnchorSpace) \ +/// Calls your macro with the name of each member of XrCompositionLayerImageLayoutFB, in order. #define XR_LIST_STRUCT_XrCompositionLayerImageLayoutFB(_) \ _(type) \ _(next) \ _(flags) \ +/// Calls your macro with the name of each member of XrCompositionLayerAlphaBlendFB, in order. #define XR_LIST_STRUCT_XrCompositionLayerAlphaBlendFB(_) \ _(type) \ _(next) \ @@ -1666,6 +1822,7 @@ XR_ENUM_STR(XrResult); _(srcFactorAlpha) \ _(dstFactorAlpha) \ +/// Calls your macro with the name of each member of XrViewConfigurationDepthRangeEXT, in order. #define XR_LIST_STRUCT_XrViewConfigurationDepthRangeEXT(_) \ _(type) \ _(next) \ @@ -1674,6 +1831,7 @@ XR_ENUM_STR(XrResult); _(recommendedFarZ) \ _(maxFarZ) \ +/// Calls your macro with the name of each member of XrGraphicsBindingEGLMNDX, in order. #define XR_LIST_STRUCT_XrGraphicsBindingEGLMNDX(_) \ _(type) \ _(next) \ @@ -1682,6 +1840,7 @@ XR_ENUM_STR(XrResult); _(config) \ _(context) \ +/// Calls your macro with the name of each member of XrSpatialGraphNodeSpaceCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSpatialGraphNodeSpaceCreateInfoMSFT(_) \ _(type) \ _(next) \ @@ -1689,6 +1848,7 @@ XR_ENUM_STR(XrResult); _(nodeId) \ _(pose) \ +/// Calls your macro with the name of each member of XrSpatialGraphStaticNodeBindingCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSpatialGraphStaticNodeBindingCreateInfoMSFT(_) \ _(type) \ _(next) \ @@ -1696,43 +1856,51 @@ XR_ENUM_STR(XrResult); _(poseInSpace) \ _(time) \ +/// Calls your macro with the name of each member of XrSpatialGraphNodeBindingPropertiesGetInfoMSFT, in order. #define XR_LIST_STRUCT_XrSpatialGraphNodeBindingPropertiesGetInfoMSFT(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrSpatialGraphNodeBindingPropertiesMSFT, in order. #define XR_LIST_STRUCT_XrSpatialGraphNodeBindingPropertiesMSFT(_) \ _(type) \ _(next) \ _(nodeId) \ _(poseInNodeSpace) \ +/// Calls your macro with the name of each member of XrSystemHandTrackingPropertiesEXT, in order. #define XR_LIST_STRUCT_XrSystemHandTrackingPropertiesEXT(_) \ _(type) \ _(next) \ _(supportsHandTracking) \ +/// Calls your macro with the name of each member of XrHandTrackerCreateInfoEXT, in order. #define XR_LIST_STRUCT_XrHandTrackerCreateInfoEXT(_) \ _(type) \ _(next) \ _(hand) \ _(handJointSet) \ +/// Calls your macro with the name of each member of XrHandJointsLocateInfoEXT, in order. #define XR_LIST_STRUCT_XrHandJointsLocateInfoEXT(_) \ _(type) \ _(next) \ _(baseSpace) \ _(time) \ +/// Calls your macro with the name of each member of XrHandJointLocationEXT, in order. #define XR_LIST_STRUCT_XrHandJointLocationEXT(_) \ _(locationFlags) \ _(pose) \ _(radius) \ +/// Calls your macro with the name of each member of XrHandJointVelocityEXT, in order. #define XR_LIST_STRUCT_XrHandJointVelocityEXT(_) \ _(velocityFlags) \ _(linearVelocity) \ _(angularVelocity) \ +/// Calls your macro with the name of each member of XrHandJointLocationsEXT, in order. #define XR_LIST_STRUCT_XrHandJointLocationsEXT(_) \ _(type) \ _(next) \ @@ -1740,12 +1908,14 @@ XR_ENUM_STR(XrResult); _(jointCount) \ _(jointLocations) \ +/// Calls your macro with the name of each member of XrHandJointVelocitiesEXT, in order. #define XR_LIST_STRUCT_XrHandJointVelocitiesEXT(_) \ _(type) \ _(next) \ _(jointCount) \ _(jointVelocities) \ +/// Calls your macro with the name of each member of XrSystemHandTrackingMeshPropertiesMSFT, in order. #define XR_LIST_STRUCT_XrSystemHandTrackingMeshPropertiesMSFT(_) \ _(type) \ _(next) \ @@ -1753,34 +1923,40 @@ XR_ENUM_STR(XrResult); _(maxHandMeshIndexCount) \ _(maxHandMeshVertexCount) \ +/// Calls your macro with the name of each member of XrHandMeshSpaceCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrHandMeshSpaceCreateInfoMSFT(_) \ _(type) \ _(next) \ _(handPoseType) \ _(poseInHandMeshSpace) \ +/// Calls your macro with the name of each member of XrHandMeshUpdateInfoMSFT, in order. #define XR_LIST_STRUCT_XrHandMeshUpdateInfoMSFT(_) \ _(type) \ _(next) \ _(time) \ _(handPoseType) \ +/// Calls your macro with the name of each member of XrHandMeshIndexBufferMSFT, in order. #define XR_LIST_STRUCT_XrHandMeshIndexBufferMSFT(_) \ _(indexBufferKey) \ _(indexCapacityInput) \ _(indexCountOutput) \ _(indices) \ +/// Calls your macro with the name of each member of XrHandMeshVertexMSFT, in order. #define XR_LIST_STRUCT_XrHandMeshVertexMSFT(_) \ _(position) \ _(normal) \ +/// Calls your macro with the name of each member of XrHandMeshVertexBufferMSFT, in order. #define XR_LIST_STRUCT_XrHandMeshVertexBufferMSFT(_) \ _(vertexUpdateTime) \ _(vertexCapacityInput) \ _(vertexCountOutput) \ _(vertices) \ +/// Calls your macro with the name of each member of XrHandMeshMSFT, in order. #define XR_LIST_STRUCT_XrHandMeshMSFT(_) \ _(type) \ _(next) \ @@ -1790,29 +1966,34 @@ XR_ENUM_STR(XrResult); _(indexBuffer) \ _(vertexBuffer) \ +/// Calls your macro with the name of each member of XrHandPoseTypeInfoMSFT, in order. #define XR_LIST_STRUCT_XrHandPoseTypeInfoMSFT(_) \ _(type) \ _(next) \ _(handPoseType) \ +/// Calls your macro with the name of each member of XrSecondaryViewConfigurationSessionBeginInfoMSFT, in order. #define XR_LIST_STRUCT_XrSecondaryViewConfigurationSessionBeginInfoMSFT(_) \ _(type) \ _(next) \ _(viewConfigurationCount) \ _(enabledViewConfigurationTypes) \ +/// Calls your macro with the name of each member of XrSecondaryViewConfigurationStateMSFT, in order. #define XR_LIST_STRUCT_XrSecondaryViewConfigurationStateMSFT(_) \ _(type) \ _(next) \ _(viewConfigurationType) \ _(active) \ +/// Calls your macro with the name of each member of XrSecondaryViewConfigurationFrameStateMSFT, in order. #define XR_LIST_STRUCT_XrSecondaryViewConfigurationFrameStateMSFT(_) \ _(type) \ _(next) \ _(viewConfigurationCount) \ _(viewConfigurationStates) \ +/// Calls your macro with the name of each member of XrSecondaryViewConfigurationLayerInfoMSFT, in order. #define XR_LIST_STRUCT_XrSecondaryViewConfigurationLayerInfoMSFT(_) \ _(type) \ _(next) \ @@ -1821,28 +2002,33 @@ XR_ENUM_STR(XrResult); _(layerCount) \ _(layers) \ +/// Calls your macro with the name of each member of XrSecondaryViewConfigurationFrameEndInfoMSFT, in order. #define XR_LIST_STRUCT_XrSecondaryViewConfigurationFrameEndInfoMSFT(_) \ _(type) \ _(next) \ _(viewConfigurationCount) \ _(viewConfigurationLayersInfo) \ +/// Calls your macro with the name of each member of XrSecondaryViewConfigurationSwapchainCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSecondaryViewConfigurationSwapchainCreateInfoMSFT(_) \ _(type) \ _(next) \ _(viewConfigurationType) \ +/// Calls your macro with the name of each member of XrControllerModelKeyStateMSFT, in order. #define XR_LIST_STRUCT_XrControllerModelKeyStateMSFT(_) \ _(type) \ _(next) \ _(modelKey) \ +/// Calls your macro with the name of each member of XrControllerModelNodePropertiesMSFT, in order. #define XR_LIST_STRUCT_XrControllerModelNodePropertiesMSFT(_) \ _(type) \ _(next) \ _(parentNodeName) \ _(nodeName) \ +/// Calls your macro with the name of each member of XrControllerModelPropertiesMSFT, in order. #define XR_LIST_STRUCT_XrControllerModelPropertiesMSFT(_) \ _(type) \ _(next) \ @@ -1850,11 +2036,13 @@ XR_ENUM_STR(XrResult); _(nodeCountOutput) \ _(nodeProperties) \ +/// Calls your macro with the name of each member of XrControllerModelNodeStateMSFT, in order. #define XR_LIST_STRUCT_XrControllerModelNodeStateMSFT(_) \ _(type) \ _(next) \ _(nodePose) \ +/// Calls your macro with the name of each member of XrControllerModelStateMSFT, in order. #define XR_LIST_STRUCT_XrControllerModelStateMSFT(_) \ _(type) \ _(next) \ @@ -1862,23 +2050,27 @@ XR_ENUM_STR(XrResult); _(nodeCountOutput) \ _(nodeStates) \ +/// Calls your macro with the name of each member of XrViewConfigurationViewFovEPIC, in order. #define XR_LIST_STRUCT_XrViewConfigurationViewFovEPIC(_) \ _(type) \ _(next) \ _(recommendedFov) \ _(maxMutableFov) \ +/// Calls your macro with the name of each member of XrHolographicWindowAttachmentMSFT, in order. #define XR_LIST_STRUCT_XrHolographicWindowAttachmentMSFT(_) \ _(type) \ _(next) \ _(holographicSpace) \ _(coreWindow) \ +/// Calls your macro with the name of each member of XrCompositionLayerReprojectionInfoMSFT, in order. #define XR_LIST_STRUCT_XrCompositionLayerReprojectionInfoMSFT(_) \ _(type) \ _(next) \ _(reprojectionMode) \ +/// Calls your macro with the name of each member of XrCompositionLayerReprojectionPlaneOverrideMSFT, in order. #define XR_LIST_STRUCT_XrCompositionLayerReprojectionPlaneOverrideMSFT(_) \ _(type) \ _(next) \ @@ -1886,20 +2078,24 @@ XR_ENUM_STR(XrResult); _(normal) \ _(velocity) \ +/// Calls your macro with the name of each member of XrAndroidSurfaceSwapchainCreateInfoFB, in order. #define XR_LIST_STRUCT_XrAndroidSurfaceSwapchainCreateInfoFB(_) \ _(type) \ _(next) \ _(createFlags) \ +/// Calls your macro with the name of each member of XrSwapchainStateBaseHeaderFB, in order. #define XR_LIST_STRUCT_XrSwapchainStateBaseHeaderFB(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrCompositionLayerSecureContentFB, in order. #define XR_LIST_STRUCT_XrCompositionLayerSecureContentFB(_) \ _(type) \ _(next) \ _(flags) \ +/// Calls your macro with the name of each member of XrInteractionProfileDpadBindingEXT, in order. #define XR_LIST_STRUCT_XrInteractionProfileDpadBindingEXT(_) \ _(type) \ _(next) \ @@ -1913,6 +2109,7 @@ XR_ENUM_STR(XrResult); _(onHaptic) \ _(offHaptic) \ +/// Calls your macro with the name of each member of XrInteractionProfileAnalogThresholdVALVE, in order. #define XR_LIST_STRUCT_XrInteractionProfileAnalogThresholdVALVE(_) \ _(type) \ _(next) \ @@ -1923,35 +2120,43 @@ XR_ENUM_STR(XrResult); _(onHaptic) \ _(offHaptic) \ +/// Calls your macro with the name of each member of XrHandJointsMotionRangeInfoEXT, in order. #define XR_LIST_STRUCT_XrHandJointsMotionRangeInfoEXT(_) \ _(type) \ _(next) \ _(handJointsMotionRange) \ +/// Calls your macro with the name of each member of XrUuidMSFT, in order. #define XR_LIST_STRUCT_XrUuidMSFT(_) \ _(bytes) \ +/// Calls your macro with the name of each member of XrSceneObserverCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneObserverCreateInfoMSFT(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrSceneCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneCreateInfoMSFT(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrSceneSphereBoundMSFT, in order. #define XR_LIST_STRUCT_XrSceneSphereBoundMSFT(_) \ _(center) \ _(radius) \ +/// Calls your macro with the name of each member of XrSceneOrientedBoxBoundMSFT, in order. #define XR_LIST_STRUCT_XrSceneOrientedBoxBoundMSFT(_) \ _(pose) \ _(extents) \ +/// Calls your macro with the name of each member of XrSceneFrustumBoundMSFT, in order. #define XR_LIST_STRUCT_XrSceneFrustumBoundMSFT(_) \ _(pose) \ _(fov) \ _(farDistance) \ +/// Calls your macro with the name of each member of XrSceneBoundsMSFT, in order. #define XR_LIST_STRUCT_XrSceneBoundsMSFT(_) \ _(space) \ _(time) \ @@ -1962,6 +2167,7 @@ XR_ENUM_STR(XrResult); _(frustumCount) \ _(frustums) \ +/// Calls your macro with the name of each member of XrNewSceneComputeInfoMSFT, in order. #define XR_LIST_STRUCT_XrNewSceneComputeInfoMSFT(_) \ _(type) \ _(next) \ @@ -1970,17 +2176,20 @@ XR_ENUM_STR(XrResult); _(consistency) \ _(bounds) \ +/// Calls your macro with the name of each member of XrVisualMeshComputeLodInfoMSFT, in order. #define XR_LIST_STRUCT_XrVisualMeshComputeLodInfoMSFT(_) \ _(type) \ _(next) \ _(lod) \ +/// Calls your macro with the name of each member of XrSceneComponentMSFT, in order. #define XR_LIST_STRUCT_XrSceneComponentMSFT(_) \ _(componentType) \ _(id) \ _(parentId) \ _(updateTime) \ +/// Calls your macro with the name of each member of XrSceneComponentsMSFT, in order. #define XR_LIST_STRUCT_XrSceneComponentsMSFT(_) \ _(type) \ _(next) \ @@ -1988,21 +2197,25 @@ XR_ENUM_STR(XrResult); _(componentCountOutput) \ _(components) \ +/// Calls your macro with the name of each member of XrSceneComponentsGetInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneComponentsGetInfoMSFT(_) \ _(type) \ _(next) \ _(componentType) \ +/// Calls your macro with the name of each member of XrSceneComponentLocationMSFT, in order. #define XR_LIST_STRUCT_XrSceneComponentLocationMSFT(_) \ _(flags) \ _(pose) \ +/// Calls your macro with the name of each member of XrSceneComponentLocationsMSFT, in order. #define XR_LIST_STRUCT_XrSceneComponentLocationsMSFT(_) \ _(type) \ _(next) \ _(locationCount) \ _(locations) \ +/// Calls your macro with the name of each member of XrSceneComponentsLocateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneComponentsLocateInfoMSFT(_) \ _(type) \ _(next) \ @@ -2011,63 +2224,75 @@ XR_ENUM_STR(XrResult); _(componentIdCount) \ _(componentIds) \ +/// Calls your macro with the name of each member of XrSceneObjectMSFT, in order. #define XR_LIST_STRUCT_XrSceneObjectMSFT(_) \ _(objectType) \ +/// Calls your macro with the name of each member of XrSceneObjectsMSFT, in order. #define XR_LIST_STRUCT_XrSceneObjectsMSFT(_) \ _(type) \ _(next) \ _(sceneObjectCount) \ _(sceneObjects) \ +/// Calls your macro with the name of each member of XrSceneComponentParentFilterInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneComponentParentFilterInfoMSFT(_) \ _(type) \ _(next) \ _(parentId) \ +/// Calls your macro with the name of each member of XrSceneObjectTypesFilterInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneObjectTypesFilterInfoMSFT(_) \ _(type) \ _(next) \ _(objectTypeCount) \ _(objectTypes) \ +/// Calls your macro with the name of each member of XrScenePlaneMSFT, in order. #define XR_LIST_STRUCT_XrScenePlaneMSFT(_) \ _(alignment) \ _(size) \ _(meshBufferId) \ _(supportsIndicesUint16) \ +/// Calls your macro with the name of each member of XrScenePlanesMSFT, in order. #define XR_LIST_STRUCT_XrScenePlanesMSFT(_) \ _(type) \ _(next) \ _(scenePlaneCount) \ _(scenePlanes) \ +/// Calls your macro with the name of each member of XrScenePlaneAlignmentFilterInfoMSFT, in order. #define XR_LIST_STRUCT_XrScenePlaneAlignmentFilterInfoMSFT(_) \ _(type) \ _(next) \ _(alignmentCount) \ _(alignments) \ +/// Calls your macro with the name of each member of XrSceneMeshMSFT, in order. #define XR_LIST_STRUCT_XrSceneMeshMSFT(_) \ _(meshBufferId) \ _(supportsIndicesUint16) \ +/// Calls your macro with the name of each member of XrSceneMeshesMSFT, in order. #define XR_LIST_STRUCT_XrSceneMeshesMSFT(_) \ _(type) \ _(next) \ _(sceneMeshCount) \ _(sceneMeshes) \ +/// Calls your macro with the name of each member of XrSceneMeshBuffersGetInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneMeshBuffersGetInfoMSFT(_) \ _(type) \ _(next) \ _(meshBufferId) \ +/// Calls your macro with the name of each member of XrSceneMeshBuffersMSFT, in order. #define XR_LIST_STRUCT_XrSceneMeshBuffersMSFT(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrSceneMeshVertexBufferMSFT, in order. #define XR_LIST_STRUCT_XrSceneMeshVertexBufferMSFT(_) \ _(type) \ _(next) \ @@ -2075,6 +2300,7 @@ XR_ENUM_STR(XrResult); _(vertexCountOutput) \ _(vertices) \ +/// Calls your macro with the name of each member of XrSceneMeshIndicesUint32MSFT, in order. #define XR_LIST_STRUCT_XrSceneMeshIndicesUint32MSFT(_) \ _(type) \ _(next) \ @@ -2082,6 +2308,7 @@ XR_ENUM_STR(XrResult); _(indexCountOutput) \ _(indices) \ +/// Calls your macro with the name of each member of XrSceneMeshIndicesUint16MSFT, in order. #define XR_LIST_STRUCT_XrSceneMeshIndicesUint16MSFT(_) \ _(type) \ _(next) \ @@ -2089,44 +2316,52 @@ XR_ENUM_STR(XrResult); _(indexCountOutput) \ _(indices) \ +/// Calls your macro with the name of each member of XrSerializedSceneFragmentDataGetInfoMSFT, in order. #define XR_LIST_STRUCT_XrSerializedSceneFragmentDataGetInfoMSFT(_) \ _(type) \ _(next) \ _(sceneFragmentId) \ +/// Calls your macro with the name of each member of XrDeserializeSceneFragmentMSFT, in order. #define XR_LIST_STRUCT_XrDeserializeSceneFragmentMSFT(_) \ _(bufferSize) \ _(buffer) \ +/// Calls your macro with the name of each member of XrSceneDeserializeInfoMSFT, in order. #define XR_LIST_STRUCT_XrSceneDeserializeInfoMSFT(_) \ _(type) \ _(next) \ _(fragmentCount) \ _(fragments) \ +/// Calls your macro with the name of each member of XrEventDataDisplayRefreshRateChangedFB, in order. #define XR_LIST_STRUCT_XrEventDataDisplayRefreshRateChangedFB(_) \ _(type) \ _(next) \ _(fromDisplayRefreshRate) \ _(toDisplayRefreshRate) \ +/// Calls your macro with the name of each member of XrViveTrackerPathsHTCX, in order. #define XR_LIST_STRUCT_XrViveTrackerPathsHTCX(_) \ _(type) \ _(next) \ _(persistentPath) \ _(rolePath) \ +/// Calls your macro with the name of each member of XrEventDataViveTrackerConnectedHTCX, in order. #define XR_LIST_STRUCT_XrEventDataViveTrackerConnectedHTCX(_) \ _(type) \ _(next) \ _(paths) \ +/// Calls your macro with the name of each member of XrSystemFacialTrackingPropertiesHTC, in order. #define XR_LIST_STRUCT_XrSystemFacialTrackingPropertiesHTC(_) \ _(type) \ _(next) \ _(supportEyeFacialTracking) \ _(supportLipFacialTracking) \ +/// Calls your macro with the name of each member of XrFacialExpressionsHTC, in order. #define XR_LIST_STRUCT_XrFacialExpressionsHTC(_) \ _(type) \ _(next) \ @@ -2135,22 +2370,26 @@ XR_ENUM_STR(XrResult); _(expressionCount) \ _(expressionWeightings) \ +/// Calls your macro with the name of each member of XrFacialTrackerCreateInfoHTC, in order. #define XR_LIST_STRUCT_XrFacialTrackerCreateInfoHTC(_) \ _(type) \ _(next) \ _(facialTrackingType) \ +/// Calls your macro with the name of each member of XrSystemColorSpacePropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemColorSpacePropertiesFB(_) \ _(type) \ _(next) \ _(colorSpace) \ +/// Calls your macro with the name of each member of XrVector4sFB, in order. #define XR_LIST_STRUCT_XrVector4sFB(_) \ _(x) \ _(y) \ _(z) \ _(w) \ +/// Calls your macro with the name of each member of XrHandTrackingMeshFB, in order. #define XR_LIST_STRUCT_XrHandTrackingMeshFB(_) \ _(type) \ _(next) \ @@ -2170,6 +2409,7 @@ XR_ENUM_STR(XrResult); _(indexCountOutput) \ _(indices) \ +/// Calls your macro with the name of each member of XrHandTrackingScaleFB, in order. #define XR_LIST_STRUCT_XrHandTrackingScaleFB(_) \ _(type) \ _(next) \ @@ -2178,6 +2418,7 @@ XR_ENUM_STR(XrResult); _(overrideHandScale) \ _(overrideValueInput) \ +/// Calls your macro with the name of each member of XrHandTrackingAimStateFB, in order. #define XR_LIST_STRUCT_XrHandTrackingAimStateFB(_) \ _(type) \ _(next) \ @@ -2188,21 +2429,25 @@ XR_ENUM_STR(XrResult); _(pinchStrengthRing) \ _(pinchStrengthLittle) \ +/// Calls your macro with the name of each member of XrHandCapsuleFB, in order. #define XR_LIST_STRUCT_XrHandCapsuleFB(_) \ _(points) \ _(radius) \ _(joint) \ +/// Calls your macro with the name of each member of XrHandTrackingCapsulesStateFB, in order. #define XR_LIST_STRUCT_XrHandTrackingCapsulesStateFB(_) \ _(type) \ _(next) \ _(capsules) \ +/// Calls your macro with the name of each member of XrSystemSpatialEntityPropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemSpatialEntityPropertiesFB(_) \ _(type) \ _(next) \ _(supportsSpatialEntity) \ +/// Calls your macro with the name of each member of XrSpatialAnchorCreateInfoFB, in order. #define XR_LIST_STRUCT_XrSpatialAnchorCreateInfoFB(_) \ _(type) \ _(next) \ @@ -2210,6 +2455,7 @@ XR_ENUM_STR(XrResult); _(poseInSpace) \ _(time) \ +/// Calls your macro with the name of each member of XrSpaceComponentStatusSetInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceComponentStatusSetInfoFB(_) \ _(type) \ _(next) \ @@ -2217,15 +2463,18 @@ XR_ENUM_STR(XrResult); _(enabled) \ _(timeout) \ +/// Calls your macro with the name of each member of XrSpaceComponentStatusFB, in order. #define XR_LIST_STRUCT_XrSpaceComponentStatusFB(_) \ _(type) \ _(next) \ _(enabled) \ _(changePending) \ +/// Calls your macro with the name of each member of XrUuidEXT, in order. #define XR_LIST_STRUCT_XrUuidEXT(_) \ _(data) \ +/// Calls your macro with the name of each member of XrEventDataSpatialAnchorCreateCompleteFB, in order. #define XR_LIST_STRUCT_XrEventDataSpatialAnchorCreateCompleteFB(_) \ _(type) \ _(next) \ @@ -2234,6 +2483,7 @@ XR_ENUM_STR(XrResult); _(space) \ _(uuid) \ +/// Calls your macro with the name of each member of XrEventDataSpaceSetStatusCompleteFB, in order. #define XR_LIST_STRUCT_XrEventDataSpaceSetStatusCompleteFB(_) \ _(type) \ _(next) \ @@ -2244,21 +2494,25 @@ XR_ENUM_STR(XrResult); _(componentType) \ _(enabled) \ +/// Calls your macro with the name of each member of XrFoveationProfileCreateInfoFB, in order. #define XR_LIST_STRUCT_XrFoveationProfileCreateInfoFB(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrSwapchainCreateInfoFoveationFB, in order. #define XR_LIST_STRUCT_XrSwapchainCreateInfoFoveationFB(_) \ _(type) \ _(next) \ _(flags) \ +/// Calls your macro with the name of each member of XrSwapchainStateFoveationFB, in order. #define XR_LIST_STRUCT_XrSwapchainStateFoveationFB(_) \ _(type) \ _(next) \ _(flags) \ _(profile) \ +/// Calls your macro with the name of each member of XrFoveationLevelProfileCreateInfoFB, in order. #define XR_LIST_STRUCT_XrFoveationLevelProfileCreateInfoFB(_) \ _(type) \ _(next) \ @@ -2266,27 +2520,32 @@ XR_ENUM_STR(XrResult); _(verticalOffset) \ _(dynamic) \ +/// Calls your macro with the name of each member of XrSystemKeyboardTrackingPropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemKeyboardTrackingPropertiesFB(_) \ _(type) \ _(next) \ _(supportsKeyboardTracking) \ +/// Calls your macro with the name of each member of XrKeyboardTrackingDescriptionFB, in order. #define XR_LIST_STRUCT_XrKeyboardTrackingDescriptionFB(_) \ _(trackedKeyboardId) \ _(size) \ _(flags) \ _(name) \ +/// Calls your macro with the name of each member of XrKeyboardSpaceCreateInfoFB, in order. #define XR_LIST_STRUCT_XrKeyboardSpaceCreateInfoFB(_) \ _(type) \ _(next) \ _(trackedKeyboardId) \ +/// Calls your macro with the name of each member of XrKeyboardTrackingQueryFB, in order. #define XR_LIST_STRUCT_XrKeyboardTrackingQueryFB(_) \ _(type) \ _(next) \ _(flags) \ +/// Calls your macro with the name of each member of XrTriangleMeshCreateInfoFB, in order. #define XR_LIST_STRUCT_XrTriangleMeshCreateInfoFB(_) \ _(type) \ _(next) \ @@ -2297,21 +2556,25 @@ XR_ENUM_STR(XrResult); _(triangleCount) \ _(indexBuffer) \ +/// Calls your macro with the name of each member of XrSystemPassthroughPropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemPassthroughPropertiesFB(_) \ _(type) \ _(next) \ _(supportsPassthrough) \ +/// Calls your macro with the name of each member of XrSystemPassthroughProperties2FB, in order. #define XR_LIST_STRUCT_XrSystemPassthroughProperties2FB(_) \ _(type) \ _(next) \ _(capabilities) \ +/// Calls your macro with the name of each member of XrPassthroughCreateInfoFB, in order. #define XR_LIST_STRUCT_XrPassthroughCreateInfoFB(_) \ _(type) \ _(next) \ _(flags) \ +/// Calls your macro with the name of each member of XrPassthroughLayerCreateInfoFB, in order. #define XR_LIST_STRUCT_XrPassthroughLayerCreateInfoFB(_) \ _(type) \ _(next) \ @@ -2319,6 +2582,7 @@ XR_ENUM_STR(XrResult); _(flags) \ _(purpose) \ +/// Calls your macro with the name of each member of XrCompositionLayerPassthroughFB, in order. #define XR_LIST_STRUCT_XrCompositionLayerPassthroughFB(_) \ _(type) \ _(next) \ @@ -2326,6 +2590,7 @@ XR_ENUM_STR(XrResult); _(space) \ _(layerHandle) \ +/// Calls your macro with the name of each member of XrGeometryInstanceCreateInfoFB, in order. #define XR_LIST_STRUCT_XrGeometryInstanceCreateInfoFB(_) \ _(type) \ _(next) \ @@ -2335,6 +2600,7 @@ XR_ENUM_STR(XrResult); _(pose) \ _(scale) \ +/// Calls your macro with the name of each member of XrGeometryInstanceTransformFB, in order. #define XR_LIST_STRUCT_XrGeometryInstanceTransformFB(_) \ _(type) \ _(next) \ @@ -2343,22 +2609,26 @@ XR_ENUM_STR(XrResult); _(pose) \ _(scale) \ +/// Calls your macro with the name of each member of XrPassthroughStyleFB, in order. #define XR_LIST_STRUCT_XrPassthroughStyleFB(_) \ _(type) \ _(next) \ _(textureOpacityFactor) \ _(edgeColor) \ +/// Calls your macro with the name of each member of XrPassthroughColorMapMonoToRgbaFB, in order. #define XR_LIST_STRUCT_XrPassthroughColorMapMonoToRgbaFB(_) \ _(type) \ _(next) \ _(textureColorMap) \ +/// Calls your macro with the name of each member of XrPassthroughColorMapMonoToMonoFB, in order. #define XR_LIST_STRUCT_XrPassthroughColorMapMonoToMonoFB(_) \ _(type) \ _(next) \ _(textureColorMap) \ +/// Calls your macro with the name of each member of XrPassthroughBrightnessContrastSaturationFB, in order. #define XR_LIST_STRUCT_XrPassthroughBrightnessContrastSaturationFB(_) \ _(type) \ _(next) \ @@ -2366,16 +2636,19 @@ XR_ENUM_STR(XrResult); _(contrast) \ _(saturation) \ +/// Calls your macro with the name of each member of XrEventDataPassthroughStateChangedFB, in order. #define XR_LIST_STRUCT_XrEventDataPassthroughStateChangedFB(_) \ _(type) \ _(next) \ _(flags) \ +/// Calls your macro with the name of each member of XrRenderModelPathInfoFB, in order. #define XR_LIST_STRUCT_XrRenderModelPathInfoFB(_) \ _(type) \ _(next) \ _(path) \ +/// Calls your macro with the name of each member of XrRenderModelPropertiesFB, in order. #define XR_LIST_STRUCT_XrRenderModelPropertiesFB(_) \ _(type) \ _(next) \ @@ -2385,6 +2658,7 @@ XR_ENUM_STR(XrResult); _(modelVersion) \ _(flags) \ +/// Calls your macro with the name of each member of XrRenderModelBufferFB, in order. #define XR_LIST_STRUCT_XrRenderModelBufferFB(_) \ _(type) \ _(next) \ @@ -2392,47 +2666,56 @@ XR_ENUM_STR(XrResult); _(bufferCountOutput) \ _(buffer) \ +/// Calls your macro with the name of each member of XrRenderModelLoadInfoFB, in order. #define XR_LIST_STRUCT_XrRenderModelLoadInfoFB(_) \ _(type) \ _(next) \ _(modelKey) \ +/// Calls your macro with the name of each member of XrSystemRenderModelPropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemRenderModelPropertiesFB(_) \ _(type) \ _(next) \ _(supportsRenderModelLoading) \ +/// Calls your macro with the name of each member of XrRenderModelCapabilitiesRequestFB, in order. #define XR_LIST_STRUCT_XrRenderModelCapabilitiesRequestFB(_) \ _(type) \ _(next) \ _(flags) \ +/// Calls your macro with the name of each member of XrViewLocateFoveatedRenderingVARJO, in order. #define XR_LIST_STRUCT_XrViewLocateFoveatedRenderingVARJO(_) \ _(type) \ _(next) \ _(foveatedRenderingActive) \ +/// Calls your macro with the name of each member of XrFoveatedViewConfigurationViewVARJO, in order. #define XR_LIST_STRUCT_XrFoveatedViewConfigurationViewVARJO(_) \ _(type) \ _(next) \ _(foveatedRenderingActive) \ +/// Calls your macro with the name of each member of XrSystemFoveatedRenderingPropertiesVARJO, in order. #define XR_LIST_STRUCT_XrSystemFoveatedRenderingPropertiesVARJO(_) \ _(type) \ _(next) \ _(supportsFoveatedRendering) \ +/// Calls your macro with the name of each member of XrCompositionLayerDepthTestVARJO, in order. #define XR_LIST_STRUCT_XrCompositionLayerDepthTestVARJO(_) \ _(type) \ _(next) \ _(depthTestRangeNearZ) \ _(depthTestRangeFarZ) \ +/// Calls your macro with the name of each member of XrSystemMarkerTrackingPropertiesVARJO, in order. #define XR_LIST_STRUCT_XrSystemMarkerTrackingPropertiesVARJO(_) \ _(type) \ _(next) \ _(supportsMarkerTracking) \ +/// Calls your macro with the name of each member of XrEventDataMarkerTrackingUpdateVARJO, in order. #define XR_LIST_STRUCT_XrEventDataMarkerTrackingUpdateVARJO(_) \ _(type) \ _(next) \ @@ -2441,35 +2724,42 @@ XR_ENUM_STR(XrResult); _(isPredicted) \ _(time) \ +/// Calls your macro with the name of each member of XrMarkerSpaceCreateInfoVARJO, in order. #define XR_LIST_STRUCT_XrMarkerSpaceCreateInfoVARJO(_) \ _(type) \ _(next) \ _(markerId) \ _(poseInMarkerSpace) \ +/// Calls your macro with the name of each member of XrSpatialAnchorPersistenceNameMSFT, in order. #define XR_LIST_STRUCT_XrSpatialAnchorPersistenceNameMSFT(_) \ _(name) \ +/// Calls your macro with the name of each member of XrSpatialAnchorPersistenceInfoMSFT, in order. #define XR_LIST_STRUCT_XrSpatialAnchorPersistenceInfoMSFT(_) \ _(type) \ _(next) \ _(spatialAnchorPersistenceName) \ _(spatialAnchor) \ +/// Calls your macro with the name of each member of XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT, in order. #define XR_LIST_STRUCT_XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT(_) \ _(type) \ _(next) \ _(spatialAnchorStore) \ _(spatialAnchorPersistenceName) \ +/// Calls your macro with the name of each member of XrSpaceQueryInfoBaseHeaderFB, in order. #define XR_LIST_STRUCT_XrSpaceQueryInfoBaseHeaderFB(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrSpaceFilterInfoBaseHeaderFB, in order. #define XR_LIST_STRUCT_XrSpaceFilterInfoBaseHeaderFB(_) \ _(type) \ _(next) \ +/// Calls your macro with the name of each member of XrSpaceQueryInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceQueryInfoFB(_) \ _(type) \ _(next) \ @@ -2479,26 +2769,31 @@ XR_ENUM_STR(XrResult); _(filter) \ _(excludeFilter) \ +/// Calls your macro with the name of each member of XrSpaceStorageLocationFilterInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceStorageLocationFilterInfoFB(_) \ _(type) \ _(next) \ _(location) \ +/// Calls your macro with the name of each member of XrSpaceUuidFilterInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceUuidFilterInfoFB(_) \ _(type) \ _(next) \ _(uuidCount) \ _(uuids) \ +/// Calls your macro with the name of each member of XrSpaceComponentFilterInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceComponentFilterInfoFB(_) \ _(type) \ _(next) \ _(componentType) \ +/// Calls your macro with the name of each member of XrSpaceQueryResultFB, in order. #define XR_LIST_STRUCT_XrSpaceQueryResultFB(_) \ _(space) \ _(uuid) \ +/// Calls your macro with the name of each member of XrSpaceQueryResultsFB, in order. #define XR_LIST_STRUCT_XrSpaceQueryResultsFB(_) \ _(type) \ _(next) \ @@ -2506,17 +2801,20 @@ XR_ENUM_STR(XrResult); _(resultCountOutput) \ _(results) \ +/// Calls your macro with the name of each member of XrEventDataSpaceQueryResultsAvailableFB, in order. #define XR_LIST_STRUCT_XrEventDataSpaceQueryResultsAvailableFB(_) \ _(type) \ _(next) \ _(requestId) \ +/// Calls your macro with the name of each member of XrEventDataSpaceQueryCompleteFB, in order. #define XR_LIST_STRUCT_XrEventDataSpaceQueryCompleteFB(_) \ _(type) \ _(next) \ _(requestId) \ _(result) \ +/// Calls your macro with the name of each member of XrSpaceSaveInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceSaveInfoFB(_) \ _(type) \ _(next) \ @@ -2524,12 +2822,14 @@ XR_ENUM_STR(XrResult); _(location) \ _(persistenceMode) \ +/// Calls your macro with the name of each member of XrSpaceEraseInfoFB, in order. #define XR_LIST_STRUCT_XrSpaceEraseInfoFB(_) \ _(type) \ _(next) \ _(space) \ _(location) \ +/// Calls your macro with the name of each member of XrEventDataSpaceSaveCompleteFB, in order. #define XR_LIST_STRUCT_XrEventDataSpaceSaveCompleteFB(_) \ _(type) \ _(next) \ @@ -2539,6 +2839,7 @@ XR_ENUM_STR(XrResult); _(uuid) \ _(location) \ +/// Calls your macro with the name of each member of XrEventDataSpaceEraseCompleteFB, in order. #define XR_LIST_STRUCT_XrEventDataSpaceEraseCompleteFB(_) \ _(type) \ _(next) \ @@ -2548,6 +2849,7 @@ XR_ENUM_STR(XrResult); _(uuid) \ _(location) \ +/// Calls your macro with the name of each member of XrSwapchainImageFoveationVulkanFB, in order. #define XR_LIST_STRUCT_XrSwapchainImageFoveationVulkanFB(_) \ _(type) \ _(next) \ @@ -2555,12 +2857,14 @@ XR_ENUM_STR(XrResult); _(width) \ _(height) \ +/// Calls your macro with the name of each member of XrSwapchainStateAndroidSurfaceDimensionsFB, in order. #define XR_LIST_STRUCT_XrSwapchainStateAndroidSurfaceDimensionsFB(_) \ _(type) \ _(next) \ _(width) \ _(height) \ +/// Calls your macro with the name of each member of XrSwapchainStateSamplerOpenGLESFB, in order. #define XR_LIST_STRUCT_XrSwapchainStateSamplerOpenGLESFB(_) \ _(type) \ _(next) \ @@ -2575,6 +2879,7 @@ XR_ENUM_STR(XrResult); _(maxAnisotropy) \ _(borderColor) \ +/// Calls your macro with the name of each member of XrSwapchainStateSamplerVulkanFB, in order. #define XR_LIST_STRUCT_XrSwapchainStateSamplerVulkanFB(_) \ _(type) \ _(next) \ @@ -2590,6 +2895,7 @@ XR_ENUM_STR(XrResult); _(maxAnisotropy) \ _(borderColor) \ +/// Calls your macro with the name of each member of XrCompositionLayerSpaceWarpInfoFB, in order. #define XR_LIST_STRUCT_XrCompositionLayerSpaceWarpInfoFB(_) \ _(type) \ _(next) \ @@ -2602,26 +2908,31 @@ XR_ENUM_STR(XrResult); _(nearZ) \ _(farZ) \ +/// Calls your macro with the name of each member of XrSystemSpaceWarpPropertiesFB, in order. #define XR_LIST_STRUCT_XrSystemSpaceWarpPropertiesFB(_) \ _(type) \ _(next) \ _(recommendedMotionVectorImageRectWidth) \ _(recommendedMotionVectorImageRectHeight) \ +/// Calls your macro with the name of each member of XrExtent3DfFB, in order. #define XR_LIST_STRUCT_XrExtent3DfFB(_) \ _(width) \ _(height) \ _(depth) \ +/// Calls your macro with the name of each member of XrOffset3DfFB, in order. #define XR_LIST_STRUCT_XrOffset3DfFB(_) \ _(x) \ _(y) \ _(z) \ +/// Calls your macro with the name of each member of XrRect3DfFB, in order. #define XR_LIST_STRUCT_XrRect3DfFB(_) \ _(offset) \ _(extent) \ +/// Calls your macro with the name of each member of XrSemanticLabelsFB, in order. #define XR_LIST_STRUCT_XrSemanticLabelsFB(_) \ _(type) \ _(next) \ @@ -2629,6 +2940,7 @@ XR_ENUM_STR(XrResult); _(bufferCountOutput) \ _(buffer) \ +/// Calls your macro with the name of each member of XrRoomLayoutFB, in order. #define XR_LIST_STRUCT_XrRoomLayoutFB(_) \ _(type) \ _(next) \ @@ -2638,6 +2950,7 @@ XR_ENUM_STR(XrResult); _(wallUuidCountOutput) \ _(wallUuids) \ +/// Calls your macro with the name of each member of XrBoundary2DFB, in order. #define XR_LIST_STRUCT_XrBoundary2DFB(_) \ _(type) \ _(next) \ @@ -2645,11 +2958,13 @@ XR_ENUM_STR(XrResult); _(vertexCountOutput) \ _(vertices) \ +/// Calls your macro with the name of each member of XrDigitalLensControlALMALENCE, in order. #define XR_LIST_STRUCT_XrDigitalLensControlALMALENCE(_) \ _(type) \ _(next) \ _(flags) \ +/// Calls your macro with the name of each member of XrSpaceContainerFB, in order. #define XR_LIST_STRUCT_XrSpaceContainerFB(_) \ _(type) \ _(next) \ @@ -2657,28 +2972,33 @@ XR_ENUM_STR(XrResult); _(uuidCountOutput) \ _(uuids) \ +/// Calls your macro with the name of each member of XrPassthroughKeyboardHandsIntensityFB, in order. #define XR_LIST_STRUCT_XrPassthroughKeyboardHandsIntensityFB(_) \ _(type) \ _(next) \ _(leftHandIntensity) \ _(rightHandIntensity) \ +/// Calls your macro with the name of each member of XrCompositionLayerSettingsFB, in order. #define XR_LIST_STRUCT_XrCompositionLayerSettingsFB(_) \ _(type) \ _(next) \ _(layerFlags) \ +/// Calls your macro with the name of each member of XrVulkanSwapchainCreateInfoMETA, in order. #define XR_LIST_STRUCT_XrVulkanSwapchainCreateInfoMETA(_) \ _(type) \ _(next) \ _(additionalCreateFlags) \ _(additionalUsageFlags) \ +/// Calls your macro with the name of each member of XrPerformanceMetricsStateMETA, in order. #define XR_LIST_STRUCT_XrPerformanceMetricsStateMETA(_) \ _(type) \ _(next) \ _(enabled) \ +/// Calls your macro with the name of each member of XrPerformanceMetricsCounterMETA, in order. #define XR_LIST_STRUCT_XrPerformanceMetricsCounterMETA(_) \ _(type) \ _(next) \ @@ -2687,8 +3007,107 @@ XR_ENUM_STR(XrResult); _(uintValue) \ _(floatValue) \ +/// Calls your macro with the name of each member of XrSystemHeadsetIdPropertiesMETA, in order. +#define XR_LIST_STRUCT_XrSystemHeadsetIdPropertiesMETA(_) \ + _(type) \ + _(next) \ + _(id) \ + +/// Calls your macro with the name of each member of XrPassthroughCreateInfoHTC, in order. +#define XR_LIST_STRUCT_XrPassthroughCreateInfoHTC(_) \ + _(type) \ + _(next) \ + _(form) \ + +/// Calls your macro with the name of each member of XrPassthroughColorHTC, in order. +#define XR_LIST_STRUCT_XrPassthroughColorHTC(_) \ + _(type) \ + _(next) \ + _(alpha) \ + +/// Calls your macro with the name of each member of XrPassthroughMeshTransformInfoHTC, in order. +#define XR_LIST_STRUCT_XrPassthroughMeshTransformInfoHTC(_) \ + _(type) \ + _(next) \ + _(vertexCount) \ + _(vertices) \ + _(indexCount) \ + _(indices) \ + _(baseSpace) \ + _(time) \ + _(pose) \ + _(scale) \ + +/// Calls your macro with the name of each member of XrCompositionLayerPassthroughHTC, in order. +#define XR_LIST_STRUCT_XrCompositionLayerPassthroughHTC(_) \ + _(type) \ + _(next) \ + _(layerFlags) \ + _(space) \ + _(passthrough) \ + _(color) \ + +/// Calls your macro with the name of each member of XrFoveationApplyInfoHTC, in order. +#define XR_LIST_STRUCT_XrFoveationApplyInfoHTC(_) \ + _(type) \ + _(next) \ + _(mode) \ + _(subImageCount) \ + _(subImages) \ + +/// Calls your macro with the name of each member of XrFoveationConfigurationHTC, in order. +#define XR_LIST_STRUCT_XrFoveationConfigurationHTC(_) \ + _(level) \ + _(clearFovDegree) \ + _(focalCenterOffset) \ +/// Calls your macro with the name of each member of XrFoveationDynamicModeInfoHTC, in order. +#define XR_LIST_STRUCT_XrFoveationDynamicModeInfoHTC(_) \ + _(type) \ + _(next) \ + _(dynamicFlags) \ +/// Calls your macro with the name of each member of XrFoveationCustomModeInfoHTC, in order. +#define XR_LIST_STRUCT_XrFoveationCustomModeInfoHTC(_) \ + _(type) \ + _(next) \ + _(configCount) \ + _(configs) \ + +/// Calls your macro with the name of each member of XrActiveActionSetPriorityEXT, in order. +#define XR_LIST_STRUCT_XrActiveActionSetPriorityEXT(_) \ + _(actionSet) \ + _(priorityOverride) \ + +/// Calls your macro with the name of each member of XrActiveActionSetPrioritiesEXT, in order. +#define XR_LIST_STRUCT_XrActiveActionSetPrioritiesEXT(_) \ + _(type) \ + _(next) \ + _(actionSetPriorityCount) \ + _(actionSetPriorities) \ + + + +/// Calls your macro with the structure type name and the XrStructureType constant for +/// each known/available structure type, excluding those unavailable due to preprocessor definitions. +#define XR_LIST_STRUCTURE_TYPES(_) \ + XR_LIST_STRUCTURE_TYPES_CORE(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_) \ + XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_) \ + + +/// Implementation detail of XR_LIST_STRUCTURE_TYPES() - structure types available without any preprocessor definitions #define XR_LIST_STRUCTURE_TYPES_CORE(_) \ _(XrApiLayerProperties, XR_TYPE_API_LAYER_PROPERTIES) \ _(XrExtensionProperties, XR_TYPE_EXTENSION_PROPERTIES) \ @@ -2889,99 +3308,117 @@ XR_ENUM_STR(XrResult); _(XrCompositionLayerSettingsFB, XR_TYPE_COMPOSITION_LAYER_SETTINGS_FB) \ _(XrPerformanceMetricsStateMETA, XR_TYPE_PERFORMANCE_METRICS_STATE_META) \ _(XrPerformanceMetricsCounterMETA, XR_TYPE_PERFORMANCE_METRICS_COUNTER_META) \ - - + _(XrSystemHeadsetIdPropertiesMETA, XR_TYPE_SYSTEM_HEADSET_ID_PROPERTIES_META) \ + _(XrPassthroughCreateInfoHTC, XR_TYPE_PASSTHROUGH_CREATE_INFO_HTC) \ + _(XrPassthroughColorHTC, XR_TYPE_PASSTHROUGH_COLOR_HTC) \ + _(XrPassthroughMeshTransformInfoHTC, XR_TYPE_PASSTHROUGH_MESH_TRANSFORM_INFO_HTC) \ + _(XrCompositionLayerPassthroughHTC, XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_HTC) \ + _(XrFoveationApplyInfoHTC, XR_TYPE_FOVEATION_APPLY_INFO_HTC) \ + _(XrFoveationDynamicModeInfoHTC, XR_TYPE_FOVEATION_DYNAMIC_MODE_INFO_HTC) \ + _(XrFoveationCustomModeInfoHTC, XR_TYPE_FOVEATION_CUSTOM_MODE_INFO_HTC) \ + _(XrActiveActionSetPrioritiesEXT, XR_TYPE_ACTIVE_ACTION_SET_PRIORITIES_EXT) \ #if defined(XR_USE_GRAPHICS_API_D3D11) +/// Implementation detail of XR_LIST_STRUCTURE_TYPES() +/// Structure types available only when XR_USE_GRAPHICS_API_D3D11 is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_) \ _(XrGraphicsBindingD3D11KHR, XR_TYPE_GRAPHICS_BINDING_D3D11_KHR) \ _(XrSwapchainImageD3D11KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR) \ _(XrGraphicsRequirementsD3D11KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR) \ - #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_) #endif #if defined(XR_USE_GRAPHICS_API_D3D12) +/// Implementation detail of XR_LIST_STRUCTURE_TYPES() +/// Structure types available only when XR_USE_GRAPHICS_API_D3D12 is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_) \ _(XrGraphicsBindingD3D12KHR, XR_TYPE_GRAPHICS_BINDING_D3D12_KHR) \ _(XrSwapchainImageD3D12KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR) \ _(XrGraphicsRequirementsD3D12KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR) \ - #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_) #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) +/// Implementation detail of XR_LIST_STRUCTURE_TYPES() +/// Structure types available only when XR_USE_GRAPHICS_API_OPENGL is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_) \ _(XrSwapchainImageOpenGLKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR) \ _(XrGraphicsRequirementsOpenGLKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR) \ - #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_) #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_WAYLAND) +/// Implementation detail of XR_LIST_STRUCTURE_TYPES() +/// Structure types available only when XR_USE_GRAPHICS_API_OPENGL and XR_USE_PLATFORM_WAYLAND are defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_) \ _(XrGraphicsBindingOpenGLWaylandKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR) \ - #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_) #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_WIN32) +/// Implementation detail of XR_LIST_STRUCTURE_TYPES() +/// Structure types available only when XR_USE_GRAPHICS_API_OPENGL and XR_USE_PLATFORM_WIN32 are defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_) \ _(XrGraphicsBindingOpenGLWin32KHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR) \ - #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_) #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_XCB) +/// Implementation detail of XR_LIST_STRUCTURE_TYPES() +/// Structure types available only when XR_USE_GRAPHICS_API_OPENGL and XR_USE_PLATFORM_XCB are defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_) \ _(XrGraphicsBindingOpenGLXcbKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR) \ - #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_) #endif #if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_XLIB) +/// Implementation detail of XR_LIST_STRUCTURE_TYPES() +/// Structure types available only when XR_USE_GRAPHICS_API_OPENGL and XR_USE_PLATFORM_XLIB are defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_) \ _(XrGraphicsBindingOpenGLXlibKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR) \ - #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_) #endif #if defined(XR_USE_GRAPHICS_API_OPENGL_ES) +/// Implementation detail of XR_LIST_STRUCTURE_TYPES() +/// Structure types available only when XR_USE_GRAPHICS_API_OPENGL_ES is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_) \ _(XrSwapchainImageOpenGLESKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR) \ _(XrGraphicsRequirementsOpenGLESKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR) \ _(XrSwapchainStateSamplerOpenGLESFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB) \ - #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_) #endif #if defined(XR_USE_GRAPHICS_API_OPENGL_ES) && defined(XR_USE_PLATFORM_ANDROID) +/// Implementation detail of XR_LIST_STRUCTURE_TYPES() +/// Structure types available only when XR_USE_GRAPHICS_API_OPENGL_ES and XR_USE_PLATFORM_ANDROID are defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_) \ _(XrGraphicsBindingOpenGLESAndroidKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR) \ - #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_) #endif #if defined(XR_USE_GRAPHICS_API_VULKAN) +/// Implementation detail of XR_LIST_STRUCTURE_TYPES() +/// Structure types available only when XR_USE_GRAPHICS_API_VULKAN is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_) \ _(XrVulkanSwapchainFormatListCreateInfoKHR, XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR) \ _(XrGraphicsBindingVulkanKHR, XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR) \ @@ -2994,58 +3431,47 @@ XR_ENUM_STR(XrResult); _(XrSwapchainStateSamplerVulkanFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB) \ _(XrVulkanSwapchainCreateInfoMETA, XR_TYPE_VULKAN_SWAPCHAIN_CREATE_INFO_META) \ - #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_) #endif #if defined(XR_USE_PLATFORM_ANDROID) +/// Implementation detail of XR_LIST_STRUCTURE_TYPES() +/// Structure types available only when XR_USE_PLATFORM_ANDROID is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_) \ _(XrInstanceCreateInfoAndroidKHR, XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR) \ _(XrLoaderInitInfoAndroidKHR, XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR) \ _(XrAndroidSurfaceSwapchainCreateInfoFB, XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB) \ _(XrSwapchainStateAndroidSurfaceDimensionsFB, XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB) \ - #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_) #endif #if defined(XR_USE_PLATFORM_EGL) +/// Implementation detail of XR_LIST_STRUCTURE_TYPES() +/// Structure types available only when XR_USE_PLATFORM_EGL is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_) \ _(XrGraphicsBindingEGLMNDX, XR_TYPE_GRAPHICS_BINDING_EGL_MNDX) \ - #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_) #endif #if defined(XR_USE_PLATFORM_WIN32) +/// Implementation detail of XR_LIST_STRUCTURE_TYPES() +/// Structure types available only when XR_USE_PLATFORM_WIN32 is defined #define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_) \ _(XrHolographicWindowAttachmentMSFT, XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT) \ - #else #define XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_) #endif -#define XR_LIST_STRUCTURE_TYPES(_) \ - XR_LIST_STRUCTURE_TYPES_CORE(_) \ - XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_) \ - XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_) \ - XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_) \ - XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_) \ - XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_) \ - XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_) \ - XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_) \ - XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_) \ - XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_) \ - XR_LIST_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_) \ - XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_) \ - XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_) \ - XR_LIST_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_) \ +/// Calls your macro with the name and extension number of all known +/// extensions in this version of the spec. #define XR_LIST_EXTENSIONS(_) \ _(XR_KHR_android_thread_settings, 4) \ _(XR_KHR_android_surface_swapchain, 5) \ @@ -3151,7 +3577,11 @@ XR_ENUM_STR(XrResult); _(XR_FB_composition_layer_settings, 205) \ _(XR_META_vulkan_swapchain_create_info, 228) \ _(XR_META_performance_metrics, 233) \ + _(XR_META_headset_id, 246) \ _(XR_EXT_uuid, 300) \ + _(XR_HTC_passthrough, 318) \ + _(XR_HTC_foveation, 319) \ + _(XR_EXT_active_action_set_priority, 374) \ #endif diff --git a/thirdparty/openxr/include/openxr/openxr_reflection_parent_structs.h b/thirdparty/openxr/include/openxr/openxr_reflection_parent_structs.h new file mode 100644 index 0000000000..19b0e1c3f6 --- /dev/null +++ b/thirdparty/openxr/include/openxr/openxr_reflection_parent_structs.h @@ -0,0 +1,261 @@ +#ifndef OPENXR_REFLECTION_PARENT_STRUCTS_H_ +#define OPENXR_REFLECTION_PARENT_STRUCTS_H_ 1 + +/* +** Copyright (c) 2017-2022, The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 OR MIT +*/ + +/* +** This header is generated from the Khronos OpenXR XML API Registry. +** +*/ + +#include "openxr.h" + +/* +This file contains expansion macros (X Macros) for OpenXR structures that have a parent type. +*/ + + +/// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrCompositionLayerBaseHeader +#define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrCompositionLayerBaseHeader(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrCompositionLayerBaseHeader_CORE(_avail, _unavail) \ + + +// Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrCompositionLayerBaseHeader() +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrCompositionLayerBaseHeader_CORE(_avail, _unavail) \ + _avail(XrCompositionLayerProjection, XR_TYPE_COMPOSITION_LAYER_PROJECTION) \ + _avail(XrCompositionLayerQuad, XR_TYPE_COMPOSITION_LAYER_QUAD) \ + _avail(XrCompositionLayerCubeKHR, XR_TYPE_COMPOSITION_LAYER_CUBE_KHR) \ + _avail(XrCompositionLayerCylinderKHR, XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR) \ + _avail(XrCompositionLayerEquirectKHR, XR_TYPE_COMPOSITION_LAYER_EQUIRECT_KHR) \ + _avail(XrCompositionLayerEquirect2KHR, XR_TYPE_COMPOSITION_LAYER_EQUIRECT2_KHR) \ + _avail(XrCompositionLayerPassthroughHTC, XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_HTC) \ + + + + + +/// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrEventDataBaseHeader +#define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrEventDataBaseHeader(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrEventDataBaseHeader_CORE(_avail, _unavail) \ + + +// Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrEventDataBaseHeader() +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrEventDataBaseHeader_CORE(_avail, _unavail) \ + _avail(XrEventDataEventsLost, XR_TYPE_EVENT_DATA_EVENTS_LOST) \ + _avail(XrEventDataInstanceLossPending, XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING) \ + _avail(XrEventDataSessionStateChanged, XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED) \ + _avail(XrEventDataReferenceSpaceChangePending, XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING) \ + _avail(XrEventDataInteractionProfileChanged, XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED) \ + _avail(XrEventDataVisibilityMaskChangedKHR, XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR) \ + _avail(XrEventDataPerfSettingsEXT, XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT) \ + _avail(XrEventDataMainSessionVisibilityChangedEXTX, XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX) \ + _avail(XrEventDataDisplayRefreshRateChangedFB, XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB) \ + _avail(XrEventDataViveTrackerConnectedHTCX, XR_TYPE_EVENT_DATA_VIVE_TRACKER_CONNECTED_HTCX) \ + _avail(XrEventDataSpatialAnchorCreateCompleteFB, XR_TYPE_EVENT_DATA_SPATIAL_ANCHOR_CREATE_COMPLETE_FB) \ + _avail(XrEventDataSpaceSetStatusCompleteFB, XR_TYPE_EVENT_DATA_SPACE_SET_STATUS_COMPLETE_FB) \ + _avail(XrEventDataMarkerTrackingUpdateVARJO, XR_TYPE_EVENT_DATA_MARKER_TRACKING_UPDATE_VARJO) \ + _avail(XrEventDataSpaceQueryResultsAvailableFB, XR_TYPE_EVENT_DATA_SPACE_QUERY_RESULTS_AVAILABLE_FB) \ + _avail(XrEventDataSpaceQueryCompleteFB, XR_TYPE_EVENT_DATA_SPACE_QUERY_COMPLETE_FB) \ + _avail(XrEventDataSpaceSaveCompleteFB, XR_TYPE_EVENT_DATA_SPACE_SAVE_COMPLETE_FB) \ + _avail(XrEventDataSpaceEraseCompleteFB, XR_TYPE_EVENT_DATA_SPACE_ERASE_COMPLETE_FB) \ + + + + + +/// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrHapticBaseHeader +#define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrHapticBaseHeader(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrHapticBaseHeader_CORE(_avail, _unavail) \ + + +// Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrHapticBaseHeader() +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrHapticBaseHeader_CORE(_avail, _unavail) \ + _avail(XrHapticVibration, XR_TYPE_HAPTIC_VIBRATION) \ + + + + + +/// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrSwapchainImageBaseHeader +#define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_CORE(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_D3D11(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_D3D12(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_OPENGL(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ + + +// Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader() +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_CORE(_avail, _unavail) \ + + +#if defined(XR_USE_GRAPHICS_API_D3D11) +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_D3D11(_avail, _unavail) \ + _avail(XrSwapchainImageD3D11KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR) \ + +#else +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_D3D11(_avail, _unavail) \ + _unavail(XrSwapchainImageD3D11KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR) \ + +#endif + +#if defined(XR_USE_GRAPHICS_API_D3D12) +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_D3D12(_avail, _unavail) \ + _avail(XrSwapchainImageD3D12KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR) \ + +#else +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_D3D12(_avail, _unavail) \ + _unavail(XrSwapchainImageD3D12KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR) \ + +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL) +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_OPENGL(_avail, _unavail) \ + _avail(XrSwapchainImageOpenGLKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR) \ + +#else +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_OPENGL(_avail, _unavail) \ + _unavail(XrSwapchainImageOpenGLKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR) \ + +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL_ES) +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ + _avail(XrSwapchainImageOpenGLESKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR) \ + +#else +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ + _unavail(XrSwapchainImageOpenGLESKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR) \ + +#endif + +#if defined(XR_USE_GRAPHICS_API_VULKAN) +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ + _avail(XrSwapchainImageVulkanKHR, XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR) \ + +#else +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainImageBaseHeader_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ + _unavail(XrSwapchainImageVulkanKHR, XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR) \ + +#endif + + + + +/// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrLoaderInitInfoBaseHeaderKHR +#define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrLoaderInitInfoBaseHeaderKHR(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrLoaderInitInfoBaseHeaderKHR_CORE(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrLoaderInitInfoBaseHeaderKHR_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ + + +// Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrLoaderInitInfoBaseHeaderKHR() +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrLoaderInitInfoBaseHeaderKHR_CORE(_avail, _unavail) \ + + +#if defined(XR_USE_PLATFORM_ANDROID) +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrLoaderInitInfoBaseHeaderKHR_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ + _avail(XrLoaderInitInfoAndroidKHR, XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR) \ + +#else +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrLoaderInitInfoBaseHeaderKHR_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ + _unavail(XrLoaderInitInfoAndroidKHR, XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR) \ + +#endif + + + + +/// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrBindingModificationBaseHeaderKHR +#define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrBindingModificationBaseHeaderKHR(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrBindingModificationBaseHeaderKHR_CORE(_avail, _unavail) \ + + +// Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrBindingModificationBaseHeaderKHR() +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrBindingModificationBaseHeaderKHR_CORE(_avail, _unavail) \ + _avail(XrInteractionProfileDpadBindingEXT, XR_TYPE_INTERACTION_PROFILE_DPAD_BINDING_EXT) \ + _avail(XrInteractionProfileAnalogThresholdVALVE, XR_TYPE_INTERACTION_PROFILE_ANALOG_THRESHOLD_VALVE) \ + + + + + +/// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrSwapchainStateBaseHeaderFB +#define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_CORE(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ + + +// Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB() +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_CORE(_avail, _unavail) \ + _avail(XrSwapchainStateFoveationFB, XR_TYPE_SWAPCHAIN_STATE_FOVEATION_FB) \ + + +#if defined(XR_USE_GRAPHICS_API_OPENGL_ES) +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ + _avail(XrSwapchainStateSamplerOpenGLESFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB) \ + +#else +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ + _unavail(XrSwapchainStateSamplerOpenGLESFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB) \ + +#endif + +#if defined(XR_USE_GRAPHICS_API_VULKAN) +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ + _avail(XrSwapchainStateSamplerVulkanFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB) \ + +#else +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ + _unavail(XrSwapchainStateSamplerVulkanFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB) \ + +#endif + +#if defined(XR_USE_PLATFORM_ANDROID) +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ + _avail(XrSwapchainStateAndroidSurfaceDimensionsFB, XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB) \ + +#else +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSwapchainStateBaseHeaderFB_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ + _unavail(XrSwapchainStateAndroidSurfaceDimensionsFB, XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB) \ + +#endif + + + + +/// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrSpaceQueryInfoBaseHeaderFB +#define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceQueryInfoBaseHeaderFB(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceQueryInfoBaseHeaderFB_CORE(_avail, _unavail) \ + + +// Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceQueryInfoBaseHeaderFB() +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceQueryInfoBaseHeaderFB_CORE(_avail, _unavail) \ + _avail(XrSpaceQueryInfoFB, XR_TYPE_SPACE_QUERY_INFO_FB) \ + + + + + +/// Like XR_LIST_ALL_STRUCTURE_TYPES, but only includes types whose parent struct type is XrSpaceFilterInfoBaseHeaderFB +#define XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceFilterInfoBaseHeaderFB(_avail, _unavail) \ + _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceFilterInfoBaseHeaderFB_CORE(_avail, _unavail) \ + + +// Implementation detail of XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceFilterInfoBaseHeaderFB() +#define _impl_XR_LIST_ALL_CHILD_STRUCTURE_TYPES_XrSpaceFilterInfoBaseHeaderFB_CORE(_avail, _unavail) \ + _avail(XrSpaceUuidFilterInfoFB, XR_TYPE_SPACE_UUID_FILTER_INFO_FB) \ + _avail(XrSpaceComponentFilterInfoFB, XR_TYPE_SPACE_COMPONENT_FILTER_INFO_FB) \ + + + + + +#endif + diff --git a/thirdparty/openxr/include/openxr/openxr_reflection_structs.h b/thirdparty/openxr/include/openxr/openxr_reflection_structs.h new file mode 100644 index 0000000000..300bbbad6d --- /dev/null +++ b/thirdparty/openxr/include/openxr/openxr_reflection_structs.h @@ -0,0 +1,427 @@ +#ifndef OPENXR_REFLECTION_STRUCTS_H_ +#define OPENXR_REFLECTION_STRUCTS_H_ 1 + +/* +** Copyright (c) 2017-2022, The Khronos Group Inc. +** +** SPDX-License-Identifier: Apache-2.0 OR MIT +*/ + +/* +** This header is generated from the Khronos OpenXR XML API Registry. +** +*/ + +#include "openxr.h" + +/* +This file contains expansion macros (X Macros) for OpenXR structures. +*/ + + + +/// Calls one of your macros with the structure type name and the XrStructureType constant for +/// each known structure type. The first macro (_avail) is called for those that are available, +/// while the second macro (_unavail) is called for those unavailable due to preprocessor definitions. +#define XR_LIST_ALL_STRUCTURE_TYPES(_avail, _unavail) \ + _impl_XR_LIST_ALL_STRUCTURE_TYPES_CORE(_avail, _unavail) \ + _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_avail, _unavail) \ + _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_avail, _unavail) \ + _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_avail, _unavail) \ + _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_avail, _unavail) \ + _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_avail, _unavail) \ + _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_avail, _unavail) \ + _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_avail, _unavail) \ + _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ + _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ + _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ + _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ + _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_avail, _unavail) \ + _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_avail, _unavail) \ + + +// Implementation detail of XR_LIST_ALL_STRUCTURE_TYPES() +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_CORE(_avail, _unavail) \ + _avail(XrApiLayerProperties, XR_TYPE_API_LAYER_PROPERTIES) \ + _avail(XrExtensionProperties, XR_TYPE_EXTENSION_PROPERTIES) \ + _avail(XrInstanceCreateInfo, XR_TYPE_INSTANCE_CREATE_INFO) \ + _avail(XrInstanceProperties, XR_TYPE_INSTANCE_PROPERTIES) \ + _avail(XrEventDataBuffer, XR_TYPE_EVENT_DATA_BUFFER) \ + _avail(XrSystemGetInfo, XR_TYPE_SYSTEM_GET_INFO) \ + _avail(XrSystemProperties, XR_TYPE_SYSTEM_PROPERTIES) \ + _avail(XrSessionCreateInfo, XR_TYPE_SESSION_CREATE_INFO) \ + _avail(XrSpaceVelocity, XR_TYPE_SPACE_VELOCITY) \ + _avail(XrReferenceSpaceCreateInfo, XR_TYPE_REFERENCE_SPACE_CREATE_INFO) \ + _avail(XrActionSpaceCreateInfo, XR_TYPE_ACTION_SPACE_CREATE_INFO) \ + _avail(XrSpaceLocation, XR_TYPE_SPACE_LOCATION) \ + _avail(XrViewConfigurationProperties, XR_TYPE_VIEW_CONFIGURATION_PROPERTIES) \ + _avail(XrViewConfigurationView, XR_TYPE_VIEW_CONFIGURATION_VIEW) \ + _avail(XrSwapchainCreateInfo, XR_TYPE_SWAPCHAIN_CREATE_INFO) \ + _avail(XrSwapchainImageAcquireInfo, XR_TYPE_SWAPCHAIN_IMAGE_ACQUIRE_INFO) \ + _avail(XrSwapchainImageWaitInfo, XR_TYPE_SWAPCHAIN_IMAGE_WAIT_INFO) \ + _avail(XrSwapchainImageReleaseInfo, XR_TYPE_SWAPCHAIN_IMAGE_RELEASE_INFO) \ + _avail(XrSessionBeginInfo, XR_TYPE_SESSION_BEGIN_INFO) \ + _avail(XrFrameWaitInfo, XR_TYPE_FRAME_WAIT_INFO) \ + _avail(XrFrameState, XR_TYPE_FRAME_STATE) \ + _avail(XrFrameBeginInfo, XR_TYPE_FRAME_BEGIN_INFO) \ + _avail(XrFrameEndInfo, XR_TYPE_FRAME_END_INFO) \ + _avail(XrViewLocateInfo, XR_TYPE_VIEW_LOCATE_INFO) \ + _avail(XrViewState, XR_TYPE_VIEW_STATE) \ + _avail(XrView, XR_TYPE_VIEW) \ + _avail(XrActionSetCreateInfo, XR_TYPE_ACTION_SET_CREATE_INFO) \ + _avail(XrActionCreateInfo, XR_TYPE_ACTION_CREATE_INFO) \ + _avail(XrInteractionProfileSuggestedBinding, XR_TYPE_INTERACTION_PROFILE_SUGGESTED_BINDING) \ + _avail(XrSessionActionSetsAttachInfo, XR_TYPE_SESSION_ACTION_SETS_ATTACH_INFO) \ + _avail(XrInteractionProfileState, XR_TYPE_INTERACTION_PROFILE_STATE) \ + _avail(XrActionStateGetInfo, XR_TYPE_ACTION_STATE_GET_INFO) \ + _avail(XrActionStateBoolean, XR_TYPE_ACTION_STATE_BOOLEAN) \ + _avail(XrActionStateFloat, XR_TYPE_ACTION_STATE_FLOAT) \ + _avail(XrActionStateVector2f, XR_TYPE_ACTION_STATE_VECTOR2F) \ + _avail(XrActionStatePose, XR_TYPE_ACTION_STATE_POSE) \ + _avail(XrActionsSyncInfo, XR_TYPE_ACTIONS_SYNC_INFO) \ + _avail(XrBoundSourcesForActionEnumerateInfo, XR_TYPE_BOUND_SOURCES_FOR_ACTION_ENUMERATE_INFO) \ + _avail(XrInputSourceLocalizedNameGetInfo, XR_TYPE_INPUT_SOURCE_LOCALIZED_NAME_GET_INFO) \ + _avail(XrHapticActionInfo, XR_TYPE_HAPTIC_ACTION_INFO) \ + _avail(XrCompositionLayerProjectionView, XR_TYPE_COMPOSITION_LAYER_PROJECTION_VIEW) \ + _avail(XrCompositionLayerProjection, XR_TYPE_COMPOSITION_LAYER_PROJECTION) \ + _avail(XrCompositionLayerQuad, XR_TYPE_COMPOSITION_LAYER_QUAD) \ + _avail(XrEventDataEventsLost, XR_TYPE_EVENT_DATA_EVENTS_LOST) \ + _avail(XrEventDataInstanceLossPending, XR_TYPE_EVENT_DATA_INSTANCE_LOSS_PENDING) \ + _avail(XrEventDataSessionStateChanged, XR_TYPE_EVENT_DATA_SESSION_STATE_CHANGED) \ + _avail(XrEventDataReferenceSpaceChangePending, XR_TYPE_EVENT_DATA_REFERENCE_SPACE_CHANGE_PENDING) \ + _avail(XrEventDataInteractionProfileChanged, XR_TYPE_EVENT_DATA_INTERACTION_PROFILE_CHANGED) \ + _avail(XrHapticVibration, XR_TYPE_HAPTIC_VIBRATION) \ + _avail(XrCompositionLayerCubeKHR, XR_TYPE_COMPOSITION_LAYER_CUBE_KHR) \ + _avail(XrCompositionLayerDepthInfoKHR, XR_TYPE_COMPOSITION_LAYER_DEPTH_INFO_KHR) \ + _avail(XrCompositionLayerCylinderKHR, XR_TYPE_COMPOSITION_LAYER_CYLINDER_KHR) \ + _avail(XrCompositionLayerEquirectKHR, XR_TYPE_COMPOSITION_LAYER_EQUIRECT_KHR) \ + _avail(XrVisibilityMaskKHR, XR_TYPE_VISIBILITY_MASK_KHR) \ + _avail(XrEventDataVisibilityMaskChangedKHR, XR_TYPE_EVENT_DATA_VISIBILITY_MASK_CHANGED_KHR) \ + _avail(XrCompositionLayerColorScaleBiasKHR, XR_TYPE_COMPOSITION_LAYER_COLOR_SCALE_BIAS_KHR) \ + _avail(XrCompositionLayerEquirect2KHR, XR_TYPE_COMPOSITION_LAYER_EQUIRECT2_KHR) \ + _avail(XrBindingModificationsKHR, XR_TYPE_BINDING_MODIFICATIONS_KHR) \ + _avail(XrEventDataPerfSettingsEXT, XR_TYPE_EVENT_DATA_PERF_SETTINGS_EXT) \ + _avail(XrDebugUtilsObjectNameInfoEXT, XR_TYPE_DEBUG_UTILS_OBJECT_NAME_INFO_EXT) \ + _avail(XrDebugUtilsLabelEXT, XR_TYPE_DEBUG_UTILS_LABEL_EXT) \ + _avail(XrDebugUtilsMessengerCallbackDataEXT, XR_TYPE_DEBUG_UTILS_MESSENGER_CALLBACK_DATA_EXT) \ + _avail(XrDebugUtilsMessengerCreateInfoEXT, XR_TYPE_DEBUG_UTILS_MESSENGER_CREATE_INFO_EXT) \ + _avail(XrSystemEyeGazeInteractionPropertiesEXT, XR_TYPE_SYSTEM_EYE_GAZE_INTERACTION_PROPERTIES_EXT) \ + _avail(XrEyeGazeSampleTimeEXT, XR_TYPE_EYE_GAZE_SAMPLE_TIME_EXT) \ + _avail(XrSessionCreateInfoOverlayEXTX, XR_TYPE_SESSION_CREATE_INFO_OVERLAY_EXTX) \ + _avail(XrEventDataMainSessionVisibilityChangedEXTX, XR_TYPE_EVENT_DATA_MAIN_SESSION_VISIBILITY_CHANGED_EXTX) \ + _avail(XrSpatialAnchorCreateInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_MSFT) \ + _avail(XrSpatialAnchorSpaceCreateInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_SPACE_CREATE_INFO_MSFT) \ + _avail(XrCompositionLayerImageLayoutFB, XR_TYPE_COMPOSITION_LAYER_IMAGE_LAYOUT_FB) \ + _avail(XrCompositionLayerAlphaBlendFB, XR_TYPE_COMPOSITION_LAYER_ALPHA_BLEND_FB) \ + _avail(XrViewConfigurationDepthRangeEXT, XR_TYPE_VIEW_CONFIGURATION_DEPTH_RANGE_EXT) \ + _avail(XrSpatialGraphNodeSpaceCreateInfoMSFT, XR_TYPE_SPATIAL_GRAPH_NODE_SPACE_CREATE_INFO_MSFT) \ + _avail(XrSpatialGraphStaticNodeBindingCreateInfoMSFT, XR_TYPE_SPATIAL_GRAPH_STATIC_NODE_BINDING_CREATE_INFO_MSFT) \ + _avail(XrSpatialGraphNodeBindingPropertiesGetInfoMSFT, XR_TYPE_SPATIAL_GRAPH_NODE_BINDING_PROPERTIES_GET_INFO_MSFT) \ + _avail(XrSpatialGraphNodeBindingPropertiesMSFT, XR_TYPE_SPATIAL_GRAPH_NODE_BINDING_PROPERTIES_MSFT) \ + _avail(XrSystemHandTrackingPropertiesEXT, XR_TYPE_SYSTEM_HAND_TRACKING_PROPERTIES_EXT) \ + _avail(XrHandTrackerCreateInfoEXT, XR_TYPE_HAND_TRACKER_CREATE_INFO_EXT) \ + _avail(XrHandJointsLocateInfoEXT, XR_TYPE_HAND_JOINTS_LOCATE_INFO_EXT) \ + _avail(XrHandJointLocationsEXT, XR_TYPE_HAND_JOINT_LOCATIONS_EXT) \ + _avail(XrHandJointVelocitiesEXT, XR_TYPE_HAND_JOINT_VELOCITIES_EXT) \ + _avail(XrSystemHandTrackingMeshPropertiesMSFT, XR_TYPE_SYSTEM_HAND_TRACKING_MESH_PROPERTIES_MSFT) \ + _avail(XrHandMeshSpaceCreateInfoMSFT, XR_TYPE_HAND_MESH_SPACE_CREATE_INFO_MSFT) \ + _avail(XrHandMeshUpdateInfoMSFT, XR_TYPE_HAND_MESH_UPDATE_INFO_MSFT) \ + _avail(XrHandMeshMSFT, XR_TYPE_HAND_MESH_MSFT) \ + _avail(XrHandPoseTypeInfoMSFT, XR_TYPE_HAND_POSE_TYPE_INFO_MSFT) \ + _avail(XrSecondaryViewConfigurationSessionBeginInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SESSION_BEGIN_INFO_MSFT) \ + _avail(XrSecondaryViewConfigurationStateMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_STATE_MSFT) \ + _avail(XrSecondaryViewConfigurationFrameStateMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_STATE_MSFT) \ + _avail(XrSecondaryViewConfigurationLayerInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_LAYER_INFO_MSFT) \ + _avail(XrSecondaryViewConfigurationFrameEndInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_FRAME_END_INFO_MSFT) \ + _avail(XrSecondaryViewConfigurationSwapchainCreateInfoMSFT, XR_TYPE_SECONDARY_VIEW_CONFIGURATION_SWAPCHAIN_CREATE_INFO_MSFT) \ + _avail(XrControllerModelKeyStateMSFT, XR_TYPE_CONTROLLER_MODEL_KEY_STATE_MSFT) \ + _avail(XrControllerModelNodePropertiesMSFT, XR_TYPE_CONTROLLER_MODEL_NODE_PROPERTIES_MSFT) \ + _avail(XrControllerModelPropertiesMSFT, XR_TYPE_CONTROLLER_MODEL_PROPERTIES_MSFT) \ + _avail(XrControllerModelNodeStateMSFT, XR_TYPE_CONTROLLER_MODEL_NODE_STATE_MSFT) \ + _avail(XrControllerModelStateMSFT, XR_TYPE_CONTROLLER_MODEL_STATE_MSFT) \ + _avail(XrViewConfigurationViewFovEPIC, XR_TYPE_VIEW_CONFIGURATION_VIEW_FOV_EPIC) \ + _avail(XrCompositionLayerReprojectionInfoMSFT, XR_TYPE_COMPOSITION_LAYER_REPROJECTION_INFO_MSFT) \ + _avail(XrCompositionLayerReprojectionPlaneOverrideMSFT, XR_TYPE_COMPOSITION_LAYER_REPROJECTION_PLANE_OVERRIDE_MSFT) \ + _avail(XrCompositionLayerSecureContentFB, XR_TYPE_COMPOSITION_LAYER_SECURE_CONTENT_FB) \ + _avail(XrInteractionProfileDpadBindingEXT, XR_TYPE_INTERACTION_PROFILE_DPAD_BINDING_EXT) \ + _avail(XrInteractionProfileAnalogThresholdVALVE, XR_TYPE_INTERACTION_PROFILE_ANALOG_THRESHOLD_VALVE) \ + _avail(XrHandJointsMotionRangeInfoEXT, XR_TYPE_HAND_JOINTS_MOTION_RANGE_INFO_EXT) \ + _avail(XrSceneObserverCreateInfoMSFT, XR_TYPE_SCENE_OBSERVER_CREATE_INFO_MSFT) \ + _avail(XrSceneCreateInfoMSFT, XR_TYPE_SCENE_CREATE_INFO_MSFT) \ + _avail(XrNewSceneComputeInfoMSFT, XR_TYPE_NEW_SCENE_COMPUTE_INFO_MSFT) \ + _avail(XrVisualMeshComputeLodInfoMSFT, XR_TYPE_VISUAL_MESH_COMPUTE_LOD_INFO_MSFT) \ + _avail(XrSceneComponentsMSFT, XR_TYPE_SCENE_COMPONENTS_MSFT) \ + _avail(XrSceneComponentsGetInfoMSFT, XR_TYPE_SCENE_COMPONENTS_GET_INFO_MSFT) \ + _avail(XrSceneComponentLocationsMSFT, XR_TYPE_SCENE_COMPONENT_LOCATIONS_MSFT) \ + _avail(XrSceneComponentsLocateInfoMSFT, XR_TYPE_SCENE_COMPONENTS_LOCATE_INFO_MSFT) \ + _avail(XrSceneObjectsMSFT, XR_TYPE_SCENE_OBJECTS_MSFT) \ + _avail(XrSceneComponentParentFilterInfoMSFT, XR_TYPE_SCENE_COMPONENT_PARENT_FILTER_INFO_MSFT) \ + _avail(XrSceneObjectTypesFilterInfoMSFT, XR_TYPE_SCENE_OBJECT_TYPES_FILTER_INFO_MSFT) \ + _avail(XrScenePlanesMSFT, XR_TYPE_SCENE_PLANES_MSFT) \ + _avail(XrScenePlaneAlignmentFilterInfoMSFT, XR_TYPE_SCENE_PLANE_ALIGNMENT_FILTER_INFO_MSFT) \ + _avail(XrSceneMeshesMSFT, XR_TYPE_SCENE_MESHES_MSFT) \ + _avail(XrSceneMeshBuffersGetInfoMSFT, XR_TYPE_SCENE_MESH_BUFFERS_GET_INFO_MSFT) \ + _avail(XrSceneMeshBuffersMSFT, XR_TYPE_SCENE_MESH_BUFFERS_MSFT) \ + _avail(XrSceneMeshVertexBufferMSFT, XR_TYPE_SCENE_MESH_VERTEX_BUFFER_MSFT) \ + _avail(XrSceneMeshIndicesUint32MSFT, XR_TYPE_SCENE_MESH_INDICES_UINT32_MSFT) \ + _avail(XrSceneMeshIndicesUint16MSFT, XR_TYPE_SCENE_MESH_INDICES_UINT16_MSFT) \ + _avail(XrSerializedSceneFragmentDataGetInfoMSFT, XR_TYPE_SERIALIZED_SCENE_FRAGMENT_DATA_GET_INFO_MSFT) \ + _avail(XrSceneDeserializeInfoMSFT, XR_TYPE_SCENE_DESERIALIZE_INFO_MSFT) \ + _avail(XrEventDataDisplayRefreshRateChangedFB, XR_TYPE_EVENT_DATA_DISPLAY_REFRESH_RATE_CHANGED_FB) \ + _avail(XrViveTrackerPathsHTCX, XR_TYPE_VIVE_TRACKER_PATHS_HTCX) \ + _avail(XrEventDataViveTrackerConnectedHTCX, XR_TYPE_EVENT_DATA_VIVE_TRACKER_CONNECTED_HTCX) \ + _avail(XrSystemFacialTrackingPropertiesHTC, XR_TYPE_SYSTEM_FACIAL_TRACKING_PROPERTIES_HTC) \ + _avail(XrFacialExpressionsHTC, XR_TYPE_FACIAL_EXPRESSIONS_HTC) \ + _avail(XrFacialTrackerCreateInfoHTC, XR_TYPE_FACIAL_TRACKER_CREATE_INFO_HTC) \ + _avail(XrSystemColorSpacePropertiesFB, XR_TYPE_SYSTEM_COLOR_SPACE_PROPERTIES_FB) \ + _avail(XrHandTrackingMeshFB, XR_TYPE_HAND_TRACKING_MESH_FB) \ + _avail(XrHandTrackingScaleFB, XR_TYPE_HAND_TRACKING_SCALE_FB) \ + _avail(XrHandTrackingAimStateFB, XR_TYPE_HAND_TRACKING_AIM_STATE_FB) \ + _avail(XrHandTrackingCapsulesStateFB, XR_TYPE_HAND_TRACKING_CAPSULES_STATE_FB) \ + _avail(XrSystemSpatialEntityPropertiesFB, XR_TYPE_SYSTEM_SPATIAL_ENTITY_PROPERTIES_FB) \ + _avail(XrSpatialAnchorCreateInfoFB, XR_TYPE_SPATIAL_ANCHOR_CREATE_INFO_FB) \ + _avail(XrSpaceComponentStatusSetInfoFB, XR_TYPE_SPACE_COMPONENT_STATUS_SET_INFO_FB) \ + _avail(XrSpaceComponentStatusFB, XR_TYPE_SPACE_COMPONENT_STATUS_FB) \ + _avail(XrEventDataSpatialAnchorCreateCompleteFB, XR_TYPE_EVENT_DATA_SPATIAL_ANCHOR_CREATE_COMPLETE_FB) \ + _avail(XrEventDataSpaceSetStatusCompleteFB, XR_TYPE_EVENT_DATA_SPACE_SET_STATUS_COMPLETE_FB) \ + _avail(XrFoveationProfileCreateInfoFB, XR_TYPE_FOVEATION_PROFILE_CREATE_INFO_FB) \ + _avail(XrSwapchainCreateInfoFoveationFB, XR_TYPE_SWAPCHAIN_CREATE_INFO_FOVEATION_FB) \ + _avail(XrSwapchainStateFoveationFB, XR_TYPE_SWAPCHAIN_STATE_FOVEATION_FB) \ + _avail(XrFoveationLevelProfileCreateInfoFB, XR_TYPE_FOVEATION_LEVEL_PROFILE_CREATE_INFO_FB) \ + _avail(XrSystemKeyboardTrackingPropertiesFB, XR_TYPE_SYSTEM_KEYBOARD_TRACKING_PROPERTIES_FB) \ + _avail(XrKeyboardSpaceCreateInfoFB, XR_TYPE_KEYBOARD_SPACE_CREATE_INFO_FB) \ + _avail(XrKeyboardTrackingQueryFB, XR_TYPE_KEYBOARD_TRACKING_QUERY_FB) \ + _avail(XrTriangleMeshCreateInfoFB, XR_TYPE_TRIANGLE_MESH_CREATE_INFO_FB) \ + _avail(XrSystemPassthroughPropertiesFB, XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES_FB) \ + _avail(XrSystemPassthroughProperties2FB, XR_TYPE_SYSTEM_PASSTHROUGH_PROPERTIES2_FB) \ + _avail(XrPassthroughCreateInfoFB, XR_TYPE_PASSTHROUGH_CREATE_INFO_FB) \ + _avail(XrPassthroughLayerCreateInfoFB, XR_TYPE_PASSTHROUGH_LAYER_CREATE_INFO_FB) \ + _avail(XrCompositionLayerPassthroughFB, XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_FB) \ + _avail(XrGeometryInstanceCreateInfoFB, XR_TYPE_GEOMETRY_INSTANCE_CREATE_INFO_FB) \ + _avail(XrGeometryInstanceTransformFB, XR_TYPE_GEOMETRY_INSTANCE_TRANSFORM_FB) \ + _avail(XrPassthroughStyleFB, XR_TYPE_PASSTHROUGH_STYLE_FB) \ + _avail(XrPassthroughColorMapMonoToRgbaFB, XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_RGBA_FB) \ + _avail(XrPassthroughColorMapMonoToMonoFB, XR_TYPE_PASSTHROUGH_COLOR_MAP_MONO_TO_MONO_FB) \ + _avail(XrPassthroughBrightnessContrastSaturationFB, XR_TYPE_PASSTHROUGH_BRIGHTNESS_CONTRAST_SATURATION_FB) \ + _avail(XrEventDataPassthroughStateChangedFB, XR_TYPE_EVENT_DATA_PASSTHROUGH_STATE_CHANGED_FB) \ + _avail(XrRenderModelPathInfoFB, XR_TYPE_RENDER_MODEL_PATH_INFO_FB) \ + _avail(XrRenderModelPropertiesFB, XR_TYPE_RENDER_MODEL_PROPERTIES_FB) \ + _avail(XrRenderModelBufferFB, XR_TYPE_RENDER_MODEL_BUFFER_FB) \ + _avail(XrRenderModelLoadInfoFB, XR_TYPE_RENDER_MODEL_LOAD_INFO_FB) \ + _avail(XrSystemRenderModelPropertiesFB, XR_TYPE_SYSTEM_RENDER_MODEL_PROPERTIES_FB) \ + _avail(XrRenderModelCapabilitiesRequestFB, XR_TYPE_RENDER_MODEL_CAPABILITIES_REQUEST_FB) \ + _avail(XrViewLocateFoveatedRenderingVARJO, XR_TYPE_VIEW_LOCATE_FOVEATED_RENDERING_VARJO) \ + _avail(XrFoveatedViewConfigurationViewVARJO, XR_TYPE_FOVEATED_VIEW_CONFIGURATION_VIEW_VARJO) \ + _avail(XrSystemFoveatedRenderingPropertiesVARJO, XR_TYPE_SYSTEM_FOVEATED_RENDERING_PROPERTIES_VARJO) \ + _avail(XrCompositionLayerDepthTestVARJO, XR_TYPE_COMPOSITION_LAYER_DEPTH_TEST_VARJO) \ + _avail(XrSystemMarkerTrackingPropertiesVARJO, XR_TYPE_SYSTEM_MARKER_TRACKING_PROPERTIES_VARJO) \ + _avail(XrEventDataMarkerTrackingUpdateVARJO, XR_TYPE_EVENT_DATA_MARKER_TRACKING_UPDATE_VARJO) \ + _avail(XrMarkerSpaceCreateInfoVARJO, XR_TYPE_MARKER_SPACE_CREATE_INFO_VARJO) \ + _avail(XrSpatialAnchorPersistenceInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_PERSISTENCE_INFO_MSFT) \ + _avail(XrSpatialAnchorFromPersistedAnchorCreateInfoMSFT, XR_TYPE_SPATIAL_ANCHOR_FROM_PERSISTED_ANCHOR_CREATE_INFO_MSFT) \ + _avail(XrSpaceQueryInfoFB, XR_TYPE_SPACE_QUERY_INFO_FB) \ + _avail(XrSpaceStorageLocationFilterInfoFB, XR_TYPE_SPACE_STORAGE_LOCATION_FILTER_INFO_FB) \ + _avail(XrSpaceUuidFilterInfoFB, XR_TYPE_SPACE_UUID_FILTER_INFO_FB) \ + _avail(XrSpaceComponentFilterInfoFB, XR_TYPE_SPACE_COMPONENT_FILTER_INFO_FB) \ + _avail(XrSpaceQueryResultsFB, XR_TYPE_SPACE_QUERY_RESULTS_FB) \ + _avail(XrEventDataSpaceQueryResultsAvailableFB, XR_TYPE_EVENT_DATA_SPACE_QUERY_RESULTS_AVAILABLE_FB) \ + _avail(XrEventDataSpaceQueryCompleteFB, XR_TYPE_EVENT_DATA_SPACE_QUERY_COMPLETE_FB) \ + _avail(XrSpaceSaveInfoFB, XR_TYPE_SPACE_SAVE_INFO_FB) \ + _avail(XrSpaceEraseInfoFB, XR_TYPE_SPACE_ERASE_INFO_FB) \ + _avail(XrEventDataSpaceSaveCompleteFB, XR_TYPE_EVENT_DATA_SPACE_SAVE_COMPLETE_FB) \ + _avail(XrEventDataSpaceEraseCompleteFB, XR_TYPE_EVENT_DATA_SPACE_ERASE_COMPLETE_FB) \ + _avail(XrCompositionLayerSpaceWarpInfoFB, XR_TYPE_COMPOSITION_LAYER_SPACE_WARP_INFO_FB) \ + _avail(XrSystemSpaceWarpPropertiesFB, XR_TYPE_SYSTEM_SPACE_WARP_PROPERTIES_FB) \ + _avail(XrSemanticLabelsFB, XR_TYPE_SEMANTIC_LABELS_FB) \ + _avail(XrRoomLayoutFB, XR_TYPE_ROOM_LAYOUT_FB) \ + _avail(XrBoundary2DFB, XR_TYPE_BOUNDARY_2D_FB) \ + _avail(XrDigitalLensControlALMALENCE, XR_TYPE_DIGITAL_LENS_CONTROL_ALMALENCE) \ + _avail(XrSpaceContainerFB, XR_TYPE_SPACE_CONTAINER_FB) \ + _avail(XrPassthroughKeyboardHandsIntensityFB, XR_TYPE_PASSTHROUGH_KEYBOARD_HANDS_INTENSITY_FB) \ + _avail(XrCompositionLayerSettingsFB, XR_TYPE_COMPOSITION_LAYER_SETTINGS_FB) \ + _avail(XrPerformanceMetricsStateMETA, XR_TYPE_PERFORMANCE_METRICS_STATE_META) \ + _avail(XrPerformanceMetricsCounterMETA, XR_TYPE_PERFORMANCE_METRICS_COUNTER_META) \ + _avail(XrSystemHeadsetIdPropertiesMETA, XR_TYPE_SYSTEM_HEADSET_ID_PROPERTIES_META) \ + _avail(XrPassthroughCreateInfoHTC, XR_TYPE_PASSTHROUGH_CREATE_INFO_HTC) \ + _avail(XrPassthroughColorHTC, XR_TYPE_PASSTHROUGH_COLOR_HTC) \ + _avail(XrPassthroughMeshTransformInfoHTC, XR_TYPE_PASSTHROUGH_MESH_TRANSFORM_INFO_HTC) \ + _avail(XrCompositionLayerPassthroughHTC, XR_TYPE_COMPOSITION_LAYER_PASSTHROUGH_HTC) \ + _avail(XrFoveationApplyInfoHTC, XR_TYPE_FOVEATION_APPLY_INFO_HTC) \ + _avail(XrFoveationDynamicModeInfoHTC, XR_TYPE_FOVEATION_DYNAMIC_MODE_INFO_HTC) \ + _avail(XrFoveationCustomModeInfoHTC, XR_TYPE_FOVEATION_CUSTOM_MODE_INFO_HTC) \ + _avail(XrActiveActionSetPrioritiesEXT, XR_TYPE_ACTIVE_ACTION_SET_PRIORITIES_EXT) \ + + +#if defined(XR_USE_GRAPHICS_API_D3D11) +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_avail, _unavail) \ + _avail(XrGraphicsBindingD3D11KHR, XR_TYPE_GRAPHICS_BINDING_D3D11_KHR) \ + _avail(XrSwapchainImageD3D11KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR) \ + _avail(XrGraphicsRequirementsD3D11KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR) \ + +#else +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D11(_avail, _unavail) \ + _unavail(XrGraphicsBindingD3D11KHR, XR_TYPE_GRAPHICS_BINDING_D3D11_KHR) \ + _unavail(XrSwapchainImageD3D11KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D11_KHR) \ + _unavail(XrGraphicsRequirementsD3D11KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D11_KHR) \ + +#endif + +#if defined(XR_USE_GRAPHICS_API_D3D12) +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_avail, _unavail) \ + _avail(XrGraphicsBindingD3D12KHR, XR_TYPE_GRAPHICS_BINDING_D3D12_KHR) \ + _avail(XrSwapchainImageD3D12KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR) \ + _avail(XrGraphicsRequirementsD3D12KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR) \ + +#else +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_D3D12(_avail, _unavail) \ + _unavail(XrGraphicsBindingD3D12KHR, XR_TYPE_GRAPHICS_BINDING_D3D12_KHR) \ + _unavail(XrSwapchainImageD3D12KHR, XR_TYPE_SWAPCHAIN_IMAGE_D3D12_KHR) \ + _unavail(XrGraphicsRequirementsD3D12KHR, XR_TYPE_GRAPHICS_REQUIREMENTS_D3D12_KHR) \ + +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL) +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_avail, _unavail) \ + _avail(XrSwapchainImageOpenGLKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR) \ + _avail(XrGraphicsRequirementsOpenGLKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR) \ + +#else +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL(_avail, _unavail) \ + _unavail(XrSwapchainImageOpenGLKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_KHR) \ + _unavail(XrGraphicsRequirementsOpenGLKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_KHR) \ + +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_WAYLAND) +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_avail, _unavail) \ + _avail(XrGraphicsBindingOpenGLWaylandKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR) \ + +#else +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WAYLAND(_avail, _unavail) \ + _unavail(XrGraphicsBindingOpenGLWaylandKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_WAYLAND_KHR) \ + +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_WIN32) +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_avail, _unavail) \ + _avail(XrGraphicsBindingOpenGLWin32KHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR) \ + +#else +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_WIN32(_avail, _unavail) \ + _unavail(XrGraphicsBindingOpenGLWin32KHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_WIN32_KHR) \ + +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_XCB) +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_avail, _unavail) \ + _avail(XrGraphicsBindingOpenGLXcbKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR) \ + +#else +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XCB(_avail, _unavail) \ + _unavail(XrGraphicsBindingOpenGLXcbKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_XCB_KHR) \ + +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL) && defined(XR_USE_PLATFORM_XLIB) +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_avail, _unavail) \ + _avail(XrGraphicsBindingOpenGLXlibKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR) \ + +#else +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_XR_USE_PLATFORM_XLIB(_avail, _unavail) \ + _unavail(XrGraphicsBindingOpenGLXlibKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_XLIB_KHR) \ + +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL_ES) +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ + _avail(XrSwapchainImageOpenGLESKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR) \ + _avail(XrGraphicsRequirementsOpenGLESKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR) \ + _avail(XrSwapchainStateSamplerOpenGLESFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB) \ + +#else +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES(_avail, _unavail) \ + _unavail(XrSwapchainImageOpenGLESKHR, XR_TYPE_SWAPCHAIN_IMAGE_OPENGL_ES_KHR) \ + _unavail(XrGraphicsRequirementsOpenGLESKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_OPENGL_ES_KHR) \ + _unavail(XrSwapchainStateSamplerOpenGLESFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_OPENGL_ES_FB) \ + +#endif + +#if defined(XR_USE_GRAPHICS_API_OPENGL_ES) && defined(XR_USE_PLATFORM_ANDROID) +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ + _avail(XrGraphicsBindingOpenGLESAndroidKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR) \ + +#else +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_OPENGL_ES_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ + _unavail(XrGraphicsBindingOpenGLESAndroidKHR, XR_TYPE_GRAPHICS_BINDING_OPENGL_ES_ANDROID_KHR) \ + +#endif + +#if defined(XR_USE_GRAPHICS_API_VULKAN) +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ + _avail(XrVulkanSwapchainFormatListCreateInfoKHR, XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR) \ + _avail(XrGraphicsBindingVulkanKHR, XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR) \ + _avail(XrSwapchainImageVulkanKHR, XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR) \ + _avail(XrGraphicsRequirementsVulkanKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR) \ + _avail(XrVulkanInstanceCreateInfoKHR, XR_TYPE_VULKAN_INSTANCE_CREATE_INFO_KHR) \ + _avail(XrVulkanDeviceCreateInfoKHR, XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR) \ + _avail(XrVulkanGraphicsDeviceGetInfoKHR, XR_TYPE_VULKAN_GRAPHICS_DEVICE_GET_INFO_KHR) \ + _avail(XrSwapchainImageFoveationVulkanFB, XR_TYPE_SWAPCHAIN_IMAGE_FOVEATION_VULKAN_FB) \ + _avail(XrSwapchainStateSamplerVulkanFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB) \ + _avail(XrVulkanSwapchainCreateInfoMETA, XR_TYPE_VULKAN_SWAPCHAIN_CREATE_INFO_META) \ + +#else +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_GRAPHICS_API_VULKAN(_avail, _unavail) \ + _unavail(XrVulkanSwapchainFormatListCreateInfoKHR, XR_TYPE_VULKAN_SWAPCHAIN_FORMAT_LIST_CREATE_INFO_KHR) \ + _unavail(XrGraphicsBindingVulkanKHR, XR_TYPE_GRAPHICS_BINDING_VULKAN_KHR) \ + _unavail(XrSwapchainImageVulkanKHR, XR_TYPE_SWAPCHAIN_IMAGE_VULKAN_KHR) \ + _unavail(XrGraphicsRequirementsVulkanKHR, XR_TYPE_GRAPHICS_REQUIREMENTS_VULKAN_KHR) \ + _unavail(XrVulkanInstanceCreateInfoKHR, XR_TYPE_VULKAN_INSTANCE_CREATE_INFO_KHR) \ + _unavail(XrVulkanDeviceCreateInfoKHR, XR_TYPE_VULKAN_DEVICE_CREATE_INFO_KHR) \ + _unavail(XrVulkanGraphicsDeviceGetInfoKHR, XR_TYPE_VULKAN_GRAPHICS_DEVICE_GET_INFO_KHR) \ + _unavail(XrSwapchainImageFoveationVulkanFB, XR_TYPE_SWAPCHAIN_IMAGE_FOVEATION_VULKAN_FB) \ + _unavail(XrSwapchainStateSamplerVulkanFB, XR_TYPE_SWAPCHAIN_STATE_SAMPLER_VULKAN_FB) \ + _unavail(XrVulkanSwapchainCreateInfoMETA, XR_TYPE_VULKAN_SWAPCHAIN_CREATE_INFO_META) \ + +#endif + +#if defined(XR_USE_PLATFORM_ANDROID) +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ + _avail(XrInstanceCreateInfoAndroidKHR, XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR) \ + _avail(XrLoaderInitInfoAndroidKHR, XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR) \ + _avail(XrAndroidSurfaceSwapchainCreateInfoFB, XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB) \ + _avail(XrSwapchainStateAndroidSurfaceDimensionsFB, XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB) \ + +#else +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_ANDROID(_avail, _unavail) \ + _unavail(XrInstanceCreateInfoAndroidKHR, XR_TYPE_INSTANCE_CREATE_INFO_ANDROID_KHR) \ + _unavail(XrLoaderInitInfoAndroidKHR, XR_TYPE_LOADER_INIT_INFO_ANDROID_KHR) \ + _unavail(XrAndroidSurfaceSwapchainCreateInfoFB, XR_TYPE_ANDROID_SURFACE_SWAPCHAIN_CREATE_INFO_FB) \ + _unavail(XrSwapchainStateAndroidSurfaceDimensionsFB, XR_TYPE_SWAPCHAIN_STATE_ANDROID_SURFACE_DIMENSIONS_FB) \ + +#endif + +#if defined(XR_USE_PLATFORM_EGL) +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_avail, _unavail) \ + _avail(XrGraphicsBindingEGLMNDX, XR_TYPE_GRAPHICS_BINDING_EGL_MNDX) \ + +#else +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_EGL(_avail, _unavail) \ + _unavail(XrGraphicsBindingEGLMNDX, XR_TYPE_GRAPHICS_BINDING_EGL_MNDX) \ + +#endif + +#if defined(XR_USE_PLATFORM_WIN32) +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_avail, _unavail) \ + _avail(XrHolographicWindowAttachmentMSFT, XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT) \ + +#else +#define _impl_XR_LIST_ALL_STRUCTURE_TYPES_XR_USE_PLATFORM_WIN32(_avail, _unavail) \ + _unavail(XrHolographicWindowAttachmentMSFT, XR_TYPE_HOLOGRAPHIC_WINDOW_ATTACHMENT_MSFT) \ + +#endif + + + + +#endif + diff --git a/thirdparty/openxr/src/loader/loader_core.cpp b/thirdparty/openxr/src/loader/loader_core.cpp index a8bbfb4de2..f2bc87d1fa 100644 --- a/thirdparty/openxr/src/loader/loader_core.cpp +++ b/thirdparty/openxr/src/loader/loader_core.cpp @@ -35,7 +35,7 @@ // Global loader lock to: // 1. Ensure ActiveLoaderInstance get and set operations are done atomically. // 2. Ensure RuntimeInterface isn't used to unload the runtime while the runtime is in use. -std::mutex &GetGlobalLoaderMutex() { +static std::mutex &GetGlobalLoaderMutex() { static std::mutex loader_mutex; return loader_mutex; } @@ -58,6 +58,8 @@ static XRAPI_ATTR XrResult XRAPI_CALL LoaderXrTermDestroyDebugUtilsMessengerEXT( static XRAPI_ATTR XrResult XRAPI_CALL LoaderXrTermSubmitDebugUtilsMessageEXT( XrInstance instance, XrDebugUtilsMessageSeverityFlagsEXT messageSeverity, XrDebugUtilsMessageTypeFlagsEXT messageTypes, const XrDebugUtilsMessengerCallbackDataEXT *callbackData); +static XRAPI_ATTR XrResult XRAPI_CALL LoaderXrGetInstanceProcAddr(XrInstance instance, const char *name, + PFN_xrVoidFunction *function); // Utility template function meant to validate if a fixed size string contains // a null-terminator. diff --git a/thirdparty/openxr/src/loader/manifest_file.cpp b/thirdparty/openxr/src/loader/manifest_file.cpp index df99d51f8f..1b0ef07848 100644 --- a/thirdparty/openxr/src/loader/manifest_file.cpp +++ b/thirdparty/openxr/src/loader/manifest_file.cpp @@ -348,14 +348,20 @@ static void ReadRuntimeDataFilesInRegistry(const std::string &runtime_registry_l if (ERROR_SUCCESS != open_value) { LoaderLogger::LogWarningMessage("", "ReadRuntimeDataFilesInRegistry - failed to open registry key " + full_registry_location); - } else if (ERROR_SUCCESS != RegGetValueW(hkey, nullptr, default_runtime_value_name_w.c_str(), - RRF_RT_REG_SZ | REG_EXPAND_SZ | RRF_ZEROONFAILURE, NULL, - reinterpret_cast<LPBYTE>(&value_w), &value_size_w)) { + + return; + } + + if (ERROR_SUCCESS != RegGetValueW(hkey, nullptr, default_runtime_value_name_w.c_str(), + RRF_RT_REG_SZ | REG_EXPAND_SZ | RRF_ZEROONFAILURE, NULL, reinterpret_cast<LPBYTE>(&value_w), + &value_size_w)) { LoaderLogger::LogWarningMessage( "", "ReadRuntimeDataFilesInRegistry - failed to read registry value " + default_runtime_value_name); } else { AddFilesInPath(wide_to_utf8(value_w), false, manifest_files); } + + RegCloseKey(hkey); } // Look for layer data files in the provided paths, but first check the environment override to determine diff --git a/thirdparty/openxr/src/xr_generated_dispatch_table.c b/thirdparty/openxr/src/xr_generated_dispatch_table.c index 91fa0c3ca0..094f9fbbda 100644 --- a/thirdparty/openxr/src/xr_generated_dispatch_table.c +++ b/thirdparty/openxr/src/xr_generated_dispatch_table.c @@ -354,6 +354,13 @@ void GeneratedXrPopulateDispatchTable(struct XrGeneratedDispatchTable *table, (get_inst_proc_addr(instance, "xrGetAudioInputDeviceGuidOculus", (PFN_xrVoidFunction*)&table->GetAudioInputDeviceGuidOculus)); #endif // defined(XR_USE_PLATFORM_WIN32) + // ---- XR_FB_scene extension commands + (get_inst_proc_addr(instance, "xrGetSpaceBoundingBox2DFB", (PFN_xrVoidFunction*)&table->GetSpaceBoundingBox2DFB)); + (get_inst_proc_addr(instance, "xrGetSpaceBoundingBox3DFB", (PFN_xrVoidFunction*)&table->GetSpaceBoundingBox3DFB)); + (get_inst_proc_addr(instance, "xrGetSpaceSemanticLabelsFB", (PFN_xrVoidFunction*)&table->GetSpaceSemanticLabelsFB)); + (get_inst_proc_addr(instance, "xrGetSpaceBoundary2DFB", (PFN_xrVoidFunction*)&table->GetSpaceBoundary2DFB)); + (get_inst_proc_addr(instance, "xrGetSpaceRoomLayoutFB", (PFN_xrVoidFunction*)&table->GetSpaceRoomLayoutFB)); + // ---- XR_ALMALENCE_digital_lens_control extension commands (get_inst_proc_addr(instance, "xrSetDigitalLensControlALMALENCE", (PFN_xrVoidFunction*)&table->SetDigitalLensControlALMALENCE)); @@ -368,6 +375,13 @@ void GeneratedXrPopulateDispatchTable(struct XrGeneratedDispatchTable *table, (get_inst_proc_addr(instance, "xrSetPerformanceMetricsStateMETA", (PFN_xrVoidFunction*)&table->SetPerformanceMetricsStateMETA)); (get_inst_proc_addr(instance, "xrGetPerformanceMetricsStateMETA", (PFN_xrVoidFunction*)&table->GetPerformanceMetricsStateMETA)); (get_inst_proc_addr(instance, "xrQueryPerformanceMetricsCounterMETA", (PFN_xrVoidFunction*)&table->QueryPerformanceMetricsCounterMETA)); + + // ---- XR_HTC_passthrough extension commands + (get_inst_proc_addr(instance, "xrCreatePassthroughHTC", (PFN_xrVoidFunction*)&table->CreatePassthroughHTC)); + (get_inst_proc_addr(instance, "xrDestroyPassthroughHTC", (PFN_xrVoidFunction*)&table->DestroyPassthroughHTC)); + + // ---- XR_HTC_foveation extension commands + (get_inst_proc_addr(instance, "xrApplyFoveationHTC", (PFN_xrVoidFunction*)&table->ApplyFoveationHTC)); } diff --git a/thirdparty/openxr/src/xr_generated_dispatch_table.h b/thirdparty/openxr/src/xr_generated_dispatch_table.h index 51d48bef43..93d07a149e 100644 --- a/thirdparty/openxr/src/xr_generated_dispatch_table.h +++ b/thirdparty/openxr/src/xr_generated_dispatch_table.h @@ -357,6 +357,13 @@ struct XrGeneratedDispatchTable { PFN_xrGetAudioInputDeviceGuidOculus GetAudioInputDeviceGuidOculus; #endif // defined(XR_USE_PLATFORM_WIN32) + // ---- XR_FB_scene extension commands + PFN_xrGetSpaceBoundingBox2DFB GetSpaceBoundingBox2DFB; + PFN_xrGetSpaceBoundingBox3DFB GetSpaceBoundingBox3DFB; + PFN_xrGetSpaceSemanticLabelsFB GetSpaceSemanticLabelsFB; + PFN_xrGetSpaceBoundary2DFB GetSpaceBoundary2DFB; + PFN_xrGetSpaceRoomLayoutFB GetSpaceRoomLayoutFB; + // ---- XR_ALMALENCE_digital_lens_control extension commands PFN_xrSetDigitalLensControlALMALENCE SetDigitalLensControlALMALENCE; @@ -371,6 +378,13 @@ struct XrGeneratedDispatchTable { PFN_xrSetPerformanceMetricsStateMETA SetPerformanceMetricsStateMETA; PFN_xrGetPerformanceMetricsStateMETA GetPerformanceMetricsStateMETA; PFN_xrQueryPerformanceMetricsCounterMETA QueryPerformanceMetricsCounterMETA; + + // ---- XR_HTC_passthrough extension commands + PFN_xrCreatePassthroughHTC CreatePassthroughHTC; + PFN_xrDestroyPassthroughHTC DestroyPassthroughHTC; + + // ---- XR_HTC_foveation extension commands + PFN_xrApplyFoveationHTC ApplyFoveationHTC; }; |