diff options
782 files changed, 32585 insertions, 22170 deletions
diff --git a/.github/workflows/linux_builds.yml b/.github/workflows/linux_builds.yml index 9ec6c4a4e9..84fdb2180b 100644 --- a/.github/workflows/linux_builds.yml +++ b/.github/workflows/linux_builds.yml @@ -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/gdextension_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 1292be06fd..ca96220570 100644 --- a/.gitignore +++ b/.gitignore @@ -242,8 +242,10 @@ xcuserdata/ [Rr]eleases/ x64/ x86/ -# Not build results, this is Theora source code. -!thirdparty/libtheora/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/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/extension_api_dump.cpp b/core/extension/extension_api_dump.cpp index 5812a24c4f..a0e3778dcc 100644 --- a/core/extension/extension_api_dump.cpp +++ b/core/extension/extension_api_dump.cpp @@ -252,63 +252,140 @@ Dictionary GDExtensionAPIDump::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 GDExtensionAPIDump::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 GDExtensionAPIDump::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++; } diff --git a/core/extension/gdextension_interface.cpp b/core/extension/gdextension_interface.cpp index 197e9db1e7..2074495aa9 100644 --- a/core/extension/gdextension_interface.cpp +++ b/core/extension/gdextension_interface.cpp @@ -80,7 +80,7 @@ static void gdextension_variant_destroy(GDExtensionVariantPtr p_self) { // variant type -static void gdextension_variant_call(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_method, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argcount, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error) { +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; @@ -96,7 +96,7 @@ static void gdextension_variant_call(GDExtensionVariantPtr p_self, GDExtensionCo } } -static void gdextension_variant_call_static(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argcount, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error) { +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; @@ -486,7 +486,7 @@ static GDExtensionPtrConstructor gdextension_variant_get_ptr_constructor(GDExten 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, GDExtensionConstVariantPtr *p_args, int32_t p_argument_count, GDExtensionCallError *r_error) { +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; @@ -814,7 +814,7 @@ static GDExtensionVariantPtr gdextension_dictionary_operator_index_const(GDExten /* OBJECT API */ -static void gdextension_object_method_bind_call(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_arg_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error) { +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; @@ -830,7 +830,7 @@ static void gdextension_object_method_bind_call(GDExtensionMethodBindPtr p_metho } } -static void gdextension_object_method_bind_ptrcall(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, GDExtensionConstTypePtr *p_args, GDExtensionTypePtr p_ret) { +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); @@ -879,6 +879,23 @@ static GDObjectInstanceID gdextension_object_get_instance_id(GDExtensionConstObj 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; @@ -1057,6 +1074,11 @@ void gdextension_setup_interface(GDExtensionInterface *p_interface) { 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; diff --git a/core/extension/gdextension_interface.h b/core/extension/gdextension_interface.h index b59a6b5ca4..0b7615ffdd 100644 --- a/core/extension/gdextension_interface.h +++ b/core/extension/gdextension_interface.h @@ -154,6 +154,8 @@ 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 */ @@ -176,8 +178,8 @@ typedef struct { 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, GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_return, int p_argument_count); -typedef void (*GDExtensionPtrConstructor)(GDExtensionTypePtr p_base, GDExtensionConstTypePtr *p_args); +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); @@ -186,7 +188,7 @@ typedef void (*GDExtensionPtrIndexedGetter)(GDExtensionConstTypePtr p_base, GDEx 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, GDExtensionConstTypePtr *p_arguments, int p_argument_count); +typedef void (*GDExtensionPtrUtilityFunction)(GDExtensionTypePtr r_return, const GDExtensionConstTypePtr *p_args, int p_argument_count); typedef GDExtensionObjectPtr (*GDExtensionClassConstructor)(); @@ -240,7 +242,7 @@ typedef void (*GDExtensionClassNotification)(GDExtensionClassInstancePtr p_insta 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, GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret); +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); @@ -293,8 +295,8 @@ typedef enum { GDEXTENSION_METHOD_ARGUMENT_METADATA_REAL_IS_DOUBLE } GDExtensionClassMethodArgumentMetadata; -typedef void (*GDExtensionClassMethodCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error); -typedef void (*GDExtensionClassMethodPtrCall)(void *method_userdata, GDExtensionClassInstancePtr p_instance, GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret); +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; @@ -342,7 +344,7 @@ typedef void (*GDExtensionScriptInstanceFreeMethodList)(GDExtensionScriptInstanc typedef GDExtensionBool (*GDExtensionScriptInstanceHasMethod)(GDExtensionScriptInstanceDataPtr p_instance, GDExtensionConstStringNamePtr p_name); -typedef void (*GDExtensionScriptInstanceCall)(GDExtensionScriptInstanceDataPtr p_self, GDExtensionConstStringNamePtr p_method, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error); +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); @@ -427,8 +429,8 @@ typedef struct { void (*variant_destroy)(GDExtensionVariantPtr p_self); /* variant type */ - void (*variant_call)(GDExtensionVariantPtr p_self, GDExtensionConstStringNamePtr p_method, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error); - void (*variant_call_static)(GDExtensionVariantType p_type, GDExtensionConstStringNamePtr p_method, GDExtensionConstVariantPtr *p_args, GDExtensionInt p_argument_count, GDExtensionVariantPtr r_return, GDExtensionCallError *r_error); + 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); @@ -463,7 +465,7 @@ typedef struct { 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, GDExtensionConstVariantPtr *p_args, int32_t p_argument_count, GDExtensionCallError *r_error); + 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); @@ -537,8 +539,8 @@ typedef struct { /* OBJECT */ - void (*object_method_bind_call)(GDExtensionMethodBindPtr p_method_bind, GDExtensionObjectPtr p_instance, 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, GDExtensionConstTypePtr *p_args, GDExtensionTypePtr r_ret); + 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); @@ -551,6 +553,11 @@ typedef struct { 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); 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/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/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/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/os/os.cpp b/core/os/os.cpp index 6d567ffd43..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; } 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/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/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/doc/classes/@GlobalScope.xml b/doc/classes/@GlobalScope.xml index 50c1ed847a..6b0dccd7fc 100644 --- a/doc/classes/@GlobalScope.xml +++ b/doc/classes/@GlobalScope.xml @@ -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/AudioStreamRandomizer.xml b/doc/classes/AudioStreamRandomizer.xml index 9b58d78af5..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"> 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/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 fd6aab6a49..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. 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/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/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..770a5dc5b0 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,24 @@ 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_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" /> diff --git a/doc/classes/NavigationAgent3D.xml b/doc/classes/NavigationAgent3D.xml index 44c17647f7..d9a1235bdd 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,24 @@ 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_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" /> 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..dff58fc1bd 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> @@ -33,10 +33,10 @@ 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> </constants> </class> diff --git a/doc/classes/NavigationPathQueryParameters3D.xml b/doc/classes/NavigationPathQueryParameters3D.xml index 29faa5561b..46a35b1071 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> @@ -33,10 +33,10 @@ 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> </constants> </class> diff --git a/doc/classes/NavigationPathQueryResult2D.xml b/doc/classes/NavigationPathQueryResult2D.xml index 95b90e9383..77b19b07b6 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> diff --git a/doc/classes/NavigationPathQueryResult3D.xml b/doc/classes/NavigationPathQueryResult3D.xml index b4ca8288db..6c553bf36b 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> 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 230e58a12a..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> @@ -489,12 +489,12 @@ 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="nav_poly" type="NavigationPolygon" /> + <param index="1" name="navigation_polygon" type="NavigationPolygon" /> <description> - Sets the navigation mesh for the region. + Sets the [param navigation_polygon] for the region. </description> </method> <method name="region_set_owner_id" qualifiers="const"> diff --git a/doc/classes/NavigationServer3D.xml b/doc/classes/NavigationServer3D.xml index c7da3b7b5b..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> @@ -433,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"> @@ -539,10 +539,10 @@ 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> 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/PopupMenu.xml b/doc/classes/PopupMenu.xml index 6810b0e8e4..8dec4eaf86 100644 --- a/doc/classes/PopupMenu.xml +++ b/doc/classes/PopupMenu.xml @@ -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 dce9d5a55c..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"> diff --git a/doc/classes/RenderingDevice.xml b/doc/classes/RenderingDevice.xml index 797231ac5e..f318430611 100644 --- a/doc/classes/RenderingDevice.xml +++ b/doc/classes/RenderingDevice.xml @@ -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> diff --git a/doc/classes/RenderingServer.xml b/doc/classes/RenderingServer.xml index fc05f67416..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" /> @@ -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/String.xml b/doc/classes/String.xml index d5624aeaa2..97466e7860 100644 --- a/doc/classes/String.xml +++ b/doc/classes/String.xml @@ -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" diff --git a/doc/classes/StringName.xml b/doc/classes/StringName.xml index e3cb6517f3..b46e39b8d7 100644 --- a/doc/classes/StringName.xml +++ b/doc/classes/StringName.xml @@ -220,7 +220,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> @@ -880,11 +880,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> @@ -895,13 +895,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" 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 4fc6ee3312..d2c6dee373 100644 --- a/doc/classes/TextServer.xml +++ b/doc/classes/TextServer.xml @@ -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 e9e2a738d3..8b537545bc 100644 --- a/doc/classes/TileMap.xml +++ b/doc/classes/TileMap.xml @@ -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/Tree.xml b/doc/classes/Tree.xml index 629c271417..584a2a2a7b 100644 --- a/doc/classes/Tree.xml +++ b/doc/classes/Tree.xml @@ -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/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/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 c7e7227916..ecad4b66a5 100644 --- a/drivers/gles3/rasterizer_canvas_gles3.cpp +++ b/drivers/gles3/rasterizer_canvas_gles3.cpp @@ -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; + } } } } @@ -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; } @@ -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); @@ -1215,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; @@ -1246,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. @@ -1267,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; @@ -1368,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; @@ -1394,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); @@ -1427,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; } @@ -1455,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); @@ -2100,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); } @@ -2127,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); @@ -2140,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); @@ -2153,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; + } } } @@ -2414,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); @@ -2425,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; } @@ -2599,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); @@ -2612,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); @@ -2621,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; @@ -2663,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 bd87973404..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; @@ -359,6 +359,7 @@ public: 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 b75fdf5f71..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 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/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/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 45f544c02d..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: { } } @@ -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; @@ -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 2321b95f18..3ccd7bb1d9 100644 --- a/drivers/vulkan/rendering_device_vulkan.h +++ b/drivers/vulkan/rendering_device_vulkan.h @@ -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); 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_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/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/editor_inspector.cpp b/editor/editor_inspector.cpp index a5397a8e6a..5bf45687ab 100644 --- a/editor/editor_inspector.cpp +++ b/editor/editor_inspector.cpp @@ -2597,7 +2597,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 +3316,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 +3867,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 +3918,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..56d0a55319 100644 --- a/editor/editor_inspector.h +++ b/editor/editor_inspector.h @@ -540,6 +540,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 463e8f6bdc..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(); @@ -6604,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); @@ -6776,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/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/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..1e406e6d17 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(); 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/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/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 c8b80db334..91c7fbc06a 100644 --- a/editor/plugins/node_3d_editor_gizmos.cpp +++ b/editor/plugins/node_3d_editor_gizmos.cpp @@ -1016,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."); @@ -1025,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; } diff --git a/editor/plugins/node_3d_editor_plugin.cpp b/editor/plugins/node_3d_editor_plugin.cpp index f5dd893377..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) { @@ -8429,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()->is_touchscreen_available()); + 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 fc252822c4..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(); 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/skeleton_3d_editor_plugin.cpp b/editor/plugins/skeleton_3d_editor_plugin.cpp index f79a001efb..d2dadd884b 100644 --- a/editor/plugins/skeleton_3d_editor_plugin.cpp +++ b/editor/plugins/skeleton_3d_editor_plugin.cpp @@ -153,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(); diff --git a/editor/plugins/tiles/tile_data_editors.cpp b/editor/plugins/tiles/tile_data_editors.cpp index 57f9b3135a..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++) { diff --git a/editor/plugins/tiles/tile_map_editor.cpp b/editor/plugins/tiles/tile_map_editor.cpp index 0331e3f69e..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) { @@ -924,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()); @@ -2124,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); @@ -2136,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); 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_set_atlas_source_editor.cpp b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp index a6cb48cb5d..34bbfa2c7e 100644 --- a/editor/plugins/tiles/tile_set_atlas_source_editor.cpp +++ b/editor/plugins/tiles/tile_set_atlas_source_editor.cpp @@ -807,9 +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_tree->set_visible(is_visible); - tile_data_painting_editor_container->set_visible(is_visible); + tile_data_editors_scroll->set_visible(is_visible); } void TileSetAtlasSourceEditor::_update_current_tile_data_editor() { @@ -2428,17 +2426,26 @@ TileSetAtlasSourceEditor::TileSetAtlasSourceEditor() { 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); @@ -2451,7 +2458,7 @@ 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_proxy_object = memnew(TileSetAtlasSourceProxyObject()); diff --git a/editor/plugins/tiles/tile_set_atlas_source_editor.h b/editor/plugins/tiles/tile_set_atlas_source_editor.h index 2e25841248..eede2ec086 100644 --- a/editor/plugins/tiles/tile_set_atlas_source_editor.h +++ b/editor/plugins/tiles/tile_set_atlas_source_editor.h @@ -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; 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 cf811067c9..c93b0019dc 100644 --- a/editor/plugins/visual_shader_editor_plugin.cpp +++ b/editor/plugins/visual_shader_editor_plugin.cpp @@ -1263,7 +1263,7 @@ Dictionary VisualShaderEditor::get_custom_node_data(Ref<VisualShaderNodeCustom> 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() != String("VisualShaderNodeCustom")) { + if (scr.is_null() || scr->get_instance_base_type() != "VisualShaderNodeCustom") { return; } 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 b406b2a1ce..b99a83a546 100644 --- a/editor/project_settings_editor.cpp +++ b/editor/project_settings_editor.cpp @@ -553,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: { @@ -683,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 8fa0a78480..7e1fd38e14 100644 --- a/main/main.cpp +++ b/main/main.cpp @@ -2121,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; @@ -2594,6 +2594,7 @@ bool Main::start() { } if (dump_gdextension_interface || dump_extension_api) { + OS::get_singleton()->set_exit_code(EXIT_SUCCESS); return false; } 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 91f31174dd..1fe1561559 100644 --- a/modules/gdscript/gdscript.cpp +++ b/modules/gdscript/gdscript.cpp @@ -1111,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 { @@ -1137,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; } @@ -1288,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); } @@ -1964,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); @@ -2597,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 7911ea47ec..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; } @@ -455,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 81e50d6b79..0aea2b9c16 100644 --- a/modules/gdscript/gdscript_analyzer.cpp +++ b/modules/gdscript/gdscript_analyzer.cpp @@ -225,6 +225,8 @@ void GDScriptAnalyzer::get_class_node_current_scope_classes(GDScriptParser::Clas } 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); @@ -235,15 +237,58 @@ void GDScriptAnalyzer::get_class_node_current_scope_classes(GDScriptParser::Clas } } -Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, bool p_recursive) { - if (p_class->base_type.is_set()) { - // Already resolved +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); @@ -252,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; @@ -265,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; @@ -286,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; @@ -313,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; @@ -322,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; } @@ -333,11 +381,12 @@ 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; @@ -349,7 +398,7 @@ Error GDScriptAnalyzer::resolve_inheritance(GDScriptParser::ClassNode *p_class, 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; } @@ -358,15 +407,9 @@ 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; } @@ -402,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; @@ -422,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; } @@ -437,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; } - result.type_source = result.ANNOTATED_EXPLICIT; + if (p_type->get_datatype().is_resolving()) { + push_error(R"(Could not resolve datatype: Cyclic reference.)", p_type); + return bad_type; + } + + 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()) { @@ -458,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); @@ -506,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 { @@ -523,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)) { @@ -541,26 +602,28 @@ GDScriptParser::DataType GDScriptAnalyzer::resolve_datatype(GDScriptParser::Type 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(); + result = member.get_datatype(); break; case GDScriptParser::ClassNode::Member::ENUM: - result = member.m_enum->get_datatype(); + 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; 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_script_path()); - if (ref->raise_status(GDScriptParserRef::INTERFACE_SOLVED) != OK) { + 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 GDScriptParser::DataType(); + return bad_type; } result = ref->get_parser()->head->get_datatype(); result.is_meta_type = false; @@ -578,15 +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; } } } } 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) { @@ -597,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; } } @@ -629,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; @@ -656,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. @@ -667,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; } } @@ -730,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; @@ -741,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); @@ -754,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); } @@ -782,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; @@ -803,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; @@ -812,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++) { @@ -840,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); @@ -850,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); @@ -872,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. @@ -894,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; + + if (resolve_class_inheritance(p_class) != OK) { + return; } - resolve_class_interface(member.m_class); + 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]; @@ -958,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]; @@ -1057,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) { @@ -1066,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)); @@ -1149,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; } @@ -1158,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 @@ -1262,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; } @@ -1595,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) { @@ -2745,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; @@ -2768,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()); @@ -2860,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; @@ -2887,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. @@ -2904,36 +3167,31 @@ void GDScriptAnalyzer::reduce_identifier_from_base(GDScriptParser::IdentifierNod // TODO: Allow outer static functions. if (base_class->outer != nullptr) { List<GDScriptParser::ClassNode *> script_classes; - get_class_node_current_scope_classes(parser->current_class, &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)) { - const GDScriptParser::ClassNode::Member &member = script_class->get_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: { + 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: { + 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: { + 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()); + case GDScriptParser::ClassNode::Member::CLASS: + p_identifier->set_datatype(member.get_datatype()); return; - } break; default: break; } @@ -3139,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<GDScript> scr = node->get_script(); if (scr.is_valid()) { 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()); } @@ -3168,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; @@ -3347,53 +3596,42 @@ void GDScriptAnalyzer::reduce_subscript(GDScriptParser::SubscriptNode *p_subscri } GDScriptParser::DataType base_type = p_subscript->base->get_datatype(); - // If base is a class metatype, use the analyzer instead. - if (p_subscript->base->is_constant && !(base_type.is_meta_type && base_type.kind == GDScriptParser::DataType::CLASS)) { + 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_script_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 { - 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; @@ -3640,7 +3878,6 @@ void GDScriptAnalyzer::reduce_ternary_op(GDScriptParser::TernaryOpNode *p_ternar void GDScriptAnalyzer::reduce_unary_op(GDScriptParser::UnaryOpNode *p_unary_op) { reduce_expression(p_unary_op->operand); - GDScriptParser::DataType operand_type = p_unary_op->operand->get_datatype(); GDScriptParser::DataType result; if (p_unary_op->operand == nullptr) { @@ -3649,6 +3886,8 @@ 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()); @@ -3752,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()) { @@ -3912,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; } @@ -4082,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; @@ -4187,8 +4427,6 @@ bool GDScriptAnalyzer::is_type_compatible(const GDScriptParser::DataType &p_targ if (p_target.kind == GDScriptParser::DataType::BUILTIN) { bool valid = p_source.kind == GDScriptParser::DataType::BUILTIN && p_target.builtin_type == p_source.builtin_type; - valid |= p_source.builtin_type == Variant::STRING && p_target.builtin_type == Variant::STRING_NAME; - valid |= p_source.builtin_type == Variant::STRING_NAME && p_target.builtin_type == Variant::STRING; if (!valid && p_allow_implicit_conversion) { valid = Variant::can_convert_strict(p_source.builtin_type, p_target.builtin_type); } @@ -4204,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); } } } @@ -4279,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. } @@ -4315,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. } @@ -4329,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); } @@ -4361,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 44ca1593ed..a4d9efb094 100644 --- a/modules/gdscript/gdscript_analyzer.h +++ b/modules/gdscript/gdscript_analyzer.h @@ -52,18 +52,20 @@ class GDScriptAnalyzer { void get_class_node_current_scope_classes(GDScriptParser::ClassNode *p_node, List<GDScriptParser::ClassNode *> *p_list); - Error resolve_inheritance(GDScriptParser::ClassNode *p_class, bool p_recursive = true); + 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); @@ -115,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; @@ -128,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_cache.cpp b/modules/gdscript/gdscript_cache.cpp index d1467eea95..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; } diff --git a/modules/gdscript/gdscript_cache.h b/modules/gdscript/gdscript_cache.h index 0ee269f96c..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(); 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 2a98b856ce..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(); @@ -2299,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; 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/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/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 index 4511c3d10b..eb0003eed8 100644 --- a/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.gd +++ b/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.gd @@ -1,4 +1,11 @@ + +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) 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 index 70dd01d88e..09c199bde1 100644 --- a/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.out +++ b/modules/gdscript/tests/scripts/analyzer/features/array_string_stringname_equivalent.out @@ -1,3 +1,5 @@ GDTEST_OK ["abc"] [&"abc"] +["abc"] +[&"abc"] 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/gltf/editor/editor_scene_importer_fbx.cpp b/modules/gltf/editor/editor_scene_importer_fbx.cpp index fb5fb455b8..27e0052c1a 100644 --- a/modules/gltf/editor/editor_scene_importer_fbx.cpp +++ b/modules/gltf/editor/editor_scene_importer_fbx.cpp @@ -36,6 +36,7 @@ #include "core/config/project_settings.h" #include "editor/editor_settings.h" +#include "main/main.h" uint32_t EditorSceneFormatImporterFBX::get_import_flags() const { return ImportFlags::IMPORT_SCENE | ImportFlags::IMPORT_ANIMATION; @@ -111,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/gltf_document.cpp b/modules/gltf/gltf_document.cpp index f4db576b0c..d858f76b28 100644 --- a/modules/gltf/gltf_document.cpp +++ b/modules/gltf/gltf_document.cpp @@ -3384,177 +3384,179 @@ Error GLTFDocument::_serialize_materials(Ref<GLTFState> p_state) { if (!material->get_name().is_empty()) { 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(p_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; - p_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(); - } - } - 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(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; + 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; } - 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; @@ -3607,6 +3609,7 @@ Error GLTFDocument::_serialize_materials(Ref<GLTFState> p_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); @@ -3621,16 +3624,19 @@ Error GLTFDocument::_serialize_materials(Ref<GLTFState> p_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()) { diff --git a/modules/gltf/register_types.cpp b/modules/gltf/register_types.cpp index cd7a23fbb2..2322e13ae2 100644 --- a/modules/gltf/register_types.cpp +++ b/modules/gltf/register_types.cpp @@ -80,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 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 06ad806afc..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,17 +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_owner_id(region, get_instance_id()); - NavigationServer3D::get_singleton()->region_set_navigation_layers(region, navigation_layers); - NavigationServer3D::get_singleton()->region_set_navmesh(region, navmesh); + 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()) { @@ -673,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; } } @@ -751,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); } } @@ -775,14 +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_owner_id(region, get_instance_id()); - NavigationServer3D::get_singleton()->region_set_navigation_layers(region, navigation_layers); - NavigationServer3D::get_singleton()->region_set_navmesh(region, nm); + 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); @@ -824,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(); } } @@ -862,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) { @@ -1047,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); @@ -1056,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); @@ -1118,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); @@ -1281,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()); @@ -1390,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/csharp_script.cpp b/modules/mono/csharp_script.cpp index d0f52488bb..eca53c4831 100644 --- a/modules/mono/csharp_script.cpp +++ b/modules/mono/csharp_script.cpp @@ -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/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 6dac120d15..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 }; 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/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 2a7a9e2026..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), diff --git a/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/Marshaling.cs b/modules/mono/glue/GodotSharp/GodotSharp/Core/NativeInterop/Marshaling.cs index ab3d3ef60f..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 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 11f1e31384..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) 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/navigation/godot_navigation_server.cpp b/modules/navigation/godot_navigation_server.cpp index e5949c935b..c5c1912621 100644 --- a/modules/navigation/godot_navigation_server.cpp +++ b/modules/navigation/godot_navigation_server.cpp @@ -421,20 +421,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 } diff --git a/modules/navigation/godot_navigation_server.h b/modules/navigation/godot_navigation_server.h index 18431e39b8..6f39420c67 100644 --- a/modules/navigation/godot_navigation_server.h +++ b/modules/navigation/godot_navigation_server.h @@ -135,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; 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 b652ca4617..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()); } @@ -2341,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(); } @@ -2382,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 ac4bbff94c..806e859da0 100644 --- a/modules/openxr/openxr_api.h +++ b/modules/openxr/openxr_api.h @@ -150,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(); @@ -301,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(); diff --git a/modules/openxr/openxr_interface.cpp b/modules/openxr/openxr_interface.cpp index 40190ab2f3..d6f7cd7b3e 100644 --- a/modules/openxr/openxr_interface.cpp +++ b/modules/openxr/openxr_interface.cpp @@ -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/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/text_server_adv.cpp b/modules/text_server_adv/text_server_adv.cpp index 512643867b..f3e7ae9b83 100644 --- a/modules/text_server_adv/text_server_adv.cpp +++ b/modules/text_server_adv/text_server_adv.cpp @@ -3296,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; @@ -3388,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); @@ -3915,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); @@ -3935,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); @@ -3945,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); @@ -3953,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; @@ -4039,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; @@ -4067,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; @@ -6238,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(); @@ -6246,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) { @@ -6265,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/text_server_fb.cpp b/modules/text_server_fb/text_server_fb.cpp index 353d370f14..ea7b7a271b 100644 --- a/modules/text_server_fb/text_server_fb.cpp +++ b/modules/text_server_fb/text_server_fb.cpp @@ -2359,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); @@ -2451,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); @@ -2917,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); @@ -2938,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); @@ -2948,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); @@ -2956,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; @@ -3042,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; @@ -3070,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; @@ -4091,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/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/ios/display_server_ios.mm b/platform/ios/display_server_ios.mm index 23b70fbc28..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) { 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/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 1c5c8b2d19..57f125a754 100644 --- a/platform/linuxbsd/x11/display_server_x11.cpp +++ b/platform/linuxbsd/x11/display_server_x11.cpp @@ -3985,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/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/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 8f2f9f6cf5..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); 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 a083a98c72..f8633d29ac 100644 --- a/platform/windows/os_windows.cpp +++ b/platform/windows/os_windows.cpp @@ -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(); 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 904b6564bd..67c32dffb4 100644 --- a/scene/2d/navigation_agent_2d.cpp +++ b/scene/2d/navigation_agent_2d.cpp @@ -79,8 +79,8 @@ 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_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); @@ -329,11 +329,11 @@ 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 { +const Vector<Vector2> &NavigationAgent2D::get_current_navigation_path() const { return navigation_result->get_path(); } @@ -418,12 +418,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 @@ -445,7 +445,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")); } @@ -457,11 +457,11 @@ 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()) { + while (origin.distance_to(navigation_path[navigation_path_index]) < path_desired_distance) { + navigation_path_index += 1; + if (navigation_path_index == navigation_path.size()) { _check_distance_to_target(); - nav_path_index -= 1; + navigation_path_index -= 1; navigation_finished = true; emit_signal(SNAME("navigation_finished")); break; diff --git a/scene/2d/navigation_agent_2d.h b/scene/2d/navigation_agent_2d.h index 5abd3c0317..2c77bdc8db 100644 --- a/scene/2d/navigation_agent_2d.h +++ b/scene/2d/navigation_agent_2d.h @@ -62,7 +62,7 @@ class NavigationAgent2D : public Node { Vector2 target_location; 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 @@ -141,10 +141,10 @@ public: Vector2 get_next_location(); - const Vector<Vector2> &get_nav_path() const; + const Vector<Vector2> &get_current_navigation_path() const; - int get_nav_path_index() const { - return nav_path_index; + int get_current_navigation_path_index() const { + return navigation_path_index; } real_t distance_to_target() const; diff --git a/scene/2d/navigation_region_2d.cpp b/scene/2d/navigation_region_2d.cpp index 7bf3eec79b..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,15 +300,34 @@ 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); 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 3ae7a0b34d..6ab13c9aa7 100644 --- a/scene/2d/tile_map.cpp +++ b/scene/2d/tile_map.cpp @@ -1092,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; } @@ -1728,10 +1728,10 @@ 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)); @@ -1739,7 +1739,7 @@ void TileMap::_navigation_update_dirty_quadrants(SelfList<TileMapQuadrant>::List 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; } } @@ -1996,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; @@ -3905,35 +3904,26 @@ void TileMap::draw_cells_outline(Control *p_control, const RBSet<Vector2i> &p_ce 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); } } } 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 e907b9f66f..08ceb946df 100644 --- a/scene/3d/navigation_agent_3d.cpp +++ b/scene/3d/navigation_agent_3d.cpp @@ -83,8 +83,8 @@ 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_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); @@ -345,11 +345,11 @@ 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 { +const Vector<Vector3> &NavigationAgent3D::get_current_navigation_path() const { return navigation_result->get_path(); } @@ -433,12 +433,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); @@ -462,7 +462,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")); } @@ -474,11 +474,11 @@ 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()) { + while (origin.distance_to(navigation_path[navigation_path_index] - Vector3(0, navigation_height_offset, 0)) < path_desired_distance) { + navigation_path_index += 1; + if (navigation_path_index == navigation_path.size()) { _check_distance_to_target(); - nav_path_index -= 1; + navigation_path_index -= 1; navigation_finished = true; emit_signal(SNAME("navigation_finished")); break; diff --git a/scene/3d/navigation_agent_3d.h b/scene/3d/navigation_agent_3d.h index 90ceab0242..1caa783a8b 100644 --- a/scene/3d/navigation_agent_3d.h +++ b/scene/3d/navigation_agent_3d.h @@ -64,7 +64,7 @@ class NavigationAgent3D : public Node { Vector3 target_location; 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 @@ -153,10 +153,10 @@ public: Vector3 get_next_location(); - const Vector<Vector3> &get_nav_path() const; + const Vector<Vector3> &get_current_navigation_path() const; - int get_nav_path_index() const { - return nav_path_index; + int get_current_navigation_path_index() const { + return navigation_path_index; } real_t distance_to_target() const; diff --git a/scene/3d/navigation_region_3d.cpp b/scene/3d/navigation_region_3d.cpp index bd96c55512..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(); @@ -353,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); @@ -392,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); } @@ -412,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; } @@ -450,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]]); @@ -528,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 a60ccd2169..32bbea8ff3 100644 --- a/scene/3d/node_3d.cpp +++ b/scene/3d/node_3d.cpp @@ -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(); @@ -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_tree.cpp b/scene/animation/animation_tree.cpp index fbc85bd5e1..b06a21dea9 100644 --- a/scene/animation/animation_tree.cpp +++ b/scene/animation/animation_tree.cpp @@ -1759,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 68af7af5d4..21c7c4ddb4 100644 --- a/scene/gui/control.cpp +++ b/scene/gui/control.cpp @@ -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; @@ -3042,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); @@ -3049,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); @@ -3217,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"); diff --git a/scene/gui/control.h b/scene/gui/control.h index 12710f3a93..f82fba3b1b 100644 --- a/scene/gui/control.h +++ b/scene/gui/control.h @@ -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/rich_text_label.cpp b/scene/gui/rich_text_label.cpp index f26e05518e..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: @@ -3298,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); @@ -3308,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; @@ -3788,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; } @@ -3809,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") { @@ -3862,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())); + } } } } @@ -5287,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/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 35cc29d080..79bad44e15 100644 --- a/scene/gui/tree.cpp +++ b/scene/gui/tree.cpp @@ -3785,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; @@ -3801,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; @@ -5281,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); @@ -5290,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/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/register_scene_types.cpp b/scene/register_scene_types.cpp index 043895b591..4f300cb5d6 100644 --- a/scene/register_scene_types.cpp +++ b/scene/register_scene_types.cpp @@ -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/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/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 e871ca007c..092f672cba 100644 --- a/scene/resources/resource_format_text.cpp +++ b/scene/resources/resource_format_text.cpp @@ -982,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/servers/audio/audio_stream.cpp b/servers/audio/audio_stream.cpp index 113e728106..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(); @@ -709,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 c6ae6817e7..0d3f7bca04 100644 --- a/servers/audio/audio_stream.h +++ b/servers/audio/audio_stream.h @@ -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/navigation_server_2d.cpp b/servers/navigation_server_2d.cpp index 4ed998a77e..1614b8e2f5 100644 --- a/servers/navigation_server_2d.cpp +++ b/servers/navigation_server_2d.cpp @@ -154,7 +154,7 @@ static ObjectID id_to_id(const ObjectID &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>(); } @@ -258,7 +258,7 @@ void NavigationServer2D::_bind_methods() { 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); @@ -361,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); diff --git a/servers/navigation_server_2d.h b/servers/navigation_server_2d.h index cf6011a0f9..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" @@ -126,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; diff --git a/servers/navigation_server_3d.cpp b/servers/navigation_server_3d.cpp index 940dd61f67..cbefe48633 100644 --- a/servers/navigation_server_3d.cpp +++ b/servers/navigation_server_3d.cpp @@ -77,8 +77,8 @@ void NavigationServer3D::_bind_methods() { 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); @@ -155,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); } diff --git a/servers/navigation_server_3d.h b/servers/navigation_server_3d.h index bf4c22be8a..65d6d19073 100644 --- a/servers/navigation_server_3d.h +++ b/servers/navigation_server_3d.h @@ -138,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; 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_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/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 d41daa18b4..f7302adbf6 100644 --- a/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp +++ b/servers/rendering/renderer_rd/renderer_canvas_render_rd.cpp @@ -1136,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; @@ -2001,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 @@ -2216,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; } @@ -2304,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 6e876b1297..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() {} 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 1b5665855f..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); 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 ec19094537..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; } @@ -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 diff --git a/servers/rendering/rendering_device.h b/servers/rendering/rendering_device.h index 27c3f77c5b..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 { @@ -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); @@ -1329,6 +1333,39 @@ protected: 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) 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 39b87fc483..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; } @@ -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 69f9a479ed..551e4e9087 100644 --- a/servers/text/text_server_extension.h +++ b/servers/text/text_server_extension.h @@ -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; @@ -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/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 ed38fe0ec8..8b73927050 100644 --- a/thirdparty/README.md +++ b/thirdparty/README.md @@ -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: @@ -548,7 +548,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/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/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; }; |