summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--COPYRIGHT.txt2
-rw-r--r--DONORS.md78
-rw-r--r--core/image.cpp12
-rw-r--r--core/message_queue.cpp2
-rw-r--r--core/os/dir_access.cpp6
-rw-r--r--core/os/os.h1
-rw-r--r--doc/classes/@GDScript.xml8
-rw-r--r--doc/classes/AnimationPlayer.xml6
-rw-r--r--doc/classes/CPUParticles.xml6
-rw-r--r--doc/classes/CPUParticles2D.xml6
-rw-r--r--doc/classes/CanvasItem.xml2
-rw-r--r--doc/classes/ColorPicker.xml34
-rw-r--r--doc/classes/ConvexPolygonShape2D.xml2
-rw-r--r--doc/classes/Environment.xml2
-rw-r--r--doc/classes/Generic6DOFJoint.xml2
-rw-r--r--doc/classes/MenuButton.xml5
-rw-r--r--doc/classes/TextEdit.xml4
-rw-r--r--doc/classes/Theme.xml6
-rw-r--r--doc/classes/VisualServer.xml4
-rwxr-xr-xdoc/tools/makerst.py2
-rw-r--r--editor/code_editor.cpp1
-rw-r--r--editor/create_dialog.cpp7
-rw-r--r--editor/dependency_editor.cpp15
-rw-r--r--editor/dependency_editor.h2
-rw-r--r--editor/editor_export.cpp24
-rw-r--r--editor/editor_export.h1
-rw-r--r--editor/editor_file_dialog.cpp5
-rw-r--r--editor/editor_help_search.cpp9
-rw-r--r--editor/editor_node.cpp48
-rw-r--r--editor/editor_node.h3
-rw-r--r--editor/editor_properties.cpp40
-rw-r--r--editor/editor_properties.h2
-rw-r--r--editor/editor_resource_preview.cpp4
-rw-r--r--editor/editor_settings.cpp8
-rw-r--r--editor/editor_spin_slider.cpp6
-rw-r--r--editor/editor_spin_slider.h1
-rw-r--r--editor/editor_themes.cpp2
-rw-r--r--editor/filesystem_dock.cpp23
-rw-r--r--editor/filesystem_dock.h7
-rw-r--r--editor/find_in_files.cpp9
-rw-r--r--editor/find_in_files.h1
-rw-r--r--editor/import/editor_import_collada.cpp2
-rw-r--r--editor/import/editor_scene_importer_gltf.cpp11
-rw-r--r--editor/plugins/abstract_polygon_2d_editor.cpp36
-rw-r--r--editor/plugins/abstract_polygon_2d_editor.h6
-rw-r--r--editor/plugins/canvas_item_editor_plugin.cpp8
-rw-r--r--editor/plugins/collision_polygon_editor_plugin.cpp2
-rw-r--r--editor/plugins/light_occluder_2d_editor_plugin.cpp424
-rw-r--r--editor/plugins/light_occluder_2d_editor_plugin.h73
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.cpp310
-rw-r--r--editor/plugins/polygon_2d_editor_plugin.h10
-rw-r--r--editor/plugins/script_editor_plugin.cpp42
-rw-r--r--editor/plugins/script_text_editor.cpp8
-rw-r--r--editor/plugins/shader_editor_plugin.cpp21
-rw-r--r--editor/plugins/shader_editor_plugin.h4
-rw-r--r--editor/plugins/spatial_editor_plugin.cpp2
-rw-r--r--editor/plugins/text_editor.cpp2
-rw-r--r--editor/plugins/texture_region_editor_plugin.cpp151
-rw-r--r--editor/plugins/texture_region_editor_plugin.h11
-rw-r--r--editor/plugins/tile_map_editor_plugin.cpp2
-rw-r--r--editor/plugins/tile_set_editor_plugin.cpp504
-rw-r--r--editor/plugins/tile_set_editor_plugin.h14
-rw-r--r--editor/plugins/visual_shader_editor_plugin.cpp28
-rw-r--r--editor/project_export.cpp54
-rw-r--r--editor/project_export.h8
-rw-r--r--editor/project_manager.cpp87
-rw-r--r--editor/project_manager.h6
-rw-r--r--editor/project_settings_editor.cpp8
-rw-r--r--editor/settings_config_dialog.cpp7
-rw-r--r--editor/translations/af.po19
-rw-r--r--editor/translations/ar.po18
-rw-r--r--editor/translations/bg.po18
-rw-r--r--editor/translations/bn.po21
-rw-r--r--editor/translations/ca.po21
-rw-r--r--editor/translations/cs.po323
-rw-r--r--editor/translations/da.po19
-rw-r--r--editor/translations/de.po266
-rw-r--r--editor/translations/de_CH.po12
-rw-r--r--editor/translations/editor.pot12
-rw-r--r--editor/translations/el.po21
-rw-r--r--editor/translations/es.po55
-rw-r--r--editor/translations/es_AR.po283
-rw-r--r--editor/translations/fa.po19
-rw-r--r--editor/translations/fi.po28
-rw-r--r--editor/translations/fr.po181
-rw-r--r--editor/translations/he.po18
-rw-r--r--editor/translations/hi.po19
-rw-r--r--editor/translations/hu.po18
-rw-r--r--editor/translations/id.po18
-rw-r--r--editor/translations/is.po12
-rw-r--r--editor/translations/it.po21
-rw-r--r--editor/translations/ja.po115
-rw-r--r--editor/translations/ka.po19
-rw-r--r--editor/translations/ko.po255
-rw-r--r--editor/translations/lt.po19
-rw-r--r--editor/translations/lv.po17
-rw-r--r--editor/translations/ml.po12
-rw-r--r--editor/translations/ms.po12
-rw-r--r--editor/translations/nb.po18
-rw-r--r--editor/translations/nl.po208
-rw-r--r--editor/translations/pl.po885
-rw-r--r--editor/translations/pr.po12
-rw-r--r--editor/translations/pt_BR.po49
-rw-r--r--editor/translations/pt_PT.po319
-rw-r--r--editor/translations/ro.po18
-rw-r--r--editor/translations/ru.po166
-rw-r--r--editor/translations/si.po12
-rw-r--r--editor/translations/sk.po12
-rw-r--r--editor/translations/sl.po19
-rw-r--r--editor/translations/sr_Cyrl.po18
-rw-r--r--editor/translations/sr_Latn.po12
-rw-r--r--editor/translations/sv.po18
-rw-r--r--editor/translations/ta.po12
-rw-r--r--editor/translations/th.po21
-rw-r--r--editor/translations/tr.po21
-rw-r--r--editor/translations/uk.po284
-rw-r--r--editor/translations/ur_PK.po12
-rw-r--r--editor/translations/vi.po19
-rw-r--r--editor/translations/zh_CN.po281
-rw-r--r--editor/translations/zh_HK.po19
-rw-r--r--editor/translations/zh_TW.po19
-rw-r--r--main/main.cpp11
-rw-r--r--main/tests/test_io.cpp133
-rw-r--r--main/tests/test_io.h45
-rw-r--r--main/tests/test_main.cpp7
-rw-r--r--misc/dist/document_icon.svg12
-rw-r--r--misc/dist/document_icons/gdscript.svg1
-rw-r--r--misc/dist/document_icons/gdscript_extra_small.svg1
-rw-r--r--misc/dist/document_icons/gdscript_small.svg1
-rw-r--r--misc/dist/document_icons/project.svg1
-rw-r--r--misc/dist/document_icons/project_extra_small.svg1
-rw-r--r--misc/dist/document_icons/project_small.svg1
-rw-r--r--misc/dist/document_icons/resource.svg1
-rw-r--r--misc/dist/document_icons/resource_extra_small.svg1
-rw-r--r--misc/dist/document_icons/resource_small.svg1
-rw-r--r--misc/dist/document_icons/scene.svg1
-rw-r--r--misc/dist/document_icons/scene_extra_small.svg1
-rw-r--r--misc/dist/document_icons/scene_small.svg1
-rw-r--r--misc/dist/linux/godot.62
-rwxr-xr-xmisc/dist/osx_tools.app/Contents/Info.plist59
-rw-r--r--misc/dist/osx_tools.app/Contents/Resources/Document.icnsbin143464 -> 0 bytes
-rw-r--r--misc/dist/osx_tools.app/Contents/Resources/GDScript.icnsbin0 -> 185973 bytes
-rw-r--r--misc/dist/osx_tools.app/Contents/Resources/Project.icnsbin0 -> 208221 bytes
-rw-r--r--misc/dist/osx_tools.app/Contents/Resources/Resource.icnsbin0 -> 176973 bytes
-rw-r--r--misc/dist/osx_tools.app/Contents/Resources/Scene.icnsbin0 -> 150612 bytes
-rw-r--r--modules/bullet/shape_bullet.cpp57
-rw-r--r--modules/csg/csg_shape.cpp13
-rw-r--r--modules/csg/csg_shape.h1
-rw-r--r--modules/gdscript/gdscript_functions.cpp12
-rw-r--r--modules/gdscript/gdscript_parser.cpp21
-rw-r--r--modules/mono/csharp_script.cpp31
-rw-r--r--modules/mono/csharp_script.h4
-rw-r--r--modules/mono/mono_gd/gd_mono_class.cpp21
-rw-r--r--modules/mono/mono_gd/gd_mono_class.h7
-rw-r--r--modules/mono/mono_gd/gd_mono_method.cpp27
-rw-r--r--modules/mono/mono_gd/gd_mono_method.h5
-rw-r--r--modules/visual_script/visual_script_editor.cpp1
-rw-r--r--modules/webp/SCsub2
-rw-r--r--platform/iphone/export/export.cpp70
-rw-r--r--platform/iphone/gl_view.mm3
-rw-r--r--platform/x11/os_x11.cpp10
-rw-r--r--scene/2d/canvas_item.cpp2
-rw-r--r--scene/2d/navigation_polygon.cpp10
-rw-r--r--scene/2d/path_2d.cpp2
-rw-r--r--scene/2d/tile_map.cpp4
-rw-r--r--scene/3d/path.cpp2
-rw-r--r--scene/3d/sprite_3d.cpp4
-rw-r--r--scene/animation/animation_tree_player.cpp10
-rw-r--r--scene/animation/animation_tree_player.h2
-rw-r--r--scene/gui/color_picker.cpp27
-rw-r--r--scene/gui/color_picker.h3
-rw-r--r--scene/gui/control.cpp18
-rw-r--r--scene/gui/graph_edit.cpp4
-rw-r--r--scene/gui/menu_button.cpp19
-rw-r--r--scene/gui/menu_button.h3
-rw-r--r--scene/gui/text_edit.cpp41
-rw-r--r--scene/gui/text_edit.h4
-rw-r--r--scene/main/viewport.cpp7
-rw-r--r--scene/resources/material.cpp2
-rw-r--r--scene/resources/primitive_meshes.cpp44
-rw-r--r--scene/resources/surface_tool.cpp2
-rw-r--r--scene/resources/tile_set.cpp47
-rw-r--r--scene/resources/tile_set.h4
-rw-r--r--servers/visual/visual_server_canvas.cpp6
-rw-r--r--servers/visual_server.cpp2
-rw-r--r--thirdparty/README.md4
-rw-r--r--thirdparty/libwebp/src/dec/alphai_dec.h2
-rw-r--r--thirdparty/libwebp/src/dec/buffer_dec.c3
-rw-r--r--thirdparty/libwebp/src/dec/common_dec.h2
-rw-r--r--thirdparty/libwebp/src/dec/frame_dec.c9
-rw-r--r--thirdparty/libwebp/src/dec/idec_dec.c25
-rw-r--r--thirdparty/libwebp/src/dec/vp8_dec.h2
-rw-r--r--thirdparty/libwebp/src/dec/vp8i_dec.h4
-rw-r--r--thirdparty/libwebp/src/dec/vp8l_dec.c103
-rw-r--r--thirdparty/libwebp/src/dec/vp8li_dec.h2
-rw-r--r--thirdparty/libwebp/src/dec/webpi_dec.h2
-rw-r--r--thirdparty/libwebp/src/demux/demux.c2
-rw-r--r--thirdparty/libwebp/src/dsp/dsp.h6
-rw-r--r--thirdparty/libwebp/src/dsp/enc.c6
-rw-r--r--thirdparty/libwebp/src/dsp/enc_avx2.c21
-rw-r--r--thirdparty/libwebp/src/dsp/lossless.c2
-rw-r--r--thirdparty/libwebp/src/dsp/lossless.h14
-rw-r--r--thirdparty/libwebp/src/dsp/lossless_enc.c86
-rw-r--r--thirdparty/libwebp/src/dsp/lossless_enc_mips32.c79
-rw-r--r--thirdparty/libwebp/src/dsp/lossless_enc_sse2.c44
-rw-r--r--thirdparty/libwebp/src/dsp/msa_macro.h2
-rw-r--r--thirdparty/libwebp/src/dsp/rescaler.c4
-rw-r--r--thirdparty/libwebp/src/dsp/rescaler_mips32.c4
-rw-r--r--thirdparty/libwebp/src/dsp/rescaler_mips_dsp_r2.c10
-rw-r--r--thirdparty/libwebp/src/dsp/rescaler_msa.c7
-rw-r--r--thirdparty/libwebp/src/dsp/rescaler_neon.c18
-rw-r--r--thirdparty/libwebp/src/dsp/rescaler_sse2.c35
-rw-r--r--thirdparty/libwebp/src/dsp/yuv.h2
-rw-r--r--thirdparty/libwebp/src/enc/analysis_enc.c2
-rw-r--r--thirdparty/libwebp/src/enc/backward_references_cost_enc.c2
-rw-r--r--thirdparty/libwebp/src/enc/backward_references_enc.c1
-rw-r--r--thirdparty/libwebp/src/enc/cost_enc.h2
-rw-r--r--thirdparty/libwebp/src/enc/delta_palettization_enc.c455
-rw-r--r--thirdparty/libwebp/src/enc/delta_palettization_enc.h25
-rw-r--r--thirdparty/libwebp/src/enc/histogram_enc.c196
-rw-r--r--thirdparty/libwebp/src/enc/histogram_enc.h10
-rw-r--r--thirdparty/libwebp/src/enc/iterator_enc.c2
-rw-r--r--thirdparty/libwebp/src/enc/picture_tools_enc.c41
-rw-r--r--thirdparty/libwebp/src/enc/vp8i_enc.h6
-rw-r--r--thirdparty/libwebp/src/enc/vp8l_enc.c17
-rw-r--r--thirdparty/libwebp/src/enc/vp8li_enc.h2
-rw-r--r--thirdparty/libwebp/src/mux/animi.h2
-rw-r--r--thirdparty/libwebp/src/mux/muxedit.c18
-rw-r--r--thirdparty/libwebp/src/mux/muxi.h18
-rw-r--r--thirdparty/libwebp/src/mux/muxinternal.c53
-rw-r--r--thirdparty/libwebp/src/mux/muxread.c61
-rw-r--r--thirdparty/libwebp/src/utils/bit_reader_inl_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/bit_reader_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/bit_writer_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/filters_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/quant_levels_dec_utils.c8
-rw-r--r--thirdparty/libwebp/src/utils/quant_levels_dec_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/quant_levels_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/random_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/rescaler_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/thread_utils.h2
-rw-r--r--thirdparty/libwebp/src/utils/utils.h2
-rw-r--r--thirdparty/libwebp/src/webp/decode.h2
-rw-r--r--thirdparty/libwebp/src/webp/demux.h2
-rw-r--r--thirdparty/libwebp/src/webp/encode.h2
-rw-r--r--thirdparty/libwebp/src/webp/format_constants.h2
-rw-r--r--thirdparty/libwebp/src/webp/mux.h2
-rw-r--r--thirdparty/libwebp/src/webp/mux_types.h2
-rw-r--r--thirdparty/libwebp/src/webp/types.h2
-rw-r--r--thirdparty/tinyexr/tinyexr.h253
250 files changed, 4494 insertions, 4623 deletions
diff --git a/COPYRIGHT.txt b/COPYRIGHT.txt
index 894cd1a53a..2a1fe20477 100644
--- a/COPYRIGHT.txt
+++ b/COPYRIGHT.txt
@@ -382,7 +382,7 @@ License: Expat
Files: ./thirdparty/tinyexr/
Comment: TinyEXR
-Copyright: 2014-2017, Syoyo Fujita
+Copyright: 2014-2018, Syoyo Fujita
2002, Industrial Light & Magic, a division of Lucas Digital Ltd. LLC
License: BSD-3-clause
diff --git a/DONORS.md b/DONORS.md
index 2c9bb1eb73..ed14a4e8da 100644
--- a/DONORS.md
+++ b/DONORS.md
@@ -22,23 +22,30 @@ generous deed immortalized in the next stable release of Godot Engine.
## Mini sponsors
+ Alan Beauchamp
Andrew Dunai
+ Arda Erol
Brandon Lamb
Christian Uldall Pedersen
Christoph Woinke
- David Graham
GameDev.net
Hein-Pieter van Braam
- iDev.Network Studios
Jamal Alyafei
+ Javary Games
+ Jay Sistar
+ Justin Arnold
+ Kyle Szklenski
Leona Eden
Matthieu Huvé
+ Maxim Karsten
Mike King
Nathan Warden
Neal Gompa (Conan Kudo)
Patrick Aarstad
+ "Rainway "
Ruslan Mustakov
Slobodan Milnovic
+ StarFlare Software
Stephan Lanfermann
Stoney Meyerhoeffer
thechris
@@ -49,11 +56,14 @@ generous deed immortalized in the next stable release of Godot Engine.
Asdf
cheese65536
+ David Gehrig
K9Kraken
Manuele Finocchiaro
Nathanael Beisiegel
Officine Pixel S.n.c.
Retro Village
+ Valorware
+ Zashi
Zaven Muradyan
13MHz
@@ -61,18 +71,18 @@ generous deed immortalized in the next stable release of Godot Engine.
Andreas Schüle
Austen McRae
Daniel Lynn
- David Gehrig
Florian Breisch
Gary Oberbrunner
Jay Horton
Johannes Wuensch
+ Jon Woodward
Joshua Lesperance
+ Justo Delgado Baudí
Krzysztof Dluzniewski
- Kyle Szklenski
- Mohammad Taleb
Moonwards
+ Mored1984
+ paul gruenbacher
Paul LaMotte
- Ranoller
Sergey
Svenne Krap
Xananax
@@ -87,11 +97,11 @@ generous deed immortalized in the next stable release of Godot Engine.
David Churchill
Dean Harmon
John
- Justo Delgado Baudí
+ Krzysztof Jankowski
KTL
Laurence Bannister
Markus Wiesner
- paul gruenbacher
+ Nathan Lundquist
Rami
Robert Willes
Robin Arys
@@ -105,16 +115,21 @@ generous deed immortalized in the next stable release of Godot Engine.
Alessandra Pereyra
Alexey Dyadchenko
Amanda Haldy
+ Benjamin W Flint
Chau Siu Hung
Chris Brown
Chris Petrich
+ Christian Leth Jeppesen
+ Christopher
Cody Parker
+ ComicSads
D
Deadly Lampshade
E.G.
Eric
Eric Monson
Ethan Bennis
+ Eugenio Hugo Salgüero Jáñez
Fidget Sinner
flesk
G Barnes
@@ -122,24 +137,23 @@ generous deed immortalized in the next stable release of Godot Engine.
GGGames.org
Giovanni Solimeno
Guilherme Felipe de C. G. da Silva
- Hasen Judy
Heath Hayes
Jeppe Zapp
joe513
+ Jose Malheiro
Juraj Móza
- Justin Arnold
+ Klavdij Voncina
Leandro Voltolino
Marius Kamm
Marvin
- Nahuel Sacchetti
Nick Nikitin
- Pablo Cholaky
+ oziatek
Pete Goodwin
+ Ranoller
ray-tracer
Ruben Soares Luis
Sofox
Stoned Xander
- Trent McPheron
WytRabbit
Zachariah Gibbons
@@ -152,9 +166,8 @@ generous deed immortalized in the next stable release of Godot Engine.
Alder Stefano
Alessandro Senese
Alexander Koppe
- Anders Jensen-Urstad
+ Andreas Krampitz
Anthony Bongiovanni
- Arda Erol
Arthur S. Muszynski
Artur Barichello
Aubrey Falconer
@@ -163,9 +176,11 @@ generous deed immortalized in the next stable release of Godot Engine.
Bastian Böhm
Benedikt
Ben Vercammen
+ Bernd Jänichen
Blair Allen
Brandon
Bryan Stevenson
+ bugcaptor
Carl Winder
Carwyn Edwards
Casey Foote
@@ -176,42 +191,45 @@ generous deed immortalized in the next stable release of Godot Engine.
Daniel Johnson
Daniel Kaplan
DanielMaximiano
- David
David Cravens
David May
- Disktra
Dominik Wetzel
Duy Kevin Nguyen
Edward Herbert
Elias Nykrem
Eric Martini
+ Eric McCarthy
Eric Williams
- Eugenio Hugo Salgüero Jáñez
Fabian Becker
fengjiongmax
+ Florian Richer
Foomf
G3Dev sàrl
George Lesica
Gerrit Großkopf
Gilberto K. Otubo
+ Grant Clarke
Greg Olson
Guldoman
Heribert Hirth
Hunter Jones
ialex32x
+ Igor Buzatovic
Jahn Johansen
Jaime Ruiz-Borau Vizárraga
Jako Danar
Jeff Hungerford
+ Joan Fons
Joel Fivat
Johan Lindberg
Jonas Rudlang
Jonas Yamazaki
+ Jonathan G
Jonathan Martin
Jonathan Nieto
+ Jonathon
Jon Bonazza
Jon Sully
- Jose Malheiro
Josh 'Cheeseness' Bush
Juanfran
Juan Negrier
@@ -220,16 +238,17 @@ generous deed immortalized in the next stable release of Godot Engine.
Justin Luk
KC Chan
Kevin Boyer
- Kevin Kamper Meejach Petersen
- Klavdij Voncina
- Krzysztof Jankowski
- Krzysztof Sierszecki
+ Kevin van Rooijen
+ Klagsam
KsyTek Games
+ Kuan Cheang
+ kycho
Linus Lind Lundgren
Loreshaper Games
Luis Moraes
Macil
magodev
+ Major Haul
Malcolm
Martin Eigel
Matt Welke
@@ -251,10 +270,9 @@ generous deed immortalized in the next stable release of Godot Engine.
Niclas Eriksen
Nicolás Montaña
Nicolas SAN AGUSTIN
- Nik
- Noi Sek
Pan Ip
Pascal Grüter
+ Pat LaBine
Patrick Nafarrete
Paul E Hansen
Paul Gieske
@@ -265,12 +283,17 @@ generous deed immortalized in the next stable release of Godot Engine.
Pietro Vertechi
Piotr Kaczmarski
Prokhorenko Leonid
+ Psyagnostic
+ rayos
Rémi Verschelde
+ Ricardo Alcantara
Richman Stewart
Roger Burgess
Roger Smith
Roman Tinkov
Sasori Olkof
+ Sebastian Michailidis
+ Shane Spoor
Sootstone
Theo Cranmore
Thibault Barbaroux
@@ -279,15 +302,18 @@ generous deed immortalized in the next stable release of Godot Engine.
Thomas Kurz
tiansheng li
Tim
+ Tim Drumheller
Tom Larrow
+ Troy Austin
Trym Nilsen
- Tyggve Sollid
+ Tryggve Sollid
Tyler Stafos
UltyX
Vaiktorg
Victor
Viktor Ferenczi
waka nya
+ William Hogben
Wout Standaert
## Bronze donors
diff --git a/core/image.cpp b/core/image.cpp
index 698a0b0b98..dca8aedb8f 100644
--- a/core/image.cpp
+++ b/core/image.cpp
@@ -1931,7 +1931,8 @@ void Image::blit_rect(const Ref<Image> &p_src, const Rect2 &p_src_rect, const Po
if (clipped_src_rect.size.x <= 0 || clipped_src_rect.size.y <= 0)
return;
- Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest, clipped_src_rect.size));
+ Point2 src_underscan = Point2(MIN(0, p_src_rect.position.x), MIN(0, p_src_rect.position.y));
+ Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest - src_underscan, clipped_src_rect.size));
PoolVector<uint8_t>::Write wp = data.write();
uint8_t *dst_data_ptr = wp.ptr();
@@ -1985,7 +1986,8 @@ void Image::blit_rect_mask(const Ref<Image> &p_src, const Ref<Image> &p_mask, co
if (clipped_src_rect.size.x <= 0 || clipped_src_rect.size.y <= 0)
return;
- Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest, clipped_src_rect.size));
+ Point2 src_underscan = Point2(MIN(0, p_src_rect.position.x), MIN(0, p_src_rect.position.y));
+ Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest - src_underscan, clipped_src_rect.size));
PoolVector<uint8_t>::Write wp = data.write();
uint8_t *dst_data_ptr = wp.ptr();
@@ -2042,7 +2044,8 @@ void Image::blend_rect(const Ref<Image> &p_src, const Rect2 &p_src_rect, const P
if (clipped_src_rect.size.x <= 0 || clipped_src_rect.size.y <= 0)
return;
- Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest, clipped_src_rect.size));
+ Point2 src_underscan = Point2(MIN(0, p_src_rect.position.x), MIN(0, p_src_rect.position.y));
+ Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest - src_underscan, clipped_src_rect.size));
lock();
Ref<Image> img = p_src;
@@ -2096,7 +2099,8 @@ void Image::blend_rect_mask(const Ref<Image> &p_src, const Ref<Image> &p_mask, c
if (clipped_src_rect.size.x <= 0 || clipped_src_rect.size.y <= 0)
return;
- Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest, clipped_src_rect.size));
+ Point2 src_underscan = Point2(MIN(0, p_src_rect.position.x), MIN(0, p_src_rect.position.y));
+ Rect2i dest_rect = Rect2i(0, 0, width, height).clip(Rect2i(p_dest - src_underscan, clipped_src_rect.size));
lock();
Ref<Image> img = p_src;
diff --git a/core/message_queue.cpp b/core/message_queue.cpp
index abfc73407a..2952593798 100644
--- a/core/message_queue.cpp
+++ b/core/message_queue.cpp
@@ -209,9 +209,9 @@ void MessageQueue::statistics() {
} break;
}
+ } else {
//object was deleted
print_line("Object was deleted while awaiting a callback");
- } else {
null_count++;
}
diff --git a/core/os/dir_access.cpp b/core/os/dir_access.cpp
index daa3eacd5f..ce70b859eb 100644
--- a/core/os/dir_access.cpp
+++ b/core/os/dir_access.cpp
@@ -431,8 +431,12 @@ Error DirAccess::copy_dir(String p_from, String p_to, int p_chmod_flags) {
ERR_FAIL_COND_V(err, err);
}
+ if (!p_to.ends_with("/")) {
+ p_to = p_to + "/";
+ }
+
DirChanger dir_changer(this, p_from);
- Error err = _copy_dir(target_da, p_to + "/", p_chmod_flags);
+ Error err = _copy_dir(target_da, p_to, p_chmod_flags);
memdelete(target_da);
return err;
diff --git a/core/os/os.h b/core/os/os.h
index 7786ffb26e..53a5ebde01 100644
--- a/core/os/os.h
+++ b/core/os/os.h
@@ -480,6 +480,7 @@ public:
enum EngineContext {
CONTEXT_EDITOR,
CONTEXT_PROJECTMAN,
+ CONTEXT_ENGINE,
};
virtual void set_context(int p_context);
diff --git a/doc/classes/@GDScript.xml b/doc/classes/@GDScript.xml
index 20ec9141c6..349daae6d9 100644
--- a/doc/classes/@GDScript.xml
+++ b/doc/classes/@GDScript.xml
@@ -751,6 +751,10 @@
<argument index="0" name="message" type="String">
</argument>
<description>
+ Pushes an error message to Godot's built-in debugger and to the OS terminal.
+ [codeblock]
+ push_error("test error") # prints "test error" to debugger and terminal as error call
+ [/codeblock]
</description>
</method>
<method name="push_warning">
@@ -759,6 +763,10 @@
<argument index="0" name="message" type="String">
</argument>
<description>
+ Pushes a warning message to Godot's built-in debugger and to the OS terminal.
+ [codeblock]
+ push_warning("test warning") # prints "test warning" to debugger and terminal as warning call
+ [/codeblock]
</description>
</method>
<method name="rad2deg">
diff --git a/doc/classes/AnimationPlayer.xml b/doc/classes/AnimationPlayer.xml
index 3b3638a4f3..499da4b8a3 100644
--- a/doc/classes/AnimationPlayer.xml
+++ b/doc/classes/AnimationPlayer.xml
@@ -110,6 +110,12 @@
Get the actual playing speed of current animation or 0 if not playing. This speed is the [code]playback_speed[/code] property multiplied by [code]custom_speed[/code] argument specified when calling the [code]play[/code] method.
</description>
</method>
+ <method name="get_queue">
+ <return type="PoolStringArray">
+ </return>
+ <description>
+ </description>
+ </method>
<method name="has_animation" qualifiers="const">
<return type="bool">
</return>
diff --git a/doc/classes/CPUParticles.xml b/doc/classes/CPUParticles.xml
index c778cd56b3..2073ca0664 100644
--- a/doc/classes/CPUParticles.xml
+++ b/doc/classes/CPUParticles.xml
@@ -127,11 +127,11 @@
</member>
<member name="randomness" type="float" setter="set_randomness_ratio" getter="get_randomness_ratio">
</member>
- <member name="scale" type="float" setter="set_param" getter="get_param">
+ <member name="scale_amount" type="float" setter="set_param" getter="get_param">
</member>
- <member name="scale_curve" type="Curve" setter="set_param_curve" getter="get_param_curve">
+ <member name="scale_amount_curve" type="Curve" setter="set_param_curve" getter="get_param_curve">
</member>
- <member name="scale_random" type="float" setter="set_param_randomness" getter="get_param_randomness">
+ <member name="scale_amount_random" type="float" setter="set_param_randomness" getter="get_param_randomness">
</member>
<member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale">
</member>
diff --git a/doc/classes/CPUParticles2D.xml b/doc/classes/CPUParticles2D.xml
index bae725d47c..12a176589c 100644
--- a/doc/classes/CPUParticles2D.xml
+++ b/doc/classes/CPUParticles2D.xml
@@ -123,11 +123,11 @@
</member>
<member name="randomness" type="float" setter="set_randomness_ratio" getter="get_randomness_ratio">
</member>
- <member name="scale" type="float" setter="set_param" getter="get_param">
+ <member name="scale_amount" type="float" setter="set_param" getter="get_param">
</member>
- <member name="scale_curve" type="Curve" setter="set_param_curve" getter="get_param_curve">
+ <member name="scale_amount_curve" type="Curve" setter="set_param_curve" getter="get_param_curve">
</member>
- <member name="scale_random" type="float" setter="set_param_randomness" getter="get_param_randomness">
+ <member name="scale_amount_random" type="float" setter="set_param_randomness" getter="get_param_randomness">
</member>
<member name="speed_scale" type="float" setter="set_speed_scale" getter="get_speed_scale">
</member>
diff --git a/doc/classes/CanvasItem.xml b/doc/classes/CanvasItem.xml
index 4bae656740..63f82fe2bd 100644
--- a/doc/classes/CanvasItem.xml
+++ b/doc/classes/CanvasItem.xml
@@ -135,7 +135,7 @@
<method name="draw_multimesh">
<return type="void">
</return>
- <argument index="0" name="mesh" type="Mesh">
+ <argument index="0" name="mesh" type="MultiMesh">
</argument>
<argument index="1" name="texture" type="Texture">
</argument>
diff --git a/doc/classes/ColorPicker.xml b/doc/classes/ColorPicker.xml
index 554e6b5632..2659fd8a39 100644
--- a/doc/classes/ColorPicker.xml
+++ b/doc/classes/ColorPicker.xml
@@ -20,6 +20,22 @@
Adds the given color to a list of color presets. The presets are displayed in the color picker and the user will be able to select them. Note: the presets list is only for [i]this[/i] color picker.
</description>
</method>
+ <method name="erase_preset">
+ <return type="void">
+ </return>
+ <argument index="0" name="color" type="Color">
+ </argument>
+ <description>
+ Remove the given color from the list of color presets of this color picker.
+ </description>
+ </method>
+ <method name="get_presets">
+ <return type="PoolColorArray">
+ </return>
+ <description>
+ Return the list of colors in the presets of the color picker.
+ </description>
+ </method>
</methods>
<members>
<member name="color" type="Color" setter="set_pick_color" getter="get_pick_color">
@@ -44,6 +60,24 @@
</description>
</signal>
</signals>
+ <signals>
+ <signal name="preset_added">
+ <argument index="0" name="color" type="Color">
+ </argument>
+ <description>
+ Emitted when a preset is added.
+ </description>
+ </signal>
+ </signals>
+ <signals>
+ <signal name="preset_removed">
+ <argument index="0" name="color" type="Color">
+ </argument>
+ <description>
+ Emitted when a preset is removed.
+ </description>
+ </signal>
+ </signals>
<constants>
</constants>
<theme_items>
diff --git a/doc/classes/ConvexPolygonShape2D.xml b/doc/classes/ConvexPolygonShape2D.xml
index 6b31149c2f..8210e7dc9c 100644
--- a/doc/classes/ConvexPolygonShape2D.xml
+++ b/doc/classes/ConvexPolygonShape2D.xml
@@ -18,7 +18,7 @@
<argument index="0" name="point_cloud" type="PoolVector2Array">
</argument>
<description>
- Currently, this method does nothing.
+ Based on the set of points provided, this creates and assigns the [member points] property using the convex hull algorithm. Removing all unneeded points. See [method Geometry.convex_hull_2d] for details.
</description>
</method>
</methods>
diff --git a/doc/classes/Environment.xml b/doc/classes/Environment.xml
index 949c93761e..80281a603a 100644
--- a/doc/classes/Environment.xml
+++ b/doc/classes/Environment.xml
@@ -159,6 +159,8 @@
<member name="glow_enabled" type="bool" setter="set_glow_enabled" getter="is_glow_enabled">
Enables glow rendering.
</member>
+ <member name="glow_hdr_luminance_cap" type="float" setter="set_glow_hdr_luminance_cap" getter="get_glow_hdr_luminance_cap">
+ </member>
<member name="glow_hdr_scale" type="float" setter="set_glow_hdr_bleed_scale" getter="get_glow_hdr_bleed_scale">
Bleed scale of the HDR glow.
</member>
diff --git a/doc/classes/Generic6DOFJoint.xml b/doc/classes/Generic6DOFJoint.xml
index e1046e282a..b6ac69e257 100644
--- a/doc/classes/Generic6DOFJoint.xml
+++ b/doc/classes/Generic6DOFJoint.xml
@@ -242,6 +242,8 @@
</member>
<member name="linear_spring_z/stiffness" type="float" setter="set_param_z" getter="get_param_z">
</member>
+ <member name="precision" type="int" setter="set_precision" getter="get_precision">
+ </member>
</members>
<constants>
<constant name="PARAM_LINEAR_LOWER_LIMIT" value="0" enum="Param">
diff --git a/doc/classes/MenuButton.xml b/doc/classes/MenuButton.xml
index c9a8d3ce7a..636edd504b 100644
--- a/doc/classes/MenuButton.xml
+++ b/doc/classes/MenuButton.xml
@@ -27,6 +27,11 @@
</description>
</method>
</methods>
+ <members>
+ <member name="switch_on_hover" type="bool" setter="set_switch_on_hover" getter="is_switch_on_hover">
+ If [code]true[/code], when the cursor hovers above another MenuButton within the same parent which also has [code]switch_on_hover[/code] enabled, it will close the current MenuButton and open the other one.
+ </member>
+ </members>
<signals>
<signal name="about_to_show">
<description>
diff --git a/doc/classes/TextEdit.xml b/doc/classes/TextEdit.xml
index a958c3fcfa..b2e3885ff2 100644
--- a/doc/classes/TextEdit.xml
+++ b/doc/classes/TextEdit.xml
@@ -467,7 +467,9 @@
<constant name="MENU_UNDO" value="5" enum="MenuItems">
Undoes the previous action.
</constant>
- <constant name="MENU_MAX" value="6" enum="MenuItems">
+ <constant name="MENU_REDO" value="6" enum="MenuItems">
+ </constant>
+ <constant name="MENU_MAX" value="7" enum="MenuItems">
</constant>
</constants>
<theme_items>
diff --git a/doc/classes/Theme.xml b/doc/classes/Theme.xml
index fe43b54d5e..8c6acd2c51 100644
--- a/doc/classes/Theme.xml
+++ b/doc/classes/Theme.xml
@@ -12,6 +12,12 @@
<demos>
</demos>
<methods>
+ <method name="clear">
+ <return type="void">
+ </return>
+ <description>
+ </description>
+ </method>
<method name="clear_color">
<return type="void">
</return>
diff --git a/doc/classes/VisualServer.xml b/doc/classes/VisualServer.xml
index b24eeaa112..d2bc56001c 100644
--- a/doc/classes/VisualServer.xml
+++ b/doc/classes/VisualServer.xml
@@ -1161,7 +1161,9 @@
</argument>
<argument index="8" name="hdr_bleed_scale" type="float">
</argument>
- <argument index="9" name="bicubic_upscale" type="bool">
+ <argument index="9" name="hdr_luminance_cap" type="float">
+ </argument>
+ <argument index="10" name="bicubic_upscale" type="bool">
</argument>
<description>
</description>
diff --git a/doc/tools/makerst.py b/doc/tools/makerst.py
index 7b7cc52547..9e83dfb55e 100755
--- a/doc/tools/makerst.py
+++ b/doc/tools/makerst.py
@@ -280,7 +280,7 @@ def rstize_text(text, cclass):
escape_post = True
# Properly escape things like `[Node]s`
- if escape_post and post_text and post_text[0].isalnum(): # not punctuation, escape
+ if escape_post and post_text and (post_text[0].isalnum() or post_text[0] == "("): # not punctuation, escape
post_text = '\ ' + post_text
next_brac_pos = post_text.find('[', 0)
diff --git a/editor/code_editor.cpp b/editor/code_editor.cpp
index a0a8e9459d..a7a51cb93d 100644
--- a/editor/code_editor.cpp
+++ b/editor/code_editor.cpp
@@ -768,6 +768,7 @@ void CodeTextEditor::update_editor_settings() {
text_editor->set_indent_using_spaces(EditorSettings::get_singleton()->get("text_editor/indent/type"));
text_editor->set_indent_size(EditorSettings::get_singleton()->get("text_editor/indent/size"));
text_editor->set_auto_indent(EditorSettings::get_singleton()->get("text_editor/indent/auto_indent"));
+ text_editor->set_draw_indent_guides(EditorSettings::get_singleton()->get("text_editor/indent/draw_indent_guides"));
text_editor->set_draw_tabs(EditorSettings::get_singleton()->get("text_editor/indent/draw_tabs"));
text_editor->set_show_line_numbers(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_line_numbers"));
text_editor->set_line_numbers_zero_padded(EditorSettings::get_singleton()->get("text_editor/line_numbers/line_numbers_zero_padded"));
diff --git a/editor/create_dialog.cpp b/editor/create_dialog.cpp
index 926fa37040..9f1082ecc4 100644
--- a/editor/create_dialog.cpp
+++ b/editor/create_dialog.cpp
@@ -89,8 +89,9 @@ void CreateDialog::popup_create(bool p_dont_clear, bool p_replace_mode) {
_save_and_update_favorite_list();
// Restore valid window bounds or pop up at default size.
- if (EditorSettings::get_singleton()->has_setting("interface/dialogs/create_new_node_bounds")) {
- popup(EditorSettings::get_singleton()->get("interface/dialogs/create_new_node_bounds"));
+ Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "create_new_node", Rect2());
+ if (saved_size != Rect2()) {
+ popup(saved_size);
} else {
Size2 popup_size = Size2(900, 700) * editor_get_scale();
@@ -415,7 +416,7 @@ void CreateDialog::_notification(int p_what) {
}
} break;
case NOTIFICATION_POPUP_HIDE: {
- EditorSettings::get_singleton()->set("interface/dialogs/create_new_node_bounds", get_rect());
+ EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "create_new_node", get_rect());
} break;
}
}
diff --git a/editor/dependency_editor.cpp b/editor/dependency_editor.cpp
index 99b6955160..aa9125915c 100644
--- a/editor/dependency_editor.cpp
+++ b/editor/dependency_editor.cpp
@@ -495,11 +495,19 @@ void DependencyRemoveDialog::ok_pressed() {
Resource *res = ResourceCache::get(files_to_delete[i]);
res->set_path("");
}
+
+ // If the file we are deleting is the main scene, clear its definition.
+ if (files_to_delete[i] == ProjectSettings::get_singleton()->get("application/run/main_scene")) {
+ ProjectSettings::get_singleton()->set("application/run/main_scene", "");
+ }
+
String path = OS::get_singleton()->get_resource_dir() + files_to_delete[i].replace_first("res://", "/");
print_verbose("Moving to trash: " + path);
Error err = OS::get_singleton()->move_to_trash(path);
if (err != OK) {
EditorNode::get_singleton()->add_io_error(TTR("Cannot remove:") + "\n" + files_to_delete[i] + "\n");
+ } else {
+ emit_signal("file_removed", files_to_delete[i]);
}
}
@@ -515,6 +523,8 @@ void DependencyRemoveDialog::ok_pressed() {
Error err = OS::get_singleton()->move_to_trash(path);
if (err != OK) {
EditorNode::get_singleton()->add_io_error(TTR("Cannot remove:") + "\n" + dirs_to_delete[i] + "\n");
+ } else {
+ emit_signal("folder_removed", dirs_to_delete[i]);
}
}
@@ -540,6 +550,11 @@ void DependencyRemoveDialog::ok_pressed() {
}
}
+void DependencyRemoveDialog::_bind_methods() {
+ ADD_SIGNAL(MethodInfo("file_removed", PropertyInfo(Variant::STRING, "file")));
+ ADD_SIGNAL(MethodInfo("folder_removed", PropertyInfo(Variant::STRING, "folder")));
+}
+
DependencyRemoveDialog::DependencyRemoveDialog() {
VBoxContainer *vb = memnew(VBoxContainer);
diff --git a/editor/dependency_editor.h b/editor/dependency_editor.h
index e46df4c837..5f1074764b 100644
--- a/editor/dependency_editor.h
+++ b/editor/dependency_editor.h
@@ -126,6 +126,8 @@ class DependencyRemoveDialog : public ConfirmationDialog {
void ok_pressed();
+ static void _bind_methods();
+
public:
void show(const Vector<String> &p_folders, const Vector<String> &p_files);
DependencyRemoveDialog();
diff --git a/editor/editor_export.cpp b/editor/editor_export.cpp
index 209a006a06..9df0f30ca4 100644
--- a/editor/editor_export.cpp
+++ b/editor/editor_export.cpp
@@ -546,6 +546,13 @@ void EditorExportPlugin::_export_begin_script(const PoolVector<String> &p_featur
}
}
+void EditorExportPlugin::_export_end_script() {
+
+ if (get_script_instance()) {
+ get_script_instance()->call("_export_end");
+ }
+}
+
void EditorExportPlugin::_export_file(const String &p_path, const String &p_type, const Set<String> &p_features) {
}
@@ -587,6 +594,20 @@ EditorExportPlatform::FeatureContainers EditorExportPlatform::get_feature_contai
result.features.insert(E->get());
result.features_pv.push_back(E->get());
}
+
+ if (p_preset->get_custom_features() != String()) {
+
+ Vector<String> tmp_custom_list = p_preset->get_custom_features().split(",");
+
+ for (int i = 0; i < tmp_custom_list.size(); i++) {
+ String f = tmp_custom_list[i].strip_edges();
+ if (f != String()) {
+ result.features.insert(f);
+ result.features_pv.push_back(f);
+ }
+ }
+ }
+
return result;
}
@@ -606,6 +627,9 @@ EditorExportPlatform::ExportNotifier::ExportNotifier(EditorExportPlatform &p_pla
EditorExportPlatform::ExportNotifier::~ExportNotifier() {
Vector<Ref<EditorExportPlugin> > export_plugins = EditorExport::get_singleton()->get_export_plugins();
for (int i = 0; i < export_plugins.size(); i++) {
+ if (export_plugins[i]->get_script_instance()) {
+ export_plugins.write[i]->_export_end_script();
+ }
export_plugins.write[i]->_export_end();
}
}
diff --git a/editor/editor_export.h b/editor/editor_export.h
index 380b33cd17..483af489a3 100644
--- a/editor/editor_export.h
+++ b/editor/editor_export.h
@@ -291,6 +291,7 @@ class EditorExportPlugin : public Reference {
void _export_file_script(const String &p_path, const String &p_type, const PoolVector<String> &p_features);
void _export_begin_script(const PoolVector<String> &p_features, bool p_debug, const String &p_path, int p_flags);
+ void _export_end_script();
protected:
void add_file(const String &p_path, const Vector<uint8_t> &p_file, bool p_remap);
diff --git a/editor/editor_file_dialog.cpp b/editor/editor_file_dialog.cpp
index b39f910182..81d9442656 100644
--- a/editor/editor_file_dialog.cpp
+++ b/editor/editor_file_dialog.cpp
@@ -830,11 +830,12 @@ void EditorFileDialog::update_file_list() {
d["name"] = files.front()->get();
d["dir"] = false;
String fullpath = cdir.plus_file(files.front()->get());
+ d["path"] = fullpath;
+ item_list->set_item_metadata(item_list->get_item_count() - 1, d);
+
if (display_mode == DISPLAY_THUMBNAILS) {
EditorResourcePreview::get_singleton()->queue_resource_preview(fullpath, this, "_thumbnail_result", fullpath);
}
- d["path"] = fullpath;
- item_list->set_item_metadata(item_list->get_item_count() - 1, d);
if (file->get_text() == files.front()->get())
item_list->set_current(item_list->get_item_count() - 1);
diff --git a/editor/editor_help_search.cpp b/editor/editor_help_search.cpp
index 8676dac921..d6dc812d38 100644
--- a/editor/editor_help_search.cpp
+++ b/editor/editor_help_search.cpp
@@ -130,9 +130,9 @@ void EditorHelpSearch::_notification(int p_what) {
} break;
case NOTIFICATION_POPUP_HIDE: {
- results_tree->clear();
+ results_tree->call_deferred("clear"); // Wait for the Tree's mouse event propagation.
get_ok()->set_disabled(true);
- EditorSettings::get_singleton()->set("interface/dialogs/search_help_bounds", get_rect());
+ EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "search_help", get_rect());
} break;
case NOTIFICATION_PROCESS: {
@@ -177,8 +177,9 @@ void EditorHelpSearch::popup_dialog() {
void EditorHelpSearch::popup_dialog(const String &p_term) {
// Restore valid window bounds or pop up at default size.
- if (EditorSettings::get_singleton()->has_setting("interface/dialogs/search_help_bounds"))
- popup(EditorSettings::get_singleton()->get("interface/dialogs/search_help_bounds"));
+ Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "search_help", Rect2());
+ if (saved_size != Rect2())
+ popup(saved_size);
else
popup_centered_ratio(0.5F);
diff --git a/editor/editor_node.cpp b/editor/editor_node.cpp
index d009ed61b5..d100d7f618 100644
--- a/editor/editor_node.cpp
+++ b/editor/editor_node.cpp
@@ -3645,6 +3645,7 @@ void EditorNode::_load_docks() {
_load_docks_from_config(config, "docks");
_load_open_scenes_from_config(config, "EditorNode");
+
editor_data.set_plugin_window_layout(config);
}
@@ -3839,6 +3840,23 @@ void EditorNode::_load_open_scenes_from_config(Ref<ConfigFile> p_layout, const S
restoring_scenes = false;
}
+bool EditorNode::has_scenes_in_session() {
+ if (!bool(EDITOR_GET("interface/scene_tabs/restore_scenes_on_load"))) {
+ return false;
+ }
+ Ref<ConfigFile> config;
+ config.instance();
+ Error err = config->load(EditorSettings::get_singleton()->get_project_settings_dir().plus_file("editor_layout.cfg"));
+ if (err != OK) {
+ return false;
+ }
+ if (!config->has_section("EditorNode") || !config->has_section_key("EditorNode", "open_scenes")) {
+ return false;
+ }
+ Array scenes = config->get_value("EditorNode", "open_scenes");
+ return !scenes.empty();
+}
+
void EditorNode::_update_layouts_menu() {
editor_layouts->clear();
@@ -5169,14 +5187,9 @@ EditorNode::EditorNode() {
top_region->add_child(left_menu_hb);
menu_hb->add_child(top_region);
- {
- Control *sp = memnew(Control);
- sp->set_custom_minimum_size(Size2(30, 0) * EDSCALE);
- menu_hb->add_child(sp);
- }
-
file_menu = memnew(MenuButton);
file_menu->set_flat(false);
+ file_menu->set_switch_on_hover(true);
file_menu->set_text(TTR("Scene"));
file_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
left_menu_hb->add_child(file_menu);
@@ -5268,6 +5281,7 @@ EditorNode::EditorNode() {
project_menu = memnew(MenuButton);
project_menu->set_flat(false);
+ project_menu->set_switch_on_hover(true);
project_menu->set_tooltip(TTR("Miscellaneous project or scene-wide tools."));
project_menu->set_text(TTR("Project"));
project_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
@@ -5309,6 +5323,7 @@ EditorNode::EditorNode() {
debug_menu = memnew(MenuButton);
debug_menu->set_flat(false);
+ debug_menu->set_switch_on_hover(true);
debug_menu->set_text(TTR("Debug"));
debug_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
left_menu_hb->add_child(debug_menu);
@@ -5339,6 +5354,7 @@ EditorNode::EditorNode() {
settings_menu = memnew(MenuButton);
settings_menu->set_flat(false);
+ settings_menu->set_switch_on_hover(true);
settings_menu->set_text(TTR("Editor"));
settings_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
left_menu_hb->add_child(settings_menu);
@@ -5375,6 +5391,7 @@ EditorNode::EditorNode() {
// Help Menu
help_menu = memnew(MenuButton);
help_menu->set_flat(false);
+ help_menu->set_switch_on_hover(true);
help_menu->set_text(TTR("Help"));
help_menu->add_style_override("hover", gui_base->get_stylebox("MenuHover", "EditorStyles"));
left_menu_hb->add_child(help_menu);
@@ -5391,12 +5408,8 @@ EditorNode::EditorNode() {
p->add_separator();
p->add_icon_item(gui_base->get_icon("Godot", "EditorIcons"), TTR("About"), HELP_ABOUT);
- play_cc = memnew(CenterContainer);
- play_cc->set_mouse_filter(Control::MOUSE_FILTER_IGNORE);
- menu_hb->add_child(play_cc);
-
play_button_panel = memnew(PanelContainer);
- play_cc->add_child(play_button_panel);
+ menu_hb->add_child(play_button_panel);
HBoxContainer *play_hb = memnew(HBoxContainer);
play_button_panel->add_child(play_hb);
@@ -5442,11 +5455,6 @@ EditorNode::EditorNode() {
run_native = memnew(EditorRunNative);
play_hb->add_child(run_native);
- native_play_button = memnew(MenuButton);
- native_play_button->set_text("NTV");
- menu_hb->add_child(native_play_button);
- native_play_button->hide();
- native_play_button->get_popup()->connect("id_pressed", this, "_run_in_device");
run_native->connect("native_run", this, "_menu_option", varray(RUN_PLAY_NATIVE));
play_scene_button = memnew(ToolButton);
@@ -5475,6 +5483,9 @@ EditorNode::EditorNode() {
play_custom_scene_button->set_shortcut(ED_SHORTCUT("editor/play_custom_scene", TTR("Play Custom Scene"), KEY_MASK_CMD | KEY_MASK_SHIFT | KEY_F5));
#endif
+ HBoxContainer *right_menu_hb = memnew(HBoxContainer);
+ menu_hb->add_child(right_menu_hb);
+
// Toggle for video driver
video_driver = memnew(OptionButton);
video_driver->set_flat(true);
@@ -5482,7 +5493,7 @@ EditorNode::EditorNode() {
video_driver->set_v_size_flags(Control::SIZE_SHRINK_CENTER);
video_driver->connect("item_selected", this, "_video_driver_selected");
video_driver->add_font_override("font", gui_base->get_font("bold", "EditorFonts"));
- menu_hb->add_child(video_driver);
+ right_menu_hb->add_child(video_driver);
String video_drivers = ProjectSettings::get_singleton()->get_custom_property_info()["rendering/quality/driver/driver_name"].hint_string;
String current_video_driver = OS::get_singleton()->get_video_driver_name(OS::get_singleton()->get_current_video_driver());
@@ -5508,9 +5519,6 @@ EditorNode::EditorNode() {
progress_hb = memnew(BackgroundProgress);
- HBoxContainer *right_menu_hb = memnew(HBoxContainer);
- menu_hb->add_child(right_menu_hb);
-
layout_dialog = memnew(EditorNameDialog);
gui_base->add_child(layout_dialog);
layout_dialog->set_hide_on_ok(false);
diff --git a/editor/editor_node.h b/editor/editor_node.h
index 4d89d1f956..e5670e5e7c 100644
--- a/editor/editor_node.h
+++ b/editor/editor_node.h
@@ -243,7 +243,6 @@ private:
Control *vp_base;
PaneDrag *pd;
- CenterContainer *play_cc;
HBoxContainer *menu_hb;
Control *viewport;
MenuButton *file_menu;
@@ -255,7 +254,6 @@ private:
ToolButton *export_button;
ToolButton *prev_scene;
ToolButton *play_button;
- MenuButton *native_play_button;
ToolButton *pause_button;
ToolButton *stop_button;
ToolButton *run_settings_button;
@@ -789,6 +787,7 @@ public:
void edit_current() { _edit_current(); };
void update_keying() const { inspector_dock->update_keying(); };
+ bool has_scenes_in_session();
EditorNode();
~EditorNode();
diff --git a/editor/editor_properties.cpp b/editor/editor_properties.cpp
index 9c9302e7cd..ff7ab051b5 100644
--- a/editor/editor_properties.cpp
+++ b/editor/editor_properties.cpp
@@ -233,7 +233,7 @@ void EditorPropertyPath::_path_pressed() {
dialog->set_mode(EditorFileDialog::MODE_OPEN_DIR);
dialog->set_current_dir(full_path);
} else {
- dialog->set_mode(EditorFileDialog::MODE_OPEN_FILE);
+ dialog->set_mode(save_mode ? EditorFileDialog::MODE_SAVE_FILE : EditorFileDialog::MODE_OPEN_FILE);
for (int i = 0; i < extensions.size(); i++) {
String e = extensions[i].strip_edges();
if (e != String()) {
@@ -260,6 +260,11 @@ void EditorPropertyPath::setup(const Vector<String> &p_extensions, bool p_folder
global = p_global;
}
+void EditorPropertyPath::set_save_mode() {
+
+ save_mode = true;
+}
+
void EditorPropertyPath::_notification(int p_what) {
if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
@@ -296,6 +301,7 @@ EditorPropertyPath::EditorPropertyPath() {
path_edit->connect("pressed", this, "_path_pressed");
folder = false;
global = false;
+ save_mode = false;
}
///////////////////// CLASS NAME /////////////////////////
@@ -1090,6 +1096,8 @@ void EditorPropertyVector2::setup(double p_min, double p_max, double p_step, boo
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1171,6 +1179,8 @@ void EditorPropertyRect2::setup(double p_min, double p_max, double p_step, bool
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1251,6 +1261,8 @@ void EditorPropertyVector3::setup(double p_min, double p_max, double p_step, boo
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1331,6 +1343,8 @@ void EditorPropertyPlane::setup(double p_min, double p_max, double p_step, bool
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1413,6 +1427,8 @@ void EditorPropertyQuat::setup(double p_min, double p_max, double p_step, bool p
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1500,6 +1516,8 @@ void EditorPropertyAABB::setup(double p_min, double p_max, double p_step, bool p
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1574,6 +1592,8 @@ void EditorPropertyTransform2D::setup(double p_min, double p_max, double p_step,
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1653,6 +1673,8 @@ void EditorPropertyBasis::setup(double p_min, double p_max, double p_step, bool
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1738,6 +1760,8 @@ void EditorPropertyTransform::setup(double p_min, double p_max, double p_step, b
spin[i]->set_max(p_max);
spin[i]->set_step(p_step);
spin[i]->set_hide_slider(p_no_slider);
+ spin[i]->set_allow_greater(true);
+ spin[i]->set_allow_lesser(true);
}
}
@@ -1932,6 +1956,20 @@ EditorPropertyNodePath::EditorPropertyNodePath() {
void EditorPropertyResource::_file_selected(const String &p_path) {
RES res = ResourceLoader::load(p_path);
+
+ List<PropertyInfo> prop_list;
+ get_edited_object()->get_property_list(&prop_list);
+ String type;
+
+ for (List<PropertyInfo>::Element *E = prop_list.front(); E; E = E->next()) {
+ if (E->get().name == get_edited_property() && (E->get().hint & PROPERTY_HINT_RESOURCE_TYPE)) {
+ type = E->get().hint_string;
+ }
+ }
+
+ if (!type.empty() && !res->is_class(type))
+ EditorNode::get_singleton()->show_warning(vformat(TTR("The selected resource (%s) does not match the type expected for this property (%s)."), res->get_class(), type));
+
emit_signal("property_changed", get_edited_property(), res);
update_property();
}
diff --git a/editor/editor_properties.h b/editor/editor_properties.h
index b82ef977ef..05716408f3 100644
--- a/editor/editor_properties.h
+++ b/editor/editor_properties.h
@@ -106,6 +106,7 @@ class EditorPropertyPath : public EditorProperty {
Vector<String> extensions;
bool folder;
bool global;
+ bool save_mode;
EditorFileDialog *dialog;
LineEdit *path;
Button *path_edit;
@@ -120,6 +121,7 @@ protected:
public:
void setup(const Vector<String> &p_extensions, bool p_folder, bool p_global);
+ void set_save_mode();
virtual void update_property();
EditorPropertyPath();
};
diff --git a/editor/editor_resource_preview.cpp b/editor/editor_resource_preview.cpp
index 310c3b3a52..71e9aced7e 100644
--- a/editor/editor_resource_preview.cpp
+++ b/editor/editor_resource_preview.cpp
@@ -326,7 +326,7 @@ void EditorResourcePreview::queue_edited_resource_preview(const Ref<Resource> &p
if (cache.has(path_id) && cache[path_id].last_hash == p_res->hash_edited_version()) {
cache[path_id].order = order++;
- p_receiver->call_deferred(p_receiver_func, path_id, cache[path_id].preview, cache[path_id].small_preview, p_userdata);
+ p_receiver->call(p_receiver_func, path_id, cache[path_id].preview, cache[path_id].small_preview, p_userdata);
preview_mutex->unlock();
return;
}
@@ -351,7 +351,7 @@ void EditorResourcePreview::queue_resource_preview(const String &p_path, Object
preview_mutex->lock();
if (cache.has(p_path)) {
cache[p_path].order = order++;
- p_receiver->call_deferred(p_receiver_func, p_path, cache[p_path].preview, cache[p_path].small_preview, p_userdata);
+ p_receiver->call(p_receiver_func, p_path, cache[p_path].preview, cache[p_path].small_preview, p_userdata);
preview_mutex->unlock();
return;
}
diff --git a/editor/editor_settings.cpp b/editor/editor_settings.cpp
index fdfa094ba2..4a373aafd9 100644
--- a/editor/editor_settings.cpp
+++ b/editor/editor_settings.cpp
@@ -377,6 +377,7 @@ void EditorSettings::_load_defaults(Ref<ConfigFile> p_extra_config) {
hints["text_editor/indent/size"] = PropertyInfo(Variant::INT, "text_editor/indent/size", PROPERTY_HINT_RANGE, "1, 64, 1"); // size of 0 crashes.
_initial_set("text_editor/indent/auto_indent", true);
_initial_set("text_editor/indent/convert_indent_on_save", false);
+ _initial_set("text_editor/indent/draw_indent_guides", true);
_initial_set("text_editor/indent/draw_tabs", true);
_initial_set("text_editor/line_numbers/show_line_numbers", true);
@@ -592,8 +593,8 @@ void EditorSettings::_load_default_text_editor_theme() {
_initial_set("text_editor/highlighting/engine_type_color", Color::html("83d3ff"));
_initial_set("text_editor/highlighting/comment_color", Color::html("676767"));
_initial_set("text_editor/highlighting/string_color", Color::html("ef6ebe"));
- _initial_set("text_editor/highlighting/background_color", dark_theme ? Color::html("3b000000") : Color::html("#323b4f"));
- _initial_set("text_editor/highlighting/completion_background_color", Color::html("2C2A32"));
+ _initial_set("text_editor/highlighting/background_color", dark_theme ? Color::html("3b000000") : Color::html("323b4f"));
+ _initial_set("text_editor/highlighting/completion_background_color", Color::html("2c2a32"));
_initial_set("text_editor/highlighting/completion_selected_color", Color::html("434244"));
_initial_set("text_editor/highlighting/completion_existing_color", Color::html("21dfdfdf"));
_initial_set("text_editor/highlighting/completion_scroll_color", Color::html("ffffff"));
@@ -603,13 +604,14 @@ void EditorSettings::_load_default_text_editor_theme() {
_initial_set("text_editor/highlighting/safe_line_number_color", Color::html("99aac8aa"));
_initial_set("text_editor/highlighting/caret_color", Color::html("aaaaaa"));
_initial_set("text_editor/highlighting/caret_background_color", Color::html("000000"));
+ _initial_set("text_editor/highlighting/indent_guide_color", Color::html("50808080"));
_initial_set("text_editor/highlighting/text_selected_color", Color::html("000000"));
_initial_set("text_editor/highlighting/selection_color", Color::html("6ca9c2"));
_initial_set("text_editor/highlighting/brace_mismatch_color", Color(1, 0.2, 0.2));
_initial_set("text_editor/highlighting/current_line_color", Color(0.3, 0.5, 0.8, 0.15));
_initial_set("text_editor/highlighting/line_length_guideline_color", Color(0.3, 0.5, 0.8, 0.1));
_initial_set("text_editor/highlighting/word_highlighted_color", Color(0.8, 0.9, 0.9, 0.15));
- _initial_set("text_editor/highlighting/number_color", Color::html("EB9532"));
+ _initial_set("text_editor/highlighting/number_color", Color::html("eb9532"));
_initial_set("text_editor/highlighting/function_color", Color::html("66a2ce"));
_initial_set("text_editor/highlighting/member_variable_color", Color::html("e64e59"));
_initial_set("text_editor/highlighting/mark_color", Color(1.0, 0.4, 0.4, 0.4));
diff --git a/editor/editor_spin_slider.cpp b/editor/editor_spin_slider.cpp
index 8ea56b8578..1b7322fd13 100644
--- a/editor/editor_spin_slider.cpp
+++ b/editor/editor_spin_slider.cpp
@@ -63,6 +63,7 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
grabbing_spinner_attempt = true;
grabbing_spinner_dist_cache = 0;
+ pre_grab_value = get_value();
grabbing_spinner = false;
grabbing_spinner_mouse_pos = Input::get_singleton()->get_mouse_position();
}
@@ -107,10 +108,10 @@ void EditorSpinSlider::_gui_input(const Ref<InputEvent> &p_event) {
if (ABS(grabbing_spinner_dist_cache) > 6) {
set_value(get_value() + SGN(grabbing_spinner_dist_cache));
grabbing_spinner_dist_cache = 0;
+ pre_grab_value = get_value();
}
} else {
- set_value(get_value() + get_step() * grabbing_spinner_dist_cache * 10);
- grabbing_spinner_dist_cache = 0;
+ set_value(pre_grab_value + get_step() * grabbing_spinner_dist_cache * 10);
}
}
} else if (updown_offset != -1) {
@@ -434,6 +435,7 @@ EditorSpinSlider::EditorSpinSlider() {
grabbing_spinner_attempt = false;
grabbing_spinner = false;
grabbing_spinner_dist_cache = 0;
+ pre_grab_value = 0;
set_focus_mode(FOCUS_ALL);
updown_offset = -1;
hover_updown = false;
diff --git a/editor/editor_spin_slider.h b/editor/editor_spin_slider.h
index e48eb171b8..9d43bd2884 100644
--- a/editor/editor_spin_slider.h
+++ b/editor/editor_spin_slider.h
@@ -59,6 +59,7 @@ class EditorSpinSlider : public Range {
bool read_only;
float grabbing_spinner_dist_cache;
Vector2 grabbing_spinner_mouse_pos;
+ double pre_grab_value;
LineEdit *value_input;
bool value_input_just_closed;
diff --git a/editor/editor_themes.cpp b/editor/editor_themes.cpp
index 36053d7534..3dfc49583c 100644
--- a/editor/editor_themes.cpp
+++ b/editor/editor_themes.cpp
@@ -1080,6 +1080,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
const Color safe_line_number_color = dim_color * Color(1, 1.2, 1, 1.5);
const Color caret_color = mono_color;
const Color caret_background_color = mono_color.inverted();
+ const Color indent_guide_color = alpha2;
const Color text_selected_color = dark_color_3;
const Color selection_color = alpha2;
const Color brace_mismatch_color = error_color;
@@ -1115,6 +1116,7 @@ Ref<Theme> create_editor_theme(const Ref<Theme> p_theme) {
setting->set_initial_value("text_editor/highlighting/safe_line_number_color", safe_line_number_color, true);
setting->set_initial_value("text_editor/highlighting/caret_color", caret_color, true);
setting->set_initial_value("text_editor/highlighting/caret_background_color", caret_background_color, true);
+ setting->set_initial_value("text_editor/highlighting/indent_guide_color", indent_guide_color, true);
setting->set_initial_value("text_editor/highlighting/text_selected_color", text_selected_color, true);
setting->set_initial_value("text_editor/highlighting/selection_color", selection_color, true);
setting->set_initial_value("text_editor/highlighting/brace_mismatch_color", brace_mismatch_color, true);
diff --git a/editor/filesystem_dock.cpp b/editor/filesystem_dock.cpp
index 828e608fa4..b2368fff6b 100644
--- a/editor/filesystem_dock.cpp
+++ b/editor/filesystem_dock.cpp
@@ -951,7 +951,7 @@ void FileSystemDock::_find_remaps(EditorFileSystemDirectory *efsd, const Map<Str
}
void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_new_path,
- Map<String, String> &p_file_renames, Map<String, String> &p_folder_renames) const {
+ Map<String, String> &p_file_renames, Map<String, String> &p_folder_renames) {
//Ensure folder paths end with "/"
String old_path = (p_item.is_file || p_item.path.ends_with("/")) ? p_item.path : (p_item.path + "/");
String new_path = (p_item.is_file || p_new_path.ends_with("/")) ? p_new_path : (p_new_path + "/");
@@ -981,6 +981,7 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_
print_verbose("Moving " + old_path + " -> " + new_path);
Error err = da->rename(old_path, new_path);
if (err == OK) {
+
//Move/Rename any corresponding import settings too
if (p_item.is_file && FileAccess::exists(old_path + ".import")) {
err = da->rename(old_path + ".import", new_path + ".import");
@@ -1007,9 +1008,11 @@ void FileSystemDock::_try_move_item(const FileOrFolder &p_item, const String &p_
for (int i = 0; i < file_changed_paths.size(); ++i) {
p_file_renames[file_changed_paths[i]] = file_changed_paths[i].replace_first(old_path, new_path);
print_verbose(" Remap: " + file_changed_paths[i] + " -> " + p_file_renames[file_changed_paths[i]]);
+ emit_signal("files_moved", file_changed_paths[i], p_file_renames[file_changed_paths[i]]);
}
for (int i = 0; i < folder_changed_paths.size(); ++i) {
p_folder_renames[folder_changed_paths[i]] = folder_changed_paths[i].replace_first(old_path, new_path);
+ emit_signal("folder_moved", folder_changed_paths[i], p_folder_renames[folder_changed_paths[i]].substr(0, p_folder_renames[folder_changed_paths[i]].length() - 1));
}
} else {
EditorNode::get_singleton()->add_io_error(TTR("Error moving:") + "\n" + old_path + "\n");
@@ -1205,6 +1208,14 @@ void FileSystemDock::_make_dir_confirm() {
}
}
+void FileSystemDock::_file_deleted(String p_file) {
+ emit_signal("file_deleted", p_file);
+}
+
+void FileSystemDock::_folder_deleted(String p_folder) {
+ emit_signal("folder_deleted", p_folder);
+}
+
void FileSystemDock::_rename_operation_confirm() {
String new_name = rename_dialog_text->get_text().strip_edges();
@@ -2273,6 +2284,9 @@ void FileSystemDock::_bind_methods() {
ClassDB::bind_method(D_METHOD("_file_list_rmb_select"), &FileSystemDock::_file_list_rmb_select);
ClassDB::bind_method(D_METHOD("_file_list_rmb_pressed"), &FileSystemDock::_file_list_rmb_pressed);
+ ClassDB::bind_method(D_METHOD("_file_deleted"), &FileSystemDock::_file_deleted);
+ ClassDB::bind_method(D_METHOD("_folder_deleted"), &FileSystemDock::_folder_deleted);
+
ClassDB::bind_method(D_METHOD("_file_list_thumbnail_done"), &FileSystemDock::_file_list_thumbnail_done);
ClassDB::bind_method(D_METHOD("_tree_thumbnail_done"), &FileSystemDock::_tree_thumbnail_done);
ClassDB::bind_method(D_METHOD("_file_list_activate_file"), &FileSystemDock::_file_list_activate_file);
@@ -2303,6 +2317,11 @@ void FileSystemDock::_bind_methods() {
ADD_SIGNAL(MethodInfo("instance", PropertyInfo(Variant::POOL_STRING_ARRAY, "files")));
ADD_SIGNAL(MethodInfo("open"));
+
+ ADD_SIGNAL(MethodInfo("file_removed", PropertyInfo(Variant::STRING, "file")));
+ ADD_SIGNAL(MethodInfo("folder_removed", PropertyInfo(Variant::STRING, "folder")));
+ ADD_SIGNAL(MethodInfo("files_moved", PropertyInfo(Variant::STRING, "old_file"), PropertyInfo(Variant::STRING, "new_file")));
+ ADD_SIGNAL(MethodInfo("folder_moved", PropertyInfo(Variant::STRING, "old_folder"), PropertyInfo(Variant::STRING, "new_file")));
}
FileSystemDock::FileSystemDock(EditorNode *p_editor) {
@@ -2464,6 +2483,8 @@ FileSystemDock::FileSystemDock(EditorNode *p_editor) {
add_child(owners_editor);
remove_dialog = memnew(DependencyRemoveDialog);
+ remove_dialog->connect("file_removed", this, "_file_deleted");
+ remove_dialog->connect("folder_removed", this, "_folder_deleted");
add_child(remove_dialog);
move_dialog = memnew(EditorDirDialog);
diff --git a/editor/filesystem_dock.h b/editor/filesystem_dock.h
index df6fa5f9d2..7692566c0b 100644
--- a/editor/filesystem_dock.h
+++ b/editor/filesystem_dock.h
@@ -202,13 +202,18 @@ private:
void _get_all_items_in_dir(EditorFileSystemDirectory *efsd, Vector<String> &files, Vector<String> &folders) const;
void _find_remaps(EditorFileSystemDirectory *efsd, const Map<String, String> &renames, Vector<String> &to_remaps) const;
- void _try_move_item(const FileOrFolder &p_item, const String &p_new_path, Map<String, String> &p_file_renames, Map<String, String> &p_folder_renames) const;
+ void _try_move_item(const FileOrFolder &p_item, const String &p_new_path, Map<String, String> &p_file_renames, Map<String, String> &p_folder_renames);
void _try_duplicate_item(const FileOrFolder &p_item, const String &p_new_path) const;
void _update_dependencies_after_move(const Map<String, String> &p_renames) const;
void _update_resource_paths_after_move(const Map<String, String> &p_renames) const;
void _update_favorites_list_after_move(const Map<String, String> &p_files_renames, const Map<String, String> &p_folders_renames) const;
void _update_project_settings_after_move(const Map<String, String> &p_folders_renames) const;
+ void _file_deleted(String p_file);
+ void _folder_deleted(String p_folder);
+ void _files_moved(String p_old_file, String p_new_file);
+ void _folder_moved(String p_old_folder, String p_new_folder);
+
void _resource_created() const;
void _make_dir_confirm();
void _rename_operation_confirm();
diff --git a/editor/find_in_files.cpp b/editor/find_in_files.cpp
index 705bb1d9c5..6ebe8cfe2c 100644
--- a/editor/find_in_files.cpp
+++ b/editor/find_in_files.cpp
@@ -44,8 +44,6 @@
#include "scene/gui/progress_bar.h"
#include "scene/gui/tree.h"
-#define ROOT_PREFIX "res://"
-
const char *FindInFiles::SIGNAL_RESULT_FOUND = "result_found";
const char *FindInFiles::SIGNAL_FINISHED = "finished";
@@ -89,7 +87,6 @@ static bool find_next(const String &line, String pattern, int from, bool match_c
//--------------------------------------------------------------------------------
FindInFiles::FindInFiles() {
- _root_prefix = ROOT_PREFIX;
_searching = false;
_whole_words = true;
_match_case = true;
@@ -182,7 +179,7 @@ void FindInFiles::_iterate() {
_current_dir = _current_dir.plus_file(folder_name);
PoolStringArray sub_dirs;
- _scan_dir(_root_prefix + _current_dir, sub_dirs);
+ _scan_dir("res://" + _current_dir, sub_dirs);
_folders_stack.push_back(sub_dirs);
@@ -348,7 +345,7 @@ FindInFilesDialog::FindInFilesDialog() {
HBoxContainer *hbc = memnew(HBoxContainer);
Label *prefix_label = memnew(Label);
- prefix_label->set_text(ROOT_PREFIX);
+ prefix_label->set_text("res://");
hbc->add_child(prefix_label);
_folder_line_edit = memnew(LineEdit);
@@ -375,10 +372,12 @@ FindInFilesDialog::FindInFilesDialog() {
{
HBoxContainer *hbc = memnew(HBoxContainer);
+ // TODO: Unhardcode this.
Vector<String> exts;
exts.push_back("gd");
if (Engine::get_singleton()->has_singleton("GodotSharp"))
exts.push_back("cs");
+ exts.push_back("shader");
for (int i = 0; i < exts.size(); ++i) {
CheckBox *cb = memnew(CheckBox);
diff --git a/editor/find_in_files.h b/editor/find_in_files.h
index 7f37123430..9705c4796c 100644
--- a/editor/find_in_files.h
+++ b/editor/find_in_files.h
@@ -73,7 +73,6 @@ private:
// Config
String _pattern;
Set<String> _extension_filter;
- String _root_prefix;
String _root_dir;
bool _whole_words;
bool _match_case;
diff --git a/editor/import/editor_import_collada.cpp b/editor/import/editor_import_collada.cpp
index 8e69090da3..93c462f747 100644
--- a/editor/import/editor_import_collada.cpp
+++ b/editor/import/editor_import_collada.cpp
@@ -771,7 +771,7 @@ Error ColladaImport::_create_mesh_surfaces(bool p_optimize, Ref<ArrayMesh> &p_me
int binormal_pos = (binormal_src->stride ? binormal_src->stride : 3) * p.indices[src + binormal_ofs];
ERR_FAIL_INDEX_V(binormal_pos, binormal_src->array.size(), ERR_INVALID_DATA);
- Vector3 binormal = Vector3(-binormal_src->array[binormal_pos + 0], -binormal_src->array[binormal_pos + 1], -binormal_src->array[binormal_pos + 2]); // Due to Godots face order it seems we need to flip our binormal!
+ Vector3 binormal = Vector3(binormal_src->array[binormal_pos + 0], binormal_src->array[binormal_pos + 1], binormal_src->array[binormal_pos + 2]);
int tangent_pos = (tangent_src->stride ? tangent_src->stride : 3) * p.indices[src + tangent_ofs];
ERR_FAIL_INDEX_V(tangent_pos, tangent_src->array.size(), ERR_INVALID_DATA);
diff --git a/editor/import/editor_scene_importer_gltf.cpp b/editor/import/editor_scene_importer_gltf.cpp
index 00ca86a43b..b5d646d5d4 100644
--- a/editor/import/editor_scene_importer_gltf.cpp
+++ b/editor/import/editor_scene_importer_gltf.cpp
@@ -899,16 +899,7 @@ Error EditorSceneImporterGLTF::_parse_meshes(GLTFState &state) {
array[Mesh::ARRAY_NORMAL] = _decode_accessor_as_vec3(state, a["NORMAL"], true);
}
if (a.has("TANGENT")) {
- PoolVector<float> tans = _decode_accessor_as_floats(state, a["TANGENT"], true);
- { // we need our binormals inversed, so flip our w component.
- int ts = tans.size();
- PoolVector<float>::Write w = tans.write();
-
- for (int j = 3; j < ts; j += 4) {
- w[j] *= -1.0;
- }
- }
- array[Mesh::ARRAY_TANGENT] = tans;
+ array[Mesh::ARRAY_TANGENT] = _decode_accessor_as_floats(state, a["TANGENT"], true);
}
if (a.has("TEXCOORD_0")) {
array[Mesh::ARRAY_TEX_UV] = _decode_accessor_as_vec2(state, a["TEXCOORD_0"], true);
diff --git a/editor/plugins/abstract_polygon_2d_editor.cpp b/editor/plugins/abstract_polygon_2d_editor.cpp
index 16423decc4..a85f4456f7 100644
--- a/editor/plugins/abstract_polygon_2d_editor.cpp
+++ b/editor/plugins/abstract_polygon_2d_editor.cpp
@@ -103,6 +103,11 @@ bool AbstractPolygon2DEditor::_is_line() const {
return false;
}
+bool AbstractPolygon2DEditor::_has_uv() const {
+
+ return false;
+}
+
int AbstractPolygon2DEditor::_get_polygon_count() const {
return 1;
@@ -202,12 +207,7 @@ void AbstractPolygon2DEditor::_notification(int p_what) {
button_edit->set_pressed(true);
get_tree()->connect("node_removed", this, "_node_removed");
-
create_resource->connect("confirmed", this, "_create_resource");
-
- } break;
- case NOTIFICATION_PHYSICS_PROCESS: {
-
} break;
}
}
@@ -250,8 +250,12 @@ void AbstractPolygon2DEditor::_wip_close() {
_set_polygon(0, wip);
} else if (wip.size() >= (_is_line() ? 2 : 3)) {
- undo_redo->create_action(TTR("Create Poly"));
+ undo_redo->create_action(TTR("Create Polygon"));
_action_add_polygon(wip);
+ if (_has_uv()) {
+ undo_redo->add_do_method(_get_node(), "set_uv", PoolVector<Vector2>());
+ undo_redo->add_undo_method(_get_node(), "set_uv", _get_node()->get("uv"));
+ }
_commit_action();
} else {
@@ -313,7 +317,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
if (vertices.size() < (_is_line() ? 2 : 3)) {
vertices.push_back(cpoint);
- undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->create_action(TTR("Edit Polygon"));
selected_point = Vertex(insert.polygon, vertices.size());
_action_set_polygon(insert.polygon, vertices);
_commit_action();
@@ -331,7 +335,6 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
undo_redo->create_action(TTR("Insert Point"));
_action_set_polygon(insert.polygon, vertices);
_commit_action();
-
return true;
}
} else {
@@ -363,7 +366,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
ERR_FAIL_INDEX_V(edited_point.vertex, vertices.size(), false);
vertices.write[edited_point.vertex] = edited_point.pos - _get_offset(edited_point.polygon);
- undo_redo->create_action(TTR("Edit Poly"));
+ undo_redo->create_action(TTR("Edit Polygon"));
_action_set_polygon(edited_point.polygon, pre_move_edit, vertices);
_commit_action();
@@ -531,6 +534,7 @@ bool AbstractPolygon2DEditor::forward_gui_input(const Ref<InputEvent> &p_event)
}
void AbstractPolygon2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
+
if (!_get_node())
return;
@@ -631,9 +635,11 @@ void AbstractPolygon2DEditor::edit(Node *p_polygon) {
_set_node(p_polygon);
- //Enable the pencil tool if the polygon is empty
+ // Enable the pencil tool if the polygon is empty.
if (_is_empty())
_menu_option(MODE_CREATE);
+ else
+ _menu_option(MODE_EDIT);
wip.clear();
wip_active = false;
@@ -664,12 +670,12 @@ void AbstractPolygon2DEditor::remove_point(const Vertex &p_vertex) {
vertices.remove(p_vertex.vertex);
- undo_redo->create_action(TTR("Edit Poly (Remove Point)"));
+ undo_redo->create_action(TTR("Edit Polygon (Remove Point)"));
_action_set_polygon(p_vertex.polygon, vertices);
_commit_action();
} else {
- undo_redo->create_action(TTR("Remove Poly And Point"));
+ undo_redo->create_action(TTR("Remove Polygon And Point"));
_action_remove_polygon(p_vertex.polygon);
_commit_action();
}
@@ -777,19 +783,19 @@ AbstractPolygon2DEditor::AbstractPolygon2DEditor(EditorNode *p_editor, bool p_wi
add_child(button_create);
button_create->connect("pressed", this, "_menu_option", varray(MODE_CREATE));
button_create->set_toggle_mode(true);
- button_create->set_tooltip(TTR("Create a new polygon from scratch"));
+ button_create->set_tooltip(TTR("Create points."));
button_edit = memnew(ToolButton);
add_child(button_edit);
button_edit->connect("pressed", this, "_menu_option", varray(MODE_EDIT));
button_edit->set_toggle_mode(true);
- button_edit->set_tooltip(TTR("Edit existing polygon:\nLMB: Move Point.\nCtrl+LMB: Split Segment.\nRMB: Erase Point."));
+ button_edit->set_tooltip(TTR("Edit points.\nLMB: Move Point\nRMB: Erase Point"));
button_delete = memnew(ToolButton);
add_child(button_delete);
button_delete->connect("pressed", this, "_menu_option", varray(MODE_DELETE));
button_delete->set_toggle_mode(true);
- button_delete->set_tooltip(TTR("Delete points"));
+ button_delete->set_tooltip(TTR("Erase points."));
create_resource = memnew(ConfirmationDialog);
add_child(create_resource);
diff --git a/editor/plugins/abstract_polygon_2d_editor.h b/editor/plugins/abstract_polygon_2d_editor.h
index c03670f254..046e8540e7 100644
--- a/editor/plugins/abstract_polygon_2d_editor.h
+++ b/editor/plugins/abstract_polygon_2d_editor.h
@@ -88,12 +88,10 @@ class AbstractPolygon2DEditor : public HBoxContainer {
protected:
enum {
-
MODE_CREATE,
MODE_EDIT,
MODE_DELETE,
MODE_CONT,
-
};
int mode;
@@ -116,13 +114,12 @@ protected:
PosVertex closest_edge_point(const Vector2 &p_pos) const;
bool _is_empty() const;
- void _commit_action();
-protected:
virtual Node2D *_get_node() const = 0;
virtual void _set_node(Node *p_polygon) = 0;
virtual bool _is_line() const;
+ virtual bool _has_uv() const;
virtual int _get_polygon_count() const;
virtual Vector2 _get_offset(int p_idx) const;
virtual Variant _get_polygon(int p_idx) const;
@@ -132,6 +129,7 @@ protected:
virtual void _action_remove_polygon(int p_idx);
virtual void _action_set_polygon(int p_idx, const Variant &p_polygon);
virtual void _action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon);
+ virtual void _commit_action();
virtual bool _has_resource() const;
virtual void _create_resource();
diff --git a/editor/plugins/canvas_item_editor_plugin.cpp b/editor/plugins/canvas_item_editor_plugin.cpp
index ee2283a035..8d9872236c 100644
--- a/editor/plugins/canvas_item_editor_plugin.cpp
+++ b/editor/plugins/canvas_item_editor_plugin.cpp
@@ -4606,7 +4606,7 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
warning_child_of_container = memnew(Label);
warning_child_of_container->hide();
- warning_child_of_container->set_text("Warning: Children of a container get their position and size determined only by their parent");
+ warning_child_of_container->set_text(TTR("Warning: Children of a container get their position and size determined only by their parent"));
add_control_to_info_overlay(warning_child_of_container);
h_scroll = memnew(HScrollBar);
@@ -4626,19 +4626,19 @@ CanvasItemEditor::CanvasItemEditor(EditorNode *p_editor) {
zoom_minus = memnew(ToolButton);
zoom_hb->add_child(zoom_minus);
zoom_minus->connect("pressed", this, "_button_zoom_minus");
- zoom_minus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", TTR("Zoom out"), KEY_MASK_CMD | KEY_MINUS));
+ zoom_minus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_minus", TTR("Zoom Out"), KEY_MASK_CMD | KEY_MINUS));
zoom_minus->set_focus_mode(FOCUS_NONE);
zoom_reset = memnew(ToolButton);
zoom_hb->add_child(zoom_reset);
zoom_reset->connect("pressed", this, "_button_zoom_reset");
- zoom_reset->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", TTR("Zoom reset"), KEY_MASK_CMD | KEY_0));
+ zoom_reset->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_reset", TTR("Zoom Reset"), KEY_MASK_CMD | KEY_0));
zoom_reset->set_focus_mode(FOCUS_NONE);
zoom_plus = memnew(ToolButton);
zoom_hb->add_child(zoom_plus);
zoom_plus->connect("pressed", this, "_button_zoom_plus");
- zoom_plus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", TTR("Zoom in"), KEY_MASK_CMD | KEY_EQUAL)); // Usually direct access key for PLUS
+ zoom_plus->set_shortcut(ED_SHORTCUT("canvas_item_editor/zoom_plus", TTR("Zoom In"), KEY_MASK_CMD | KEY_EQUAL)); // Usually direct access key for PLUS
zoom_plus->set_focus_mode(FOCUS_NONE);
updating_scroll = false;
diff --git a/editor/plugins/collision_polygon_editor_plugin.cpp b/editor/plugins/collision_polygon_editor_plugin.cpp
index 805a7d3835..e92a91db7c 100644
--- a/editor/plugins/collision_polygon_editor_plugin.cpp
+++ b/editor/plugins/collision_polygon_editor_plugin.cpp
@@ -95,7 +95,7 @@ void Polygon3DEditor::_menu_option(int p_option) {
void Polygon3DEditor::_wip_close() {
- undo_redo->create_action(TTR("Create Poly3D"));
+ undo_redo->create_action(TTR("Create Polygon3D"));
undo_redo->add_undo_method(node, "set_polygon", node->call("get_polygon"));
undo_redo->add_do_method(node, "set_polygon", wip);
undo_redo->add_do_method(this, "_polygon_draw");
diff --git a/editor/plugins/light_occluder_2d_editor_plugin.cpp b/editor/plugins/light_occluder_2d_editor_plugin.cpp
index 6a16cf0989..646883fbda 100644
--- a/editor/plugins/light_occluder_2d_editor_plugin.cpp
+++ b/editor/plugins/light_occluder_2d_editor_plugin.cpp
@@ -30,425 +30,91 @@
#include "light_occluder_2d_editor_plugin.h"
-#include "canvas_item_editor_plugin.h"
-#include "core/os/file_access.h"
-#include "editor/editor_settings.h"
+Ref<OccluderPolygon2D> LightOccluder2DEditor::_ensure_occluder() const {
-void LightOccluder2DEditor::_notification(int p_what) {
+ Ref<OccluderPolygon2D> occluder = node->get_occluder_polygon();
+ if (!occluder.is_valid()) {
- switch (p_what) {
-
- case NOTIFICATION_READY: {
-
- button_create->set_icon(get_icon("Edit", "EditorIcons"));
- button_edit->set_icon(get_icon("MovePoint", "EditorIcons"));
- button_edit->set_pressed(true);
- get_tree()->connect("node_removed", this, "_node_removed");
- create_poly->connect("confirmed", this, "_create_poly");
-
- } break;
- case NOTIFICATION_PHYSICS_PROCESS: {
-
- } break;
- }
-}
-void LightOccluder2DEditor::_node_removed(Node *p_node) {
-
- if (p_node == node) {
- node = NULL;
- hide();
- canvas_item_editor->update_viewport();
+ occluder = Ref<OccluderPolygon2D>(memnew(OccluderPolygon2D));
+ node->set_occluder_polygon(occluder);
}
+ return occluder;
}
-void LightOccluder2DEditor::_menu_option(int p_option) {
+Node2D *LightOccluder2DEditor::_get_node() const {
- switch (p_option) {
-
- case MODE_CREATE: {
-
- mode = MODE_CREATE;
- button_create->set_pressed(true);
- button_edit->set_pressed(false);
- } break;
- case MODE_EDIT: {
-
- mode = MODE_EDIT;
- button_create->set_pressed(false);
- button_edit->set_pressed(true);
- } break;
- }
+ return node;
}
-void LightOccluder2DEditor::_wip_close(bool p_closed) {
-
- undo_redo->create_action(TTR("Create Poly"));
- undo_redo->add_undo_method(node->get_occluder_polygon().ptr(), "set_polygon", node->get_occluder_polygon()->get_polygon());
- undo_redo->add_do_method(node->get_occluder_polygon().ptr(), "set_polygon", wip);
- undo_redo->add_undo_method(node->get_occluder_polygon().ptr(), "set_closed", node->get_occluder_polygon()->is_closed());
- undo_redo->add_do_method(node->get_occluder_polygon().ptr(), "set_closed", p_closed);
+void LightOccluder2DEditor::_set_node(Node *p_polygon) {
- undo_redo->add_do_method(canvas_item_editor, "update_viewport");
- undo_redo->add_undo_method(canvas_item_editor, "update_viewport");
- undo_redo->commit_action();
- wip.clear();
- wip_active = false;
- mode = MODE_EDIT;
- button_edit->set_pressed(true);
- button_create->set_pressed(false);
- edited_point = -1;
+ node = Object::cast_to<LightOccluder2D>(p_polygon);
}
-bool LightOccluder2DEditor::forward_gui_input(const Ref<InputEvent> &p_event) {
+bool LightOccluder2DEditor::_is_line() const {
- if (!node)
+ Ref<OccluderPolygon2D> occluder = node->get_occluder_polygon();
+ if (occluder.is_valid())
+ return !occluder->is_closed();
+ else
return false;
-
- if (node->get_occluder_polygon().is_null()) {
- Ref<InputEventMouseButton> mb = p_event;
- if (mb.is_valid() && mb->get_button_index() == 1 && mb->is_pressed()) {
- create_poly->set_text(TTR("No OccluderPolygon2D resource on this node.\nCreate and assign one?"));
- create_poly->popup_centered_minsize();
- }
- return (mb.is_valid() && mb->get_button_index() == 1);
- }
-
- Ref<InputEventMouseButton> mb = p_event;
-
- if (mb.is_valid()) {
-
- Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
-
- Vector2 gpoint = mb->get_position();
- Vector2 cpoint = node->get_global_transform().affine_inverse().xform(canvas_item_editor->snap_point(canvas_item_editor->get_canvas_transform().affine_inverse().xform(mb->get_position())));
-
- Vector<Vector2> poly = Variant(node->get_occluder_polygon()->get_polygon());
-
- //first check if a point is to be added (segment split)
- real_t grab_threshold = EDITOR_DEF("editors/poly_editor/point_grab_radius", 8);
-
- switch (mode) {
-
- case MODE_CREATE: {
-
- if (mb->get_button_index() == BUTTON_LEFT && mb->is_pressed()) {
-
- if (!wip_active) {
-
- wip.clear();
- wip.push_back(cpoint);
- wip_active = true;
- edited_point_pos = cpoint;
- canvas_item_editor->update_viewport();
- edited_point = 1;
- return true;
- } else {
-
- if (wip.size() > 1 && xform.xform(wip[0]).distance_to(gpoint) < grab_threshold) {
- //wip closed
- _wip_close(true);
-
- return true;
- } else if (wip.size() > 1 && xform.xform(wip[wip.size() - 1]).distance_to(gpoint) < grab_threshold) {
- //wip closed
- _wip_close(false);
- return true;
-
- } else {
-
- wip.push_back(cpoint);
- edited_point = wip.size();
- canvas_item_editor->update_viewport();
- return true;
-
- //add wip point
- }
- }
- } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && wip_active) {
- _wip_close(true);
- }
-
- } break;
-
- case MODE_EDIT: {
-
- if (mb->get_button_index() == BUTTON_LEFT) {
- if (mb->is_pressed()) {
-
- if (mb->get_control()) {
-
- if (poly.size() < 3) {
-
- undo_redo->create_action(TTR("Edit Poly"));
- undo_redo->add_undo_method(node->get_occluder_polygon().ptr(), "set_polygon", poly);
- poly.push_back(cpoint);
- undo_redo->add_do_method(node->get_occluder_polygon().ptr(), "set_polygon", poly);
- undo_redo->add_do_method(canvas_item_editor, "update_viewport");
- undo_redo->add_undo_method(canvas_item_editor, "update_viewport");
- undo_redo->commit_action();
- return true;
- }
-
- //search edges
- int closest_idx = -1;
- Vector2 closest_pos;
- real_t closest_dist = 1e10;
- for (int i = 0; i < poly.size(); i++) {
-
- Vector2 points[2] = { xform.xform(poly[i]),
- xform.xform(poly[(i + 1) % poly.size()]) };
-
- Vector2 cp = Geometry::get_closest_point_to_segment_2d(gpoint, points);
- if (cp.distance_squared_to(points[0]) < CMP_EPSILON2 || cp.distance_squared_to(points[1]) < CMP_EPSILON2)
- continue; //not valid to reuse point
-
- real_t d = cp.distance_to(gpoint);
- if (d < closest_dist && d < grab_threshold) {
- closest_dist = d;
- closest_pos = cp;
- closest_idx = i;
- }
- }
-
- if (closest_idx >= 0) {
-
- pre_move_edit = poly;
- poly.insert(closest_idx + 1, xform.affine_inverse().xform(closest_pos));
- edited_point = closest_idx + 1;
- edited_point_pos = xform.affine_inverse().xform(closest_pos);
- node->get_occluder_polygon()->set_polygon(Variant(poly));
- canvas_item_editor->update_viewport();
- return true;
- }
- } else {
-
- //look for points to move
-
- int closest_idx = -1;
- Vector2 closest_pos;
- real_t closest_dist = 1e10;
- for (int i = 0; i < poly.size(); i++) {
-
- Vector2 cp = xform.xform(poly[i]);
-
- real_t d = cp.distance_to(gpoint);
- if (d < closest_dist && d < grab_threshold) {
- closest_dist = d;
- closest_pos = cp;
- closest_idx = i;
- }
- }
-
- if (closest_idx >= 0) {
-
- pre_move_edit = poly;
- edited_point = closest_idx;
- edited_point_pos = xform.affine_inverse().xform(closest_pos);
- canvas_item_editor->update_viewport();
- return true;
- }
- }
- } else {
-
- if (edited_point != -1) {
-
- //apply
-
- ERR_FAIL_INDEX_V(edited_point, poly.size(), false);
- poly.write[edited_point] = edited_point_pos;
- undo_redo->create_action(TTR("Edit Poly"));
- undo_redo->add_do_method(node->get_occluder_polygon().ptr(), "set_polygon", poly);
- undo_redo->add_undo_method(node->get_occluder_polygon().ptr(), "set_polygon", pre_move_edit);
- undo_redo->add_do_method(canvas_item_editor, "update_viewport");
- undo_redo->add_undo_method(canvas_item_editor, "update_viewport");
- undo_redo->commit_action();
-
- edited_point = -1;
- return true;
- }
- }
- } else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed() && edited_point == -1) {
-
- int closest_idx = -1;
- Vector2 closest_pos;
- real_t closest_dist = 1e10;
- for (int i = 0; i < poly.size(); i++) {
-
- Vector2 cp = xform.xform(poly[i]);
-
- real_t d = cp.distance_to(gpoint);
- if (d < closest_dist && d < grab_threshold) {
- closest_dist = d;
- closest_pos = cp;
- closest_idx = i;
- }
- }
-
- if (closest_idx >= 0) {
-
- undo_redo->create_action(TTR("Edit Poly (Remove Point)"));
- undo_redo->add_undo_method(node->get_occluder_polygon().ptr(), "set_polygon", poly);
- poly.remove(closest_idx);
- undo_redo->add_do_method(node->get_occluder_polygon().ptr(), "set_polygon", poly);
- undo_redo->add_do_method(canvas_item_editor, "update_viewport");
- undo_redo->add_undo_method(canvas_item_editor, "update_viewport");
- undo_redo->commit_action();
- return true;
- }
- }
-
- } break;
- }
- }
-
- Ref<InputEventMouseMotion> mm = p_event;
-
- if (mm.is_valid()) {
-
- if (edited_point != -1 && (wip_active || mm->get_button_mask() & BUTTON_MASK_LEFT)) {
-
- Vector2 gpoint = mm->get_position();
- Vector2 cpoint = canvas_item_editor->get_canvas_transform().affine_inverse().xform(gpoint);
- cpoint = canvas_item_editor->snap_point(cpoint);
- edited_point_pos = node->get_global_transform().affine_inverse().xform(cpoint);
-
- canvas_item_editor->update_viewport();
- }
- }
-
- return false;
}
-void LightOccluder2DEditor::forward_canvas_draw_over_viewport(Control *p_overlay) {
-
- if (!node || !node->get_occluder_polygon().is_valid())
- return;
-
- Vector<Vector2> poly;
+int LightOccluder2DEditor::_get_polygon_count() const {
- if (wip_active)
- poly = wip;
+ Ref<OccluderPolygon2D> occluder = node->get_occluder_polygon();
+ if (occluder.is_valid())
+ return occluder->get_polygon().size();
else
- poly = Variant(node->get_occluder_polygon()->get_polygon());
-
- Transform2D xform = canvas_item_editor->get_canvas_transform() * node->get_global_transform();
- Ref<Texture> handle = get_icon("EditorHandle", "EditorIcons");
-
- for (int i = 0; i < poly.size(); i++) {
-
- Vector2 p, p2;
- p = i == edited_point ? edited_point_pos : poly[i];
- if ((wip_active && i == poly.size() - 1) || (((i + 1) % poly.size()) == edited_point))
- p2 = edited_point_pos;
- else
- p2 = poly[(i + 1) % poly.size()];
+ return 0;
+}
- Vector2 point = xform.xform(p);
- Vector2 next_point = xform.xform(p2);
+Variant LightOccluder2DEditor::_get_polygon(int p_idx) const {
- Color col = Color(1, 0.3, 0.1, 0.8);
+ Ref<OccluderPolygon2D> occluder = node->get_occluder_polygon();
+ if (occluder.is_valid())
+ return occluder->get_polygon();
+ else
+ return Variant(Vector<Vector2>());
+}
- if (i == poly.size() - 1 && (!node->get_occluder_polygon()->is_closed() || wip_active)) {
+void LightOccluder2DEditor::_set_polygon(int p_idx, const Variant &p_polygon) const {
- } else {
- p_overlay->draw_line(point, next_point, col, 2);
- }
- p_overlay->draw_texture(handle, point - handle->get_size() * 0.5);
- }
+ Ref<OccluderPolygon2D> occluder = _ensure_occluder();
+ occluder->set_polygon(p_polygon);
}
-void LightOccluder2DEditor::edit(Node *p_collision_polygon) {
+void LightOccluder2DEditor::_action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon) {
- if (!canvas_item_editor) {
- canvas_item_editor = CanvasItemEditor::get_singleton();
- }
+ Ref<OccluderPolygon2D> occluder = _ensure_occluder();
+ undo_redo->add_do_method(occluder.ptr(), "set_polygon", p_polygon);
+ undo_redo->add_undo_method(occluder.ptr(), "set_polygon", p_previous);
+}
- if (p_collision_polygon) {
+bool LightOccluder2DEditor::_has_resource() const {
- node = Object::cast_to<LightOccluder2D>(p_collision_polygon);
- wip.clear();
- wip_active = false;
- edited_point = -1;
- canvas_item_editor->update_viewport();
- } else {
- node = NULL;
- }
+ return node && node->get_occluder_polygon().is_valid();
}
-void LightOccluder2DEditor::_create_poly() {
+void LightOccluder2DEditor::_create_resource() {
if (!node)
return;
+
undo_redo->create_action(TTR("Create Occluder Polygon"));
undo_redo->add_do_method(node, "set_occluder_polygon", Ref<OccluderPolygon2D>(memnew(OccluderPolygon2D)));
undo_redo->add_undo_method(node, "set_occluder_polygon", Variant(REF()));
undo_redo->commit_action();
-}
-
-void LightOccluder2DEditor::_bind_methods() {
- ClassDB::bind_method(D_METHOD("_menu_option"), &LightOccluder2DEditor::_menu_option);
- ClassDB::bind_method(D_METHOD("_node_removed"), &LightOccluder2DEditor::_node_removed);
- ClassDB::bind_method(D_METHOD("_create_poly"), &LightOccluder2DEditor::_create_poly);
+ _menu_option(MODE_CREATE);
}
-LightOccluder2DEditor::LightOccluder2DEditor(EditorNode *p_editor) {
+LightOccluder2DEditor::LightOccluder2DEditor(EditorNode *p_editor) :
+ AbstractPolygon2DEditor(p_editor) {
node = NULL;
- canvas_item_editor = NULL;
- editor = p_editor;
- undo_redo = editor->get_undo_redo();
-
- add_child(memnew(VSeparator));
- button_create = memnew(ToolButton);
- add_child(button_create);
- button_create->connect("pressed", this, "_menu_option", varray(MODE_CREATE));
- button_create->set_toggle_mode(true);
- button_create->set_tooltip(TTR("Create a new polygon from scratch."));
-
- button_edit = memnew(ToolButton);
- add_child(button_edit);
- button_edit->connect("pressed", this, "_menu_option", varray(MODE_EDIT));
- button_edit->set_toggle_mode(true);
- button_edit->set_tooltip(TTR("Edit existing polygon:") + "\n" + TTR("LMB: Move Point.") + "\n" + TTR("Ctrl+LMB: Split Segment.") + "\n" + TTR("RMB: Erase Point."));
-
- create_poly = memnew(ConfirmationDialog);
- add_child(create_poly);
- create_poly->get_ok()->set_text(TTR("Create"));
-
- mode = MODE_EDIT;
- wip_active = false;
-}
-
-void LightOccluder2DEditorPlugin::edit(Object *p_object) {
-
- light_occluder_editor->edit(Object::cast_to<Node>(p_object));
-}
-
-bool LightOccluder2DEditorPlugin::handles(Object *p_object) const {
-
- return p_object->is_class("LightOccluder2D");
-}
-
-void LightOccluder2DEditorPlugin::make_visible(bool p_visible) {
-
- if (p_visible) {
- light_occluder_editor->show();
- } else {
-
- light_occluder_editor->hide();
- light_occluder_editor->edit(NULL);
- }
-}
-
-LightOccluder2DEditorPlugin::LightOccluder2DEditorPlugin(EditorNode *p_node) {
-
- editor = p_node;
- light_occluder_editor = memnew(LightOccluder2DEditor(p_node));
- CanvasItemEditor::get_singleton()->add_control_to_menu_panel(light_occluder_editor);
-
- light_occluder_editor->hide();
}
-LightOccluder2DEditorPlugin::~LightOccluder2DEditorPlugin() {
+LightOccluder2DEditorPlugin::LightOccluder2DEditorPlugin(EditorNode *p_node) :
+ AbstractPolygon2DEditorPlugin(p_node, memnew(LightOccluder2DEditor(p_node)), "LightOccluder2D") {
}
diff --git a/editor/plugins/light_occluder_2d_editor_plugin.h b/editor/plugins/light_occluder_2d_editor_plugin.h
index a1962892ee..6117d50e89 100644
--- a/editor/plugins/light_occluder_2d_editor_plugin.h
+++ b/editor/plugins/light_occluder_2d_editor_plugin.h
@@ -31,83 +31,44 @@
#ifndef LIGHT_OCCLUDER_2D_EDITOR_PLUGIN_H
#define LIGHT_OCCLUDER_2D_EDITOR_PLUGIN_H
-#include "editor/editor_node.h"
-#include "editor/editor_plugin.h"
+#include "editor/plugins/abstract_polygon_2d_editor.h"
#include "scene/2d/light_occluder_2d.h"
-#include "scene/gui/tool_button.h"
/**
@author Juan Linietsky <reduzio@gmail.com>
*/
-class CanvasItemEditor;
+class LightOccluder2DEditor : public AbstractPolygon2DEditor {
-class LightOccluder2DEditor : public HBoxContainer {
+ GDCLASS(LightOccluder2DEditor, AbstractPolygon2DEditor);
- GDCLASS(LightOccluder2DEditor, HBoxContainer);
-
- UndoRedo *undo_redo;
- enum Mode {
-
- MODE_CREATE,
- MODE_EDIT,
-
- };
-
- Mode mode;
-
- ToolButton *button_create;
- ToolButton *button_edit;
-
- CanvasItemEditor *canvas_item_editor;
- EditorNode *editor;
- Panel *panel;
LightOccluder2D *node;
- MenuButton *options;
- int edited_point;
- Vector2 edited_point_pos;
- Vector<Vector2> pre_move_edit;
- Vector<Vector2> wip;
- bool wip_active;
+ Ref<OccluderPolygon2D> _ensure_occluder() const;
- ConfirmationDialog *create_poly;
+protected:
+ virtual Node2D *_get_node() const;
+ virtual void _set_node(Node *p_polygon);
- void _wip_close(bool p_closed);
- void _menu_option(int p_option);
- void _create_poly();
+ virtual bool _is_line() const;
+ virtual int _get_polygon_count() const;
+ virtual Variant _get_polygon(int p_idx) const;
+ virtual void _set_polygon(int p_idx, const Variant &p_polygon) const;
-protected:
- void _notification(int p_what);
- void _node_removed(Node *p_node);
- static void _bind_methods();
+ virtual void _action_set_polygon(int p_idx, const Variant &p_previous, const Variant &p_polygon);
+
+ virtual bool _has_resource() const;
+ virtual void _create_resource();
public:
- Vector2 snap_point(const Vector2 &p_point) const;
- void forward_canvas_draw_over_viewport(Control *p_overlay);
- bool forward_gui_input(const Ref<InputEvent> &p_event);
- void edit(Node *p_collision_polygon);
LightOccluder2DEditor(EditorNode *p_editor);
};
-class LightOccluder2DEditorPlugin : public EditorPlugin {
+class LightOccluder2DEditorPlugin : public AbstractPolygon2DEditorPlugin {
- GDCLASS(LightOccluder2DEditorPlugin, EditorPlugin);
-
- LightOccluder2DEditor *light_occluder_editor;
- EditorNode *editor;
+ GDCLASS(LightOccluder2DEditorPlugin, AbstractPolygon2DEditorPlugin);
public:
- virtual bool forward_canvas_gui_input(const Ref<InputEvent> &p_event) { return light_occluder_editor->forward_gui_input(p_event); }
- virtual void forward_canvas_draw_over_viewport(Control *p_overlay) { return light_occluder_editor->forward_canvas_draw_over_viewport(p_overlay); }
-
- virtual String get_name() const { return "LightOccluder2D"; }
- bool has_main_screen() const { return false; }
- virtual void edit(Object *p_object);
- virtual bool handles(Object *p_object) const;
- virtual void make_visible(bool p_visible);
-
LightOccluder2DEditorPlugin(EditorNode *p_node);
- ~LightOccluder2DEditorPlugin();
};
#endif // LIGHT_OCCLUDER_2D_EDITOR_PLUGIN_H
diff --git a/editor/plugins/polygon_2d_editor_plugin.cpp b/editor/plugins/polygon_2d_editor_plugin.cpp
index 45268d8c8d..97448f3f88 100644
--- a/editor/plugins/polygon_2d_editor_plugin.cpp
+++ b/editor/plugins/polygon_2d_editor_plugin.cpp
@@ -56,6 +56,12 @@ void Polygon2DEditor::_notification(int p_what) {
switch (p_what) {
+ case NOTIFICATION_ENTER_TREE:
+ case NOTIFICATION_THEME_CHANGED: {
+
+ uv_edit_draw->add_style_override("panel", get_stylebox("bg", "Tree"));
+ bone_scroll->add_style_override("bg", get_stylebox("bg", "Tree"));
+ } break;
case NOTIFICATION_READY: {
button_uv->set_icon(get_icon("Uv", "EditorIcons"));
@@ -73,66 +79,68 @@ void Polygon2DEditor::_notification(int p_what) {
b_snap_grid->set_icon(get_icon("Grid", "EditorIcons"));
b_snap_enable->set_icon(get_icon("SnapGrid", "EditorIcons"));
uv_icon_zoom->set_texture(get_icon("Zoom", "EditorIcons"));
-
} break;
- case NOTIFICATION_PHYSICS_PROCESS: {
+ case NOTIFICATION_VISIBILITY_CHANGED: {
+ if (!is_visible()) {
+ uv_edit->hide();
+ }
} break;
}
}
void Polygon2DEditor::_sync_bones() {
+ Skeleton2D *skeleton;
if (!node->has_node(node->get_skeleton())) {
error->set_text(TTR("The skeleton property of the Polygon2D does not point to a Skeleton2D node"));
error->popup_centered_minsize();
- return;
+ } else {
+ Node *sn = node->get_node(node->get_skeleton());
+ skeleton = Object::cast_to<Skeleton2D>(sn);
}
- Node *sn = node->get_node(node->get_skeleton());
- Skeleton2D *skeleton = Object::cast_to<Skeleton2D>(sn);
+ Array prev_bones = node->call("_get_bones");
+ node->clear_bones();
if (!skeleton) {
error->set_text(TTR("The skeleton property of the Polygon2D does not point to a Skeleton2D node"));
error->popup_centered_minsize();
- return;
- }
-
- Array prev_bones = node->call("_get_bones");
- node->clear_bones();
-
- for (int i = 0; i < skeleton->get_bone_count(); i++) {
- NodePath path = skeleton->get_path_to(skeleton->get_bone(i));
- PoolVector<float> weights;
- int wc = node->get_polygon().size();
-
- for (int j = 0; j < prev_bones.size(); j += 2) {
- NodePath pvp = prev_bones[j];
- PoolVector<float> pv = prev_bones[j + 1];
- if (pvp == path && pv.size() == wc) {
- weights = pv;
+ } else {
+ for (int i = 0; i < skeleton->get_bone_count(); i++) {
+ NodePath path = skeleton->get_path_to(skeleton->get_bone(i));
+ PoolVector<float> weights;
+ int wc = node->get_polygon().size();
+
+ for (int j = 0; j < prev_bones.size(); j += 2) {
+ NodePath pvp = prev_bones[j];
+ PoolVector<float> pv = prev_bones[j + 1];
+ if (pvp == path && pv.size() == wc) {
+ weights = pv;
+ }
}
- }
- if (weights.size() == 0) { //create them
- weights.resize(node->get_polygon().size());
- PoolVector<float>::Write w = weights.write();
- for (int j = 0; j < wc; j++) {
- w[j] = 0.0;
+ if (weights.size() == 0) { //create them
+ weights.resize(node->get_polygon().size());
+ PoolVector<float>::Write w = weights.write();
+ for (int j = 0; j < wc; j++) {
+ w[j] = 0.0;
+ }
}
- }
- node->add_bone(path, weights);
+ node->add_bone(path, weights);
+ }
}
+
Array new_bones = node->call("_get_bones");
- undo_redo->create_action(TTR("Sync bones"));
+ undo_redo->create_action(TTR("Sync Bones"));
undo_redo->add_do_method(node, "_set_bones", new_bones);
undo_redo->add_undo_method(node, "_set_bones", prev_bones);
- undo_redo->add_do_method(uv_edit_draw, "update");
- undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->add_do_method(this, "_update_bone_list");
undo_redo->add_undo_method(this, "_update_bone_list");
+ undo_redo->add_do_method(uv_edit_draw, "update");
+ undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->commit_action();
}
@@ -162,9 +170,10 @@ void Polygon2DEditor::_update_bone_list() {
cb->set_text(name);
cb->set_button_group(bg);
cb->set_meta("bone_path", np);
+ cb->set_focus_mode(FOCUS_NONE);
bone_scroll_vb->add_child(cb);
- if (np == selected)
+ if (np == selected || bone_scroll_vb->get_child_count() < 2)
cb->set_pressed(true);
cb->connect("pressed", this, "_bone_paint_selected", varray(i));
@@ -180,6 +189,7 @@ void Polygon2DEditor::_bone_paint_selected(int p_index) {
void Polygon2DEditor::_uv_edit_mode_select(int p_mode) {
if (p_mode == 0) { //uv
+
uv_button[UV_MODE_CREATE]->hide();
for (int i = UV_MODE_MOVE; i <= UV_MODE_SCALE; i++) {
uv_button[i]->show();
@@ -194,8 +204,8 @@ void Polygon2DEditor::_uv_edit_mode_select(int p_mode) {
bone_paint_strength->hide();
bone_paint_radius->hide();
bone_paint_radius_label->hide();
-
} else if (p_mode == 1) { //poly
+
for (int i = 0; i <= UV_MODE_SCALE; i++) {
uv_button[i]->show();
}
@@ -209,8 +219,8 @@ void Polygon2DEditor::_uv_edit_mode_select(int p_mode) {
bone_paint_strength->hide();
bone_paint_radius->hide();
bone_paint_radius_label->hide();
-
} else if (p_mode == 2) { //splits
+
for (int i = 0; i <= UV_MODE_SCALE; i++) {
uv_button[i]->hide();
}
@@ -224,8 +234,8 @@ void Polygon2DEditor::_uv_edit_mode_select(int p_mode) {
bone_paint_strength->hide();
bone_paint_radius->hide();
bone_paint_radius_label->hide();
-
} else if (p_mode == 3) { //bones´
+
for (int i = 0; i <= UV_MODE_REMOVE_SPLIT; i++) {
uv_button[i]->hide();
}
@@ -241,9 +251,17 @@ void Polygon2DEditor::_uv_edit_mode_select(int p_mode) {
bone_paint_pos = Vector2(-100000, -100000); //send brush away when switching
}
+ uv_edit->set_size(uv_edit->get_size()); // Necessary readjustment of the popup window.
uv_edit_draw->update();
}
+void Polygon2DEditor::_uv_edit_popup_hide() {
+
+ EditorSettings::get_singleton()->set("interface/dialogs/uv_editor_bounds", uv_edit->get_rect());
+
+ _cancel_editing();
+}
+
void Polygon2DEditor::_menu_option(int p_option) {
switch (p_option) {
@@ -252,7 +270,7 @@ void Polygon2DEditor::_menu_option(int p_option) {
if (node->get_texture().is_null()) {
- error->set_text("No texture in this polygon.\nSet a texture to be able to edit UV.");
+ error->set_text(TTR("No texture in this polygon.\nSet a texture to be able to edit UV."));
error->popup_centered_minsize();
return;
}
@@ -268,7 +286,10 @@ void Polygon2DEditor::_menu_option(int p_option) {
undo_redo->commit_action();
}
- uv_edit->popup_centered_ratio(0.85);
+ if (EditorSettings::get_singleton()->has_setting("interface/dialogs/uv_editor_bounds"))
+ uv_edit->popup(EditorSettings::get_singleton()->get("interface/dialogs/uv_editor_bounds"));
+ else
+ uv_edit->popup_centered_ratio(0.85);
} break;
case UVEDIT_POLYGON_TO_UV: {
@@ -282,7 +303,6 @@ void Polygon2DEditor::_menu_option(int p_option) {
undo_redo->add_do_method(uv_edit_draw, "update");
undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->commit_action();
-
} break;
case UVEDIT_UV_TO_POLYGON: {
@@ -291,13 +311,12 @@ void Polygon2DEditor::_menu_option(int p_option) {
if (uvs.size() == 0)
break;
- undo_redo->create_action(TTR("Create UV Map"));
+ undo_redo->create_action(TTR("Create Polygon"));
undo_redo->add_do_method(node, "set_polygon", uvs);
undo_redo->add_undo_method(node, "set_polygon", points);
undo_redo->add_do_method(uv_edit_draw, "update");
undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->commit_action();
-
} break;
case UVEDIT_UV_CLEAR: {
@@ -310,43 +329,81 @@ void Polygon2DEditor::_menu_option(int p_option) {
undo_redo->add_do_method(uv_edit_draw, "update");
undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->commit_action();
-
} break;
case UVEDIT_GRID_SETTINGS: {
+
grid_settings->popup_centered_minsize();
} break;
default: {
+
AbstractPolygon2DEditor::_menu_option(p_option);
} break;
}
}
+void Polygon2DEditor::_cancel_editing() {
+
+ if (uv_create) {
+ uv_drag = false;
+ uv_create = false;
+ node->set_uv(uv_create_uv_prev);
+ node->set_polygon(uv_create_poly_prev);
+ node->call("_set_bones", uv_create_bones_prev);
+ node->set_splits(splits_prev);
+ } else if (uv_drag) {
+ uv_drag = false;
+ if (uv_edit_mode[0]->is_pressed()) { // Edit UV.
+ node->set_uv(points_prev);
+ } else if (uv_edit_mode[1]->is_pressed()) { // Edit polygon.
+ node->set_polygon(points_prev);
+ }
+ } else if (split_create) {
+ split_create = false;
+ }
+}
+
+void Polygon2DEditor::_commit_action() {
+
+ // Makes that undo/redoing actions made outside of the UV editor still affects its polygon.
+ undo_redo->add_do_method(uv_edit_draw, "update");
+ undo_redo->add_undo_method(uv_edit_draw, "update");
+ undo_redo->add_do_method(CanvasItemEditor::get_singleton(), "update_viewport");
+ undo_redo->add_undo_method(CanvasItemEditor::get_singleton(), "update_viewport");
+ undo_redo->commit_action();
+}
+
void Polygon2DEditor::_set_use_snap(bool p_use) {
use_snap = p_use;
+ EditorSettings::get_singleton()->set_project_metadata("polygon_2d_uv_editor", "snap_enabled", p_use);
}
void Polygon2DEditor::_set_show_grid(bool p_show) {
snap_show_grid = p_show;
+ EditorSettings::get_singleton()->set_project_metadata("polygon_2d_uv_editor", "show_grid", p_show);
uv_edit_draw->update();
}
void Polygon2DEditor::_set_snap_off_x(float p_val) {
snap_offset.x = p_val;
+ EditorSettings::get_singleton()->set_project_metadata("polygon_2d_uv_editor", "snap_offset", snap_offset);
uv_edit_draw->update();
}
void Polygon2DEditor::_set_snap_off_y(float p_val) {
snap_offset.y = p_val;
+ EditorSettings::get_singleton()->set_project_metadata("polygon_2d_uv_editor", "snap_offset", snap_offset);
uv_edit_draw->update();
}
void Polygon2DEditor::_set_snap_step_x(float p_val) {
snap_step.x = p_val;
+ EditorSettings::get_singleton()->set_project_metadata("polygon_2d_uv_editor", "snap_step", snap_step);
uv_edit_draw->update();
}
void Polygon2DEditor::_set_snap_step_y(float p_val) {
snap_step.y = p_val;
+ EditorSettings::get_singleton()->set_project_metadata("polygon_2d_uv_editor", "snap_step", snap_step);
uv_edit_draw->update();
}
@@ -364,6 +421,9 @@ void Polygon2DEditor::_uv_mode(int p_mode) {
void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
+ if (!_get_node())
+ return;
+
Transform2D mtx;
mtx.elements[2] = -uv_draw_ofs;
mtx.scale_basis(Vector2(uv_draw_zoom, uv_draw_zoom));
@@ -376,7 +436,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
if (mb->is_pressed()) {
- uv_drag_from = Vector2(mb->get_position().x, mb->get_position().y);
+ uv_drag_from = snap_point(Vector2(mb->get_position().x, mb->get_position().y));
uv_drag = true;
points_prev = node->get_uv();
@@ -390,8 +450,9 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
if (uv_move_current == UV_MODE_CREATE) {
if (!uv_create) {
+
points_prev.resize(0);
- Vector2 tuv = mtx.affine_inverse().xform(Vector2(mb->get_position().x, mb->get_position().y));
+ Vector2 tuv = mtx.affine_inverse().xform(snap_point(Vector2(mb->get_position().x, mb->get_position().y)));
points_prev.push_back(tuv);
uv_create_to = tuv;
point_drag_index = 0;
@@ -405,23 +466,27 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
node->set_polygon(points_prev);
node->set_uv(points_prev);
+ uv_edit_draw->update();
} else {
- Vector2 tuv = mtx.affine_inverse().xform(Vector2(mb->get_position().x, mb->get_position().y));
- if (points_prev.size() > 3 && tuv.distance_to(points_prev[0]) < 8) {
+ Vector2 tuv = mtx.affine_inverse().xform(snap_point(Vector2(mb->get_position().x, mb->get_position().y)));
+
+ if (points_prev.size() > 2 && tuv.distance_to(points_prev[0]) < 8) {
undo_redo->create_action(TTR("Create Polygon & UV"));
undo_redo->add_do_method(node, "set_uv", node->get_uv());
- undo_redo->add_undo_method(node, "set_uv", points_prev);
+ undo_redo->add_undo_method(node, "set_uv", uv_create_uv_prev);
undo_redo->add_do_method(node, "set_polygon", node->get_polygon());
- undo_redo->add_undo_method(node, "set_polygon", points_prev);
+ undo_redo->add_undo_method(node, "set_polygon", uv_create_poly_prev);
undo_redo->add_do_method(node, "clear_bones");
- undo_redo->add_undo_method(node, "_set_bones", node->call("_get_bones"));
+ undo_redo->add_undo_method(node, "_set_bones", uv_create_bones_prev);
undo_redo->add_do_method(uv_edit_draw, "update");
undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->commit_action();
uv_drag = false;
uv_create = false;
+
_uv_mode(UV_MODE_EDIT_POINT);
+ _menu_option(MODE_EDIT);
} else {
points_prev.push_back(tuv);
point_drag_index = points_prev.size() - 1;
@@ -430,6 +495,8 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
node->set_polygon(points_prev);
node->set_uv(points_prev);
}
+
+ CanvasItemEditor::get_singleton()->update_viewport();
}
if (uv_move_current == UV_MODE_EDIT_POINT) {
@@ -540,7 +607,6 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
splits_prev.push_back(split_to_index);
undo_redo->create_action(TTR("Add Split"));
-
undo_redo->add_do_method(node, "set_splits", splits_prev);
undo_redo->add_undo_method(node, "set_splits", node->get_splits());
undo_redo->add_do_method(uv_edit_draw, "update");
@@ -575,13 +641,11 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
splits_prev.remove(i);
undo_redo->create_action(TTR("Remove Split"));
-
undo_redo->add_do_method(node, "set_splits", splits_prev);
undo_redo->add_undo_method(node, "set_splits", node->get_splits());
undo_redo->add_do_method(uv_edit_draw, "update");
undo_redo->add_undo_method(uv_edit_draw, "update");
undo_redo->commit_action();
-
break;
}
}
@@ -608,12 +672,12 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
} else if (uv_drag && !uv_create) {
- undo_redo->create_action(TTR("Transform UV Map"));
-
if (uv_edit_mode[0]->is_pressed()) { //edit uv
+ undo_redo->create_action(TTR("Transform UV Map"));
undo_redo->add_do_method(node, "set_uv", node->get_uv());
undo_redo->add_undo_method(node, "set_uv", points_prev);
} else if (uv_edit_mode[1]->is_pressed()) { //edit polygon
+ undo_redo->create_action(TTR("Transform Polygon"));
undo_redo->add_do_method(node, "set_polygon", node->get_polygon());
undo_redo->add_undo_method(node, "set_polygon", points_prev);
}
@@ -624,7 +688,7 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
uv_drag = false;
} else if (bone_painting) {
- undo_redo->create_action(TTR("Paint bone weights"));
+ undo_redo->create_action(TTR("Paint Bone Weights"));
undo_redo->add_do_method(node, "set_bone_weights", bone_painting_bone, node->get_bone_weights(bone_painting_bone));
undo_redo->add_undo_method(node, "set_bone_weights", bone_painting_bone, prev_weights);
undo_redo->add_do_method(uv_edit_draw, "update");
@@ -635,30 +699,12 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
} else if (mb->get_button_index() == BUTTON_RIGHT && mb->is_pressed()) {
- if (uv_create) {
-
- uv_drag = false;
- uv_create = false;
- node->set_uv(uv_create_uv_prev);
- node->set_polygon(uv_create_poly_prev);
- node->call("_set_bones", uv_create_bones_prev);
- node->set_splits(splits_prev);
- uv_edit_draw->update();
- } else if (uv_drag) {
+ _cancel_editing();
- uv_drag = false;
- if (uv_edit_mode[0]->is_pressed()) { //edit uv
- node->set_uv(points_prev);
- } else if (uv_edit_mode[1]->is_pressed()) { //edit polygon
- node->set_polygon(points_prev);
- }
- uv_edit_draw->update();
- } else if (split_create) {
- split_create = false;
- uv_edit_draw->update();
- } else if (bone_painting) {
+ if (bone_painting)
node->set_bone_weights(bone_painting_bone, prev_weights);
- }
+
+ uv_edit_draw->update();
} else if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed()) {
@@ -682,13 +728,15 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
} else if (uv_drag) {
Vector2 uv_drag_to = mm->get_position();
+ uv_drag_to = snap_point(uv_drag_to); // FIXME: Only works correctly with 'UV_MODE_EDIT_POINT', it's imprecise with the rest.
Vector2 drag = mtx.affine_inverse().xform(uv_drag_to) - mtx.affine_inverse().xform(uv_drag_from);
switch (uv_move_current) {
case UV_MODE_CREATE: {
+
if (uv_create) {
- uv_create_to = mtx.affine_inverse().xform(Vector2(mm->get_position().x, mm->get_position().y));
+ uv_create_to = mtx.affine_inverse().xform(snap_point(Vector2(mm->get_position().x, mm->get_position().y)));
}
} break;
case UV_MODE_EDIT_POINT: {
@@ -713,7 +761,6 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
} else if (uv_edit_mode[1]->is_pressed()) { //edit polygon
node->set_polygon(uv_new);
}
-
} break;
case UV_MODE_ROTATE: {
@@ -737,7 +784,6 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
} else if (uv_edit_mode[1]->is_pressed()) { //edit polygon
node->set_polygon(uv_new);
}
-
} break;
case UV_MODE_SCALE: {
@@ -767,11 +813,15 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
node->set_polygon(uv_new);
}
} break;
+ case UV_MODE_PAINT_WEIGHT:
+ case UV_MODE_CLEAR_WEIGHT: {
+
+ bone_paint_pos = Vector2(mm->get_position().x, mm->get_position().y);
+ } break;
default: {}
}
if (bone_painting) {
- bone_paint_pos = Vector2(mm->get_position().x, mm->get_position().y);
PoolVector<float> painted_weights = node->get_bone_weights(bone_painting_bone);
{
@@ -796,7 +846,9 @@ void Polygon2DEditor::_uv_input(const Ref<InputEvent> &p_input) {
node->set_bone_weights(bone_painting_bone, painted_weights);
}
+
uv_edit_draw->update();
+ CanvasItemEditor::get_singleton()->update_viewport();
} else if (split_create) {
uv_create_to = mtx.affine_inverse().xform(Vector2(mm->get_position().x, mm->get_position().y));
uv_edit_draw->update();
@@ -833,6 +885,9 @@ void Polygon2DEditor::_uv_scroll_changed(float) {
void Polygon2DEditor::_uv_draw() {
+ if (!uv_edit->is_visible() || !_get_node())
+ return;
+
Ref<Texture> base_tex = node->get_texture();
if (base_tex.is_null())
return;
@@ -848,6 +903,7 @@ void Polygon2DEditor::_uv_draw() {
VS::get_singleton()->canvas_item_add_set_transform(uv_edit_draw->get_canvas_item(), Transform2D());
if (snap_show_grid) {
+ Color grid_color = Color(1.0, 1.0, 1.0, 0.15);
Size2 s = uv_edit_draw->get_size();
int last_cell = 0;
@@ -857,7 +913,7 @@ void Polygon2DEditor::_uv_draw() {
if (i == 0)
last_cell = cell;
if (last_cell != cell)
- uv_edit_draw->draw_line(Point2(i, 0), Point2(i, s.height), Color(0.3, 0.7, 1, 0.3));
+ uv_edit_draw->draw_line(Point2(i, 0), Point2(i, s.height), grid_color);
last_cell = cell;
}
}
@@ -868,7 +924,7 @@ void Polygon2DEditor::_uv_draw() {
if (i == 0)
last_cell = cell;
if (last_cell != cell)
- uv_edit_draw->draw_line(Point2(0, i), Point2(s.width, i), Color(0.3, 0.7, 1, 0.3));
+ uv_edit_draw->draw_line(Point2(0, i), Point2(s.width, i), grid_color);
last_cell = cell;
}
}
@@ -901,19 +957,26 @@ void Polygon2DEditor::_uv_draw() {
Ref<Texture> handle = get_icon("EditorHandle", "EditorIcons");
+ Color poly_line_color = Color(0.9, 0.5, 0.5);
+ Color prev_color = Color(0.5, 0.5, 0.5);
Rect2 rect(Point2(), mtx.basis_xform(base_tex->get_size()));
rect.expand_to(mtx.basis_xform(uv_edit_draw->get_size()));
for (int i = 0; i < uvs.size(); i++) {
int next = (i + 1) % uvs.size();
+
+ if (uv_drag && uv_move_current == UV_MODE_EDIT_POINT && EDITOR_DEF("editors/poly_editor/show_previous_outline", true)) {
+ uv_edit_draw->draw_line(mtx.xform(points_prev[i]), mtx.xform(points_prev[next]), prev_color, 2 * EDSCALE);
+ }
+
Vector2 next_point = uvs[next];
if (uv_create && i == uvs.size() - 1) {
next_point = uv_create_to;
}
- uv_edit_draw->draw_line(mtx.xform(uvs[i]), mtx.xform(next_point), Color(0.9, 0.5, 0.5), 2);
- if (weight_r.ptr()) {
+ uv_edit_draw->draw_line(mtx.xform(uvs[i]), mtx.xform(next_point), poly_line_color, 2 * EDSCALE);
+ if (weight_r.ptr()) {
Vector2 draw_pos = mtx.xform(uvs[i]);
float weight = weight_r[i];
uv_edit_draw->draw_rect(Rect2(draw_pos - Vector2(2, 2) * EDSCALE, Vector2(5, 5) * EDSCALE), Color(weight, weight, weight, 1.0));
@@ -926,7 +989,7 @@ void Polygon2DEditor::_uv_draw() {
if (split_create) {
Vector2 from = uvs[point_drag_index];
Vector2 to = uv_create_to;
- uv_edit_draw->draw_line(mtx.xform(from), mtx.xform(to), Color(0.9, 0.5, 0.5), 2);
+ uv_edit_draw->draw_line(mtx.xform(from), mtx.xform(to), poly_line_color, 2);
}
PoolVector<int> splits = node->get_splits();
@@ -936,7 +999,7 @@ void Polygon2DEditor::_uv_draw() {
int idx_to = splits[i + 1];
if (idx_from < 0 || idx_to >= uvs.size())
continue;
- uv_edit_draw->draw_line(mtx.xform(uvs[idx_from]), mtx.xform(uvs[idx_to]), Color(0.9, 0.5, 0.5), 2);
+ uv_edit_draw->draw_line(mtx.xform(uvs[idx_from]), mtx.xform(uvs[idx_to]), poly_line_color, 2);
}
if (uv_mode == UV_MODE_PAINT_WEIGHT || uv_mode == UV_MODE_CLEAR_WEIGHT) {
@@ -1002,15 +1065,23 @@ void Polygon2DEditor::_uv_draw() {
updating_uv_scroll = true;
uv_hscroll->set_min(rect.position.x);
uv_hscroll->set_max(rect.position.x + rect.size.x);
- uv_hscroll->set_page(uv_edit_draw->get_size().x);
- uv_hscroll->set_value(uv_draw_ofs.x);
- uv_hscroll->set_step(0.001);
+ if (ABS(rect.position.x - (rect.position.x + rect.size.x)) <= uv_edit_draw->get_size().x) {
+ uv_hscroll->hide();
+ } else {
+ uv_hscroll->show();
+ uv_hscroll->set_page(uv_edit_draw->get_size().x);
+ uv_hscroll->set_value(uv_draw_ofs.x);
+ }
uv_vscroll->set_min(rect.position.y);
uv_vscroll->set_max(rect.position.y + rect.size.y);
- uv_vscroll->set_page(uv_edit_draw->get_size().y);
- uv_vscroll->set_value(uv_draw_ofs.y);
- uv_vscroll->set_step(0.001);
+ if (ABS(rect.position.y - (rect.position.y + rect.size.y)) <= uv_edit_draw->get_size().y) {
+ uv_vscroll->hide();
+ } else {
+ uv_vscroll->show();
+ uv_vscroll->set_page(uv_edit_draw->get_size().y);
+ uv_vscroll->set_value(uv_draw_ofs.y);
+ }
updating_uv_scroll = false;
}
@@ -1027,9 +1098,9 @@ void Polygon2DEditor::_bind_methods() {
ClassDB::bind_method(D_METHOD("_set_snap_step_x"), &Polygon2DEditor::_set_snap_step_x);
ClassDB::bind_method(D_METHOD("_set_snap_step_y"), &Polygon2DEditor::_set_snap_step_y);
ClassDB::bind_method(D_METHOD("_uv_edit_mode_select"), &Polygon2DEditor::_uv_edit_mode_select);
+ ClassDB::bind_method(D_METHOD("_uv_edit_popup_hide"), &Polygon2DEditor::_uv_edit_popup_hide);
ClassDB::bind_method(D_METHOD("_sync_bones"), &Polygon2DEditor::_sync_bones);
ClassDB::bind_method(D_METHOD("_update_bone_list"), &Polygon2DEditor::_update_bone_list);
-
ClassDB::bind_method(D_METHOD("_bone_paint_selected"), &Polygon2DEditor::_bone_paint_selected);
}
@@ -1046,23 +1117,25 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
AbstractPolygon2DEditor(p_editor) {
node = NULL;
- snap_step = Vector2(10, 10);
- use_snap = false;
- snap_show_grid = false;
+ snap_offset = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "snap_offset", Vector2());
+ snap_step = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "snap_step", Vector2(10, 10));
+ use_snap = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "snap_enabled", false);
+ snap_show_grid = EditorSettings::get_singleton()->get_project_metadata("polygon_2d_uv_editor", "show_grid", false);
button_uv = memnew(ToolButton);
add_child(button_uv);
+ button_uv->set_tooltip(TTR("Open Polygon 2D UV editor."));
button_uv->connect("pressed", this, "_menu_option", varray(MODE_EDIT_UV));
uv_mode = UV_MODE_EDIT_POINT;
uv_edit = memnew(AcceptDialog);
add_child(uv_edit);
uv_edit->set_title(TTR("Polygon 2D UV Editor"));
- uv_edit->set_self_modulate(Color(1, 1, 1, 0.9));
+ uv_edit->set_resizable(true);
+ uv_edit->connect("popup_hide", this, "_uv_edit_popup_hide");
VBoxContainer *uv_main_vb = memnew(VBoxContainer);
uv_edit->add_child(uv_main_vb);
- //uv_edit->set_child_rect(uv_main_vb);
HBoxContainer *uv_mode_hb = memnew(HBoxContainer);
uv_edit_group.instance();
@@ -1109,14 +1182,14 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
}
uv_button[0]->set_tooltip(TTR("Create Polygon"));
- uv_button[1]->set_tooltip(TTR("Move Point") + "\n" + TTR("Ctrl: Rotate") + "\n" + TTR("Shift: Move All") + "\n" + TTR("Shift+Ctrl: Scale"));
+ uv_button[1]->set_tooltip(TTR("Move Points") + "\n" + TTR("Ctrl: Rotate") + "\n" + TTR("Shift: Move All") + "\n" + TTR("Shift+Ctrl: Scale"));
uv_button[2]->set_tooltip(TTR("Move Polygon"));
uv_button[3]->set_tooltip(TTR("Rotate Polygon"));
uv_button[4]->set_tooltip(TTR("Scale Polygon"));
- uv_button[5]->set_tooltip(TTR("Connect two points to make a split"));
- uv_button[6]->set_tooltip(TTR("Select a split to erase it"));
- uv_button[7]->set_tooltip(TTR("Paint weights with specified intensity"));
- uv_button[8]->set_tooltip(TTR("UnPaint weights with specified intensity"));
+ uv_button[5]->set_tooltip(TTR("Connect two points to make a split."));
+ uv_button[6]->set_tooltip(TTR("Select a split to erase it."));
+ uv_button[7]->set_tooltip(TTR("Paint weights with specified intensity."));
+ uv_button[8]->set_tooltip(TTR("Unpaint weights with specified intensity."));
uv_button[0]->hide();
uv_button[5]->hide();
@@ -1134,7 +1207,7 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
bone_paint_strength->set_step(0.01);
bone_paint_strength->set_value(0.5);
- bone_paint_radius_label = memnew(Label(" " + TTR("Radius:") + " "));
+ bone_paint_radius_label = memnew(Label(TTR("Radius:")));
uv_mode_hb->add_child(bone_paint_radius_label);
bone_paint_radius = memnew(SpinBox);
uv_mode_hb->add_child(bone_paint_radius);
@@ -1147,12 +1220,13 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
bone_paint_radius->set_step(1);
bone_paint_radius->set_value(32);
- HBoxContainer *uv_main_hb = memnew(HBoxContainer);
- uv_main_vb->add_child(uv_main_hb);
- uv_edit_draw = memnew(Control);
- uv_main_hb->add_child(uv_edit_draw);
- uv_main_hb->set_v_size_flags(SIZE_EXPAND_FILL);
+ HSplitContainer *uv_main_hsc = memnew(HSplitContainer);
+ uv_main_vb->add_child(uv_main_hsc);
+ uv_main_hsc->set_v_size_flags(SIZE_EXPAND_FILL);
+ uv_edit_draw = memnew(Panel);
+ uv_main_hsc->add_child(uv_edit_draw);
uv_edit_draw->set_h_size_flags(SIZE_EXPAND_FILL);
+ uv_edit_draw->set_custom_minimum_size(Size2(200, 200) * EDSCALE);
uv_menu = memnew(MenuButton);
uv_mode_hb->add_child(uv_menu);
uv_menu->set_text(TTR("Edit"));
@@ -1228,6 +1302,7 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
uv_mode_hb->add_child(memnew(VSeparator));
uv_icon_zoom = memnew(TextureRect);
+ uv_icon_zoom->set_stretch_mode(TextureRect::STRETCH_KEEP_CENTERED);
uv_mode_hb->add_child(uv_icon_zoom);
uv_zoom = memnew(HSlider);
uv_zoom->set_min(0.01);
@@ -1245,17 +1320,25 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
uv_zoom->connect("value_changed", this, "_uv_scroll_changed");
uv_vscroll = memnew(VScrollBar);
- uv_main_hb->add_child(uv_vscroll);
+ uv_vscroll->set_step(0.001);
+ uv_edit_draw->add_child(uv_vscroll);
+ uv_vscroll->set_anchors_and_margins_preset(PRESET_RIGHT_WIDE);
uv_vscroll->connect("value_changed", this, "_uv_scroll_changed");
uv_hscroll = memnew(HScrollBar);
- uv_main_vb->add_child(uv_hscroll);
+ uv_hscroll->set_step(0.001);
+ uv_edit_draw->add_child(uv_hscroll);
+ uv_hscroll->set_anchors_and_margins_preset(PRESET_BOTTOM_WIDE);
+ uv_hscroll->set_margin(MARGIN_RIGHT, -uv_vscroll->get_size().x * EDSCALE);
uv_hscroll->connect("value_changed", this, "_uv_scroll_changed");
bone_scroll_main_vb = memnew(VBoxContainer);
bone_scroll_main_vb->hide();
+ bone_scroll_main_vb->set_custom_minimum_size(Size2(150 * EDSCALE, 0));
sync_bones = memnew(Button(TTR("Sync Bones to Polygon")));
bone_scroll_main_vb->add_child(sync_bones);
- uv_main_hb->add_child(bone_scroll_main_vb);
+ sync_bones->set_h_size_flags(0);
+ sync_bones->connect("pressed", this, "_sync_bones");
+ uv_main_hsc->add_child(bone_scroll_main_vb);
bone_scroll = memnew(ScrollContainer);
bone_scroll->set_v_scroll(true);
bone_scroll->set_h_scroll(false);
@@ -1263,7 +1346,6 @@ Polygon2DEditor::Polygon2DEditor(EditorNode *p_editor) :
bone_scroll->set_v_size_flags(SIZE_EXPAND_FILL);
bone_scroll_vb = memnew(VBoxContainer);
bone_scroll->add_child(bone_scroll_vb);
- sync_bones->connect("pressed", this, "_sync_bones");
uv_edit_draw->connect("draw", this, "_uv_draw");
uv_edit_draw->connect("gui_input", this, "_uv_input");
diff --git a/editor/plugins/polygon_2d_editor_plugin.h b/editor/plugins/polygon_2d_editor_plugin.h
index f9b42a21c2..935f1cfff0 100644
--- a/editor/plugins/polygon_2d_editor_plugin.h
+++ b/editor/plugins/polygon_2d_editor_plugin.h
@@ -41,13 +41,11 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
GDCLASS(Polygon2DEditor, AbstractPolygon2DEditor);
enum Mode {
-
MODE_EDIT_UV = MODE_CONT,
UVEDIT_POLYGON_TO_UV,
UVEDIT_UV_TO_POLYGON,
UVEDIT_UV_CLEAR,
UVEDIT_GRID_SETTINGS
-
};
enum UVMode {
@@ -73,7 +71,7 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
ToolButton *uv_button[UV_MODE_MAX];
ToolButton *b_snap_enable;
ToolButton *b_snap_grid;
- Control *uv_edit_draw;
+ Panel *uv_edit_draw;
HSlider *uv_zoom;
SpinBox *uv_zoom_value;
HScrollBar *uv_hscroll;
@@ -125,6 +123,8 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
virtual void _menu_option(int p_option);
+ void _cancel_editing();
+
void _uv_scroll_changed(float);
void _uv_input(const Ref<InputEvent> &p_input);
void _uv_draw();
@@ -138,6 +138,7 @@ class Polygon2DEditor : public AbstractPolygon2DEditor {
void _set_snap_step_y(float p_val);
void _uv_edit_mode_select(int p_mode);
+ void _uv_edit_popup_hide();
void _bone_paint_selected(int p_index);
protected:
@@ -146,6 +147,9 @@ protected:
virtual Vector2 _get_offset(int p_idx) const;
+ virtual bool _has_uv() const { return true; };
+ virtual void _commit_action();
+
void _notification(int p_what);
static void _bind_methods();
diff --git a/editor/plugins/script_editor_plugin.cpp b/editor/plugins/script_editor_plugin.cpp
index 0bbe08821a..44f1625d06 100644
--- a/editor/plugins/script_editor_plugin.cpp
+++ b/editor/plugins/script_editor_plugin.cpp
@@ -40,6 +40,7 @@
#include "editor/editor_settings.h"
#include "editor/find_in_files.h"
#include "editor/node_dock.h"
+#include "editor/plugins/shader_editor_plugin.h"
#include "editor/script_editor_debugger.h"
#include "scene/main/viewport.h"
#include "script_text_editor.h"
@@ -896,12 +897,12 @@ void ScriptEditor::_file_dialog_action(String p_file) {
} break;
case THEME_SAVE_AS: {
if (!EditorSettings::get_singleton()->save_text_editor_theme_as(p_file)) {
- editor->show_warning(TTR("Error while saving theme"), TTR("Error saving"));
+ editor->show_warning(TTR("Error while saving theme."), TTR("Error Saving"));
}
} break;
case THEME_IMPORT: {
if (!EditorSettings::get_singleton()->import_text_editor_theme(p_file)) {
- editor->show_warning(TTR("Error importing theme"), TTR("Error importing"));
+ editor->show_warning(TTR("Error importing theme."), TTR("Error Importing"));
}
} break;
}
@@ -1089,7 +1090,7 @@ void ScriptEditor::_menu_option(int p_option) {
Ref<Script> scr = current->get_edited_resource();
if (scr == NULL || scr.is_null()) {
- EditorNode::get_singleton()->show_warning("Can't obtain the script for running");
+ EditorNode::get_singleton()->show_warning("Can't obtain the script for running.");
break;
}
@@ -1102,13 +1103,13 @@ void ScriptEditor::_menu_option(int p_option) {
}
if (!scr->is_tool()) {
- EditorNode::get_singleton()->show_warning("Script is not in tool mode, will not be able to run");
+ EditorNode::get_singleton()->show_warning("Script is not in tool mode, will not be able to run.");
return;
}
if (!ClassDB::is_parent_class(scr->get_instance_base_type(), "EditorScript")) {
- EditorNode::get_singleton()->show_warning("To run this script, it must inherit EditorScript and be set to tool mode");
+ EditorNode::get_singleton()->show_warning("To run this script, it must inherit EditorScript and be set to tool mode.");
return;
}
@@ -2778,13 +2779,18 @@ void ScriptEditor::_on_find_in_files_requested(String text) {
void ScriptEditor::_on_find_in_files_result_selected(String fpath, int line_number, int begin, int end) {
RES res = ResourceLoader::load(fpath);
- edit(res);
-
- ScriptEditorBase *seb = _get_current_editor();
+ if (fpath.get_extension() == "shader") {
+ ShaderEditorPlugin *shader_editor = Object::cast_to<ShaderEditorPlugin>(EditorNode::get_singleton()->get_editor_data().get_editor("Shader"));
+ shader_editor->edit(res.ptr());
+ shader_editor->make_visible(true);
+ shader_editor->get_shader_editor()->goto_line_selection(line_number - 1, begin, end);
+ } else {
+ edit(res);
- ScriptTextEditor *ste = Object::cast_to<ScriptTextEditor>(seb);
- if (ste) {
- ste->goto_line_selection(line_number - 1, begin, end);
+ ScriptTextEditor *ste = Object::cast_to<ScriptTextEditor>(_get_current_editor());
+ if (ste) {
+ ste->goto_line_selection(line_number - 1, begin, end);
+ }
}
}
@@ -2971,10 +2977,11 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
file_menu = memnew(MenuButton);
menu_hb->add_child(file_menu);
file_menu->set_text(TTR("File"));
+ file_menu->set_switch_on_hover(true);
file_menu->get_popup()->set_hide_on_window_lose_focus(true);
- file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new", TTR("New Script")), FILE_NEW);
- file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new_textfile", TTR("New TextFile")), FILE_NEW_TEXTFILE);
- file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/open", TTR("Open")), FILE_OPEN);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new", TTR("New Script...")), FILE_NEW);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/new_textfile", TTR("New TextFile...")), FILE_NEW_TEXTFILE);
+ file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/open", TTR("Open...")), FILE_OPEN);
file_menu->get_popup()->add_submenu_item(TTR("Open Recent"), "RecentScripts", FILE_OPEN_RECENT);
recent_scripts = memnew(PopupMenu);
@@ -3003,10 +3010,11 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
theme_submenu->set_name("Theme");
file_menu->get_popup()->add_child(theme_submenu);
theme_submenu->connect("id_pressed", this, "_theme_option");
- theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/import_theme", TTR("Import Theme")), THEME_IMPORT);
+ theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/import_theme", TTR("Import Theme...")), THEME_IMPORT);
theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/reload_theme", TTR("Reload Theme")), THEME_RELOAD);
+ theme_submenu->add_separator();
theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/save_theme", TTR("Save Theme")), THEME_SAVE);
- theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/save_theme_as", TTR("Save Theme As")), THEME_SAVE_AS);
+ theme_submenu->add_shortcut(ED_SHORTCUT("script_editor/save_theme_as", TTR("Save Theme As...")), THEME_SAVE_AS);
file_menu->get_popup()->add_separator();
file_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/close_docs", TTR("Close Docs")), CLOSE_DOCS);
@@ -3022,6 +3030,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
script_search_menu = memnew(MenuButton);
menu_hb->add_child(script_search_menu);
script_search_menu->set_text(TTR("Search"));
+ script_search_menu->set_switch_on_hover(true);
script_search_menu->get_popup()->set_hide_on_window_lose_focus(true);
script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find", TTR("Find..."), KEY_MASK_CMD | KEY_F), HELP_SEARCH_FIND);
script_search_menu->get_popup()->add_shortcut(ED_SHORTCUT("script_editor/find_next", TTR("Find Next"), KEY_F3), HELP_SEARCH_FIND_NEXT);
@@ -3031,6 +3040,7 @@ ScriptEditor::ScriptEditor(EditorNode *p_editor) {
debug_menu = memnew(MenuButton);
menu_hb->add_child(debug_menu);
debug_menu->set_text(TTR("Debug"));
+ debug_menu->set_switch_on_hover(true);
debug_menu->get_popup()->set_hide_on_window_lose_focus(true);
debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/step_over", TTR("Step Over"), KEY_F10), DEBUG_NEXT);
debug_menu->get_popup()->add_shortcut(ED_SHORTCUT("debugger/step_into", TTR("Step Into"), KEY_F11), DEBUG_STEP);
diff --git a/editor/plugins/script_text_editor.cpp b/editor/plugins/script_text_editor.cpp
index e6bb8b24a9..6d4b1d1b9c 100644
--- a/editor/plugins/script_text_editor.cpp
+++ b/editor/plugins/script_text_editor.cpp
@@ -131,6 +131,7 @@ void ScriptTextEditor::_load_theme_settings() {
Color safe_line_number_color = EDITOR_GET("text_editor/highlighting/safe_line_number_color");
Color caret_color = EDITOR_GET("text_editor/highlighting/caret_color");
Color caret_background_color = EDITOR_GET("text_editor/highlighting/caret_background_color");
+ Color indent_guide_color = EDITOR_GET("text_editor/highlighting/indent_guide_color");
Color text_selected_color = EDITOR_GET("text_editor/highlighting/text_selected_color");
Color selection_color = EDITOR_GET("text_editor/highlighting/selection_color");
Color brace_mismatch_color = EDITOR_GET("text_editor/highlighting/brace_mismatch_color");
@@ -163,6 +164,7 @@ void ScriptTextEditor::_load_theme_settings() {
text_edit->add_color_override("safe_line_number_color", safe_line_number_color);
text_edit->add_color_override("caret_color", caret_color);
text_edit->add_color_override("caret_background_color", caret_background_color);
+ text_edit->add_color_override("indent_guide_color", indent_guide_color);
text_edit->add_color_override("font_selected_color", text_selected_color);
text_edit->add_color_override("selection_color", selection_color);
text_edit->add_color_override("brace_mismatch_color", brace_mismatch_color);
@@ -1076,7 +1078,7 @@ void ScriptTextEditor::set_syntax_highlighter(SyntaxHighlighter *p_highlighter)
if (p_highlighter != NULL)
highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text(p_highlighter->get_name()), true);
else
- highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text("Standard"), true);
+ highlighter_menu->set_item_checked(highlighter_menu->get_item_idx_from_text(TTR("Standard")), true);
}
void ScriptTextEditor::_change_syntax_highlighter(int p_idx) {
@@ -1466,6 +1468,7 @@ ScriptTextEditor::ScriptTextEditor() {
edit_menu = memnew(MenuButton);
edit_menu->set_text(TTR("Edit"));
+ edit_menu->set_switch_on_hover(true);
edit_menu->get_popup()->set_hide_on_window_lose_focus(true);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
@@ -1509,7 +1512,7 @@ ScriptTextEditor::ScriptTextEditor() {
convert_case->add_shortcut(ED_SHORTCUT("script_text_editor/capitalize", TTR("Capitalize"), KEY_MASK_SHIFT | KEY_F6), EDIT_CAPITALIZE);
convert_case->connect("id_pressed", this, "_edit_option");
- highlighters["Standard"] = NULL;
+ highlighters[TTR("Standard")] = NULL;
highlighter_menu = memnew(PopupMenu);
highlighter_menu->set_name("highlighter_menu");
edit_menu->get_popup()->add_child(highlighter_menu);
@@ -1520,6 +1523,7 @@ ScriptTextEditor::ScriptTextEditor() {
search_menu = memnew(MenuButton);
edit_hb->add_child(search_menu);
search_menu->set_text(TTR("Search"));
+ search_menu->set_switch_on_hover(true);
search_menu->get_popup()->set_hide_on_window_lose_focus(true);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
diff --git a/editor/plugins/shader_editor_plugin.cpp b/editor/plugins/shader_editor_plugin.cpp
index 6bc5c77df2..e3389f25cf 100644
--- a/editor/plugins/shader_editor_plugin.cpp
+++ b/editor/plugins/shader_editor_plugin.cpp
@@ -70,6 +70,7 @@ void ShaderTextEditor::_load_theme_settings() {
Color line_number_color = EDITOR_GET("text_editor/highlighting/line_number_color");
Color caret_color = EDITOR_GET("text_editor/highlighting/caret_color");
Color caret_background_color = EDITOR_GET("text_editor/highlighting/caret_background_color");
+ Color indent_guide_color = EDITOR_GET("text_editor/highlighting/indent_guide_color");
Color text_selected_color = EDITOR_GET("text_editor/highlighting/text_selected_color");
Color selection_color = EDITOR_GET("text_editor/highlighting/selection_color");
Color brace_mismatch_color = EDITOR_GET("text_editor/highlighting/brace_mismatch_color");
@@ -98,6 +99,7 @@ void ShaderTextEditor::_load_theme_settings() {
get_text_edit()->add_color_override("line_number_color", line_number_color);
get_text_edit()->add_color_override("caret_color", caret_color);
get_text_edit()->add_color_override("caret_background_color", caret_background_color);
+ get_text_edit()->add_color_override("indent_guide_color", indent_guide_color);
get_text_edit()->add_color_override("font_selected_color", text_selected_color);
get_text_edit()->add_color_override("selection_color", selection_color);
get_text_edit()->add_color_override("brace_mismatch_color", brace_mismatch_color);
@@ -350,9 +352,9 @@ void ShaderEditor::_menu_option(int p_option) {
void ShaderEditor::_notification(int p_what) {
- if (p_what == NOTIFICATION_ENTER_TREE) {
- }
- if (p_what == NOTIFICATION_DRAW) {
+ if (p_what == NOTIFICATION_VISIBILITY_CHANGED) {
+ if (is_visible_in_tree())
+ shader_editor->get_text_edit()->grab_focus();
}
}
@@ -368,6 +370,7 @@ void ShaderEditor::_editor_settings_changed() {
shader_editor->get_text_edit()->set_indent_size(EditorSettings::get_singleton()->get("text_editor/indent/size"));
shader_editor->get_text_edit()->set_indent_using_spaces(EditorSettings::get_singleton()->get("text_editor/indent/type"));
shader_editor->get_text_edit()->set_auto_indent(EditorSettings::get_singleton()->get("text_editor/indent/auto_indent"));
+ shader_editor->get_text_edit()->set_draw_indent_guides(EditorSettings::get_singleton()->get("text_editor/indent/draw_indent_guides"));
shader_editor->get_text_edit()->set_draw_tabs(EditorSettings::get_singleton()->get("text_editor/indent/draw_tabs"));
shader_editor->get_text_edit()->set_show_line_numbers(EditorSettings::get_singleton()->get("text_editor/line_numbers/show_line_numbers"));
shader_editor->get_text_edit()->set_syntax_coloring(EditorSettings::get_singleton()->get("text_editor/highlighting/syntax_highlighting"));
@@ -389,7 +392,6 @@ void ShaderEditor::_bind_methods() {
ClassDB::bind_method("_menu_option", &ShaderEditor::_menu_option);
ClassDB::bind_method("_params_changed", &ShaderEditor::_params_changed);
ClassDB::bind_method("apply_shaders", &ShaderEditor::apply_shaders);
- //ClassDB::bind_method("_close_current_tab",&ShaderEditor::_close_current_tab);
}
void ShaderEditor::ensure_select_current() {
@@ -405,6 +407,11 @@ void ShaderEditor::ensure_select_current() {
}*/
}
+void ShaderEditor::goto_line_selection(int p_line, int p_begin, int p_end) {
+
+ shader_editor->goto_line_selection(p_line, p_begin, p_end);
+}
+
void ShaderEditor::edit(const Ref<Shader> &p_shader) {
if (p_shader.is_null() || !p_shader->is_text_shader())
@@ -527,9 +534,8 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
HBoxContainer *hbc = memnew(HBoxContainer);
edit_menu = memnew(MenuButton);
- //edit_menu->set_position(Point2(5, -1));
edit_menu->set_text(TTR("Edit"));
-
+ edit_menu->set_switch_on_hover(true);
edit_menu->get_popup()->set_hide_on_window_lose_focus(true);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/undo"), EDIT_UNDO);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/redo"), EDIT_REDO);
@@ -549,12 +555,11 @@ ShaderEditor::ShaderEditor(EditorNode *p_node) {
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/clone_down"), EDIT_CLONE_DOWN);
edit_menu->get_popup()->add_separator();
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/complete_symbol"), EDIT_COMPLETE);
-
edit_menu->get_popup()->connect("id_pressed", this, "_menu_option");
search_menu = memnew(MenuButton);
- //search_menu->set_position(Point2(38, -1));
search_menu->set_text(TTR("Search"));
+ search_menu->set_switch_on_hover(true);
search_menu->get_popup()->set_hide_on_window_lose_focus(true);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find"), SEARCH_FIND);
search_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("script_text_editor/find_next"), SEARCH_FIND_NEXT);
diff --git a/editor/plugins/shader_editor_plugin.h b/editor/plugins/shader_editor_plugin.h
index 2ea1562310..46e3dffdd5 100644
--- a/editor/plugins/shader_editor_plugin.h
+++ b/editor/plugins/shader_editor_plugin.h
@@ -120,6 +120,8 @@ public:
void ensure_select_current();
void edit(const Ref<Shader> &p_shader);
+ void goto_line_selection(int p_line, int p_begin, int p_end);
+
virtual Size2 get_minimum_size() const { return Size2(0, 200); }
void save_external_data();
@@ -143,6 +145,8 @@ public:
virtual void make_visible(bool p_visible);
virtual void selected_notify();
+ ShaderEditor *get_shader_editor() const { return shader_editor; }
+
virtual void save_external_data();
virtual void apply_changes();
diff --git a/editor/plugins/spatial_editor_plugin.cpp b/editor/plugins/spatial_editor_plugin.cpp
index cc5f50a834..4fe278d005 100644
--- a/editor/plugins/spatial_editor_plugin.cpp
+++ b/editor/plugins/spatial_editor_plugin.cpp
@@ -5475,6 +5475,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
transform_menu = memnew(MenuButton);
transform_menu->set_text(TTR("Transform"));
+ transform_menu->set_switch_on_hover(true);
hbc_menu->add_child(transform_menu);
p = transform_menu->get_popup();
@@ -5487,6 +5488,7 @@ SpatialEditor::SpatialEditor(EditorNode *p_editor) {
view_menu = memnew(MenuButton);
view_menu->set_text(TTR("View"));
+ view_menu->set_switch_on_hover(true);
hbc_menu->add_child(view_menu);
p = view_menu->get_popup();
diff --git a/editor/plugins/text_editor.cpp b/editor/plugins/text_editor.cpp
index 4a8eae1ba4..52dd115b3e 100644
--- a/editor/plugins/text_editor.cpp
+++ b/editor/plugins/text_editor.cpp
@@ -84,6 +84,7 @@ void TextEditor::_load_theme_settings() {
Color line_number_color = EDITOR_GET("text_editor/highlighting/line_number_color");
Color caret_color = EDITOR_GET("text_editor/highlighting/caret_color");
Color caret_background_color = EDITOR_GET("text_editor/highlighting/caret_background_color");
+ Color indent_guide_color = EDITOR_GET("text_editor/highlighting/indent_guide_color");
Color text_selected_color = EDITOR_GET("text_editor/highlighting/text_selected_color");
Color selection_color = EDITOR_GET("text_editor/highlighting/selection_color");
Color brace_mismatch_color = EDITOR_GET("text_editor/highlighting/brace_mismatch_color");
@@ -115,6 +116,7 @@ void TextEditor::_load_theme_settings() {
text_edit->add_color_override("line_number_color", line_number_color);
text_edit->add_color_override("caret_color", caret_color);
text_edit->add_color_override("caret_background_color", caret_background_color);
+ text_edit->add_color_override("indent_guide_color", indent_guide_color);
text_edit->add_color_override("font_selected_color", text_selected_color);
text_edit->add_color_override("selection_color", selection_color);
text_edit->add_color_override("brace_mismatch_color", brace_mismatch_color);
diff --git a/editor/plugins/texture_region_editor_plugin.cpp b/editor/plugins/texture_region_editor_plugin.cpp
index 7c3e524d89..aed3a7d503 100644
--- a/editor/plugins/texture_region_editor_plugin.cpp
+++ b/editor/plugins/texture_region_editor_plugin.cpp
@@ -169,15 +169,24 @@ void TextureRegionEditor::_region_draw() {
updating_scroll = true;
hscroll->set_min(scroll_rect.position.x);
hscroll->set_max(scroll_rect.position.x + scroll_rect.size.x);
- hscroll->set_page(edit_draw->get_size().x);
- hscroll->set_value(draw_ofs.x);
- hscroll->set_step(0.001);
+ if (ABS(scroll_rect.position.x - (scroll_rect.position.x + scroll_rect.size.x)) <= edit_draw->get_size().x) {
+ hscroll->hide();
+ } else {
+ hscroll->show();
+ hscroll->set_page(edit_draw->get_size().x);
+ hscroll->set_value(draw_ofs.x);
+ }
vscroll->set_min(scroll_rect.position.y);
vscroll->set_max(scroll_rect.position.y + scroll_rect.size.y);
- vscroll->set_page(edit_draw->get_size().y);
- vscroll->set_value(draw_ofs.y);
- vscroll->set_step(0.001);
+ if (ABS(scroll_rect.position.y - (scroll_rect.position.y + scroll_rect.size.y)) <= edit_draw->get_size().y) {
+ vscroll->hide();
+ draw_ofs.y = scroll_rect.position.y;
+ } else {
+ vscroll->show();
+ vscroll->set_page(edit_draw->get_size().y);
+ vscroll->set_value(draw_ofs.y);
+ }
updating_scroll = false;
float margins[4];
@@ -299,6 +308,8 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {
undo_redo->add_do_method(atlas_tex.ptr(), "set_region", rect);
undo_redo->add_undo_method(atlas_tex.ptr(), "set_region", atlas_tex->get_region());
}
+ undo_redo->add_do_method(this, "_update_rect");
+ undo_redo->add_undo_method(this, "_update_rect");
undo_redo->add_do_method(edit_draw, "update");
undo_redo->add_undo_method(edit_draw, "update");
undo_redo->commit_action();
@@ -336,7 +347,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {
} else if (drag) {
if (edited_margin >= 0) {
- undo_redo->create_action("Set Margin");
+ undo_redo->create_action(TTR("Set Margin"));
static Margin m[4] = { MARGIN_TOP, MARGIN_BOTTOM, MARGIN_LEFT, MARGIN_RIGHT };
if (node_ninepatch) {
undo_redo->add_do_method(node_ninepatch, "set_patch_margin", m[edited_margin], node_ninepatch->get_patch_margin(m[edited_margin]));
@@ -348,7 +359,7 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {
}
edited_margin = -1;
} else {
- undo_redo->create_action("Set Region Rect");
+ undo_redo->create_action(TTR("Set Region Rect"));
if (node_sprite) {
undo_redo->add_do_method(node_sprite, "set_region_rect", node_sprite->get_region_rect());
undo_redo->add_undo_method(node_sprite, "set_region_rect", rect_prev);
@@ -364,6 +375,8 @@ void TextureRegionEditor::_region_input(const Ref<InputEvent> &p_input) {
}
drag_index = -1;
}
+ undo_redo->add_do_method(this, "_update_rect");
+ undo_redo->add_undo_method(this, "_update_rect");
undo_redo->add_do_method(edit_draw, "update");
undo_redo->add_undo_method(edit_draw, "update");
undo_redo->commit_action();
@@ -509,10 +522,7 @@ void TextureRegionEditor::_scroll_changed(float) {
}
void TextureRegionEditor::_set_snap_mode(int p_mode) {
- snap_mode_button->get_popup()->set_item_checked(snap_mode, false);
snap_mode = p_mode;
- snap_mode_button->set_text(snap_mode_button->get_popup()->get_item_text(p_mode));
- snap_mode_button->get_popup()->set_item_checked(snap_mode, true);
if (snap_mode == SNAP_GRID)
hb_grid->show();
@@ -577,15 +587,26 @@ void TextureRegionEditor::_zoom_out() {
}
}
-void TextureRegionEditor::apply_rect(const Rect2 &rect) {
+void TextureRegionEditor::apply_rect(const Rect2 &p_rect) {
+ if (node_sprite)
+ node_sprite->set_region_rect(p_rect);
+ else if (node_ninepatch)
+ node_ninepatch->set_region_rect(p_rect);
+ else if (obj_styleBox.is_valid())
+ obj_styleBox->set_region_rect(p_rect);
+ else if (atlas_tex.is_valid())
+ atlas_tex->set_region(p_rect);
+}
+
+void TextureRegionEditor::_update_rect() {
if (node_sprite)
- node_sprite->set_region_rect(rect);
+ rect = node_sprite->get_region_rect();
else if (node_ninepatch)
- node_ninepatch->set_region_rect(rect);
+ rect = node_ninepatch->get_region_rect();
else if (obj_styleBox.is_valid())
- obj_styleBox->set_region_rect(rect);
+ rect = obj_styleBox->get_region_rect();
else if (atlas_tex.is_valid())
- atlas_tex->set_region(rect);
+ rect = atlas_tex->get_region();
}
void TextureRegionEditor::_update_autoslice() {
@@ -657,6 +678,10 @@ void TextureRegionEditor::_update_autoslice() {
void TextureRegionEditor::_notification(int p_what) {
switch (p_what) {
+ case NOTIFICATION_ENTER_TREE:
+ case NOTIFICATION_THEME_CHANGED: {
+ edit_draw->add_style_override("panel", get_stylebox("bg", "Tree"));
+ } break;
case NOTIFICATION_READY: {
zoom_out->set_icon(get_icon("ZoomLess", "EditorIcons"));
zoom_reset->set_icon(get_icon("ZoomReset", "EditorIcons"));
@@ -669,7 +694,7 @@ void TextureRegionEditor::_notification(int p_what) {
} break;
case MainLoop::NOTIFICATION_WM_FOCUS_IN: {
// This happens when the user leaves the Editor and returns,
- // he/she could have changed the textures, so the cache is cleared
+ // they could have changed the textures, so the cache is cleared.
cache_map.clear();
_edit_region();
} break;
@@ -702,6 +727,7 @@ void TextureRegionEditor::_bind_methods() {
ClassDB::bind_method(D_METHOD("_zoom_in"), &TextureRegionEditor::_zoom_in);
ClassDB::bind_method(D_METHOD("_zoom_reset"), &TextureRegionEditor::_zoom_reset);
ClassDB::bind_method(D_METHOD("_zoom_out"), &TextureRegionEditor::_zoom_out);
+ ClassDB::bind_method(D_METHOD("_update_rect"), &TextureRegionEditor::_update_rect);
}
bool TextureRegionEditor::is_stylebox() {
@@ -774,6 +800,9 @@ void TextureRegionEditor::_edit_region() {
texture = atlas_tex->get_atlas();
if (texture.is_null()) {
+ _zoom_reset();
+ hscroll->hide();
+ vscroll->hide();
edit_draw->update();
return;
}
@@ -790,15 +819,7 @@ void TextureRegionEditor::_edit_region() {
}
}
- if (node_sprite)
- rect = node_sprite->get_region_rect();
- else if (node_ninepatch)
- rect = node_ninepatch->get_region_rect();
- else if (obj_styleBox.is_valid())
- rect = obj_styleBox->get_region_rect();
- else if (atlas_tex.is_valid())
- rect = atlas_tex->get_region();
-
+ _update_rect();
edit_draw->update();
}
@@ -826,30 +847,23 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
drag_index = -1;
drag = false;
- VBoxContainer *main_vb = memnew(VBoxContainer);
- add_child(main_vb);
- main_vb->set_anchors_and_margins_preset(Control::PRESET_WIDE);
HBoxContainer *hb_tools = memnew(HBoxContainer);
- main_vb->add_child(hb_tools);
-
+ add_child(hb_tools);
hb_tools->add_child(memnew(Label(TTR("Snap Mode:"))));
- snap_mode_button = memnew(MenuButton);
+ snap_mode_button = memnew(OptionButton);
hb_tools->add_child(snap_mode_button);
- snap_mode_button->set_text(TTR("<None>"));
- PopupMenu *p = snap_mode_button->get_popup();
- p->set_hide_on_checkable_item_selection(false);
- p->add_radio_check_item(TTR("<None>"), 0);
- p->add_radio_check_item(TTR("Pixel Snap"), 1);
- p->add_radio_check_item(TTR("Grid Snap"), 2);
- p->add_radio_check_item(TTR("Auto Slice"), 3);
- p->set_item_checked(0, true);
- p->connect("id_pressed", this, "_set_snap_mode");
+ snap_mode_button->add_item(TTR("None"), 0);
+ snap_mode_button->add_item(TTR("Pixel Snap"), 1);
+ snap_mode_button->add_item(TTR("Grid Snap"), 2);
+ snap_mode_button->add_item(TTR("Auto Slice"), 3);
+ snap_mode_button->select(0);
+ snap_mode_button->connect("item_selected", this, "_set_snap_mode");
+
hb_grid = memnew(HBoxContainer);
- //hb_tools->add_child(hb_grid);
- main_vb->add_child(hb_grid);
- hb_grid->add_child(memnew(VSeparator));
+ hb_tools->add_child(hb_grid);
+ hb_grid->add_child(memnew(VSeparator));
hb_grid->add_child(memnew(Label(TTR("Offset:"))));
sb_off_x = memnew(SpinBox);
@@ -914,42 +928,47 @@ TextureRegionEditor::TextureRegionEditor(EditorNode *p_editor) {
hb_grid->hide();
- HBoxContainer *main_hb = memnew(HBoxContainer);
- main_vb->add_child(main_hb);
- edit_draw = memnew(Control);
- main_hb->add_child(edit_draw);
- main_hb->set_v_size_flags(SIZE_EXPAND_FILL);
- edit_draw->set_h_size_flags(SIZE_EXPAND_FILL);
+ edit_draw = memnew(Panel);
+ add_child(edit_draw);
+ edit_draw->set_v_size_flags(SIZE_EXPAND_FILL);
+ edit_draw->connect("draw", this, "_region_draw");
+ edit_draw->connect("gui_input", this, "_region_input");
+
+ draw_zoom = 1.0;
+ edit_draw->set_clip_contents(true);
- Control *separator = memnew(Control);
- separator->set_h_size_flags(Control::SIZE_EXPAND_FILL);
- hb_tools->add_child(separator);
+ HBoxContainer *zoom_hb = memnew(HBoxContainer);
+ edit_draw->add_child(zoom_hb);
+ zoom_hb->set_begin(Point2(5, 5));
zoom_out = memnew(ToolButton);
+ zoom_out->set_tooltip(TTR("Zoom Out"));
zoom_out->connect("pressed", this, "_zoom_out");
- hb_tools->add_child(zoom_out);
+ zoom_hb->add_child(zoom_out);
zoom_reset = memnew(ToolButton);
+ zoom_out->set_tooltip(TTR("Zoom Reset"));
zoom_reset->connect("pressed", this, "_zoom_reset");
- hb_tools->add_child(zoom_reset);
+ zoom_hb->add_child(zoom_reset);
zoom_in = memnew(ToolButton);
+ zoom_out->set_tooltip(TTR("Zoom In"));
zoom_in->connect("pressed", this, "_zoom_in");
- hb_tools->add_child(zoom_in);
+ zoom_hb->add_child(zoom_in);
vscroll = memnew(VScrollBar);
- main_hb->add_child(vscroll);
+ vscroll->set_step(0.001);
+ edit_draw->add_child(vscroll);
+ vscroll->set_anchors_and_margins_preset(PRESET_RIGHT_WIDE);
vscroll->connect("value_changed", this, "_scroll_changed");
hscroll = memnew(HScrollBar);
- main_vb->add_child(hscroll);
+ hscroll->set_step(0.001);
+ edit_draw->add_child(hscroll);
+ hscroll->set_anchors_and_margins_preset(PRESET_BOTTOM_WIDE);
+ hscroll->set_margin(MARGIN_RIGHT, -vscroll->get_size().x * EDSCALE);
hscroll->connect("value_changed", this, "_scroll_changed");
- edit_draw->connect("draw", this, "_region_draw");
- edit_draw->connect("gui_input", this, "_region_input");
- draw_zoom = 1.0;
updating_scroll = false;
-
- edit_draw->set_clip_contents(true);
}
void TextureRegionEditorPlugin::edit(Object *p_object) {
@@ -978,7 +997,6 @@ void TextureRegionEditorPlugin::make_visible(bool p_visible) {
Dictionary TextureRegionEditorPlugin::get_state() const {
Dictionary state;
- state["zoom"] = region_editor->draw_zoom;
state["snap_offset"] = region_editor->snap_offset;
state["snap_step"] = region_editor->snap_step;
state["snap_separation"] = region_editor->snap_separation;
@@ -989,10 +1007,6 @@ Dictionary TextureRegionEditorPlugin::get_state() const {
void TextureRegionEditorPlugin::set_state(const Dictionary &p_state) {
Dictionary state = p_state;
- if (state.has("zoom")) {
- region_editor->draw_zoom = p_state["zoom"];
- }
-
if (state.has("snap_step")) {
Vector2 s = state["snap_step"];
region_editor->sb_step_x->set_value(s.x);
@@ -1016,6 +1030,7 @@ void TextureRegionEditorPlugin::set_state(const Dictionary &p_state) {
if (state.has("snap_mode")) {
region_editor->_set_snap_mode(state["snap_mode"]);
+ region_editor->snap_mode_button->select(state["snap_mode"]);
}
}
diff --git a/editor/plugins/texture_region_editor_plugin.h b/editor/plugins/texture_region_editor_plugin.h
index 61ef769f89..4f301ea916 100644
--- a/editor/plugins/texture_region_editor_plugin.h
+++ b/editor/plugins/texture_region_editor_plugin.h
@@ -43,9 +43,9 @@
@author Mariano Suligoy
*/
-class TextureRegionEditor : public Control {
+class TextureRegionEditor : public VBoxContainer {
- GDCLASS(TextureRegionEditor, Control);
+ GDCLASS(TextureRegionEditor, VBoxContainer);
enum SnapMode {
SNAP_NONE,
@@ -55,7 +55,7 @@ class TextureRegionEditor : public Control {
};
friend class TextureRegionEditorPlugin;
- MenuButton *snap_mode_button;
+ OptionButton *snap_mode_button;
ToolButton *zoom_in;
ToolButton *zoom_reset;
ToolButton *zoom_out;
@@ -66,7 +66,7 @@ class TextureRegionEditor : public Control {
SpinBox *sb_off_x;
SpinBox *sb_sep_y;
SpinBox *sb_sep_x;
- Control *edit_draw;
+ Panel *edit_draw;
VScrollBar *vscroll;
HScrollBar *hscroll;
@@ -111,7 +111,8 @@ class TextureRegionEditor : public Control {
void _zoom_in();
void _zoom_reset();
void _zoom_out();
- void apply_rect(const Rect2 &rect);
+ void apply_rect(const Rect2 &p_rect);
+ void _update_rect();
void _update_autoslice();
protected:
diff --git a/editor/plugins/tile_map_editor_plugin.cpp b/editor/plugins/tile_map_editor_plugin.cpp
index 213cd2ce1a..1d8a80d3f3 100644
--- a/editor/plugins/tile_map_editor_plugin.cpp
+++ b/editor/plugins/tile_map_editor_plugin.cpp
@@ -1862,7 +1862,7 @@ TileMapEditor::TileMapEditor(EditorNode *p_editor) {
toolbar->add_child(tile_info);
options = memnew(MenuButton);
- options->set_text("Tile Map");
+ options->set_text("TileMap");
options->set_icon(EditorNode::get_singleton()->get_gui_base()->get_icon("TileMap", "EditorIcons"));
options->set_process_unhandled_key_input(false);
diff --git a/editor/plugins/tile_set_editor_plugin.cpp b/editor/plugins/tile_set_editor_plugin.cpp
index d0e0b3e006..cab9a4297d 100644
--- a/editor/plugins/tile_set_editor_plugin.cpp
+++ b/editor/plugins/tile_set_editor_plugin.cpp
@@ -172,6 +172,7 @@ Error TileSetEditor::update_library_file(Node *p_base_scene, Ref<TileSet> ml, bo
}
void TileSetEditor::_bind_methods() {
+
ClassDB::bind_method("_on_tileset_toolbar_button_pressed", &TileSetEditor::_on_tileset_toolbar_button_pressed);
ClassDB::bind_method("_on_textures_added", &TileSetEditor::_on_textures_added);
ClassDB::bind_method("_on_tileset_toolbar_confirm", &TileSetEditor::_on_tileset_toolbar_confirm);
@@ -184,58 +185,69 @@ void TileSetEditor::_bind_methods() {
ClassDB::bind_method("_on_workspace_input", &TileSetEditor::_on_workspace_input);
ClassDB::bind_method("_on_tool_clicked", &TileSetEditor::_on_tool_clicked);
ClassDB::bind_method("_on_priority_changed", &TileSetEditor::_on_priority_changed);
+ ClassDB::bind_method("_on_z_index_changed", &TileSetEditor::_on_z_index_changed);
ClassDB::bind_method("_on_grid_snap_toggled", &TileSetEditor::_on_grid_snap_toggled);
ClassDB::bind_method("_set_snap_step", &TileSetEditor::_set_snap_step);
ClassDB::bind_method("_set_snap_off", &TileSetEditor::_set_snap_off);
ClassDB::bind_method("_set_snap_sep", &TileSetEditor::_set_snap_sep);
+ ClassDB::bind_method("_zoom_in", &TileSetEditor::_zoom_in);
+ ClassDB::bind_method("_zoom_out", &TileSetEditor::_zoom_out);
+ ClassDB::bind_method("_zoom_reset", &TileSetEditor::_zoom_reset);
}
void TileSetEditor::_notification(int p_what) {
- if (p_what == NOTIFICATION_ENTER_TREE || p_what == NOTIFICATION_THEME_CHANGED) {
-
- tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_icon(get_icon("ToolAddNode", "EditorIcons"));
- tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_icon(get_icon("Remove", "EditorIcons"));
- tileset_toolbar_tools->set_icon(get_icon("Tools", "EditorIcons"));
-
- tool_workspacemode[WORKSPACE_EDIT]->set_icon(get_icon("Edit", "EditorIcons"));
- tool_workspacemode[WORKSPACE_CREATE_SINGLE]->set_icon(get_icon("AddSingleTile", "EditorIcons"));
- tool_workspacemode[WORKSPACE_CREATE_AUTOTILE]->set_icon(get_icon("AddAutotile", "EditorIcons"));
- tool_workspacemode[WORKSPACE_CREATE_ATLAS]->set_icon(get_icon("AddAtlasTile", "EditorIcons"));
-
- tools[TOOL_SELECT]->set_icon(get_icon("ToolSelect", "EditorIcons"));
- tools[BITMASK_COPY]->set_icon(get_icon("Duplicate", "EditorIcons"));
- tools[BITMASK_PASTE]->set_icon(get_icon("Override", "EditorIcons"));
- tools[BITMASK_CLEAR]->set_icon(get_icon("Clear", "EditorIcons"));
- tools[SHAPE_NEW_POLYGON]->set_icon(get_icon("CollisionPolygon2D", "EditorIcons"));
- tools[SHAPE_DELETE]->set_icon(get_icon("Remove", "EditorIcons"));
- tools[SHAPE_KEEP_INSIDE_TILE]->set_icon(get_icon("Snap", "EditorIcons"));
- tools[TOOL_GRID_SNAP]->set_icon(get_icon("SnapGrid", "EditorIcons"));
- tools[ZOOM_OUT]->set_icon(get_icon("ZoomLess", "EditorIcons"));
- tools[ZOOM_1]->set_icon(get_icon("ZoomReset", "EditorIcons"));
- tools[ZOOM_IN]->set_icon(get_icon("ZoomMore", "EditorIcons"));
- tools[VISIBLE_INFO]->set_icon(get_icon("InformationSign", "EditorIcons"));
-
- tool_editmode[EDITMODE_REGION]->set_icon(get_icon("RegionEdit", "EditorIcons"));
- tool_editmode[EDITMODE_COLLISION]->set_icon(get_icon("StaticBody2D", "EditorIcons"));
- tool_editmode[EDITMODE_OCCLUSION]->set_icon(get_icon("LightOccluder2D", "EditorIcons"));
- tool_editmode[EDITMODE_NAVIGATION]->set_icon(get_icon("Navigation2D", "EditorIcons"));
- tool_editmode[EDITMODE_BITMASK]->set_icon(get_icon("PackedDataContainer", "EditorIcons"));
- tool_editmode[EDITMODE_PRIORITY]->set_icon(get_icon("MaterialPreviewLight1", "EditorIcons"));
- tool_editmode[EDITMODE_ICON]->set_icon(get_icon("LargeTexture", "EditorIcons"));
+
+ switch (p_what) {
+ case NOTIFICATION_READY: {
+
+ add_constant_override("autohide", 1); // Fixes the dragger always showing up.
+ } break;
+ case NOTIFICATION_ENTER_TREE:
+ case NOTIFICATION_THEME_CHANGED: {
+
+ tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_icon(get_icon("ToolAddNode", "EditorIcons"));
+ tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_icon(get_icon("Remove", "EditorIcons"));
+ tileset_toolbar_tools->set_icon(get_icon("Tools", "EditorIcons"));
+
+ tool_workspacemode[WORKSPACE_EDIT]->set_icon(get_icon("Edit", "EditorIcons"));
+ tool_workspacemode[WORKSPACE_CREATE_SINGLE]->set_icon(get_icon("AddSingleTile", "EditorIcons"));
+ tool_workspacemode[WORKSPACE_CREATE_AUTOTILE]->set_icon(get_icon("AddAutotile", "EditorIcons"));
+ tool_workspacemode[WORKSPACE_CREATE_ATLAS]->set_icon(get_icon("AddAtlasTile", "EditorIcons"));
+
+ tools[TOOL_SELECT]->set_icon(get_icon("ToolSelect", "EditorIcons"));
+ tools[BITMASK_COPY]->set_icon(get_icon("Duplicate", "EditorIcons"));
+ tools[BITMASK_PASTE]->set_icon(get_icon("Override", "EditorIcons"));
+ tools[BITMASK_CLEAR]->set_icon(get_icon("Clear", "EditorIcons"));
+ tools[SHAPE_NEW_POLYGON]->set_icon(get_icon("CollisionPolygon2D", "EditorIcons"));
+ tools[SHAPE_DELETE]->set_icon(get_icon("Remove", "EditorIcons"));
+ tools[SHAPE_KEEP_INSIDE_TILE]->set_icon(get_icon("Snap", "EditorIcons"));
+ tools[TOOL_GRID_SNAP]->set_icon(get_icon("SnapGrid", "EditorIcons"));
+ tools[ZOOM_OUT]->set_icon(get_icon("ZoomLess", "EditorIcons"));
+ tools[ZOOM_1]->set_icon(get_icon("ZoomReset", "EditorIcons"));
+ tools[ZOOM_IN]->set_icon(get_icon("ZoomMore", "EditorIcons"));
+ tools[VISIBLE_INFO]->set_icon(get_icon("InformationSign", "EditorIcons"));
+
+ tool_editmode[EDITMODE_REGION]->set_icon(get_icon("RegionEdit", "EditorIcons"));
+ tool_editmode[EDITMODE_COLLISION]->set_icon(get_icon("StaticBody2D", "EditorIcons"));
+ tool_editmode[EDITMODE_OCCLUSION]->set_icon(get_icon("LightOccluder2D", "EditorIcons"));
+ tool_editmode[EDITMODE_NAVIGATION]->set_icon(get_icon("Navigation2D", "EditorIcons"));
+ tool_editmode[EDITMODE_BITMASK]->set_icon(get_icon("PackedDataContainer", "EditorIcons"));
+ tool_editmode[EDITMODE_PRIORITY]->set_icon(get_icon("MaterialPreviewLight1", "EditorIcons"));
+ tool_editmode[EDITMODE_ICON]->set_icon(get_icon("LargeTexture", "EditorIcons"));
+ tool_editmode[EDITMODE_Z_INDEX]->set_icon(get_icon("Sort", "EditorIcons"));
+
+ scroll->add_style_override("bg", get_stylebox("bg", "Tree"));
+ } break;
}
}
TileSetEditor::TileSetEditor(EditorNode *p_editor) {
editor = p_editor;
- set_name("Tile Set Bottom Editor");
-
- HSplitContainer *split = memnew(HSplitContainer);
- split->set_anchors_and_margins_preset(PRESET_WIDE, PRESET_MODE_MINSIZE, 10);
- add_child(split);
+ current_tile = -1;
VBoxContainer *left_container = memnew(VBoxContainer);
- split->add_child(left_container);
+ add_child(left_container);
texture_list = memnew(ItemList);
left_container->add_child(texture_list);
@@ -247,30 +259,22 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
left_container->add_child(tileset_toolbar_container);
tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE] = memnew(ToolButton);
- Vector<Variant> p;
- p.push_back((int)TOOL_TILESET_ADD_TEXTURE);
- tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->connect("pressed", this, "_on_tileset_toolbar_button_pressed", p);
+ tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->connect("pressed", this, "_on_tileset_toolbar_button_pressed", varray(TOOL_TILESET_ADD_TEXTURE));
tileset_toolbar_container->add_child(tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]);
- tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_tooltip(TTR("Add Texture(s) to TileSet"));
+ tileset_toolbar_buttons[TOOL_TILESET_ADD_TEXTURE]->set_tooltip(TTR("Add Texture(s) to TileSet."));
tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE] = memnew(ToolButton);
- p = Vector<Variant>();
- p.push_back((int)TOOL_TILESET_REMOVE_TEXTURE);
- tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->connect("pressed", this, "_on_tileset_toolbar_button_pressed", p);
+ tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->connect("pressed", this, "_on_tileset_toolbar_button_pressed", varray(TOOL_TILESET_REMOVE_TEXTURE));
tileset_toolbar_container->add_child(tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]);
- tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_tooltip(TTR("Remove current Texture from TileSet"));
+ tileset_toolbar_buttons[TOOL_TILESET_REMOVE_TEXTURE]->set_tooltip(TTR("Remove selected Texture from TileSet."));
Control *toolbar_separator = memnew(Control);
toolbar_separator->set_h_size_flags(Control::SIZE_EXPAND_FILL);
tileset_toolbar_container->add_child(toolbar_separator);
tileset_toolbar_tools = memnew(MenuButton);
- tileset_toolbar_tools->set_text("Tools");
- p = Vector<Variant>();
- p.push_back((int)TOOL_TILESET_CREATE_SCENE);
+ tileset_toolbar_tools->set_text(TTR("Tools"));
tileset_toolbar_tools->get_popup()->add_item(TTR("Create from Scene"), TOOL_TILESET_CREATE_SCENE);
- p = Vector<Variant>();
- p.push_back((int)TOOL_TILESET_MERGE_SCENE);
tileset_toolbar_tools->get_popup()->add_item(TTR("Merge from Scene"), TOOL_TILESET_MERGE_SCENE);
tileset_toolbar_tools->get_popup()->connect("id_pressed", this, "_on_tileset_toolbar_button_pressed");
@@ -279,7 +283,7 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
//---------------
VBoxContainer *right_container = memnew(VBoxContainer);
right_container->set_v_size_flags(SIZE_EXPAND_FILL);
- split->add_child(right_container);
+ add_child(right_container);
dragging_point = -1;
creating_shape = false;
@@ -296,21 +300,18 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
Ref<ButtonGroup> g(memnew(ButtonGroup));
String workspace_label[WORKSPACE_MODE_MAX] = { "Edit", "New Single Tile", "New Autotile", "New Atlas" };
-
for (int i = 0; i < (int)WORKSPACE_MODE_MAX; i++) {
tool_workspacemode[i] = memnew(Button);
- tool_workspacemode[i]->set_text(workspace_label[i]);
+ tool_workspacemode[i]->set_text(TTR(workspace_label[i]));
tool_workspacemode[i]->set_toggle_mode(true);
tool_workspacemode[i]->set_button_group(g);
- Vector<Variant> p;
- p.push_back(i);
- tool_workspacemode[i]->connect("pressed", this, "_on_workspace_mode_changed", p);
+ tool_workspacemode[i]->connect("pressed", this, "_on_workspace_mode_changed", varray(i));
tool_hb->add_child(tool_workspacemode[i]);
}
Control *spacer = memnew(Control);
spacer->set_h_size_flags(Control::SIZE_EXPAND_FILL);
tool_hb->add_child(spacer);
- tool_hb->move_child(spacer, (int)WORKSPACE_CREATE_SINGLE);
+ tool_hb->move_child(spacer, WORKSPACE_CREATE_SINGLE);
tool_workspacemode[WORKSPACE_EDIT]->set_pressed(true);
workspace_mode = WORKSPACE_EDIT;
@@ -321,16 +322,13 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
tool_hb = memnew(HBoxContainer);
g = Ref<ButtonGroup>(memnew(ButtonGroup));
- String label[EDITMODE_MAX] = { "Region", "Collision", "Occlusion", "Navigation", "Bitmask", "Priority", "Icon" };
-
+ String label[EDITMODE_MAX] = { "Region", "Collision", "Occlusion", "Navigation", "Bitmask", "Priority", "Icon", "Z Index" };
for (int i = 0; i < (int)EDITMODE_MAX; i++) {
tool_editmode[i] = memnew(Button);
tool_editmode[i]->set_text(label[i]);
tool_editmode[i]->set_toggle_mode(true);
tool_editmode[i]->set_button_group(g);
- Vector<Variant> p;
- p.push_back(i);
- tool_editmode[i]->connect("pressed", this, "_on_edit_mode_changed", p);
+ tool_editmode[i]->connect("pressed", this, "_on_edit_mode_changed", varray(i));
tool_hb->add_child(tool_editmode[i]);
}
tool_editmode[EDITMODE_COLLISION]->set_pressed(true);
@@ -343,42 +341,38 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
toolbar = memnew(HBoxContainer);
Ref<ButtonGroup> tg(memnew(ButtonGroup));
- p = Vector<Variant>();
tools[TOOL_SELECT] = memnew(ToolButton);
toolbar->add_child(tools[TOOL_SELECT]);
- tools[TOOL_SELECT]->set_tooltip(TTR("Select sub-tile to use as icon, this will be also used on invalid autotile bindings."));
tools[TOOL_SELECT]->set_toggle_mode(true);
tools[TOOL_SELECT]->set_button_group(tg);
tools[TOOL_SELECT]->set_pressed(true);
- p.push_back((int)TOOL_SELECT);
- tools[TOOL_SELECT]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[TOOL_SELECT]->connect("pressed", this, "_on_tool_clicked", varray(TOOL_SELECT));
+ separator_bitmask = memnew(VSeparator);
+ toolbar->add_child(separator_bitmask);
tools[BITMASK_COPY] = memnew(ToolButton);
- p.push_back((int)BITMASK_COPY);
- tools[BITMASK_COPY]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[BITMASK_COPY]->set_tooltip(TTR("Copy bitmask."));
+ tools[BITMASK_COPY]->connect("pressed", this, "_on_tool_clicked", varray(BITMASK_COPY));
toolbar->add_child(tools[BITMASK_COPY]);
tools[BITMASK_PASTE] = memnew(ToolButton);
- p = Vector<Variant>();
- p.push_back((int)BITMASK_PASTE);
- tools[BITMASK_PASTE]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[BITMASK_PASTE]->set_tooltip(TTR("Paste bitmask."));
+ tools[BITMASK_PASTE]->connect("pressed", this, "_on_tool_clicked", varray(BITMASK_PASTE));
toolbar->add_child(tools[BITMASK_PASTE]);
tools[BITMASK_CLEAR] = memnew(ToolButton);
- p = Vector<Variant>();
- p.push_back((int)BITMASK_CLEAR);
- tools[BITMASK_CLEAR]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[BITMASK_CLEAR]->set_tooltip(TTR("Erase bitmask."));
+ tools[BITMASK_CLEAR]->connect("pressed", this, "_on_tool_clicked", varray(BITMASK_CLEAR));
toolbar->add_child(tools[BITMASK_CLEAR]);
tools[SHAPE_NEW_POLYGON] = memnew(ToolButton);
toolbar->add_child(tools[SHAPE_NEW_POLYGON]);
tools[SHAPE_NEW_POLYGON]->set_toggle_mode(true);
tools[SHAPE_NEW_POLYGON]->set_button_group(tg);
+ tools[SHAPE_NEW_POLYGON]->set_tooltip(TTR("Create a new polygon."));
separator_delete = memnew(VSeparator);
toolbar->add_child(separator_delete);
tools[SHAPE_DELETE] = memnew(ToolButton);
- p = Vector<Variant>();
- p.push_back((int)SHAPE_DELETE);
- tools[SHAPE_DELETE]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[SHAPE_DELETE]->connect("pressed", this, "_on_tool_clicked", varray(SHAPE_DELETE));
toolbar->add_child(tools[SHAPE_DELETE]);
separator_grid = memnew(VSeparator);
@@ -386,9 +380,11 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
tools[SHAPE_KEEP_INSIDE_TILE] = memnew(ToolButton);
tools[SHAPE_KEEP_INSIDE_TILE]->set_toggle_mode(true);
tools[SHAPE_KEEP_INSIDE_TILE]->set_pressed(true);
+ tools[SHAPE_KEEP_INSIDE_TILE]->set_tooltip(TTR("Keep polygon inside region Rect."));
toolbar->add_child(tools[SHAPE_KEEP_INSIDE_TILE]);
tools[TOOL_GRID_SNAP] = memnew(ToolButton);
tools[TOOL_GRID_SNAP]->set_toggle_mode(true);
+ tools[TOOL_GRID_SNAP]->set_tooltip(TTR("Enable snap and show grid (configurable via the Inspector)."));
tools[TOOL_GRID_SNAP]->connect("toggled", this, "_on_grid_snap_toggled");
toolbar->add_child(tools[TOOL_GRID_SNAP]);
@@ -401,32 +397,35 @@ TileSetEditor::TileSetEditor(EditorNode *p_editor) {
spin_priority->hide();
toolbar->add_child(spin_priority);
+ spin_z_index = memnew(SpinBox);
+ spin_z_index->set_min(VS::CANVAS_ITEM_Z_MIN);
+ spin_z_index->set_max(VS::CANVAS_ITEM_Z_MAX);
+ spin_z_index->set_step(1);
+ spin_z_index->set_custom_minimum_size(Size2(100, 0));
+ spin_z_index->connect("value_changed", this, "_on_z_index_changed");
+ spin_z_index->hide();
+ toolbar->add_child(spin_z_index);
+
Control *separator = memnew(Control);
separator->set_h_size_flags(SIZE_EXPAND_FILL);
toolbar->add_child(separator);
tools[ZOOM_OUT] = memnew(ToolButton);
- p = Vector<Variant>();
- p.push_back((int)ZOOM_OUT);
- tools[ZOOM_OUT]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[ZOOM_OUT]->connect("pressed", this, "_zoom_out");
toolbar->add_child(tools[ZOOM_OUT]);
tools[ZOOM_OUT]->set_tooltip(TTR("Zoom Out"));
tools[ZOOM_1] = memnew(ToolButton);
- p = Vector<Variant>();
- p.push_back((int)ZOOM_1);
- tools[ZOOM_1]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[ZOOM_1]->connect("pressed", this, "_zoom_reset");
toolbar->add_child(tools[ZOOM_1]);
- tools[ZOOM_1]->set_tooltip(TTR("Reset Zoom"));
+ tools[ZOOM_1]->set_tooltip(TTR("Zoom Reset"));
tools[ZOOM_IN] = memnew(ToolButton);
- p = Vector<Variant>();
- p.push_back((int)ZOOM_IN);
- tools[ZOOM_IN]->connect("pressed", this, "_on_tool_clicked", p);
+ tools[ZOOM_IN]->connect("pressed", this, "_zoom_in");
toolbar->add_child(tools[ZOOM_IN]);
tools[ZOOM_IN]->set_tooltip(TTR("Zoom In"));
tools[VISIBLE_INFO] = memnew(ToolButton);
tools[VISIBLE_INFO]->set_toggle_mode(true);
- tools[VISIBLE_INFO]->set_tooltip(TTR("Display tile's names (hold Alt Key)"));
+ tools[VISIBLE_INFO]->set_tooltip(TTR("Display Tile Names (Hold Alt Key)"));
toolbar->add_child(tools[VISIBLE_INFO]);
main_vb->add_child(toolbar);
@@ -600,10 +599,14 @@ void TileSetEditor::_on_textures_added(const PoolStringArray &p_paths) {
}
void TileSetEditor::_on_edit_mode_changed(int p_edit_mode) {
+ draw_handles = false;
+ creating_shape = false;
edit_mode = (EditMode)p_edit_mode;
switch (edit_mode) {
case EDITMODE_REGION: {
tools[TOOL_SELECT]->show();
+
+ separator_bitmask->hide();
tools[BITMASK_COPY]->hide();
tools[BITMASK_PASTE]->hide();
tools[BITMASK_CLEAR]->hide();
@@ -623,30 +626,16 @@ void TileSetEditor::_on_edit_mode_changed(int p_edit_mode) {
tools[TOOL_SELECT]->set_pressed(true);
tools[TOOL_SELECT]->set_tooltip(TTR("Drag handles to edit Rect.\nClick on another Tile to edit it."));
+ tools[SHAPE_DELETE]->set_tooltip(TTR("Delete selected Rect."));
spin_priority->hide();
- } break;
- case EDITMODE_BITMASK: {
- tools[TOOL_SELECT]->show();
- tools[BITMASK_COPY]->show();
- tools[BITMASK_PASTE]->show();
- tools[BITMASK_CLEAR]->show();
- tools[SHAPE_NEW_POLYGON]->hide();
-
- separator_delete->hide();
- tools[SHAPE_DELETE]->hide();
-
- separator_grid->hide();
- tools[SHAPE_KEEP_INSIDE_TILE]->hide();
- tools[TOOL_GRID_SNAP]->hide();
-
- tools[TOOL_SELECT]->set_pressed(true);
- tools[TOOL_SELECT]->set_tooltip(TTR("LMB: set bit on.\nRMB: set bit off.\nClick on another Tile to edit it."));
- spin_priority->hide();
+ spin_z_index->hide();
} break;
case EDITMODE_COLLISION:
case EDITMODE_NAVIGATION:
case EDITMODE_OCCLUSION: {
tools[TOOL_SELECT]->show();
+
+ separator_bitmask->hide();
tools[BITMASK_COPY]->hide();
tools[BITMASK_PASTE]->hide();
tools[BITMASK_CLEAR]->hide();
@@ -660,11 +649,38 @@ void TileSetEditor::_on_edit_mode_changed(int p_edit_mode) {
tools[TOOL_GRID_SNAP]->show();
tools[TOOL_SELECT]->set_tooltip(TTR("Select current edited sub-tile.\nClick on another Tile to edit it."));
+ tools[SHAPE_DELETE]->set_tooltip(TTR("Delete polygon."));
spin_priority->hide();
+ spin_z_index->hide();
+
select_coord(edited_shape_coord);
} break;
- default: {
+ case EDITMODE_BITMASK: {
tools[TOOL_SELECT]->show();
+
+ separator_bitmask->show();
+ tools[BITMASK_COPY]->show();
+ tools[BITMASK_PASTE]->show();
+ tools[BITMASK_CLEAR]->show();
+ tools[SHAPE_NEW_POLYGON]->hide();
+
+ separator_delete->hide();
+ tools[SHAPE_DELETE]->hide();
+
+ separator_grid->hide();
+ tools[SHAPE_KEEP_INSIDE_TILE]->hide();
+ tools[TOOL_GRID_SNAP]->hide();
+
+ tools[TOOL_SELECT]->set_pressed(true);
+ tools[TOOL_SELECT]->set_tooltip(TTR("LMB: Set bit on.\nRMB: Set bit off.\nClick on another Tile to edit it."));
+ spin_priority->hide();
+ } break;
+ case EDITMODE_Z_INDEX:
+ case EDITMODE_PRIORITY:
+ case EDITMODE_ICON: {
+ tools[TOOL_SELECT]->show();
+
+ separator_bitmask->hide();
tools[BITMASK_COPY]->hide();
tools[BITMASK_PASTE]->hide();
tools[BITMASK_CLEAR]->hide();
@@ -680,11 +696,18 @@ void TileSetEditor::_on_edit_mode_changed(int p_edit_mode) {
if (edit_mode == EDITMODE_ICON) {
tools[TOOL_SELECT]->set_tooltip(TTR("Select sub-tile to use as icon, this will be also used on invalid autotile bindings.\nClick on another Tile to edit it."));
spin_priority->hide();
- } else {
+ spin_z_index->hide();
+ } else if (edit_mode == EDITMODE_PRIORITY) {
tools[TOOL_SELECT]->set_tooltip(TTR("Select sub-tile to change its priority.\nClick on another Tile to edit it."));
spin_priority->show();
+ spin_z_index->hide();
+ } else {
+ tools[TOOL_SELECT]->set_tooltip(TTR("Select sub-tile to change its z index.\nClick on another Tile to edit it."));
+ spin_priority->hide();
+ spin_z_index->show();
}
} break;
+ default: {}
}
workspace->update();
}
@@ -706,15 +729,16 @@ void TileSetEditor::_on_workspace_mode_changed(int p_workspace_mode) {
void TileSetEditor::_on_workspace_draw() {
- const Color COLOR_AUTOTILE = Color(0.266373, 0.565288, 0.988281);
- const Color COLOR_SINGLE = Color(0.988281, 0.909323, 0.266373);
- const Color COLOR_ATLAS = Color(0.78653, 0.812835, 0.832031);
-
- if (tileset.is_null())
- return;
- if (!get_current_texture().is_valid())
+ if (tileset.is_null() || !get_current_texture().is_valid())
return;
+ const Color COLOR_AUTOTILE = Color(0.3, 0.6, 1);
+ const Color COLOR_SINGLE = Color(1, 1, 0.3);
+ const Color COLOR_ATLAS = Color(0.8, 0.8, 0.8);
+ const Color COLOR_SUBDIVISION = Color(0.3, 0.7, 0.6);
+
+ draw_handles = false;
+
draw_highlight_current_tile();
draw_grid_snap();
@@ -808,10 +832,12 @@ void TileSetEditor::_on_workspace_draw() {
spin_priority->set_suffix(" / " + String::num(total, 0));
draw_highlight_subtile(edited_shape_coord, queue_others);
} break;
+ case EDITMODE_Z_INDEX: {
+ spin_z_index->set_value(tileset->autotile_get_z_index(get_current_tile(), edited_shape_coord));
+ draw_highlight_subtile(edited_shape_coord);
+ } break;
default: {}
}
-
- draw_tile_subdivision(get_current_tile(), Color(0.347214, 0.722656, 0.617063));
}
RID current_texture_rid = get_current_texture()->get_rid();
@@ -819,7 +845,7 @@ void TileSetEditor::_on_workspace_draw() {
tileset->get_tile_list(tiles);
for (List<int>::Element *E = tiles->front(); E; E = E->next()) {
int t_id = E->get();
- if (tileset->tile_get_texture(t_id)->get_rid() == current_texture_rid && (t_id != get_current_tile() || edit_mode != EDITMODE_REGION)) {
+ if (tileset->tile_get_texture(t_id)->get_rid() == current_texture_rid && (t_id != get_current_tile() || edit_mode != EDITMODE_REGION || workspace_mode != WORKSPACE_EDIT)) {
Rect2i region = tileset->tile_get_region(t_id);
region.position += WORKSPACE_MARGIN;
Color c;
@@ -829,10 +855,11 @@ void TileSetEditor::_on_workspace_draw() {
c = COLOR_AUTOTILE;
else if (tileset->tile_get_tile_mode(t_id) == TileSet::ATLAS_TILE)
c = COLOR_ATLAS;
- draw_tile_subdivision(t_id, Color(0.347214, 0.722656, 0.617063, 0.5));
+ draw_tile_subdivision(t_id, COLOR_SUBDIVISION);
workspace->draw_rect(region, c, false);
}
}
+
if (edit_mode == EDITMODE_REGION) {
if (workspace_mode != WORKSPACE_EDIT) {
Rect2i region = edited_region;
@@ -854,6 +881,12 @@ void TileSetEditor::_on_workspace_draw() {
region = tileset->tile_get_region(t_id);
region.position += WORKSPACE_MARGIN;
}
+
+ if (draw_edited_region)
+ draw_edited_region_subdivision();
+ else
+ draw_tile_subdivision(t_id, COLOR_SUBDIVISION);
+
Color c;
if (tileset->tile_get_tile_mode(t_id) == TileSet::SINGLE_TILE)
c = COLOR_SINGLE;
@@ -861,13 +894,10 @@ void TileSetEditor::_on_workspace_draw() {
c = COLOR_AUTOTILE;
else if (tileset->tile_get_tile_mode(t_id) == TileSet::ATLAS_TILE)
c = COLOR_ATLAS;
- if (draw_edited_region)
- draw_edited_region_subdivision();
- else
- draw_tile_subdivision(t_id, Color(0.347214, 0.722656, 0.617063, 1));
workspace->draw_rect(region, c, false);
}
}
+
workspace_overlay->update();
}
@@ -887,9 +917,7 @@ void TileSetEditor::_on_workspace_process() {
void TileSetEditor::_on_workspace_overlay_draw() {
- if (!tileset.is_valid())
- return;
- if (!get_current_texture().is_valid())
+ if (!tileset.is_valid() || !get_current_texture().is_valid())
return;
const Color COLOR_AUTOTILE = Color(0.266373, 0.565288, 0.988281);
@@ -939,9 +967,8 @@ void TileSetEditor::_on_workspace_overlay_draw() {
#define MIN_DISTANCE_SQUARED 6
void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
- if (tileset.is_null())
- return;
- if (!get_current_texture().is_valid())
+
+ if (tileset.is_null() || !get_current_texture().is_valid())
return;
static bool dragging;
@@ -979,11 +1006,9 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
}
// Mouse Wheel Event
- const int _mouse_button_index = mb->get_button_index();
- if (_mouse_button_index == BUTTON_WHEEL_UP && mb->get_control()) {
+ if (mb->get_button_index() == BUTTON_WHEEL_UP && mb->is_pressed() && mb->get_control()) {
_zoom_in();
-
- } else if (_mouse_button_index == BUTTON_WHEEL_DOWN && mb->get_control()) {
+ } else if (mb->get_button_index() == BUTTON_WHEEL_DOWN && mb->is_pressed() && mb->get_control()) {
_zoom_out();
}
}
@@ -1032,10 +1057,14 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
tileset->tile_set_tile_mode(t_id, workspace_mode == WORKSPACE_CREATE_AUTOTILE ? TileSet::AUTO_TILE : TileSet::ATLAS_TILE);
}
set_current_tile(t_id);
+
tool_workspacemode[WORKSPACE_EDIT]->set_pressed(true);
+ tool_editmode[EDITMODE_COLLISION]->set_pressed(true);
+ edit_mode = EDITMODE_COLLISION;
_on_workspace_mode_changed(WORKSPACE_EDIT);
}
}
+ edited_region = Rect2();
workspace->update();
workspace_overlay->update();
return;
@@ -1201,7 +1230,8 @@ void TileSetEditor::_on_workspace_input(const Ref<InputEvent> &p_ie) {
case EDITMODE_COLLISION:
case EDITMODE_OCCLUSION:
case EDITMODE_NAVIGATION:
- case EDITMODE_PRIORITY: {
+ case EDITMODE_PRIORITY:
+ case EDITMODE_Z_INDEX: {
Vector2 shape_anchor = Vector2(0, 0);
if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE) {
shape_anchor = edited_shape_coord;
@@ -1416,6 +1446,7 @@ void TileSetEditor::_on_tool_clicked(int p_tool) {
case EDITMODE_REGION: {
if (workspace_mode == WORKSPACE_EDIT && get_current_tile() >= 0) {
tileset->remove_tile(get_current_tile());
+ set_current_tile(-1);
workspace->update();
workspace_overlay->update();
}
@@ -1461,12 +1492,6 @@ void TileSetEditor::_on_tool_clicked(int p_tool) {
default: {}
}
}
- } else if (p_tool == ZOOM_OUT) {
- _zoom_out();
- } else if (p_tool == ZOOM_1) {
- _reset_zoom();
- } else if (p_tool == ZOOM_IN) {
- _zoom_in();
} else if (p_tool == TOOL_SELECT) {
if (creating_shape) {
// Cancel Creation
@@ -1482,6 +1507,11 @@ void TileSetEditor::_on_priority_changed(float val) {
workspace->update();
}
+void TileSetEditor::_on_z_index_changed(float val) {
+ tileset->autotile_set_z_index(get_current_tile(), edited_shape_coord, (int)val);
+ workspace->update();
+}
+
void TileSetEditor::_on_grid_snap_toggled(bool p_val) {
helper->set_snap_options_visible(p_val);
workspace->update();
@@ -1524,7 +1554,7 @@ void TileSetEditor::_zoom_out() {
workspace_overlay->set_custom_minimum_size(workspace->get_rect().size * scale);
}
}
-void TileSetEditor::_reset_zoom() {
+void TileSetEditor::_zoom_reset() {
workspace->set_scale(Vector2(1, 1));
workspace_container->set_custom_minimum_size(workspace->get_rect().size);
workspace_overlay->set_custom_minimum_size(workspace->get_rect().size);
@@ -1532,20 +1562,32 @@ void TileSetEditor::_reset_zoom() {
void TileSetEditor::draw_highlight_current_tile() {
- if (get_current_tile() >= 0) {
- Rect2 region = tileset->tile_get_region(get_current_tile());
- region.position += WORKSPACE_MARGIN;
- workspace->draw_rect(Rect2(0, 0, workspace->get_rect().size.x, region.position.y), Color(0.3, 0.3, 0.3, 0.3));
- workspace->draw_rect(Rect2(0, region.position.y, region.position.x, region.size.y), Color(0.3, 0.3, 0.3, 0.3));
- workspace->draw_rect(Rect2(region.position.x + region.size.x, region.position.y, workspace->get_rect().size.x - region.position.x - region.size.x, region.size.y), Color(0.3, 0.3, 0.3, 0.3));
- workspace->draw_rect(Rect2(0, region.position.y + region.size.y, workspace->get_rect().size.x, workspace->get_rect().size.y - region.size.y - region.position.y), Color(0.3, 0.3, 0.3, 0.3));
+ Color shadow_color = Color(0.3, 0.3, 0.3, 0.3);
+ if ((workspace_mode == WORKSPACE_EDIT && get_current_tile() >= 0) || !edited_region.has_no_area()) {
+ Rect2 region;
+ if (edited_region.has_no_area()) {
+ region = tileset->tile_get_region(get_current_tile());
+ region.position += WORKSPACE_MARGIN;
+ } else {
+ region = edited_region;
+ }
+
+ if (region.position.y >= 0)
+ workspace->draw_rect(Rect2(0, 0, workspace->get_rect().size.x, region.position.y), shadow_color);
+ if (region.position.x >= 0)
+ workspace->draw_rect(Rect2(0, MAX(0, region.position.y), region.position.x, MIN(workspace->get_rect().size.y - region.position.y, MIN(region.size.y, region.position.y + region.size.y))), shadow_color);
+ if (region.position.x + region.size.x <= workspace->get_rect().size.x)
+ workspace->draw_rect(Rect2(region.position.x + region.size.x, MAX(0, region.position.y), workspace->get_rect().size.x - region.position.x - region.size.x, MIN(workspace->get_rect().size.y - region.position.y, MIN(region.size.y, region.position.y + region.size.y))), shadow_color);
+ if (region.position.y + region.size.y <= workspace->get_rect().size.y)
+ workspace->draw_rect(Rect2(0, region.position.y + region.size.y, workspace->get_rect().size.x, workspace->get_rect().size.y - region.size.y - region.position.y), shadow_color);
} else {
- workspace->draw_rect(Rect2(Point2(0, 0), workspace->get_rect().size), Color(0.3, 0.3, 0.3, 0.3));
+ workspace->draw_rect(Rect2(Point2(0, 0), workspace->get_rect().size), shadow_color);
}
}
void TileSetEditor::draw_highlight_subtile(Vector2 coord, const Vector<Vector2> &other_highlighted) {
+ Color shadow_color = Color(0.3, 0.3, 0.3, 0.3);
Vector2 size = tileset->autotile_get_size(get_current_tile());
int spacing = tileset->autotile_get_spacing(get_current_tile());
Rect2 region = tileset->tile_get_region(get_current_tile());
@@ -1553,10 +1595,16 @@ void TileSetEditor::draw_highlight_subtile(Vector2 coord, const Vector<Vector2>
coord.y *= (size.y + spacing);
coord += region.position;
coord += WORKSPACE_MARGIN;
- workspace->draw_rect(Rect2(0, 0, workspace->get_rect().size.x, coord.y), Color(0.3, 0.3, 0.3, 0.3));
- workspace->draw_rect(Rect2(0, coord.y, coord.x, size.y), Color(0.3, 0.3, 0.3, 0.3));
- workspace->draw_rect(Rect2(coord.x + size.x, coord.y, workspace->get_rect().size.x - coord.x - size.x, size.y), Color(0.3, 0.3, 0.3, 0.3));
- workspace->draw_rect(Rect2(0, coord.y + size.y, workspace->get_rect().size.x, workspace->get_rect().size.y - size.y - coord.y), Color(0.3, 0.3, 0.3, 0.3));
+
+ if (coord.y >= 0)
+ workspace->draw_rect(Rect2(0, 0, workspace->get_rect().size.x, coord.y), shadow_color);
+ if (coord.x >= 0)
+ workspace->draw_rect(Rect2(0, MAX(0, coord.y), coord.x, MIN(workspace->get_rect().size.y - coord.y, MIN(size.y, coord.y + size.y))), shadow_color);
+ if (coord.x + size.x <= workspace->get_rect().size.x)
+ workspace->draw_rect(Rect2(coord.x + size.x, MAX(0, coord.y), workspace->get_rect().size.x - coord.x - size.x, MIN(workspace->get_rect().size.y - coord.y, MIN(size.y, coord.y + size.y))), shadow_color);
+ if (coord.y + size.y <= workspace->get_rect().size.y)
+ workspace->draw_rect(Rect2(0, coord.y + size.y, workspace->get_rect().size.x, workspace->get_rect().size.y - size.y - coord.y), shadow_color);
+
coord += Vector2(1, 1) / workspace->get_scale().x;
workspace->draw_rect(Rect2(coord, size - Vector2(2, 2) / workspace->get_scale().x), Color(1, 0, 0), false);
for (int i = 0; i < other_highlighted.size(); i++) {
@@ -1576,35 +1624,35 @@ void TileSetEditor::draw_tile_subdivision(int p_id, Color p_color) const {
Rect2 region = tileset->tile_get_region(p_id);
Size2 size = tileset->autotile_get_size(p_id);
int spacing = tileset->autotile_get_spacing(p_id);
- float j = 0;
+ float j = size.x;
+
while (j < region.size.x) {
- j += size.x;
if (spacing <= 0) {
workspace->draw_line(region.position + WORKSPACE_MARGIN + Point2(j, 0), region.position + WORKSPACE_MARGIN + Point2(j, region.size.y), c);
} else {
workspace->draw_rect(Rect2(region.position + WORKSPACE_MARGIN + Point2(j, 0), Size2(spacing, region.size.y)), c);
}
- j += spacing;
+ j += spacing + size.x;
}
- j = 0;
+ j = size.y;
while (j < region.size.y) {
- j += size.y;
if (spacing <= 0) {
workspace->draw_line(region.position + WORKSPACE_MARGIN + Point2(0, j), region.position + WORKSPACE_MARGIN + Point2(region.size.x, j), c);
} else {
workspace->draw_rect(Rect2(region.position + WORKSPACE_MARGIN + Point2(0, j), Size2(region.size.x, spacing)), c);
}
- j += spacing;
+ j += spacing + size.y;
}
}
}
void TileSetEditor::draw_edited_region_subdivision() const {
- Color c = Color(0.347214, 0.722656, 0.617063, 1);
+ Color c = Color(0.3, 0.7, 0.6);
Rect2 region = edited_region;
Size2 size;
int spacing;
bool draw;
+
if (workspace_mode == WORKSPACE_EDIT) {
int p_id = get_current_tile();
size = tileset->autotile_get_size(p_id);
@@ -1615,66 +1663,72 @@ void TileSetEditor::draw_edited_region_subdivision() const {
spacing = snap_separation.x;
draw = workspace_mode != WORKSPACE_CREATE_SINGLE;
}
- if (draw) {
- float j = 0;
+ if (draw) {
+ float j = size.x;
while (j < region.size.x) {
- j += size.x;
if (spacing <= 0) {
workspace->draw_line(region.position + Point2(j, 0), region.position + Point2(j, region.size.y), c);
} else {
workspace->draw_rect(Rect2(region.position + Point2(j, 0), Size2(spacing, region.size.y)), c);
}
- j += spacing;
+ j += spacing + size.x;
}
- j = 0;
+ j = size.y;
while (j < region.size.y) {
- j += size.y;
if (spacing <= 0) {
workspace->draw_line(region.position + Point2(0, j), region.position + Point2(region.size.x, j), c);
} else {
workspace->draw_rect(Rect2(region.position + Point2(0, j), Size2(region.size.x, spacing)), c);
}
- j += spacing;
+ j += spacing + size.y;
}
}
}
void TileSetEditor::draw_grid_snap() {
if (tools[TOOL_GRID_SNAP]->is_pressed()) {
- Color grid_color = Color(0.39, 0, 1, 0.2f);
+ Color grid_color = Color(0.4, 0, 1);
Size2 s = workspace->get_size();
- int width_count = (int)(s.width / (snap_step.x + snap_separation.x));
- int height_count = (int)(s.height / (snap_step.y + snap_separation.y));
+ int width_count = Math::floor((s.width - WORKSPACE_MARGIN.x) / (snap_step.x + snap_separation.x));
+ int height_count = Math::floor((s.height - WORKSPACE_MARGIN.y) / (snap_step.y + snap_separation.y));
+ int last_p = 0;
if (snap_step.x != 0) {
- int last_p = 0;
for (int i = 0; i <= width_count; i++) {
if (i == 0 && snap_offset.x != 0) {
last_p = snap_offset.x;
}
- if (snap_separation.x != 0 && i != 0) {
- workspace->draw_rect(Rect2(last_p, 0, snap_separation.x, s.height), grid_color);
- last_p += snap_separation.x;
- } else
+ if (snap_separation.x != 0) {
+ if (i != 0) {
+ workspace->draw_rect(Rect2(last_p, 0, snap_separation.x, s.height), grid_color);
+ last_p += snap_separation.x;
+ } else {
+ workspace->draw_rect(Rect2(last_p, 0, -snap_separation.x, s.height), grid_color);
+ }
+ } else {
workspace->draw_line(Point2(last_p, 0), Point2(last_p, s.height), grid_color);
-
+ }
last_p += snap_step.x;
}
}
-
+ last_p = 0;
if (snap_step.y != 0) {
- int last_p = 0;
for (int i = 0; i <= height_count; i++) {
if (i == 0 && snap_offset.y != 0) {
last_p = snap_offset.y;
}
- if (snap_separation.x != 0 && i != 0) {
- workspace->draw_rect(Rect2(0, last_p, s.width, snap_separation.y), grid_color);
- last_p += snap_separation.y;
- } else
+ if (snap_separation.x != 0) {
+ if (i != 0) {
+ workspace->draw_rect(Rect2(0, last_p, s.width, snap_separation.y), grid_color);
+ last_p += snap_separation.y;
+ } else {
+ workspace->draw_rect(Rect2(0, last_p, s.width, -snap_separation.y), grid_color);
+ }
+ } else {
workspace->draw_line(Point2(0, last_p), Point2(s.width, last_p), grid_color);
+ }
last_p += snap_step.y;
}
}
@@ -1687,8 +1741,6 @@ void TileSetEditor::draw_polygon_shapes() {
if (t_id < 0)
return;
- draw_handles = false;
-
switch (edit_mode) {
case EDITMODE_COLLISION: {
Vector<TileSet::ShapeData> sd = tileset->tile_get_shapes(t_id);
@@ -2154,6 +2206,18 @@ void TileSetEditor::update_texture_list_icon() {
void TileSetEditor::update_workspace_tile_mode() {
+ if (!get_current_texture().is_valid()) {
+ tool_workspacemode[WORKSPACE_EDIT]->set_pressed(true);
+ workspace_mode = WORKSPACE_EDIT;
+ for (int i = 1; i < WORKSPACE_MODE_MAX; i++) {
+ tool_workspacemode[i]->set_disabled(true);
+ }
+ } else {
+ for (int i = 1; i < WORKSPACE_MODE_MAX; i++) {
+ tool_workspacemode[i]->set_disabled(false);
+ }
+ }
+
if (workspace_mode != WORKSPACE_EDIT) {
for (int i = 0; i < EDITMODE_MAX; i++) {
tool_editmode[i]->hide();
@@ -2172,7 +2236,9 @@ void TileSetEditor::update_workspace_tile_mode() {
for (int i = 0; i < ZOOM_OUT; i++) {
tools[i]->hide();
}
+
separator_editmode->hide();
+ separator_bitmask->hide();
separator_delete->hide();
separator_grid->hide();
return;
@@ -2184,7 +2250,7 @@ void TileSetEditor::update_workspace_tile_mode() {
separator_editmode->show();
if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::SINGLE_TILE) {
- if (tool_editmode[EDITMODE_ICON]->is_pressed() || tool_editmode[EDITMODE_PRIORITY]->is_pressed() || tool_editmode[EDITMODE_BITMASK]->is_pressed()) {
+ if (tool_editmode[EDITMODE_ICON]->is_pressed() || tool_editmode[EDITMODE_PRIORITY]->is_pressed() || tool_editmode[EDITMODE_BITMASK]->is_pressed() || tool_editmode[EDITMODE_Z_INDEX]->is_pressed()) {
tool_editmode[EDITMODE_COLLISION]->set_pressed(true);
edit_mode = EDITMODE_COLLISION;
}
@@ -2193,6 +2259,7 @@ void TileSetEditor::update_workspace_tile_mode() {
tool_editmode[EDITMODE_ICON]->hide();
tool_editmode[EDITMODE_BITMASK]->hide();
tool_editmode[EDITMODE_PRIORITY]->hide();
+ tool_editmode[EDITMODE_Z_INDEX]->hide();
} else if (tileset->tile_get_tile_mode(get_current_tile()) == TileSet::AUTO_TILE || tileset->tile_get_tile_mode(get_current_tile()) == TileSet::ATLAS_TILE) {
if (edit_mode == EDITMODE_ICON)
select_coord(tileset->autotile_get_icon_coordinate(get_current_tile()));
@@ -2218,25 +2285,18 @@ void TileSetEditor::update_edited_region(const Vector2 &end_point) {
edited_region = Rect2(region_from, Size2());
if (tools[TOOL_GRID_SNAP]->is_pressed()) {
Vector2 grid_coord;
- grid_coord.x = Math::floor((region_from.x - snap_offset.x) / (snap_step.x + snap_separation.x));
- grid_coord.y = Math::floor((region_from.y - snap_offset.y) / (snap_step.y + snap_separation.y));
- grid_coord.x *= (snap_step.x + snap_separation.x);
- grid_coord.y *= (snap_step.y + snap_separation.y);
+ grid_coord = ((region_from - snap_offset) / (snap_step + snap_separation)).floor();
+ grid_coord *= (snap_step + snap_separation);
grid_coord += snap_offset;
edited_region.expand_to(grid_coord);
- grid_coord += snap_step;
+ grid_coord += snap_step + snap_separation;
edited_region.expand_to(grid_coord);
- grid_coord.x = Math::floor((end_point.x - snap_offset.x) / (snap_step.x + snap_separation.x));
- grid_coord.y = Math::floor((end_point.y - snap_offset.y) / (snap_step.y + snap_separation.y));
- grid_coord.x *= (snap_step.x + snap_separation.x);
- grid_coord.y *= (snap_step.y + snap_separation.y);
+
+ grid_coord = ((end_point - snap_offset) / (snap_step + snap_separation)).floor();
+ grid_coord *= (snap_step + snap_separation);
grid_coord += snap_offset;
edited_region.expand_to(grid_coord);
- grid_coord += snap_step;
- if (grid_coord.x < end_point.x)
- grid_coord.x += snap_separation.x;
- if (grid_coord.y < end_point.y)
- grid_coord.y += snap_separation.y;
+ grid_coord += snap_step + snap_separation;
edited_region.expand_to(grid_coord);
} else {
edited_region.expand_to(end_point);
@@ -2414,7 +2474,13 @@ void TilesetEditorContext::_get_property_list(List<PropertyInfo> *p_list) const
}
}
+void TilesetEditorContext::_bind_methods() {
+
+ ClassDB::bind_method("_hide_script_from_inspector", &TilesetEditorContext::_hide_script_from_inspector);
+}
+
TilesetEditorContext::TilesetEditorContext(TileSetEditor *p_tileset_editor) {
+
tileset_editor = p_tileset_editor;
}
@@ -2428,8 +2494,7 @@ void TileSetEditorPlugin::edit(Object *p_node) {
bool TileSetEditorPlugin::handles(Object *p_node) const {
- return p_node->is_class("TileSet") ||
- p_node->is_class("TilesetEditorContext");
+ return p_node->is_class("TileSet") || p_node->is_class("TilesetEditorContext");
}
void TileSetEditorPlugin::make_visible(bool p_visible) {
@@ -2444,6 +2509,41 @@ void TileSetEditorPlugin::make_visible(bool p_visible) {
}
}
+Dictionary TileSetEditorPlugin::get_state() const {
+
+ Dictionary state;
+ state["snap_offset"] = tileset_editor->snap_offset;
+ state["snap_step"] = tileset_editor->snap_step;
+ state["snap_separation"] = tileset_editor->snap_separation;
+ state["snap_enabled"] = tileset_editor->tools[TileSetEditor::TOOL_GRID_SNAP]->is_pressed();
+ state["keep_inside_tile"] = tileset_editor->tools[TileSetEditor::SHAPE_KEEP_INSIDE_TILE]->is_pressed();
+ return state;
+}
+
+void TileSetEditorPlugin::set_state(const Dictionary &p_state) {
+
+ Dictionary state = p_state;
+ if (state.has("snap_step")) {
+ tileset_editor->_set_snap_step(state["snap_step"]);
+ }
+
+ if (state.has("snap_offset")) {
+ tileset_editor->_set_snap_off(state["snap_offset"]);
+ }
+
+ if (state.has("snap_separation")) {
+ tileset_editor->_set_snap_sep(state["snap_separation"]);
+ }
+
+ if (state.has("snap_enabled")) {
+ tileset_editor->tools[TileSetEditor::TOOL_GRID_SNAP]->set_pressed(state["snap_enabled"]);
+ }
+
+ if (state.has("keep_inside_tile")) {
+ tileset_editor->tools[TileSetEditor::SHAPE_KEEP_INSIDE_TILE]->set_pressed(state["keep_inside_tile"]);
+ }
+}
+
TileSetEditorPlugin::TileSetEditorPlugin(EditorNode *p_node) {
editor = p_node;
tileset_editor = memnew(TileSetEditor(p_node));
@@ -2451,6 +2551,6 @@ TileSetEditorPlugin::TileSetEditorPlugin(EditorNode *p_node) {
tileset_editor->set_custom_minimum_size(Size2(0, 200) * EDSCALE);
tileset_editor->hide();
- tileset_editor_button = p_node->add_bottom_panel_item(TTR("Tile Set"), tileset_editor);
+ tileset_editor_button = p_node->add_bottom_panel_item(TTR("TileSet"), tileset_editor);
tileset_editor_button->hide();
}
diff --git a/editor/plugins/tile_set_editor_plugin.h b/editor/plugins/tile_set_editor_plugin.h
index bd8a2ddb98..276e23f9ee 100644
--- a/editor/plugins/tile_set_editor_plugin.h
+++ b/editor/plugins/tile_set_editor_plugin.h
@@ -40,12 +40,12 @@
#define WORKSPACE_MARGIN Vector2(10, 10)
class TilesetEditorContext;
-class TileSetEditor : public Control {
+class TileSetEditor : public HSplitContainer {
friend class TileSetEditorPlugin;
friend class TilesetEditorContext;
- GDCLASS(TileSetEditor, Control)
+ GDCLASS(TileSetEditor, HSplitContainer)
enum TextureToolButtons {
TOOL_TILESET_ADD_TEXTURE,
@@ -71,6 +71,7 @@ class TileSetEditor : public Control {
EDITMODE_BITMASK,
EDITMODE_PRIORITY,
EDITMODE_ICON,
+ EDITMODE_Z_INDEX,
EDITMODE_MAX
};
@@ -134,9 +135,11 @@ class TileSetEditor : public Control {
HSeparator *separator_editmode;
HBoxContainer *toolbar;
ToolButton *tools[TOOL_MAX];
+ VSeparator *separator_bitmask;
VSeparator *separator_delete;
VSeparator *separator_grid;
SpinBox *spin_priority;
+ SpinBox *spin_z_index;
WorkspaceMode workspace_mode;
EditMode edit_mode;
int current_tile;
@@ -177,6 +180,7 @@ private:
void _on_workspace_input(const Ref<InputEvent> &p_ie);
void _on_tool_clicked(int p_tool);
void _on_priority_changed(float val);
+ void _on_z_index_changed(float val);
void _on_grid_snap_toggled(bool p_val);
void _set_snap_step(Vector2 p_val);
void _set_snap_off(Vector2 p_val);
@@ -184,7 +188,7 @@ private:
void _zoom_in();
void _zoom_out();
- void _reset_zoom();
+ void _zoom_reset();
void draw_highlight_current_tile();
void draw_highlight_subtile(Vector2 coord, const Vector<Vector2> &other_highlighted = Vector<Vector2>());
@@ -212,6 +216,7 @@ class TilesetEditorContext : public Object {
bool snap_options_visible;
public:
+ bool _hide_script_from_inspector() { return true; }
void set_tileset(const Ref<TileSet> &p_tileset);
private:
@@ -221,6 +226,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;
+ static void _bind_methods();
public:
TilesetEditorContext(TileSetEditor *p_tileset_editor);
@@ -240,6 +246,8 @@ public:
virtual void edit(Object *p_node);
virtual bool handles(Object *p_node) const;
virtual void make_visible(bool p_visible);
+ void set_state(const Dictionary &p_state);
+ Dictionary get_state() const;
TileSetEditorPlugin(EditorNode *p_node);
};
diff --git a/editor/plugins/visual_shader_editor_plugin.cpp b/editor/plugins/visual_shader_editor_plugin.cpp
index 39e50ec7f8..d3295c0f51 100644
--- a/editor/plugins/visual_shader_editor_plugin.cpp
+++ b/editor/plugins/visual_shader_editor_plugin.cpp
@@ -633,18 +633,23 @@ void VisualShaderEditor::_duplicate_nodes() {
VisualShader::Type type = VisualShader::Type(edit_type->get_selected());
List<int> nodes;
+ Set<int> excluded;
for (int i = 0; i < graph->get_child_count(); i++) {
- if (Object::cast_to<GraphNode>(graph->get_child(i))) {
- int id = String(graph->get_child(i)->get_name()).to_int();
+ GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i));
+ if (gn) {
+ int id = String(gn->get_name()).to_int();
Ref<VisualShaderNode> node = visual_shader->get_node(type, id);
Ref<VisualShaderNodeOutput> output = node;
- if (output.is_valid()) //can't duplicate output
+ if (output.is_valid()) { // can't duplicate output
+ excluded.insert(id);
continue;
- if (node.is_valid()) {
+ }
+ if (node.is_valid() && gn->is_selected()) {
nodes.push_back(id);
}
+ excluded.insert(id);
}
}
@@ -683,15 +688,16 @@ void VisualShaderEditor::_duplicate_nodes() {
undo_redo->add_undo_method(this, "_update_graph");
undo_redo->commit_action();
- //reselect
+ // reselect duplicated nodes by excluding the other ones
for (int i = 0; i < graph->get_child_count(); i++) {
- if (Object::cast_to<GraphNode>(graph->get_child(i))) {
- int id = String(graph->get_child(i)->get_name()).to_int();
- if (nodes.find(id)) {
- Object::cast_to<GraphNode>(graph->get_child(i))->set_selected(true);
+ GraphNode *gn = Object::cast_to<GraphNode>(graph->get_child(i));
+ if (gn) {
+ int id = String(gn->get_name()).to_int();
+ if (!excluded.has(id)) {
+ gn->set_selected(true);
} else {
- Object::cast_to<GraphNode>(graph->get_child(i))->set_selected(false);
+ gn->set_selected(false);
}
}
}
@@ -798,7 +804,7 @@ VisualShaderEditor::VisualShaderEditor() {
add_node = memnew(MenuButton);
graph->get_zoom_hbox()->add_child(add_node);
- add_node->set_text(TTR("Add Node.."));
+ add_node->set_text(TTR("Add Node..."));
graph->get_zoom_hbox()->move_child(add_node, 0);
add_node->get_popup()->connect("id_pressed", this, "_add_node");
diff --git a/editor/project_export.cpp b/editor/project_export.cpp
index f8ba6fd4e3..557aac021d 100644
--- a/editor/project_export.cpp
+++ b/editor/project_export.cpp
@@ -56,7 +56,7 @@ void ProjectExportDialog::_notification(int p_what) {
custom_feature_display->get_parent_control()->add_style_override("panel", get_stylebox("bg", "Tree"));
} break;
case NOTIFICATION_POPUP_HIDE: {
- EditorSettings::get_singleton()->set("interface/dialogs/export_bounds", get_rect());
+ EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "export", get_rect());
} break;
case NOTIFICATION_THEME_CHANGED: {
duplicate_preset->set_icon(get_icon("Duplicate", "EditorIcons"));
@@ -84,8 +84,9 @@ void ProjectExportDialog::popup_export() {
}
// Restore valid window bounds or pop up at default size.
- if (EditorSettings::get_singleton()->has_setting("interface/dialogs/export_bounds")) {
- popup(EditorSettings::get_singleton()->get("interface/dialogs/export_bounds"));
+ Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "export", Rect2());
+ if (saved_size != Rect2()) {
+ popup(saved_size);
} else {
Size2 popup_size = Size2(900, 700) * editor_get_scale();
@@ -191,7 +192,7 @@ void ProjectExportDialog::_edit_preset(int p_index) {
if (p_index < 0 || p_index >= presets->get_item_count()) {
name->set_text("");
name->set_editable(false);
- export_path->set_editable(false);
+ export_path->hide();
runnable->set_disabled(true);
parameters->edit(NULL);
presets->unselect_all();
@@ -213,11 +214,19 @@ void ProjectExportDialog::_edit_preset(int p_index) {
sections->show();
name->set_editable(true);
- export_path->set_editable(true);
+ export_path->show();
duplicate_preset->set_disabled(false);
delete_preset->set_disabled(false);
name->set_text(current->get_name());
- export_path->set_text(current->get_export_path());
+
+ List<String> extension_list = current->get_platform()->get_binary_extensions(current);
+ Vector<String> extension_vector;
+ for (int i = 0; i < extension_list.size(); i++) {
+ extension_vector.push_back("*." + extension_list[i]);
+ }
+
+ export_path->setup(extension_vector, false, true);
+ export_path->update_property();
runnable->set_disabled(false);
runnable->set_pressed(current->is_runnable());
parameters->edit(current.ptr());
@@ -457,7 +466,21 @@ void ProjectExportDialog::_name_changed(const String &p_string) {
_update_presets();
}
-void ProjectExportDialog::_export_path_changed(const String &p_string) {
+void ProjectExportDialog::set_export_path(const String &p_value) {
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ ERR_FAIL_COND(current.is_null());
+
+ current->set_export_path(p_value);
+}
+
+String ProjectExportDialog::get_export_path() {
+ Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
+ ERR_FAIL_COND_V(current.is_null(), String(""));
+
+ return current->get_export_path();
+}
+
+void ProjectExportDialog::_export_path_changed(const StringName &p_property, const Variant &p_value) {
if (updating)
return;
@@ -465,7 +488,7 @@ void ProjectExportDialog::_export_path_changed(const String &p_string) {
Ref<EditorExportPreset> current = EditorExport::get_singleton()->get_export_preset(presets->get_current());
ERR_FAIL_COND(current.is_null());
- current->set_export_path(p_string);
+ current->set_export_path(p_value);
_update_presets();
}
@@ -954,6 +977,10 @@ void ProjectExportDialog::_bind_methods() {
ClassDB::bind_method("_export_all_dialog_action", &ProjectExportDialog::_export_all_dialog_action);
ClassDB::bind_method("_custom_features_changed", &ProjectExportDialog::_custom_features_changed);
ClassDB::bind_method("_tab_changed", &ProjectExportDialog::_tab_changed);
+ ClassDB::bind_method("set_export_path", &ProjectExportDialog::set_export_path);
+ ClassDB::bind_method("get_export_path", &ProjectExportDialog::get_export_path);
+
+ ADD_PROPERTY(PropertyInfo(Variant::STRING, "export_path"), "set_export_path", "get_export_path");
}
ProjectExportDialog::ProjectExportDialog() {
@@ -1006,9 +1033,12 @@ ProjectExportDialog::ProjectExportDialog() {
runnable->connect("pressed", this, "_runnable_pressed");
settings_vb->add_child(runnable);
- export_path = memnew(LineEdit);
- settings_vb->add_margin_child(TTR("Export Path:"), export_path);
- export_path->connect("text_changed", this, "_export_path_changed");
+ export_path = memnew(EditorPropertyPath);
+ settings_vb->add_child(export_path);
+ export_path->set_label(TTR("Export Path"));
+ export_path->set_object_and_property(this, "export_path");
+ export_path->set_save_mode();
+ export_path->connect("property_changed", this, "_export_path_changed");
sections = memnew(TabContainer);
sections->set_tab_align(TabContainer::ALIGN_LEFT);
@@ -1100,7 +1130,7 @@ ProjectExportDialog::ProjectExportDialog() {
//disable by default
name->set_editable(false);
- export_path->set_editable(false);
+ export_path->hide();
runnable->set_disabled(true);
duplicate_preset->set_disabled(true);
delete_preset->set_disabled(true);
diff --git a/editor/project_export.h b/editor/project_export.h
index 7009968138..b43dd9a392 100644
--- a/editor/project_export.h
+++ b/editor/project_export.h
@@ -37,6 +37,7 @@
#include "editor/editor_file_dialog.h"
#include "editor/editor_file_system.h"
#include "editor/editor_inspector.h"
+#include "editor/editor_properties.h"
#include "scene/gui/button.h"
#include "scene/gui/check_button.h"
#include "scene/gui/control.h"
@@ -66,7 +67,7 @@ private:
ItemList *presets;
LineEdit *name;
- LineEdit *export_path;
+ EditorPropertyPath *export_path;
EditorInspector *parameters;
CheckButton *runnable;
@@ -110,7 +111,7 @@ private:
void _runnable_pressed();
void _update_parameters(const String &p_edited_property);
void _name_changed(const String &p_string);
- void _export_path_changed(const String &p_string);
+ void _export_path_changed(const StringName &p_property, const Variant &p_value);
void _add_preset(int p_platform);
void _edit_preset(int p_index);
void _duplicate_preset();
@@ -162,6 +163,9 @@ protected:
public:
void popup_export();
+ void set_export_path(const String &p_value);
+ String get_export_path();
+
ProjectExportDialog();
~ProjectExportDialog();
};
diff --git a/editor/project_manager.cpp b/editor/project_manager.cpp
index 8c906e5f0b..8d5847bea4 100644
--- a/editor/project_manager.cpp
+++ b/editor/project_manager.cpp
@@ -745,7 +745,8 @@ public:
get_ok()->set_text(TTR("Create & Edit"));
name_container->show();
install_path_container->hide();
- project_name->grab_focus();
+ project_name->call_deferred("grab_focus");
+ project_name->call_deferred("select_all");
} else if (mode == MODE_INSTALL) {
@@ -866,16 +867,22 @@ struct ProjectItem {
uint64_t last_modified;
bool favorite;
bool grayed;
+ bool ordered_latest_modification;
ProjectItem() {}
- ProjectItem(const String &p_project, const String &p_path, const String &p_conf, uint64_t p_last_modified, bool p_favorite = false, bool p_grayed = false) {
+ ProjectItem(const String &p_project, const String &p_path, const String &p_conf, uint64_t p_last_modified, bool p_favorite = false, bool p_grayed = false, const bool p_ordered_latest_modification = true) {
project = p_project;
path = p_path;
conf = p_conf;
last_modified = p_last_modified;
favorite = p_favorite;
grayed = p_grayed;
+ ordered_latest_modification = p_ordered_latest_modification;
+ }
+ _FORCE_INLINE_ bool operator<(const ProjectItem &l) const {
+ if (ordered_latest_modification)
+ return last_modified > l.last_modified;
+ return project < l.project;
}
- _FORCE_INLINE_ bool operator<(const ProjectItem &l) const { return last_modified > l.last_modified; }
_FORCE_INLINE_ bool operator==(const ProjectItem &l) const { return project == l.project; }
};
@@ -1156,6 +1163,13 @@ void ProjectManager::_load_recent_projects() {
Color font_color = gui_base->get_color("font_color", "Tree");
+ bool set_ordered_latest_modification;
+ ProjectListFilter::FilterOption filter_order_option = project_order_filter->get_filter_option();
+ if (filter_order_option == ProjectListFilter::FILTER_NAME)
+ set_ordered_latest_modification = false;
+ else
+ set_ordered_latest_modification = true;
+
List<ProjectItem> projects;
List<ProjectItem> favorite_projects;
@@ -1188,13 +1202,12 @@ void ProjectManager::_load_recent_projects() {
grayed = true;
}
- ProjectItem item(project, path, conf, last_modified, favorite, grayed);
+ ProjectItem item(project, path, conf, last_modified, favorite, grayed, set_ordered_latest_modification);
if (favorite)
favorite_projects.push_back(item);
else
projects.push_back(item);
}
-
projects.sort();
favorite_projects.sort();
@@ -1818,16 +1831,41 @@ ProjectManager::ProjectManager() {
tabs->add_child(tree_hb);
VBoxContainer *search_tree_vb = memnew(VBoxContainer);
- search_tree_vb->set_h_size_flags(SIZE_EXPAND_FILL);
tree_hb->add_child(search_tree_vb);
+ search_tree_vb->set_h_size_flags(SIZE_EXPAND_FILL);
- HBoxContainer *search_box = memnew(HBoxContainer);
- search_box->add_spacer(true);
+ HBoxContainer *sort_filters = memnew(HBoxContainer);
+ Label *sort_label = memnew(Label);
+ sort_label->set_text(TTR("Sort:"));
+ sort_filters->add_child(sort_label);
+ Vector<String> vec1;
+ vec1.push_back("Name");
+ vec1.push_back("Last Modified");
+ project_order_filter = memnew(ProjectListFilter);
+ project_order_filter->_setup_filters(vec1);
+ project_order_filter->set_filter_size(150);
+ sort_filters->add_child(project_order_filter);
+ project_order_filter->connect("filter_changed", this, "_load_recent_projects");
+ project_order_filter->set_custom_minimum_size(Size2(180, 10) * EDSCALE);
+
+ sort_filters->add_spacer(true);
+ Label *search_label = memnew(Label);
+ search_label->set_text(TTR(" Search:"));
+ sort_filters->add_child(search_label);
+
+ HBoxContainer *search_filters = memnew(HBoxContainer);
+ Vector<String> vec2;
+ vec2.push_back("Name");
+ vec2.push_back("Path");
project_filter = memnew(ProjectListFilter);
- search_box->add_child(project_filter);
+ project_filter->_setup_filters(vec2);
+ project_filter->add_search_box();
+ search_filters->add_child(project_filter);
project_filter->connect("filter_changed", this, "_load_recent_projects");
project_filter->set_custom_minimum_size(Size2(280, 10) * EDSCALE);
- search_tree_vb->add_child(search_box);
+ sort_filters->add_child(search_filters);
+
+ search_tree_vb->add_child(sort_filters);
PanelContainer *pc = memnew(PanelContainer);
pc->add_style_override("panel", gui_base->get_stylebox("bg", "Tree"));
@@ -2017,11 +2055,11 @@ ProjectManager::~ProjectManager() {
EditorSettings::destroy();
}
-void ProjectListFilter::_setup_filters() {
+void ProjectListFilter::_setup_filters(Vector<String> options) {
filter_option->clear();
- filter_option->add_item(TTR("Name"));
- filter_option->add_item(TTR("Path"));
+ for (int i = 0; i < options.size(); i++)
+ filter_option->add_item(TTR(options[i]));
}
void ProjectListFilter::_search_text_changed(const String &p_newtext) {
@@ -2046,7 +2084,7 @@ void ProjectListFilter::_filter_option_selected(int p_idx) {
void ProjectListFilter::_notification(int p_what) {
- if (p_what == NOTIFICATION_ENTER_TREE) {
+ if (p_what == NOTIFICATION_ENTER_TREE && has_search_box) {
search_box->set_right_icon(get_icon("Search", "EditorIcons"));
search_box->set_clear_button_enabled(true);
}
@@ -2060,20 +2098,27 @@ void ProjectListFilter::_bind_methods() {
ADD_SIGNAL(MethodInfo("filter_changed"));
}
+void ProjectListFilter::add_search_box() {
+ search_box = memnew(LineEdit);
+ search_box->connect("text_changed", this, "_search_text_changed");
+ search_box->set_h_size_flags(SIZE_EXPAND_FILL);
+ add_child(search_box);
+ has_search_box = true;
+}
+
+void ProjectListFilter::set_filter_size(int h_size) {
+ filter_option->set_custom_minimum_size(Size2(h_size * EDSCALE, 10 * EDSCALE));
+}
+
ProjectListFilter::ProjectListFilter() {
_current_filter = FILTER_NAME;
filter_option = memnew(OptionButton);
- filter_option->set_custom_minimum_size(Size2(80 * EDSCALE, 10 * EDSCALE));
+ set_filter_size(80);
filter_option->set_clip_text(true);
filter_option->connect("item_selected", this, "_filter_option_selected");
add_child(filter_option);
- _setup_filters();
-
- search_box = memnew(LineEdit);
- search_box->connect("text_changed", this, "_search_text_changed");
- search_box->set_h_size_flags(SIZE_EXPAND_FILL);
- add_child(search_box);
+ has_search_box = false;
}
diff --git a/editor/project_manager.h b/editor/project_manager.h
index ad21e00b0d..88fc081272 100644
--- a/editor/project_manager.h
+++ b/editor/project_manager.h
@@ -54,6 +54,7 @@ class ProjectManager : public Control {
EditorAssetLibrary *asset_library;
ProjectListFilter *project_filter;
+ ProjectListFilter *project_order_filter;
ConfirmationDialog *language_restart_ask;
ConfirmationDialog *erase_ask;
@@ -130,6 +131,7 @@ private:
OptionButton *filter_option;
LineEdit *search_box;
+ bool has_search_box;
enum FilterOption {
FILTER_NAME,
@@ -138,7 +140,6 @@ private:
FilterOption _current_filter;
void _search_text_changed(const String &p_newtext);
- void _setup_filters();
void _filter_option_selected(int p_idx);
protected:
@@ -146,6 +147,9 @@ protected:
static void _bind_methods();
public:
+ void _setup_filters(Vector<String> options);
+ void add_search_box();
+ void set_filter_size(int h_size);
String get_search_term();
FilterOption get_filter_option();
ProjectListFilter();
diff --git a/editor/project_settings_editor.cpp b/editor/project_settings_editor.cpp
index 7a68646f40..af8d33d3d1 100644
--- a/editor/project_settings_editor.cpp
+++ b/editor/project_settings_editor.cpp
@@ -115,10 +115,9 @@ void ProjectSettingsEditor::_notification(int p_what) {
} break;
case NOTIFICATION_POPUP_HIDE: {
- EditorSettings::get_singleton()->set("interface/dialogs/project_settings_bounds", get_rect());
+ EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "project_settings", get_rect());
} break;
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
-
search_button->set_icon(get_icon("Search", "EditorIcons"));
search_box->set_right_icon(get_icon("Search", "EditorIcons"));
search_box->set_clear_button_enabled(true);
@@ -788,8 +787,9 @@ void ProjectSettingsEditor::_update_actions() {
void ProjectSettingsEditor::popup_project_settings() {
// Restore valid window bounds or pop up at default size.
- if (EditorSettings::get_singleton()->has_setting("interface/dialogs/project_settings_bounds")) {
- popup(EditorSettings::get_singleton()->get("interface/dialogs/project_settings_bounds"));
+ Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "project_settings", Rect2());
+ if (saved_size != Rect2()) {
+ popup(saved_size);
} else {
Size2 popup_size = Size2(900, 700) * editor_get_scale();
diff --git a/editor/settings_config_dialog.cpp b/editor/settings_config_dialog.cpp
index 537c9ac6b8..a4956bee27 100644
--- a/editor/settings_config_dialog.cpp
+++ b/editor/settings_config_dialog.cpp
@@ -94,8 +94,9 @@ void EditorSettingsDialog::popup_edit_settings() {
set_process_unhandled_input(true);
// Restore valid window bounds or pop up at default size.
- if (EditorSettings::get_singleton()->has_setting("interface/dialogs/editor_settings_bounds")) {
- popup(EditorSettings::get_singleton()->get("interface/dialogs/editor_settings_bounds"));
+ Rect2 saved_size = EditorSettings::get_singleton()->get_project_metadata("dialog_bounds", "editor_settings", Rect2());
+ if (saved_size != Rect2()) {
+ popup(saved_size);
} else {
Size2 popup_size = Size2(900, 700) * editor_get_scale();
@@ -132,7 +133,7 @@ void EditorSettingsDialog::_notification(int p_what) {
_update_icons();
} break;
case NOTIFICATION_POPUP_HIDE: {
- EditorSettings::get_singleton()->set("interface/dialogs/editor_settings_bounds", get_rect());
+ EditorSettings::get_singleton()->set_project_metadata("dialog_bounds", "editor_settings", get_rect());
set_process_unhandled_input(false);
} break;
case EditorSettings::NOTIFICATION_EDITOR_SETTINGS_CHANGED: {
diff --git a/editor/translations/af.po b/editor/translations/af.po
index 17dd7b19c5..d3647bdb0f 100644
--- a/editor/translations/af.po
+++ b/editor/translations/af.po
@@ -552,9 +552,8 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Zoem In"
+msgid "Font Size:"
+msgstr ""
#: editor/code_editor.cpp
msgid "Line:"
@@ -1726,6 +1725,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2125,7 +2130,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -9042,7 +9047,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9269,6 +9274,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Zoem In"
+
#~ msgid "Class List:"
#~ msgstr "Klas Lys:"
diff --git a/editor/translations/ar.po b/editor/translations/ar.po
index ed3b98016a..a93f3ebed9 100644
--- a/editor/translations/ar.po
+++ b/editor/translations/ar.po
@@ -567,8 +567,8 @@ msgstr ""
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "تقريب"
+msgid "Font Size:"
+msgstr "حجم الخطوط:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1729,6 +1729,12 @@ msgstr "هذه العملية لا يمكنها الإكتمال من غير جØ
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr "لا يمكن Ø­Ùظ المشهد. على الأرجح لا يمكن إستيÙاء التبعيات (مجسّدات)."
@@ -2163,7 +2169,7 @@ msgid "Undo"
msgstr "تراجع"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "إعادة"
@@ -9208,7 +9214,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9438,6 +9444,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "تقريب"
+
#~ msgid "Class List:"
#~ msgstr "قائمة الأصناÙ:"
diff --git a/editor/translations/bg.po b/editor/translations/bg.po
index 60f5eafb45..f75e29e11a 100644
--- a/editor/translations/bg.po
+++ b/editor/translations/bg.po
@@ -552,8 +552,9 @@ msgid "Warnings:"
msgstr "ПредупреждениÑ:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "Приближение:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "Изглед Отпред."
#: editor/code_editor.cpp
msgid "Line:"
@@ -1692,6 +1693,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2098,7 +2105,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -9147,7 +9154,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9375,6 +9382,9 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#~ msgid "Zoom:"
+#~ msgstr "Приближение:"
+
#~ msgid "Class List:"
#~ msgstr "СпиÑък на КлаÑове:"
diff --git a/editor/translations/bn.po b/editor/translations/bn.po
index ae6a8a7f70..a99a1360a2 100644
--- a/editor/translations/bn.po
+++ b/editor/translations/bn.po
@@ -572,8 +572,8 @@ msgstr "সতরà§à¦•à¦¤à¦¾"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "জà§à¦®à§ (%):"
+msgid "Font Size:"
+msgstr "উৎস ফনà§à¦Ÿà§‡à¦° আকার:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1768,6 +1768,12 @@ msgid "This operation can't be done without a tree root."
msgstr "দৃশà§à¦¯ ছাড়া à¦à¦Ÿà¦¿ করা সমà§à¦­à¦¬ হবে না।"
#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
#, fuzzy
msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
@@ -2219,7 +2225,7 @@ msgid "Undo"
msgstr "সাবেক অবসà§à¦¥à¦¾à§Ÿ যান/আনডà§"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "পà§à¦¨à¦°à¦¾à¦¯à¦¼ করà§à¦¨"
@@ -9689,7 +9695,7 @@ msgstr ""
"আকৃতি তৈরি করà§à¦¨!"
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9940,6 +9946,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "জà§à¦®à§ (%):"
+
#~ msgid "Class List:"
#~ msgstr "কà§à¦²à¦¾à¦¸à§‡à¦° তালিকা:"
@@ -10655,9 +10665,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "ফনà§à¦Ÿà§‡à¦° উৎস:"
-#~ msgid "Source Font Size:"
-#~ msgstr "উৎস ফনà§à¦Ÿà§‡à¦° আকার:"
-
#~ msgid "Dest Resource:"
#~ msgstr "রিসোরà§à¦¸à§‡à¦° গনà§à¦¤à¦¬à§à¦¯à¦¸à§à¦¥à¦¾à¦¨:"
diff --git a/editor/translations/ca.po b/editor/translations/ca.po
index 1b8fa8933c..c0ec1493a3 100644
--- a/editor/translations/ca.po
+++ b/editor/translations/ca.po
@@ -547,8 +547,9 @@ msgid "Warnings:"
msgstr "Avisos:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "Zoom:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "Mida de la lletra:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1711,6 +1712,12 @@ msgstr "Aquesta operació no es pot fer sense cap arrel d'arbre."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2154,7 +2161,7 @@ msgid "Undo"
msgstr "Desfés"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Refés"
@@ -9316,7 +9323,7 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr "Res és visible perquè no s'ha assignat cap Malla a cap pas de Dibuix."
#: scene/3d/cpu_particles.cpp
@@ -9584,6 +9591,9 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#~ msgid "Zoom:"
+#~ msgstr "Zoom:"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "Esteu segur que voleu eliminar totes les connexions de \""
@@ -10277,9 +10287,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "Lletra:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Mida de la lletra:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Recurs Objectiu:"
diff --git a/editor/translations/cs.po b/editor/translations/cs.po
index f6bc57ed66..9a1d88ba87 100644
--- a/editor/translations/cs.po
+++ b/editor/translations/cs.po
@@ -13,15 +13,15 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-11-21 19:07+0000\n"
-"Last-Translator: Jan 'spl!te' Kondelík <j.kondelik@centrum.cz>\n"
+"PO-Revision-Date: 2018-12-04 22:14+0000\n"
+"Last-Translator: Vojtěch Šamla <auzkok@seznam.cz>\n"
"Language-Team: Czech <https://hosted.weblate.org/projects/godot-engine/godot/"
"cs/>\n"
"Language: cs\n"
"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 3.3-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -499,7 +499,7 @@ msgstr "Změnit hodnotu pole"
#: editor/code_editor.cpp
msgid "Go to Line"
-msgstr "Běž na řádek"
+msgstr "Jít na řádek"
#: editor/code_editor.cpp
msgid "Line Number:"
@@ -550,8 +550,9 @@ msgid "Warnings:"
msgstr "Varování:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "Přiblížit:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "Pohled zepředu"
#: editor/code_editor.cpp
msgid "Line:"
@@ -665,9 +666,9 @@ msgid "Edit Connection: "
msgstr "Upravit připojení: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "Jste si jisti, že chcete odstranit všechna připojení od \""
+msgstr ""
+"Jste si jisti, že chcete odstranit všechna připojení ze signálu \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -675,7 +676,7 @@ msgstr "Signály"
#: editor/connections_dialog.cpp
msgid "Are you sure you want to remove all connections from this signal?"
-msgstr ""
+msgstr "Jste si jistí, že chcete odstranit všechna připojení z tohoto signálu?"
#: editor/connections_dialog.cpp
msgid "Disconnect All"
@@ -686,9 +687,8 @@ msgid "Edit..."
msgstr "Upravit..."
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Go To Method"
-msgstr "Metody"
+msgstr "Přejít na metodu"
#: editor/create_dialog.cpp
msgid "Change %s Type"
@@ -1306,7 +1306,6 @@ msgid "File Exists, Overwrite?"
msgstr "Soubor už existuje. Přepsat?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
msgstr "Vybrat tuto složku"
@@ -1315,15 +1314,13 @@ msgid "Copy Path"
msgstr "Kopírovat cestu"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
msgstr "Otevřít ve správci souborů"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
-msgstr "Ukázat ve správci souborů"
+msgstr "Zobrazit ve správci souborů"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1466,19 +1463,16 @@ msgid "Methods"
msgstr "Metody"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Methods:"
-msgstr "Metody"
+msgstr "Metody:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "Vlastnosti"
+msgstr "Vlastnosti motivu"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties:"
-msgstr "Vlastnosti:"
+msgstr "Vlastnosti motivu:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1505,14 +1499,12 @@ msgid "Constants:"
msgstr "Konstanty:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description"
-msgstr "Popis"
+msgstr "Popis třídy"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description:"
-msgstr "Popis:"
+msgstr "Popis třídy:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1529,12 +1521,10 @@ msgstr ""
"$url2]zažádat[/url][/color]."
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "Popis vlastnosti:"
+msgstr "Popis vlastnosti"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions:"
msgstr "Popis vlastnosti:"
@@ -1547,12 +1537,10 @@ msgstr ""
"nám tím, že ho[color=$color][url=$url]vytvoříte[/url][/color]!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "Popis metody:"
+msgstr "Popis metody"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions:"
msgstr "Popis metody:"
@@ -1570,39 +1558,32 @@ msgid "Search Help"
msgstr "Prohledat nápovědu"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "Nahradit všechny"
+msgstr "Zobrazit všechny"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Classes Only"
-msgstr "Třídy"
+msgstr "Pouze třídy"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "Metody"
+msgstr "Pouze metody"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "Signály"
+msgstr "Pouze signály"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "Konstanty"
+msgstr "Pouze konstanty"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "Vlastnosti"
+msgstr "Pouze vlastnosti"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "Vlastnosti"
+msgstr "Pouze vlastnosti motivu"
#: editor/editor_help_search.cpp
#, fuzzy
@@ -1610,9 +1591,8 @@ msgid "Member Type"
msgstr "Členové"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "Třída:"
+msgstr "Třída"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -1711,6 +1691,12 @@ msgstr "Tato operace nemůže být provedena bez kořenového uzlu."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -1719,7 +1705,7 @@ msgstr ""
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "Nelze přepsat scénu, která je stále otevřená!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -1797,6 +1783,9 @@ msgid ""
"Please read the documentation relevant to debugging to better understand "
"this workflow."
msgstr ""
+"Toto je vzdálený objekt, takže jeho změny nebudou zachovány.\n"
+"PÅ™eÄtÄ›te si, prosím, dokumentaci týkající se debugování, abyste lépe "
+"pochopili tento proces."
#: editor/editor_node.cpp
msgid "There is no defined scene to run."
@@ -1962,13 +1951,12 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Nelze naÄíst skript rozšíření z cesty: '%s'."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
-"Nelze naÄíst skript rozšíření z cesty: '%s'. Skript není v režimu nástroje "
-"(tool)."
+"Nelze naÄíst skript rozšíření z cesty: '%s'. Zdá se, že se v kódu nachází "
+"chyba. Prosím, zkontrolujte syntax."
#: editor/editor_node.cpp
msgid ""
@@ -2022,7 +2010,6 @@ msgstr "Výchozí"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
msgstr "Zobrazit v souborovém systému"
@@ -2107,7 +2094,6 @@ msgid "Save Scene"
msgstr "Uložit scénu"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
msgstr "Uložit všechny scény"
@@ -2137,7 +2123,7 @@ msgid "Undo"
msgstr "Zpět"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Znovu"
@@ -2166,9 +2152,8 @@ msgid "Tools"
msgstr "Nástroje"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Open Project Data Folder"
-msgstr "Otevřít Správce projektu?"
+msgstr "Otevřít složku s daty projektu"
#: editor/editor_node.cpp
msgid "Quit to Project List"
@@ -2473,7 +2458,7 @@ msgstr "Otevřít editor skriptů"
#: editor/editor_node.cpp editor/project_manager.cpp
msgid "Open Asset Library"
-msgstr ""
+msgstr "Otevřít knihovnu assetů"
#: editor/editor_node.cpp
msgid "Open the next Editor"
@@ -2492,9 +2477,8 @@ msgid "Thumbnail..."
msgstr "Náhled..."
#: editor/editor_plugin_settings.cpp
-#, fuzzy
msgid "Edit Plugin"
-msgstr "Pluginy"
+msgstr "Upravit plugin"
#: editor/editor_plugin_settings.cpp
msgid "Installed Plugins:"
@@ -2523,9 +2507,8 @@ msgstr "Upravit:"
#: editor/editor_profiler.cpp editor/plugins/animation_state_machine_editor.cpp
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Start"
-msgstr "Start!"
+msgstr "Start"
#: editor/editor_profiler.cpp
msgid "Measure:"
@@ -2577,11 +2560,11 @@ msgstr ""
#: editor/editor_properties.cpp
msgid "Layer"
-msgstr ""
+msgstr "Vrstva"
#: editor/editor_properties.cpp
msgid "Bit %d, value %d"
-msgstr ""
+msgstr "Bit %d, hodnota %d"
#: editor/editor_properties.cpp
msgid "[Empty]"
@@ -2596,6 +2579,8 @@ msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"Nelze vytvořit ViewportTexture na zdroji uloženém jako soubor.\n"
+"Zdroj musí patřit scéně."
#: editor/editor_properties.cpp
msgid ""
@@ -2644,9 +2629,8 @@ msgstr "Konvertovat na %s"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
-#, fuzzy
msgid "Open Editor"
-msgstr "Otevřít v editoru"
+msgstr "Otevřít editor"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Selected node is not a Viewport!"
@@ -2694,7 +2678,6 @@ msgid "Write your logic in the _run() method."
msgstr "Napište svůj kód v _run() metodě."
#: editor/editor_run_script.cpp
-#, fuzzy
msgid "There is an edited scene already."
msgstr "Nějaka scéna už je upravována."
@@ -2753,11 +2736,11 @@ msgstr "(Aktuální)"
#: editor/export_template_manager.cpp
msgid "Retrieving mirrors, please wait..."
-msgstr ""
+msgstr "Získávání zrcadel, prosím Äekejte..."
#: editor/export_template_manager.cpp
msgid "Remove template version '%s'?"
-msgstr ""
+msgstr "Odstranit Å¡ablonu verze '%s'?"
#: editor/export_template_manager.cpp
msgid "Can't open export templates zip."
@@ -2781,18 +2764,20 @@ msgstr "Extrakce exportních šablon"
#: editor/export_template_manager.cpp
msgid "Importing:"
-msgstr ""
+msgstr "Importování:"
#: editor/export_template_manager.cpp
msgid ""
"No download links found for this version. Direct download is only available "
"for official releases."
msgstr ""
+"Nebyly nalezeny odkazy pro stažení této verze. Přímé stažení je dostupné "
+"pouze pro oficiální vydání."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Can't resolve."
-msgstr ""
+msgstr "Nelze vyřešit."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -2802,7 +2787,7 @@ msgstr "Nelze se připojit."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "No response."
-msgstr ""
+msgstr "Žádná odpovÄ›Ä."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -2812,22 +2797,23 @@ msgstr "Požadavek se nezdařil."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Redirect Loop."
-msgstr ""
+msgstr "Zacyklené přesměrování."
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Failed:"
-msgstr ""
+msgstr "Selhalo:"
#: editor/export_template_manager.cpp
msgid "Download Complete."
-msgstr ""
+msgstr "Stahování dokonÄeno."
#: editor/export_template_manager.cpp
msgid ""
"Templates installation failed. The problematic templates archives can be "
"found at '%s'."
msgstr ""
+"Instalace šablon selhala. Problémové archivy šablon lze nalézt na '%s'."
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2843,11 +2829,11 @@ msgstr "Odpojeno"
#: editor/export_template_manager.cpp
msgid "Resolving"
-msgstr ""
+msgstr "Řeším"
#: editor/export_template_manager.cpp
msgid "Can't Resolve"
-msgstr ""
+msgstr "Nelze vyřešit"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -2877,19 +2863,19 @@ msgstr "Chyba připojení"
#: editor/export_template_manager.cpp
msgid "SSL Handshake Error"
-msgstr ""
+msgstr "Selhání SSL handshaku"
#: editor/export_template_manager.cpp
msgid "Current Version:"
-msgstr ""
+msgstr "Aktuální verze:"
#: editor/export_template_manager.cpp
msgid "Installed Versions:"
-msgstr ""
+msgstr "Instalované verze:"
#: editor/export_template_manager.cpp
msgid "Install From File"
-msgstr ""
+msgstr "Instalovat ze souboru"
#: editor/export_template_manager.cpp
msgid "Remove Template"
@@ -2918,9 +2904,8 @@ msgstr ""
"ukládána!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "Oblíbené:"
+msgstr "Oblíbené"
#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
@@ -3005,14 +2990,12 @@ msgid "Instance"
msgstr "Instance"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to favorites"
-msgstr "Oblíbené:"
+msgstr "Přidat do oblíbených"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from favorites"
-msgstr "Odebrat ze skupiny"
+msgstr "Odebrat z oblíbených"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3043,12 +3026,10 @@ msgid "New Resource..."
msgstr "Nový zdroj..."
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Expand All"
msgstr "Rozbalit vše"
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
msgstr "Sbalit vše"
@@ -3109,24 +3090,20 @@ msgid "Create Script"
msgstr "Vytvořit skript"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find in Files"
msgstr "Najít v souborech"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "Najít: "
+msgstr "Najít:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "Složka: "
+msgstr "Složka:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "Filtr: "
+msgstr "Filtry:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3303,12 +3280,10 @@ msgid "Failed to load resource."
msgstr "Selhalo nahrání zdroje."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
msgstr "Rozbalit všechny vlastnosti"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
msgstr "Sbalit všechny vlastnosti"
@@ -3450,6 +3425,10 @@ msgid ""
"Ctrl+LMB: Split Segment.\n"
"RMB: Erase Point."
msgstr ""
+"Upravit existující polygon:\n"
+"LMB: Přesunout bod.\n"
+"Ctrl+LMB: Rozdělit segment.\n"
+"RMB: Vymazat bod."
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Delete points"
@@ -3467,15 +3446,14 @@ msgstr "Přidat animaci"
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Load.."
-msgstr "NaÄíst"
+msgstr "NaÄíst.."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_state_machine_editor.cpp
msgid "This type of node can't be used. Only root nodes are allowed."
-msgstr ""
+msgstr "Tento typ uzlu nelze použít. Jsou povoleny pouze kořenové uzly."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
@@ -3494,37 +3472,32 @@ msgstr ""
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "Select and move points, create points with RMB."
-msgstr ""
+msgstr "Zvolte a přesuňte body. Nové uzly vytvořte pomocí RMB."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Create points."
-msgstr "Odstranit body"
+msgstr "Vytvořit body."
#: editor/plugins/animation_blend_space_1d_editor.cpp
-#, fuzzy
msgid "Erase points."
-msgstr "RMB: Vymazat bod."
+msgstr "Vymazat body."
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Point"
-msgstr "Přesunout bod"
+msgstr "Bod"
#: editor/plugins/animation_blend_space_1d_editor.cpp
#: editor/plugins/animation_blend_space_2d_editor.cpp
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Open Animation Node"
-msgstr "Jméno animace:"
+msgstr "Otevřít uzel animace"
#: editor/plugins/animation_blend_space_2d_editor.cpp
-#, fuzzy
msgid "Triangle already exists"
-msgstr "Akce '%s' již existuje!"
+msgstr "Trojúhelník již existuje"
#: editor/plugins/animation_blend_space_2d_editor.cpp
msgid "BlendSpace2D does not belong to an AnimationTree node."
@@ -3588,15 +3561,13 @@ msgstr ""
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Add Node.."
-msgstr "Přidat uzel"
+msgstr "Přidat uzel.."
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Edit Filtered Tracks:"
-msgstr "Editovat filtry"
+msgstr "Upravit filtrované stopy:"
#: editor/plugins/animation_blend_tree_editor_plugin.cpp
msgid "Enable filtering"
@@ -3608,15 +3579,15 @@ msgstr ""
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Animation Name:"
-msgstr ""
+msgstr "Nový název animace:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "New Anim"
-msgstr ""
+msgstr "Nová animace"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Change Animation Name:"
-msgstr ""
+msgstr "Změnit název animace:"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Delete Animation?"
@@ -3628,14 +3599,12 @@ msgid "Remove Animation"
msgstr "Smazat animaci"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Invalid animation name!"
-msgstr "Chyba: Neplatné jméno animace!"
+msgstr "Neplatné jméno animace!"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Animation name already exists!"
-msgstr "Chyba: Jméno animace už existuje!"
+msgstr "Jméno animace už existuje!"
#: editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/sprite_frames_editor_plugin.cpp
@@ -3659,9 +3628,8 @@ msgid "Duplicate Animation"
msgstr "Duplikovat animaci"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to copy!"
-msgstr "ERROR: Nevybrána animace pro kopírování!"
+msgstr "Žádná animace pro kopírování!"
#: editor/plugins/animation_player_editor_plugin.cpp
#, fuzzy
@@ -3677,9 +3645,8 @@ msgid "Paste Animation"
msgstr "Vložit animaci"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "No animation to edit!"
-msgstr "ERROR: Nevybrána animace pro úpravu!"
+msgstr "Žádná animace pro úpravu!"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Play selected animation backwards from current pos. (A)"
@@ -3723,14 +3690,12 @@ msgid "New"
msgstr "Nový"
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Edit Transitions..."
-msgstr "Přechody"
+msgstr "Upravit přechody..."
#: editor/plugins/animation_player_editor_plugin.cpp
-#, fuzzy
msgid "Open in Inspector"
-msgstr "Otevřít v editoru"
+msgstr "Otevřít v inspektoru"
#: editor/plugins/animation_player_editor_plugin.cpp
msgid "Display list of animations in player."
@@ -3823,7 +3788,7 @@ msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
msgid "End"
-msgstr ""
+msgstr "Konec"
#: editor/plugins/animation_state_machine_editor.cpp
msgid "Immediate"
@@ -3858,14 +3823,12 @@ msgid ""
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Create new nodes."
-msgstr "Vytvořit nový %s"
+msgstr "Vytvořit nové uzly."
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Connect nodes."
-msgstr "Připojit uzly"
+msgstr "Připojit uzly."
#: editor/plugins/animation_state_machine_editor.cpp
#, fuzzy
@@ -3881,9 +3844,8 @@ msgid "Set the end animation. This is useful for sub-transitions."
msgstr ""
#: editor/plugins/animation_state_machine_editor.cpp
-#, fuzzy
msgid "Transition: "
-msgstr "Přechod"
+msgstr "Přechod: "
#: editor/plugins/animation_tree_editor_plugin.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -4075,7 +4037,7 @@ msgstr "Neúspěšná kontrola sha256 hashe"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Asset Download Error:"
-msgstr ""
+msgstr "Chyba při stahování assetu:"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Downloading (%s / %s)..."
@@ -4107,7 +4069,7 @@ msgstr "Chyba při stahování"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "Download for this asset is already in progress!"
-msgstr ""
+msgstr "Stahování tohoto assetu právě probíhá!"
#: editor/plugins/asset_library_editor_plugin.cpp
msgid "First"
@@ -4480,9 +4442,8 @@ msgid "Show Origin"
msgstr "Zobrazit poÄátek"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Show Viewport"
-msgstr "Zobrazit pomocné"
+msgstr "Zobrazit Viewport"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
@@ -4501,13 +4462,12 @@ msgid "Layout"
msgstr "Rozložení"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Insert keys."
-msgstr "Vložit klíÄe"
+msgstr "Vložit klíÄe."
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Insert Key (Existing Tracks)"
-msgstr ""
+msgstr "Vložit klÃ­Ä (existující stopy)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Copy Pose"
@@ -4887,11 +4847,11 @@ msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Target Surface:"
-msgstr ""
+msgstr "Cílový povrch:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Source Mesh:"
-msgstr ""
+msgstr "Zdrojová mesh:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "X-Axis"
@@ -4911,11 +4871,11 @@ msgstr ""
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Random Rotation:"
-msgstr ""
+msgstr "Náhodná rotace:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Random Tilt:"
-msgstr ""
+msgstr "Náhodné naklonění:"
#: editor/plugins/multimesh_editor_plugin.cpp
msgid "Random Scale:"
@@ -4927,7 +4887,7 @@ msgstr "Naplnit"
#: editor/plugins/navigation_polygon_editor_plugin.cpp
msgid "Create Navigation Polygon"
-msgstr ""
+msgstr "VytvoÅ™it navigaÄní polygon"
#: editor/plugins/particles_2d_editor_plugin.cpp
#, fuzzy
@@ -5089,12 +5049,12 @@ msgstr "Shift+Táhnutí:"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Click: Add Point"
-msgstr "Kliknutí: Přidat bod"
+msgstr "Klik: Přidat bod"
#: editor/plugins/path_2d_editor_plugin.cpp
#: editor/plugins/path_editor_plugin.cpp
msgid "Right Click: Delete Point"
-msgstr ""
+msgstr "Pravý klik: Smazat bod"
#: editor/plugins/path_2d_editor_plugin.cpp
msgid "Select Control Points (Shift+Drag)"
@@ -5141,9 +5101,8 @@ msgid "Curve Point #"
msgstr "Bod křivky #"
#: editor/plugins/path_editor_plugin.cpp
-#, fuzzy
msgid "Set Curve Point Position"
-msgstr "Odstranit signál"
+msgstr "Nastavit pozici bodu křivky"
#: editor/plugins/path_editor_plugin.cpp
msgid "Set Curve In Position"
@@ -5407,12 +5366,11 @@ msgstr "Zdroj"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "AnimationTree nemá nastavenou cestu k AnimstionPlayer"
#: editor/plugins/root_motion_editor_plugin.cpp
-#, fuzzy
msgid "Path to AnimationPlayer is invalid"
-msgstr "Strom animace je neplatný."
+msgstr "Cesta k AnimationPlayer je neplatná"
#: editor/plugins/script_editor_plugin.cpp
msgid "Clear Recent Files"
@@ -5423,19 +5381,16 @@ msgid "Close and save changes?"
msgstr "Zavřít a uložit změny?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "Chyba pÅ™i naÄítání:"
+msgstr "Chyba při zápisu textového souboru:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error: could not load file."
-msgstr "Chyba - Nelze vytvořit skript v souborovém systému."
+msgstr "Chyba: nelze naÄíst soubor."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "Chyba - Nelze vytvořit skript v souborovém systému."
+msgstr "Chyba nelze naÄíst soubor."
#: editor/plugins/script_editor_plugin.cpp
msgid "Error saving file!"
@@ -5458,18 +5413,16 @@ msgid "Error importing"
msgstr "Chyba při importu"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "Nová složka..."
+msgstr "Nový textový soubor..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Open File"
msgstr "Otevřít soubor"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "Uložit jako..."
+msgstr "Uložit soubor jako..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
@@ -5516,9 +5469,8 @@ msgid "File"
msgstr "Soubor"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile"
-msgstr "Zobrazit soubory"
+msgstr "Nový textový soubor"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5606,9 +5558,8 @@ msgid "Keep Debugger Open"
msgstr "Nechat ladící program otevřený"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Debug with External Editor"
-msgstr "Debugovat externím editorem"
+msgstr "Debugovat v externím editoru"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
@@ -5651,9 +5602,8 @@ msgid "Debugger"
msgstr "Ladicí program"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
-msgstr "Prohledat výsledky"
+msgstr "Výsledky hledání"
#: editor/plugins/script_text_editor.cpp
msgid "Line"
@@ -5664,9 +5614,8 @@ msgid "(ignore)"
msgstr "(ignorovat)"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "Přejít na funkci..."
+msgstr "Přejít na funkci"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -5755,12 +5704,10 @@ msgid "Trim Trailing Whitespace"
msgstr "Osekat koncové mezery"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Spaces"
msgstr "Převést odsazení na mezery"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Tabs"
msgstr "Převést odsazení na taby"
@@ -5778,12 +5725,10 @@ msgid "Remove All Breakpoints"
msgstr "Odstranit všechny breakpointy"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Breakpoint"
msgstr "Přejít na další breakpoint"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Breakpoint"
msgstr "Přejít na předchozí breakpoint"
@@ -5792,17 +5737,14 @@ msgid "Find Previous"
msgstr "Najít předchozí"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find in Files..."
msgstr "Najít v souborech..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
msgstr "Přejít na funkci..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
msgstr "Přejít na řádek..."
@@ -5843,9 +5785,8 @@ msgid "Create physical skeleton"
msgstr "Vytvořit fyzickou kostru"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "Spustit"
+msgstr "Spustit IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -7089,18 +7030,20 @@ msgid ""
"You don't currently have any projects.\n"
"Would you like to explore the official example projects in the Asset Library?"
msgstr ""
+"V této chvíli nemáte žádný projekt.\n"
+"Přejete si prozkoumat oficiální ukázkové projekty v knihovně assetů?"
#: editor/project_settings_editor.cpp
msgid "Key "
-msgstr ""
+msgstr "Klávesa "
#: editor/project_settings_editor.cpp
msgid "Joy Button"
-msgstr ""
+msgstr "TlaÄítko gamepadu"
#: editor/project_settings_editor.cpp
msgid "Joy Axis"
-msgstr ""
+msgstr "Osa gamepadu"
#: editor/project_settings_editor.cpp
msgid "Mouse Button"
@@ -7559,9 +7502,8 @@ msgid "Initial value for the counter"
msgstr ""
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Krok:"
+msgstr "Krok"
#: editor/rename_dialog.cpp
msgid "Amount by which counter is incremented for each node"
@@ -9195,7 +9137,7 @@ msgstr ""
"prosím zdroj tvar!"
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9449,6 +9391,9 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#~ msgid "Zoom:"
+#~ msgstr "Přiblížit:"
+
#~ msgid "Class List:"
#~ msgstr "Seznam tříd:"
diff --git a/editor/translations/da.po b/editor/translations/da.po
index 03e628df44..c92d2f2ece 100644
--- a/editor/translations/da.po
+++ b/editor/translations/da.po
@@ -556,9 +556,8 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Zoom Ind"
+msgid "Font Size:"
+msgstr ""
#: editor/code_editor.cpp
msgid "Line:"
@@ -1728,6 +1727,12 @@ msgstr "Denne handling kan ikke foretages uden tree root"
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2173,7 +2178,7 @@ msgid "Undo"
msgstr "Fortryd"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Annuller Fortyd"
@@ -9274,7 +9279,7 @@ msgstr ""
"til det!"
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9522,6 +9527,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Zoom Ind"
+
#~ msgid "Class List:"
#~ msgstr "Class Liste:"
diff --git a/editor/translations/de.po b/editor/translations/de.po
index 95d275e732..fc6396fd5b 100644
--- a/editor/translations/de.po
+++ b/editor/translations/de.po
@@ -34,12 +34,13 @@
# Robin Bauknecht <robin.bauknecht@gmail.com>, 2018.
# Julian Retzlaff <julian.retzlaff@googlemail.com>, 2018.
# asyncial <mahlburg@posteo.de>, 2018.
+# ssantos <ssantos@web.de>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-11-10 20:07+0000\n"
-"Last-Translator: So Wieso <sowieso@dukun.de>\n"
+"PO-Revision-Date: 2018-12-04 22:14+0000\n"
+"Last-Translator: ssantos <ssantos@web.de>\n"
"Language-Team: German <https://hosted.weblate.org/projects/godot-engine/"
"godot/de/>\n"
"Language: de\n"
@@ -47,7 +48,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 3.3-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -63,9 +64,8 @@ msgstr ""
"Nicht genügend Bytes zum Dekodieren des Byte-Strings oder ungültiges Format."
#: core/math/expression.cpp
-#, fuzzy
msgid "Invalid input %i (not passed) in expression"
-msgstr "Ungültige Eingabe %i (fehlgeschlagen) in Ausdruck"
+msgstr "Ungültige Eingabe %i (nicht bestanden) in Ausdruck"
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
@@ -433,14 +433,12 @@ msgid "Delete Selection"
msgstr "Auswahl löschen"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
-msgstr "Gehe zum nächsten Schritt"
+msgstr "Zum nächsten Schritt"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
-msgstr "Gehe zum vorherigen Schritt"
+msgstr "Zum vorherigen Schritt"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -579,8 +577,9 @@ msgid "Warnings:"
msgstr "Warnungen:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "Vergrößerung:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "Quellschriftgröße:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -693,9 +692,8 @@ msgid "Edit Connection: "
msgstr "Verbindung bearbeiten: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "Sollen wirklich alle Verbindungen mit diesem Signal entfernt werden?"
+msgstr "Sollen wirklich alle Verbindungen des Signals „%s“ entfernt werden?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -852,10 +850,8 @@ msgid "Error loading:"
msgstr "Fehler beim Laden:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr ""
-"Die Szene konnte aufgrund fehlender Abhängigkeiten nicht geladen werden:"
+msgstr "Ladefehler aufgrund fehlender Abhängigkeiten:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1343,7 +1339,6 @@ msgid "File Exists, Overwrite?"
msgstr "Datei existiert bereits. Ãœberschreiben?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
msgstr "Diesen Ordner auswählen"
@@ -1352,15 +1347,13 @@ msgid "Copy Path"
msgstr "Pfad kopieren"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
msgstr "Im Dateimanager öffnen"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
-msgstr "Zeige im Dateimanager"
+msgstr "Im Dateimanager anzeigen"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1503,19 +1496,16 @@ msgid "Methods"
msgstr "Methoden"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Methods:"
-msgstr "Methoden"
+msgstr "Methoden:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "Eigenschaften"
+msgstr "Motiv-Eigenschaften"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties:"
-msgstr "Eigenschaften:"
+msgstr "Motiv-Eigenschaften:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1542,14 +1532,12 @@ msgid "Constants:"
msgstr "Konstanten:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description"
-msgstr "Beschreibung"
+msgstr "Klassenbeschreibung"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description:"
-msgstr "Beschreibung:"
+msgstr "Klassenbeschreibung:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1566,12 +1554,10 @@ msgstr ""
"$url2]Meldung von Problemen[/url][/color] sind sehr erwünscht."
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "Eigenschaften-Beschreibung:"
+msgstr "Eigenschaften-Beschreibung"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions:"
msgstr "Eigenschaften-Beschreibung:"
@@ -1584,12 +1570,10 @@ msgstr ""
"$url]Ergänzungen durch eigene Beiträge[/url][/color] sind sehr erwünscht!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "Methoden-Beschreibung:"
+msgstr "Methoden-Beschreibung"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions:"
msgstr "Methoden-Beschreibung:"
@@ -1607,49 +1591,40 @@ msgid "Search Help"
msgstr "Hilfe durchsuchen"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "Normale Ansicht"
+msgstr "Alles anzeigen"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Classes Only"
-msgstr "Klassen"
+msgstr "Nur Klassen"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "Methoden"
+msgstr "Nur Methoden"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "Signale"
+msgstr "Nur Signale"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "Konstanten"
+msgstr "Nur Konstanten"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "Eigenschaften"
+msgstr "Nur Eigenschaften"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "Eigenschaften"
+msgstr "Nur Motiv-Eigenschaften"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Member Type"
-msgstr "Mitglieder"
+msgstr "Mitgliedstyp"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "Klasse:"
+msgstr "Klasse"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -1750,6 +1725,12 @@ msgstr "Diese Aktion kann nicht ohne eine Wurzel ausgeführt werden."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -1758,7 +1739,7 @@ msgstr ""
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "Momentan geöffnete Szenen können nicht überschrieben werden!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -2021,13 +2002,12 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Erweiterungsskript konnte nicht geladen werden: ‚%s‘."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
-"Erweiterungsskript konnte nicht geladen werden: ‚%s‘ Skript ist nicht im "
-"Werkzeugmodus."
+"Erweiterungsskript konnte nicht von folgendem Pfad geladen werden: ‚%s‘. Es "
+"scheint ein Fehler im Quellcode zu sein. Bitte Syntax überprüfen."
#: editor/editor_node.cpp
msgid ""
@@ -2084,7 +2064,6 @@ msgstr "Standard"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
msgstr "Im Dateisystem anzeigen"
@@ -2169,7 +2148,6 @@ msgid "Save Scene"
msgstr "Szene speichern"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
msgstr "Alle Szenen speichern"
@@ -2199,7 +2177,7 @@ msgid "Undo"
msgstr "Rückgängig machen"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Wiederherstellen"
@@ -2657,6 +2635,9 @@ msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"ViewportTextures können nicht für Ressourcen erstellt werden die als Datei "
+"gespeichert sind.\n"
+"Diese Ressourcen müssen zu einer Szene gehören."
#: editor/editor_properties.cpp
msgid ""
@@ -2665,6 +2646,10 @@ msgid ""
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"ViewportTexture kann für diese Ressource nicht erstellt werden weil sie "
+"nicht als lokal zu einer Szene markiert wurde.\n"
+"Bitte die ‚Lokal zu Szene‘-Eigenschaft an dieser Ressource aktivieren (und "
+"an allen Ressourcen die sie enthalten, bis zum nächsten Node)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
@@ -2981,9 +2966,8 @@ msgstr ""
"Der Dateityp-Cache wird nicht gespeichert!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "Favoriten:"
+msgstr "Favoriten"
#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
@@ -3069,14 +3053,12 @@ msgid "Instance"
msgstr "Instanz"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to favorites"
-msgstr "Favoriten:"
+msgstr "Zu Favoriten hinzufügen"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from favorites"
-msgstr "Aus Gruppe entfernen"
+msgstr "Aus Favoriten entfernen"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3107,12 +3089,10 @@ msgid "New Resource..."
msgstr "Neue Ressource..."
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Expand All"
-msgstr "Alle expandieren"
+msgstr "Alle ausklappen"
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
msgstr "Alle einklappen"
@@ -3136,9 +3116,8 @@ msgid "Re-Scan Filesystem"
msgstr "Dateisystem erneut einlesen"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle split mode"
-msgstr "Modus umschalten"
+msgstr "Geteilten Modus umschalten"
#: editor/filesystem_dock.cpp
msgid "Search files"
@@ -3175,24 +3154,20 @@ msgid "Create Script"
msgstr "Erstelle Skript"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find in Files"
msgstr "In Dateien suchen"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "Suche: "
+msgstr "Suche:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "Verzeichnis: "
+msgstr "Verzeichnis:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "Filter"
+msgstr "Filter:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3369,12 +3344,10 @@ msgid "Failed to load resource."
msgstr "Laden der Ressource gescheitert."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
msgstr "Alle Eigenschaften ausklappen"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
msgstr "Alle Eigenschaften einklappen"
@@ -4329,9 +4302,8 @@ msgid "Resize CanvasItem"
msgstr "CanvasItem in Größe anpassen"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale CanvasItem"
-msgstr "CanvasItem rotieren"
+msgstr "CanvasItem skalieren"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
@@ -4396,9 +4368,8 @@ msgid "Rotate Mode"
msgstr "Rotationsmodus"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Mode"
-msgstr "Skalierungsmodus (R)"
+msgstr "Skalierungsmodus"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4499,9 +4470,8 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Macht Unterobjekte dieses Objekts wieder auswählbar."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton Options"
-msgstr "Skelett"
+msgstr "Skelett-Einstellungen"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
@@ -4555,7 +4525,7 @@ msgstr "Zeige Ansichtsfenster (Viewport)"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "Gruppe zeigen und Icons sperren"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -4998,7 +4968,6 @@ msgid "Create Navigation Polygon"
msgstr "Erzeuge Navigationspolygon"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Generating Visibility Rect"
msgstr "Generiere Sichtbarkeits-Rechteck"
@@ -5482,7 +5451,6 @@ msgid "Error writing TextFile:"
msgstr "Fehler beim Schreiben von Textdatei:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error: could not load file."
msgstr "Fehler: Datei konnte nicht geladen werden."
@@ -5583,7 +5551,6 @@ msgid "Copy Script Path"
msgstr "Skriptpfad kopieren"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "History Previous"
msgstr "Zurück im Verlauf"
@@ -5655,7 +5622,6 @@ msgid "Keep Debugger Open"
msgstr "Debugger offen halten"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Debug with External Editor"
msgstr "Mit externem Editor debuggen"
@@ -5700,7 +5666,6 @@ msgid "Debugger"
msgstr "Debugger"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
msgstr "Suchergebnisse"
@@ -5713,9 +5678,8 @@ msgid "(ignore)"
msgstr "(ignorieren)"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "Springe zu Funktion..."
+msgstr "Springe zu Funktion"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -5804,12 +5768,10 @@ msgid "Trim Trailing Whitespace"
msgstr "Kürze Leerraum am Zeilenende"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Spaces"
msgstr "Konvertiere Einrückung zu Leerzeichen"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Tabs"
msgstr "Konvertiere Einrückung zu Tabulatoren"
@@ -5827,12 +5789,10 @@ msgid "Remove All Breakpoints"
msgstr "Lösche alle Haltepunkte"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Breakpoint"
msgstr "Springe zum nächsten Haltepunkt"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Breakpoint"
msgstr "Springe zum vorigen Haltepunkt"
@@ -5841,17 +5801,14 @@ msgid "Find Previous"
msgstr "Finde Vorheriges"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find in Files..."
msgstr "In Dateien suchen..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
msgstr "Springe zu Funktion..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
msgstr "Springe zu Zeile..."
@@ -5947,11 +5904,11 @@ msgstr "Animationsschlüsselbild eingefügt."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Pitch"
-msgstr "Tonhöhe"
+msgstr "Neigen"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Yaw"
-msgstr ""
+msgstr "Gieren"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
@@ -6118,9 +6075,8 @@ msgid "Freelook Speed Modifier"
msgstr "Freisicht Geschwindigkeitsregler"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View Rotation Locked"
-msgstr "Sichtrotation sperren"
+msgstr "Sichtrotation gesperrt"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
@@ -6624,9 +6580,8 @@ msgid "Fix Invalid Tiles"
msgstr "Ungültige Kacheln reparieren"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Cut Selection"
-msgstr "Auswahl zentrieren"
+msgstr "Auswahl ausschneiden"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6673,32 +6628,28 @@ msgid "Pick Tile"
msgstr "Wähle Kachel"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "Auswahl verschieben"
+msgstr "Auswahl kopieren"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate left"
-msgstr "Rotationsmodus"
+msgstr "Nach links rotieren"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate right"
-msgstr "nach rechts"
+msgstr "Nach rechts rotieren"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip horizontally"
-msgstr ""
+msgstr "Horizontal spiegeln"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip vertically"
-msgstr ""
+msgstr "Vertikal spiegeln"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear transform"
-msgstr "Transformation"
+msgstr "Transform löschen"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Add Texture(s) to TileSet"
@@ -6729,9 +6680,8 @@ msgid "Display tile's names (hold Alt Key)"
msgstr "Kachelnamen anzeigen (Alt-Taste halten)"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected texture and ALL TILES which use it?"
-msgstr "Wirklich ausgewählte Textur und ALLE sie nutzenden Kacheln entfernen?"
+msgstr "Ausgewählte Textur und ALLE sie nutzenden Kacheln entfernen?"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
@@ -6746,10 +6696,10 @@ msgid "Merge from scene?"
msgstr "Aus Szene vereinen?"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "%s file(s) were not added because was already on the list."
msgstr ""
-" Dateien wurde nicht hinzugefügt weil sie schon in der Liste vorhanden waren."
+"%s Datei(en) wurde(n) nicht hinzugefügt weil sie schon in der Liste "
+"vorhanden war(en)."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -6836,14 +6786,12 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "Export-Vorlagen für dieses Systeme fehlen / sind fehlerhaft:"
#: editor/project_export.cpp
-#, fuzzy
msgid "Release"
-msgstr "gerade losgelassen"
+msgstr "Veröffentlichung"
#: editor/project_export.cpp
-#, fuzzy
msgid "Exporting All"
-msgstr "Exportiere für %s"
+msgstr "Exportiere alles"
#: editor/project_export.cpp
msgid "Presets"
@@ -6854,9 +6802,8 @@ msgid "Add..."
msgstr "Hinzufügen..."
#: editor/project_export.cpp
-#, fuzzy
msgid "Export Path:"
-msgstr "Exportvorlage:"
+msgstr "Exportpfad:"
#: editor/project_export.cpp
msgid "Resources"
@@ -6921,14 +6868,12 @@ msgid "Export PCK/Zip"
msgstr "Exportiere PCK/Zip"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "Export-Modus:"
+msgstr "Export-Modus?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "Exportieren"
+msgstr "Alles exportieren"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
@@ -7618,16 +7563,14 @@ msgid "Step"
msgstr "Schritt"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Amount by which counter is incremented for each node"
-msgstr "Wert um welchen Zähler für jedes Node erhöht wird"
+msgstr "Wert um welchen der Zähler für jedes Node erhöht wird"
#: editor/rename_dialog.cpp
msgid "Padding"
msgstr "Versatz"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid ""
"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
@@ -7778,6 +7721,8 @@ msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
msgstr ""
+"Wenn „Editierbare Instanz“ deaktiviert wird, werden alle Eigenschaften "
+"dieses Nodes wieder in ihren Ausgangszustand zurückgesetzt."
#: editor/scene_tree_dock.cpp
msgid "Editable Children"
@@ -7852,9 +7797,8 @@ msgid "Clear Inheritance"
msgstr "Leere Vererbung"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open documentation"
-msgstr "Öffne Godot-Referenzdokumentation"
+msgstr "Dokumentation öffnen"
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
@@ -7869,9 +7813,8 @@ msgid "Change Type"
msgstr "Typ ändern"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
-msgstr "Skript öffnen"
+msgstr "Skript erweitern"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -8035,9 +7978,8 @@ msgid "Path is empty"
msgstr "Pfad ist leer"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty"
-msgstr "Sprite ist leer!"
+msgstr "Dateiname ist leer"
#: editor/script_create_dialog.cpp
msgid "Path is not local"
@@ -8128,9 +8070,8 @@ msgid "Bytes:"
msgstr "Bytes:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Stack Trace"
-msgstr "Aufrufsverlauf"
+msgstr "Stacktrace"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8580,7 +8521,7 @@ msgstr "Ende des inneren Exception-Stack-Traces"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Bake NavMesh"
-msgstr ""
+msgstr "NavMesh backen"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8969,12 +8910,11 @@ msgstr "VisualScript suchen"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "%s abrufen"
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Set %s"
-msgstr "Setzen "
+msgstr "%s setzen"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9075,6 +9015,8 @@ msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"CPUParticles2D-Animationen benötigen ein CanvasItemMaterial mit der "
+"Eigenschaft „Particles Animation“ aktiviert."
#: scene/2d/light_2d.cpp
msgid ""
@@ -9134,6 +9076,8 @@ msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"Particles2D-Animationen benötigen ein CanvasItemMaterial mit der Eigenschaft "
+"„Particles Animation“ aktiviert."
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
@@ -9284,15 +9228,16 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
-msgstr ""
-"Nichts ist sichtbar da keine Meshe den Zeichendurchläufen zugewiesen wurden."
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Nichts ist sichtbar da kein Mesh zugewiesen wurden."
#: scene/3d/cpu_particles.cpp
msgid ""
"CPUParticles animation requires the usage of a SpatialMaterial with "
"\"Billboard Particles\" enabled."
msgstr ""
+"CPUParticles-Animationen benötigen ein SpatialMaterial mit der Eigenschaft "
+"„Billboard Particles“ aktiviert."
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
@@ -9323,24 +9268,24 @@ msgid ""
"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
"Particles\" enabled."
msgstr ""
+"Particles-Animationen benötigen ein SpatialMaterial mit der Eigenschaft "
+"„Billboard Particles“ aktiviert."
#: scene/3d/path.cpp
-#, fuzzy
msgid "PathFollow only works when set as a child of a Path node."
msgstr ""
-"PathFollow2D funktioniert nur, wenn es als Unterobjekt eines Path2D-Nodes "
+"PathFollow funktioniert nur, wenn es als Unterobjekt eines Path-Nodes "
"gesetzt wird."
#: scene/3d/path.cpp
-#, fuzzy
msgid "OrientedPathFollow only works when set as a child of a Path node."
msgstr ""
-"PathFollow2D funktioniert nur, wenn es als Unterobjekt eines Path2D-Nodes "
-"gesetzt wird."
+"OrientedPathFollow funktioniert nur, wenn es als Unterobjekt eines Path-"
+"Nodes gesetzt wird."
#: scene/3d/path.cpp
msgid "OrientedPathFollow requires up vectors enabled in its parent Path."
-msgstr ""
+msgstr "OrientedPathFollow benötigt im Elternpfad aktivierte Aufwärtsvektoren."
#: scene/3d/physics_body.cpp
msgid ""
@@ -9382,7 +9327,6 @@ msgid "This body will be ignored until you set a mesh"
msgstr "Diese Körper wird ignoriert werden bis ein Mesh gesetzt wurde"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
@@ -9479,7 +9423,7 @@ msgstr ""
#: scene/gui/range.cpp
msgid "If exp_edit is true min_value must be > 0."
-msgstr ""
+msgstr "Wenn exp_edit true ist muss min_value größer als null sein."
#: scene/gui/scroll_container.cpp
msgid ""
@@ -9558,6 +9502,9 @@ msgstr "Zuweisung an Uniform."
msgid "Varyings can only be assigned in vertex function."
msgstr "Varyings können nur in Vertex-Funktion zugewiesen werden."
+#~ msgid "Zoom:"
+#~ msgstr "Vergrößerung:"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "Sollen wirklich alle Verbindungen entfernt werden von „"
@@ -10280,9 +10227,6 @@ msgstr "Varyings können nur in Vertex-Funktion zugewiesen werden."
#~ msgid "Source Font:"
#~ msgstr "Quellschriftart:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Quellschriftgröße:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Ziel-Ressource:"
diff --git a/editor/translations/de_CH.po b/editor/translations/de_CH.po
index 66085ed6b8..4ec0459cf0 100644
--- a/editor/translations/de_CH.po
+++ b/editor/translations/de_CH.po
@@ -549,7 +549,7 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
#: editor/code_editor.cpp
@@ -1696,6 +1696,12 @@ msgstr "Ohne eine Szene kann das nicht funktionieren."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2102,7 +2108,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -9147,7 +9153,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
diff --git a/editor/translations/editor.pot b/editor/translations/editor.pot
index 7f7d1391a1..beba25ff56 100644
--- a/editor/translations/editor.pot
+++ b/editor/translations/editor.pot
@@ -528,7 +528,7 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
#: editor/code_editor.cpp
@@ -1643,6 +1643,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2039,7 +2045,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -8839,7 +8845,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
diff --git a/editor/translations/el.po b/editor/translations/el.po
index 3f04d1ce6a..1eec84e7e5 100644
--- a/editor/translations/el.po
+++ b/editor/translations/el.po
@@ -546,8 +546,9 @@ msgid "Warnings:"
msgstr "ΠÏοειδοποιήσεις:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "Μεγέθυνση:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "Μέγεθος πηγαίας γÏαμματοσειÏάς:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1709,6 +1710,12 @@ msgstr "Αυτή η λειτουÏγία δεν μποÏεί να γίνει χÏ
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2161,7 +2168,7 @@ msgid "Undo"
msgstr "ΑναίÏεση"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "ΑκÏÏωση αναίÏεσης"
@@ -9332,7 +9339,7 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
"Τίποτα δεν είναι οÏατό, επειδή δεν έχουν οÏιστεί πεÏάσματα για τα πλέγματα."
@@ -9603,6 +9610,9 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#~ msgid "Zoom:"
+#~ msgstr "Μεγέθυνση:"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr ""
#~ "Είστε σίγουÏοι πως θέλετε να αφαιÏέσετε όλες τις συνδέσεις απο το \""
@@ -10320,9 +10330,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "Πηγαία γÏαμματοσειÏά:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Μέγεθος πηγαίας γÏαμματοσειÏάς:"
-
#~ msgid "Dest Resource:"
#~ msgstr "ΠόÏος Ï€ÏοοÏισμοÏ:"
diff --git a/editor/translations/es.po b/editor/translations/es.po
index 6c1b5908cd..012cff890c 100644
--- a/editor/translations/es.po
+++ b/editor/translations/es.po
@@ -33,12 +33,13 @@
# Franklin David Macias Avellan <franklin.macias864@gmail.com>, 2018.
# Dianiel García <jdangarr@gmail.com>, 2018.
# ayahuasca1979 <ayahuasca1979@gmail.com>, 2018.
+# Elena G <elena.guzbla@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-09-14 23:25+0000\n"
-"Last-Translator: Javier Ocampos <xavier.ocampos@gmail.com>\n"
+"PO-Revision-Date: 2018-12-04 22:15+0000\n"
+"Last-Translator: Elena G <elena.guzbla@gmail.com>\n"
"Language-Team: Spanish <https://hosted.weblate.org/projects/godot-engine/"
"godot/es/>\n"
"Language: es\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 3.2-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -580,8 +581,9 @@ msgid "Warnings:"
msgstr "Advertencias:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "Zoom:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "Tamaño de la tipografía elegida:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1745,6 +1747,12 @@ msgstr "Esta operación no puede realizarse sin una escena raíz."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -1753,7 +1761,7 @@ msgstr ""
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "¡No se puede sobreescribir una escena que está abierta!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -2194,7 +2202,7 @@ msgid "Undo"
msgstr "Deshacer"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Rehacer"
@@ -4553,8 +4561,9 @@ msgid "Show Viewport"
msgstr "Ver viewport"
#: editor/plugins/canvas_item_editor_plugin.cpp
+#, fuzzy
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "Mostrar iconos de grupo y bloqueo"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -5948,8 +5957,9 @@ msgid "Pitch"
msgstr "Altura"
#: editor/plugins/spatial_editor_plugin.cpp
+#, fuzzy
msgid "Yaw"
-msgstr ""
+msgstr "Girar desde eje vertical"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
@@ -6685,11 +6695,11 @@ msgstr "Mover a la derecha"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip horizontally"
-msgstr ""
+msgstr "Voltear horizontalmente"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip vertically"
-msgstr ""
+msgstr "Voltear verticalmente"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
@@ -8965,12 +8975,11 @@ msgstr "Buscar en VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "Obtener %s"
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Set %s"
-msgstr "Establecer "
+msgstr "Establecer %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9070,6 +9079,8 @@ msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"La animación CPUParticles2D requiere el uso de un CanvasItemMaterial con "
+"\"Particles Animation\" activado."
#: scene/2d/light_2d.cpp
msgid ""
@@ -9127,6 +9138,8 @@ msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"La animación Particles2D requiere el uso de un CanvasItemMaterial con "
+"\"Particles Animation\" activado."
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
@@ -9273,7 +9286,7 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
"Nada es visible porque las mallas no se han asignado a los pases de dibujo."
@@ -9282,6 +9295,8 @@ msgid ""
"CPUParticles animation requires the usage of a SpatialMaterial with "
"\"Billboard Particles\" enabled."
msgstr ""
+"La animación CPUParticles requiere el uso de un SpatialMaterial con "
+"\"Billboard Particles\" activado."
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
@@ -9312,6 +9327,8 @@ msgid ""
"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
"Particles\" enabled."
msgstr ""
+"La animación de partículas requiere el uso de un SpatialMaterial con "
+"\"Billboard Particles\" activado."
#: scene/3d/path.cpp
#, fuzzy
@@ -9461,7 +9478,7 @@ msgstr ""
#: scene/gui/range.cpp
msgid "If exp_edit is true min_value must be > 0."
-msgstr ""
+msgstr "Si exp_edit es `true` min_value debe ser > 0."
#: scene/gui/scroll_container.cpp
msgid ""
@@ -9537,6 +9554,9 @@ msgstr "Asignación a uniform."
msgid "Varyings can only be assigned in vertex function."
msgstr "Solo se pueden asignar variaciones en funciones de vértice."
+#~ msgid "Zoom:"
+#~ msgstr "Zoom:"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "¿Estás seguro/a que quieres quitar todas las conexiones de el/la \""
@@ -10271,9 +10291,6 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice."
#~ msgid "Source Font:"
#~ msgstr "Tipografía elegida:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Tamaño de la tipografía elegida:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Recurso de destino:"
diff --git a/editor/translations/es_AR.po b/editor/translations/es_AR.po
index 133c013958..f9196dbc6d 100644
--- a/editor/translations/es_AR.po
+++ b/editor/translations/es_AR.po
@@ -13,7 +13,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-11-21 19:08+0000\n"
+"PO-Revision-Date: 2018-12-04 22:15+0000\n"
"Last-Translator: Lisandro Lorea <lisandrolorea@gmail.com>\n"
"Language-Team: Spanish (Argentina) <https://hosted.weblate.org/projects/"
"godot-engine/godot/es_AR/>\n"
@@ -22,7 +22,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 3.3-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -407,12 +407,10 @@ msgid "Delete Selection"
msgstr "Eliminar Selección"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
msgstr "Ir a Paso Próximo"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
msgstr "Ir a Paso Previo"
@@ -553,8 +551,9 @@ msgid "Warnings:"
msgstr "Advertencias:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "Zoom:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "Tamaño de la Tipografía de Origen:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -667,9 +666,9 @@ msgid "Edit Connection: "
msgstr "Editar Conexión: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "¿Estás seguro/a que querés quitar todas las conexiones de esta señal?"
+msgstr ""
+"¿Estás seguro/a que querés quitar todas las conexiones de la señal \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -822,10 +821,8 @@ msgid "Error loading:"
msgstr "Error cargando:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr ""
-"La escena falló al cargar debido a las siguientes dependencias faltantes:"
+msgstr "Fallo la carga debido a dependencias faltantes:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1311,24 +1308,21 @@ msgid "File Exists, Overwrite?"
msgstr "El Archivo Existe, Sobreescribir?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
-msgstr "Seleccionar esta Carpeta"
+msgstr "Seleccionar Esta Carpeta"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Copiar Ruta"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
msgstr "Abrir en el Explorador de Archivos"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
-msgstr "Mostrar en Gestor de Archivos"
+msgstr "Mostrar en Explorador de Archivos"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1471,19 +1465,16 @@ msgid "Methods"
msgstr "Métodos"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Methods:"
-msgstr "Métodos"
+msgstr "Métodos:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "Propiedades"
+msgstr "Propiedades de Tema"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties:"
-msgstr "Propiedades:"
+msgstr "Propiedades de Tema:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1510,14 +1501,12 @@ msgid "Constants:"
msgstr "Constantes:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description"
-msgstr "Descripción"
+msgstr "Descripción de Clase"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description:"
-msgstr "Descripción:"
+msgstr "Descripción de Clase:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1534,14 +1523,12 @@ msgstr ""
"url][/color]."
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "Descripción de Propiedad:"
+msgstr "Descripción de Propiedades"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions:"
-msgstr "Descripción de Propiedad:"
+msgstr "Descripción de Propiedades:"
#: editor/editor_help.cpp
msgid ""
@@ -1552,12 +1539,10 @@ msgstr ""
"[color=$color][url=$url]contribuyendo una[/url][/color]!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "Descripción de Métodos:"
+msgstr "Descripción de Método"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions:"
msgstr "Descripción de Métodos:"
@@ -1575,49 +1560,40 @@ msgid "Search Help"
msgstr "Buscar en la Ayuda"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "Mostrar Normal"
+msgstr "Mostrar Todo"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Classes Only"
-msgstr "Clases"
+msgstr "Solo Clases"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "Métodos"
+msgstr "Solo Métodos"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "Señales"
+msgstr "Solo Señales"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "Constantes"
+msgstr "Solo Constantes"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "Propiedades"
+msgstr "Solo Propiedades"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "Propiedades"
+msgstr "Solo Propiedades de Tema"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Member Type"
-msgstr "Miembros"
+msgstr "Tipo de Miembro"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "Clase:"
+msgstr "Clase"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -1717,6 +1693,12 @@ msgstr "Esta operación no puede hacerse sin una raíz de árbol."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -1725,7 +1707,7 @@ msgstr ""
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "No se puede sobrescribir una escena que todavía esta abierta!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -1988,13 +1970,12 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "No se pudo cargar el script de addon desde la ruta: '%s'."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
-"No se pudo cargar el script de addon desde la ruta: El script '%s' no está "
-"en modo tool."
+"No se pudo cargar el script de addon desde la ruta: '%s' Parece haber un "
+"error en el código. Por favor, revisá la sintaxis."
#: editor/editor_node.cpp
msgid ""
@@ -2050,7 +2031,6 @@ msgstr "Por Defecto"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
msgstr "Mostrar en Sistema de Archivos"
@@ -2135,9 +2115,8 @@ msgid "Save Scene"
msgstr "Guardar Escena"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
-msgstr "Guardar todas las Escenas"
+msgstr "Guardar Todas las Escenas"
#: editor/editor_node.cpp
msgid "Close Scene"
@@ -2165,7 +2144,7 @@ msgid "Undo"
msgstr "Deshacer"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Rehacer"
@@ -2623,6 +2602,8 @@ msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"No se puede crear una ViewportTexture en recursos guardados como archivo.\n"
+"El recurso debe pertenecer a una escena."
#: editor/editor_properties.cpp
msgid ""
@@ -2631,6 +2612,10 @@ msgid ""
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"No se puede crear una ViewportTexture en este recurso porque no esta "
+"asignado como local a la escena.\n"
+"Por favor activá la propiedad 'local a escena' en él (y en todos los "
+"recursos que lo contienen hasta un nodo)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
@@ -2949,9 +2934,8 @@ msgstr ""
"de tipos de archivo!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "Favoritos:"
+msgstr "Favoritos"
#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
@@ -3037,14 +3021,12 @@ msgid "Instance"
msgstr "Instancia"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to favorites"
-msgstr "Favoritos:"
+msgstr "Agregar a favoritos"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from favorites"
-msgstr "Quitar del Grupo"
+msgstr "Quitar de favoritos"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3075,14 +3057,12 @@ msgid "New Resource..."
msgstr "Nuevo Recurso..."
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Expand All"
-msgstr "Expandir todos"
+msgstr "Expandir Todos"
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
-msgstr "Colapsar todos"
+msgstr "Colapsar Todos"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3104,9 +3084,8 @@ msgid "Re-Scan Filesystem"
msgstr "Reexaminar Sistema de Archivos"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle split mode"
-msgstr "Act/Desact. Modo"
+msgstr "Act/Desact. Modo Partido"
#: editor/filesystem_dock.cpp
msgid "Search files"
@@ -3142,24 +3121,20 @@ msgid "Create Script"
msgstr "Crear Script"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find in Files"
-msgstr "Encontrar en archivos"
+msgstr "Buscar en archivos"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "Encontrar: "
+msgstr "Buscar:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "Carpeta: "
+msgstr "Carpeta:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "Filtros"
+msgstr "Filtros:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3336,14 +3311,12 @@ msgid "Failed to load resource."
msgstr "Fallo al cargar recurso."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
-msgstr "Expandir todas las propiedades"
+msgstr "Expandir Todas las Propiedades"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
-msgstr "Colapsar todas las propiedades"
+msgstr "Colapsar Todas las Propiedades"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -4299,9 +4272,8 @@ msgid "Resize CanvasItem"
msgstr "Redimensionar CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale CanvasItem"
-msgstr "Rotar CanvasItem"
+msgstr "Escalar CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
@@ -4366,9 +4338,8 @@ msgid "Rotate Mode"
msgstr "Modo Rotar"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Mode"
-msgstr "Modo de Escalado (R)"
+msgstr "Modo de Escalado"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4467,9 +4438,8 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Restaurar la habilidad de seleccionar los hijos de un objeto."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton Options"
-msgstr "Esqueleto"
+msgstr "Opciones de Esqueleto"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
@@ -4523,7 +4493,7 @@ msgstr "Mostrar Viewport"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "Mostrar Grupo Y Bloquear Iconos"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -4965,9 +4935,8 @@ msgid "Create Navigation Polygon"
msgstr "Crear Polígono de Navegación"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Generating Visibility Rect"
-msgstr "Generar Rect. de Visibilidad"
+msgstr "Generando Rect. de Visibilidad"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -5446,9 +5415,8 @@ msgid "Error writing TextFile:"
msgstr "Error al escribir el TextFile:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error: could not load file."
-msgstr "Error no se pudo cargar el archivo."
+msgstr "Error: no se pudo cargar el archivo."
#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
@@ -5547,7 +5515,6 @@ msgid "Copy Script Path"
msgstr "Copiar Ruta de Script"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "History Previous"
msgstr "Previo en Historial"
@@ -5619,9 +5586,8 @@ msgid "Keep Debugger Open"
msgstr "Mantener el Depurador Abierto"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Debug with External Editor"
-msgstr "Depurar con editor externo"
+msgstr "Depurar con Editor Externo"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
@@ -5664,9 +5630,8 @@ msgid "Debugger"
msgstr "Depurador"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
-msgstr "Resultados de la búsqueda"
+msgstr "Resultados de la Búsqueda"
#: editor/plugins/script_text_editor.cpp
msgid "Line"
@@ -5677,9 +5642,8 @@ msgid "(ignore)"
msgstr "(ignorar)"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "Ir a Función..."
+msgstr "Ir a Función"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -5768,14 +5732,12 @@ msgid "Trim Trailing Whitespace"
msgstr "Eliminar Espacios Sobrantes al Final"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Spaces"
msgstr "Convertir Indentación En Espacios"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Tabs"
-msgstr "Convertir Indentación En Tabs"
+msgstr "Convertir Indentación En Tabulaciones"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5791,31 +5753,26 @@ msgid "Remove All Breakpoints"
msgstr "Quitar Todos los Breakpoints"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Breakpoint"
-msgstr "Ir a Próximo Breakpoint"
+msgstr "Ir al Breakpoint Siguiente"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Breakpoint"
-msgstr "Ir a Anterior Breakpoint"
+msgstr "Ir al Breakpoint Anterior"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Encontrar Anterior"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find in Files..."
-msgstr "Encontrar en archivos..."
+msgstr "Buscar en Archivos..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
msgstr "Ir a Función..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
msgstr "Ir a Línea..."
@@ -5913,7 +5870,7 @@ msgstr "Altura"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Yaw"
-msgstr ""
+msgstr "Yaw"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
@@ -6080,9 +6037,8 @@ msgid "Freelook Speed Modifier"
msgstr "Modificador de Velocidad de Vista Libre"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View Rotation Locked"
-msgstr "Trabar Rotación de Vista"
+msgstr "Rotación de Vista Trabada"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
@@ -6584,9 +6540,8 @@ msgid "Fix Invalid Tiles"
msgstr "Corregir Tiles Inválidos"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Cut Selection"
-msgstr "Centrar Selección"
+msgstr "Cortar Selección"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6633,32 +6588,28 @@ msgid "Pick Tile"
msgstr "Elegir Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "Mover Selección"
+msgstr "Copiar Selección"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate left"
-msgstr "Modo Rotar"
+msgstr "Rotar a la izquierda"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate right"
-msgstr "Mover a la Derecha"
+msgstr "Rotar a la derecha"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip horizontally"
-msgstr ""
+msgstr "Espejar horizontalmente"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip vertically"
-msgstr ""
+msgstr "Espejar verticalmente"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear transform"
-msgstr "Transform"
+msgstr "Reestablecer transform"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Add Texture(s) to TileSet"
@@ -6689,7 +6640,6 @@ msgid "Display tile's names (hold Alt Key)"
msgstr "Mostrar nombres de tiles (mantener Tecla Alt)"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected texture and ALL TILES which use it?"
msgstr "¿Quitar Textura Seleccionada y TODOS LOS TILES que la usen?"
@@ -6706,9 +6656,8 @@ msgid "Merge from scene?"
msgstr "¿Mergear desde escena?"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "%s file(s) were not added because was already on the list."
-msgstr " archivo(s) no fueron agregados porque ya estaban en la lista."
+msgstr "%s archivo(s) no fueron agregados porque ya estaban en la lista."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -6797,14 +6746,12 @@ msgstr ""
"corruptas:"
#: editor/project_export.cpp
-#, fuzzy
msgid "Release"
-msgstr "recién soltado"
+msgstr "Release"
#: editor/project_export.cpp
-#, fuzzy
msgid "Exporting All"
-msgstr "Exportando para %s"
+msgstr "Exportar Todo"
#: editor/project_export.cpp
msgid "Presets"
@@ -6815,9 +6762,8 @@ msgid "Add..."
msgstr "Agregar..."
#: editor/project_export.cpp
-#, fuzzy
msgid "Export Path:"
-msgstr "Presets de Exportación:"
+msgstr "Ruta de Exportación:"
#: editor/project_export.cpp
msgid "Resources"
@@ -6882,14 +6828,12 @@ msgid "Export PCK/Zip"
msgstr "Exportar PCK/Zip"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "Modo de Exportación:"
+msgstr "¿Modo de Exportación?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "Exportar"
+msgstr "Exportar Todos"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
@@ -7580,7 +7524,6 @@ msgid "Step"
msgstr "Paso"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Amount by which counter is incremented for each node"
msgstr "Cantidad en la que se incrementa el contador por cada nodo"
@@ -7589,7 +7532,6 @@ msgid "Padding"
msgstr "Relleno"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid ""
"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
@@ -7738,6 +7680,8 @@ msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
msgstr ""
+"Desactivar \"editable_instance\" causara que todas las propiedades del nodo "
+"vuelvan a sus valores por defecto."
#: editor/scene_tree_dock.cpp
msgid "Editable Children"
@@ -7813,9 +7757,8 @@ msgid "Clear Inheritance"
msgstr "Limpiar Herencia"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open documentation"
-msgstr "Abrir la documentación online de Godot"
+msgstr "Abrir documentación"
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
@@ -7830,9 +7773,8 @@ msgid "Change Type"
msgstr "Cambiar Tipo"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
-msgstr "Abrir Script"
+msgstr "Extender Script"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -7996,9 +7938,8 @@ msgid "Path is empty"
msgstr "La ruta está vacía"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty"
-msgstr "El sprite esta vacío!"
+msgstr "Nombre de archivo vacio"
#: editor/script_create_dialog.cpp
msgid "Path is not local"
@@ -8089,9 +8030,8 @@ msgid "Bytes:"
msgstr "Bytes:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Stack Trace"
-msgstr "Frames del Stack"
+msgstr "Stack Trace"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8542,7 +8482,7 @@ msgstr "Fin del stack trace de excepción interna"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Bake NavMesh"
-msgstr ""
+msgstr "Hacer Bake de NavMesh"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8929,12 +8869,11 @@ msgstr "Buscar en VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "Obtener %s"
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Set %s"
-msgstr "Set "
+msgstr "Asignar %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9033,6 +8972,8 @@ msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"Animar CPUParticles2D requiere el uso de un CanvasItemMaterial con "
+"\"Particles Animation\" activado."
#: scene/2d/light_2d.cpp
msgid ""
@@ -9088,6 +9029,8 @@ msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"Animar de Particles2D requiere el uso de un CanvasItemMaterial con "
+"\"Particles Animation\" activado."
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
@@ -9233,14 +9176,16 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
-msgstr "Nada visible ya que no se asigno pasadas de dibujado a los meshes."
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Nada visible ya que no se asignó ningún mesh."
#: scene/3d/cpu_particles.cpp
msgid ""
"CPUParticles animation requires the usage of a SpatialMaterial with "
"\"Billboard Particles\" enabled."
msgstr ""
+"Animar CPUParticles requiere el uso de un SpatialMaterial con \"Billboard "
+"Particles\" activado."
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
@@ -9269,22 +9214,25 @@ msgid ""
"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
"Particles\" enabled."
msgstr ""
+"Animar Particles requiere el uso de un SpatialMaterial con \"Billboard "
+"Particles\" activado."
#: scene/3d/path.cpp
-#, fuzzy
msgid "PathFollow only works when set as a child of a Path node."
msgstr ""
-"PathFollow2D sólo funciona cuando está seteado como hijo de un nodo Path2D."
+"PathFollow solo funciona cuando está asignado como hijo de un nodo Path."
#: scene/3d/path.cpp
-#, fuzzy
msgid "OrientedPathFollow only works when set as a child of a Path node."
msgstr ""
-"PathFollow2D sólo funciona cuando está seteado como hijo de un nodo Path2D."
+"OrientedPathFollow solo funciona cuando esta asignado como hijo de un nodo "
+"Path."
#: scene/3d/path.cpp
msgid "OrientedPathFollow requires up vectors enabled in its parent Path."
msgstr ""
+"OrientedPathFollow requiere que los vectores up estén activos en su Path "
+"padre."
#: scene/3d/physics_body.cpp
msgid ""
@@ -9326,15 +9274,14 @@ msgid "This body will be ignored until you set a mesh"
msgstr "Este cuerpo sera ignorado hasta que le asignes un mesh"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Los cambios de tamaño a SoftBody serán sobre escritos por el motor de física "
-"al ejecutar.\n"
-"Cambiá el tamaño de los collision shapes hijos."
+"Los cambios de tamaño a un SoftBody serán sobrescritos por el motor de "
+"física al ejecutar.\n"
+"En su lugar, cambiá el tamaño de los collision shapes hijos."
#: scene/3d/sprite_3d.cpp
msgid ""
@@ -9418,7 +9365,7 @@ msgstr ""
#: scene/gui/range.cpp
msgid "If exp_edit is true min_value must be > 0."
-msgstr ""
+msgstr "Si exp_edit es verdadero min_value debe ser > 0."
#: scene/gui/scroll_container.cpp
msgid ""
@@ -9494,6 +9441,9 @@ msgstr "Asignación a uniform."
msgid "Varyings can only be assigned in vertex function."
msgstr "Solo se pueden asignar variaciones en funciones de vértice."
+#~ msgid "Zoom:"
+#~ msgstr "Zoom:"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "¿Estás seguro/a que querés quitar todas las conexiones de el/la \""
@@ -10217,9 +10167,6 @@ msgstr "Solo se pueden asignar variaciones en funciones de vértice."
#~ msgid "Source Font:"
#~ msgstr "Tipografía de Origen:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Tamaño de la Tipografía de Origen:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Recurso de Dest:"
diff --git a/editor/translations/fa.po b/editor/translations/fa.po
index 4f908a5ad2..8b0fcd0b15 100644
--- a/editor/translations/fa.po
+++ b/editor/translations/fa.po
@@ -560,9 +560,8 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "بزرگنمایی بیشتر"
+msgid "Font Size:"
+msgstr ""
#: editor/code_editor.cpp
msgid "Line:"
@@ -1724,6 +1723,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2126,7 +2131,7 @@ msgid "Undo"
msgstr "خنثی کردن (Undo)"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -9252,7 +9257,7 @@ msgstr ""
"برای آن ایجاد کنید!"
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9501,6 +9506,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "بزرگنمایی بیشتر"
+
#~ msgid "Class List:"
#~ msgstr "Ùهرست کلاس:"
diff --git a/editor/translations/fi.po b/editor/translations/fi.po
index 40def6086b..8e3c605afb 100644
--- a/editor/translations/fi.po
+++ b/editor/translations/fi.po
@@ -12,7 +12,7 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-10-04 17:26+0000\n"
+"PO-Revision-Date: 2018-12-04 05:21+0000\n"
"Last-Translator: Tapani Niemi <tapani.niemi@kapsi.fi>\n"
"Language-Team: Finnish <https://hosted.weblate.org/projects/godot-engine/"
"godot/fi/>\n"
@@ -20,7 +20,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 3.2-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -545,8 +545,9 @@ msgid "Warnings:"
msgstr "Varoitukset:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "Lähennä:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "Etunäkymä"
#: editor/code_editor.cpp
msgid "Line:"
@@ -659,9 +660,8 @@ msgid "Edit Connection: "
msgstr "Muokkaa yhteyttä: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "Oletko varma, että haluat poistaa kaikki kytkennät tältä signaalilta?"
+msgstr "Oletko varma, että haluat poistaa kaikki kytkennät signaalilta \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -816,9 +816,8 @@ msgid "Error loading:"
msgstr "Virhe ladatessa:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr "Skenen lataaminen epäonnistui puuttuvan riippuvuuden takia:"
+msgstr "Lataaminen epäonnistui puuttuvien riippuvuuksien takia:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1709,6 +1708,12 @@ msgstr "Tätä toimintoa ei voi tehdä ilman että puun juuri on olemassa."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2141,7 +2146,7 @@ msgid "Undo"
msgstr "Peru"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Tee uudelleen"
@@ -9195,7 +9200,7 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
"Mitään ei näy, koska mesheille ei ole asetettu piirtopyyhkäisyjä (draw "
"passes)."
@@ -9458,6 +9463,9 @@ msgstr "Sijoitus uniformille."
msgid "Varyings can only be assigned in vertex function."
msgstr "Varying tyypin voi sijoittaa vain vertex-funktiossa."
+#~ msgid "Zoom:"
+#~ msgstr "Lähennä:"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "Oletko varma, että haluat poistaa kaikki yhteydet kohteesta \""
diff --git a/editor/translations/fr.po b/editor/translations/fr.po
index e62b20139a..4e2515081c 100644
--- a/editor/translations/fr.po
+++ b/editor/translations/fr.po
@@ -50,12 +50,14 @@
# Florent Wijanto <f_wijanto@hotmail.com>, 2018.
# Olivier gareau <olivier.gareau@protonmail.com>, 2018.
# Rémi Verschelde <akien@godotengine.org>, 2018.
+# Rémi Bintein <reminus5@hotmail.fr>, 2018.
+# Sylvain Corsini <sylvain.corsini@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-11-26 16:07+0000\n"
-"Last-Translator: Rémi Verschelde <akien@godotengine.org>\n"
+"PO-Revision-Date: 2018-11-29 13:23+0000\n"
+"Last-Translator: Sylvain Corsini <sylvain.corsini@gmail.com>\n"
"Language-Team: French <https://hosted.weblate.org/projects/godot-engine/"
"godot/fr/>\n"
"Language: fr\n"
@@ -452,12 +454,10 @@ msgid "Delete Selection"
msgstr "Supprimer la sélection"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
msgstr "Aller à l'étape suivante"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
msgstr "Aller à l'étape précédente"
@@ -598,8 +598,9 @@ msgid "Warnings:"
msgstr "Avertissements :"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "Agrandissement (%) :"
+#, fuzzy
+msgid "Font Size:"
+msgstr "Taille de la police source :"
#: editor/code_editor.cpp
msgid "Line:"
@@ -712,7 +713,6 @@ msgid "Edit Connection: "
msgstr "Modifier les connexions : "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
msgstr "Voulez-vous vraiment supprimer toutes les connexions de ce signal ?"
@@ -870,7 +870,6 @@ msgid "Error loading:"
msgstr "Erreur au chargement :"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
msgstr "La scène n'a pas pu être chargée à cause de dépendances manquantes :"
@@ -1358,7 +1357,6 @@ msgid "File Exists, Overwrite?"
msgstr "Le fichier existe, l'écraser ?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
msgstr "Sélectionner ce dossier"
@@ -1367,13 +1365,11 @@ msgid "Copy Path"
msgstr "Copier le chemin"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
msgstr "Ouvrir dans le gestionnaire de fichiers"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
msgstr "Montrer dans le gestionnaire de fichiers"
@@ -1518,19 +1514,16 @@ msgid "Methods"
msgstr "Méthodes :"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Methods:"
msgstr "Méthodes :"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "Propriétés"
+msgstr "Propriétés du thème"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties:"
-msgstr "Propriétés :"
+msgstr "Propriétés du thème :"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1557,14 +1550,12 @@ msgid "Constants:"
msgstr "Constantes :"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description"
-msgstr "Description"
+msgstr "Description de la classe"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description:"
-msgstr "Description :"
+msgstr "Description de la classe :"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1581,12 +1572,10 @@ msgstr ""
"demander un[/url][/color]."
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
msgstr "Description des propriétés :"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions:"
msgstr "Description des propriétés :"
@@ -1599,12 +1588,10 @@ msgstr ""
"[color=$color][url=$url]en créant[/url][/color] une !"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
msgstr "Description de la méthode :"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions:"
msgstr "Description de la méthode :"
@@ -1622,47 +1609,38 @@ msgid "Search Help"
msgstr "Chercher dans l'aide"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "Affichage normal"
+msgstr "Tout afficher"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Classes Only"
-msgstr "Classes"
+msgstr "Classes seulement"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "Méthodes :"
+msgstr "Méthodes seulement"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "Signaux"
+msgstr "Signaux seulement"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "Constantes"
+msgstr "Constantes seulement"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "Propriétés"
+msgstr "Propriétés seulement"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "Propriétés"
+msgstr "Propriétés du thème seulement"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Member Type"
-msgstr "Membres"
+msgstr "Type de membre"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
msgstr "Classe :"
@@ -1763,6 +1741,12 @@ msgstr "Cette opération ne peut être réalisée sans une arborescence racine."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -1771,7 +1755,7 @@ msgstr ""
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "Impossible de ré-écrire une scène encore ouverte !"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -2040,13 +2024,12 @@ msgstr ""
"Impossible de charger le script de l’extension depuis le chemin : '%s'."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
-"Impossible de charger le script de l’extension depuis le chemin : '%s' Le "
-"script n'est pas en mode outil."
+"Impossible de charger le script de l’extension depuis le chemin : '%s' Il "
+"semble y avoir une erreur dans le code, merci de vérifier la syntaxe."
#: editor/editor_node.cpp
msgid ""
@@ -2102,7 +2085,6 @@ msgstr "Par défaut"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
msgstr "Montrer dans le système de fichiers"
@@ -2187,7 +2169,6 @@ msgid "Save Scene"
msgstr "Enregistrer la scène"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
msgstr "Enregistrer toutes les scènes"
@@ -2217,7 +2198,7 @@ msgid "Undo"
msgstr "Annuler"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Refaire"
@@ -2676,6 +2657,9 @@ msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"Impossible de créer un ViewportTexture sur des ressources enregistrées comme "
+"fichier.\n"
+"La ressource a besoin d'appartenir à une scène."
#: editor/editor_properties.cpp
msgid ""
@@ -3002,7 +2986,6 @@ msgstr ""
"sera pas sauvé !"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
msgstr "Favoris :"
@@ -3091,14 +3074,12 @@ msgid "Instance"
msgstr "Instance"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to favorites"
-msgstr "Favoris :"
+msgstr "Ajouter aux favoris"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from favorites"
-msgstr "Supprimer du groupe"
+msgstr "Supprimer des favoris"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3129,12 +3110,10 @@ msgid "New Resource..."
msgstr "Nouvelle Ressource…"
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Expand All"
msgstr "Développer tout"
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
msgstr "Réduire tout"
@@ -3198,24 +3177,20 @@ msgid "Create Script"
msgstr "Créer un script"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find in Files"
msgstr "Trouver dans les fichiers"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "Trouver : "
+msgstr "Trouver :"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "Dossier : "
+msgstr "Dossier :"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "Filtres"
+msgstr "Filtres :"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3393,12 +3368,10 @@ msgid "Failed to load resource."
msgstr "Impossible de charger la ressource."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
msgstr "Développer toutes les propriétés"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
msgstr "Réduire toutes les propriétés"
@@ -4428,9 +4401,8 @@ msgid "Rotate Mode"
msgstr "Mode rotation"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Mode"
-msgstr "Mode de mise à l'échelle (R)"
+msgstr "Mode de mise à l'échelle"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4585,7 +4557,7 @@ msgstr "Montrer La fenêtre d'affichage"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "Montrer le groupe et verrouiller les icônes"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -5513,7 +5485,6 @@ msgid "Error writing TextFile:"
msgstr "Erreur lors de l'écriture du fichier texte :"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error: could not load file."
msgstr "Erreur de chargement de fichier."
@@ -5686,7 +5657,6 @@ msgid "Keep Debugger Open"
msgstr "Garder le débogueur ouvert"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Debug with External Editor"
msgstr "Déboguer avec un éditeur externe"
@@ -5731,7 +5701,6 @@ msgid "Debugger"
msgstr "Débogueur"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
msgstr "Résultats de recherche"
@@ -5744,9 +5713,8 @@ msgid "(ignore)"
msgstr "(ignorer)"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "Aller à la fonction…"
+msgstr "Aller à la fonction"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -5835,12 +5803,10 @@ msgid "Trim Trailing Whitespace"
msgstr "Supprimer les espaces de fin de ligne"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Spaces"
msgstr "Convertir indentations en espaces"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Tabs"
msgstr "Convertir les indentations en tabulations"
@@ -5858,12 +5824,10 @@ msgid "Remove All Breakpoints"
msgstr "Supprimer tous les points d'arrêt"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Breakpoint"
msgstr "Aller au point d'arrêt suivant"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Breakpoint"
msgstr "Aller au point d'arrêt précédent"
@@ -5872,17 +5836,14 @@ msgid "Find Previous"
msgstr "Trouver le précédent"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find in Files..."
msgstr "Trouver dans les fichiers..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
msgstr "Aller à la fonction…"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
msgstr "Aller à la ligne…"
@@ -6149,7 +6110,6 @@ msgid "Freelook Speed Modifier"
msgstr "Modificateur de vitesse de la vue libre"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View Rotation Locked"
msgstr "Verrouiller la rotation de la vue"
@@ -6655,9 +6615,8 @@ msgid "Fix Invalid Tiles"
msgstr "Résoudre les tuiles invalides"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Cut Selection"
-msgstr "Centrer sur la sélection"
+msgstr "Couper la sélection"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6704,27 +6663,24 @@ msgid "Pick Tile"
msgstr "Sélectionner une case"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "Déplacer la sélection"
+msgstr "Copier la sélection"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate left"
-msgstr "Mode rotation"
+msgstr "Rotation à gauche"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate right"
-msgstr "Aller à droite"
+msgstr "Rotation à droite"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip horizontally"
-msgstr ""
+msgstr "Retourner horizontalement"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip vertically"
-msgstr ""
+msgstr "Retourner verticalement"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
@@ -6869,12 +6825,11 @@ msgstr "Modèles d'exportation manquants ou corrompus pour cette plateforme :"
#: editor/project_export.cpp
#, fuzzy
msgid "Release"
-msgstr "vient d'être relâché"
+msgstr "Réalisation"
#: editor/project_export.cpp
-#, fuzzy
msgid "Exporting All"
-msgstr "Exportation pour %s"
+msgstr "Tout exporter"
#: editor/project_export.cpp
msgid "Presets"
@@ -6952,14 +6907,12 @@ msgid "Export PCK/Zip"
msgstr "Exporter le PCK/ZIP"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "Mode d'exportation :"
+msgstr "Mode Exportation?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "Exporter"
+msgstr "Tout exporter"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
@@ -7651,7 +7604,6 @@ msgid "Step"
msgstr "Pas"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Amount by which counter is incremented for each node"
msgstr "Valeur par laquelle le compteur est incrémenté pour chaque nœud"
@@ -7660,7 +7612,6 @@ msgid "Padding"
msgstr "Remplissage"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid ""
"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
@@ -7883,9 +7834,8 @@ msgid "Clear Inheritance"
msgstr "Effacer l'héritage"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open documentation"
-msgstr "Ouvrir la documentation Godot en ligne"
+msgstr "Ouvrir la documentation"
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
@@ -8066,9 +8016,8 @@ msgid "Path is empty"
msgstr "Le chemin est vide"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty"
-msgstr "Le sprite est vide !"
+msgstr "Le nom de fichier est vide"
#: editor/script_create_dialog.cpp
msgid "Path is not local"
@@ -9002,12 +8951,11 @@ msgstr "Rechercher VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "Obtenir %s"
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Set %s"
-msgstr "Définir "
+msgstr "Définir %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9101,10 +9049,13 @@ msgstr ""
"créer une ressource de forme !"
#: scene/2d/cpu_particles_2d.cpp
+#, fuzzy
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"L'animation CPUParticles2D a besoin de l'usage d'un CanvasItemMaterial avec "
+"\"Animation de Particules\" activé."
#: scene/2d/light_2d.cpp
msgid ""
@@ -9160,10 +9111,13 @@ msgstr ""
"comportement n'est donc imprimé."
#: scene/2d/particles_2d.cpp
+#, fuzzy
msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"L'animation Particles2D a besoin de l'usage d'un CanvasItemMaterial avec "
+"\"Animation de Particules\" activé."
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
@@ -9310,11 +9264,8 @@ msgstr ""
"de forme pour cette CollisionShape !"
#: scene/3d/cpu_particles.cpp
-#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
-msgstr ""
-"Rien n'est visible car les maillages n'ont pas été assignés au tirage des "
-"passes."
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Rien n'est visible car aucun maillage n'a été assigné."
#: scene/3d/cpu_particles.cpp
msgid ""
@@ -9505,7 +9456,7 @@ msgstr ""
#: scene/gui/range.cpp
msgid "If exp_edit is true min_value must be > 0."
-msgstr ""
+msgstr "Si exp_edit est vrai min_value doit être > 0."
#: scene/gui/scroll_container.cpp
msgid ""
@@ -9581,6 +9532,9 @@ msgstr "Affectation à l'uniforme."
msgid "Varyings can only be assigned in vertex function."
msgstr "Les variations ne peuvent être affectées que dans la fonction vertex."
+#~ msgid "Zoom:"
+#~ msgstr "Agrandissement (%) :"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "Voulez-vous vraiment supprimer toutes les connexions du ''"
@@ -10308,9 +10262,6 @@ msgstr "Les variations ne peuvent être affectées que dans la fonction vertex."
#~ msgid "Source Font:"
#~ msgstr "Police source :"
-#~ msgid "Source Font Size:"
-#~ msgstr "Taille de la police source :"
-
#~ msgid "Dest Resource:"
#~ msgstr "Ressource de destination :"
diff --git a/editor/translations/he.po b/editor/translations/he.po
index ed2657f46b..3d9418b4fd 100644
--- a/editor/translations/he.po
+++ b/editor/translations/he.po
@@ -564,8 +564,8 @@ msgstr "×זהרות"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "להתקרב"
+msgid "Font Size:"
+msgstr "מבט קדמי"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1706,6 +1706,12 @@ msgstr "×œ× × ×™×ª×Ÿ לבצע פעולה זו ×œ×œ× ×©×•×¨×© ×”×¢×¥."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2112,7 +2118,7 @@ msgid "Undo"
msgstr "ביטול"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "ביצוע חוזר"
@@ -9090,7 +9096,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9318,6 +9324,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "להתקרב"
+
#~ msgid "Class List:"
#~ msgstr "רשימת מחלקות:"
diff --git a/editor/translations/hi.po b/editor/translations/hi.po
index 92f64ab6d1..1188b26a7c 100644
--- a/editor/translations/hi.po
+++ b/editor/translations/hi.po
@@ -544,9 +544,8 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "बड़ा करो"
+msgid "Font Size:"
+msgstr ""
#: editor/code_editor.cpp
msgid "Line:"
@@ -1706,6 +1705,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2103,7 +2108,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -8955,7 +8960,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9182,6 +9187,10 @@ msgid "Varyings can only be assigned in vertex function."
msgstr ""
#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "बड़ा करो"
+
+#, fuzzy
#~ msgid "Match case"
#~ msgstr "à¤à¤• जैसा:"
diff --git a/editor/translations/hu.po b/editor/translations/hu.po
index 5524b9319d..7fb0a8b353 100644
--- a/editor/translations/hu.po
+++ b/editor/translations/hu.po
@@ -564,8 +564,8 @@ msgstr ""
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Nagyítás"
+msgid "Font Size:"
+msgstr "Körvonal Mérete:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1727,6 +1727,12 @@ msgstr "Ezt a műveletet nem lehet fagyökér nélkül végrehajtani."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2179,7 +2185,7 @@ msgid "Undo"
msgstr "Visszavonás"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Mégis"
@@ -9231,7 +9237,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9467,6 +9473,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Nagyítás"
+
#~ msgid "Class List:"
#~ msgstr "Osztálylista:"
diff --git a/editor/translations/id.po b/editor/translations/id.po
index 04d72d94d2..a63dd99bc3 100644
--- a/editor/translations/id.po
+++ b/editor/translations/id.po
@@ -572,8 +572,8 @@ msgstr ""
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Perbesar Pandangan"
+msgid "Font Size:"
+msgstr "Tampilan Depan."
#: editor/code_editor.cpp
msgid "Line:"
@@ -1740,6 +1740,12 @@ msgstr "Operasi ini tidak dapat diselesaikan tanpa root pohon."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2183,7 +2189,7 @@ msgid "Undo"
msgstr "Batal"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Ulangi"
@@ -9433,7 +9439,7 @@ msgstr ""
"ciptakan sebuah resource bentuk untuk itu!"
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9690,6 +9696,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Perbesar Pandangan"
+
#~ msgid "Class List:"
#~ msgstr "Daftar Class:"
diff --git a/editor/translations/is.po b/editor/translations/is.po
index 518e43ac10..0300245fc6 100644
--- a/editor/translations/is.po
+++ b/editor/translations/is.po
@@ -552,7 +552,7 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
#: editor/code_editor.cpp
@@ -1668,6 +1668,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2065,7 +2071,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -8879,7 +8885,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
diff --git a/editor/translations/it.po b/editor/translations/it.po
index 3a1f0a2dd2..6a293bb667 100644
--- a/editor/translations/it.po
+++ b/editor/translations/it.po
@@ -587,8 +587,8 @@ msgstr "Avvertimento"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Zoom(%):"
+msgid "Font Size:"
+msgstr "Dimensione Font sorgente:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1758,6 +1758,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2207,7 +2213,7 @@ msgid "Undo"
msgstr "Annulla"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Redo"
@@ -9525,7 +9531,7 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr "Nulla é visibile perché le mesh non sono state assegnate ai draw pass."
#: scene/3d/cpu_particles.cpp
@@ -9797,6 +9803,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Zoom(%):"
+
#~ msgid "Class List:"
#~ msgstr "Lista Classi:"
@@ -10528,9 +10538,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "Font Sorgente:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Dimensione Font sorgente:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Risorsa di destin. :"
diff --git a/editor/translations/ja.po b/editor/translations/ja.po
index e2db7c16d1..72ea5d8d14 100644
--- a/editor/translations/ja.po
+++ b/editor/translations/ja.po
@@ -18,18 +18,19 @@
# sugusan <sugusan.development@gmail.com>, 2018.
# Nathan Lovato <nathan.lovato.art@gmail.com>, 2018.
# nyanode <akaruooyagi@yahoo.co.jp>, 2018.
+# nitenook <admin@alterbaum.net>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-10-09 09:33+0000\n"
-"Last-Translator: nyanode <akaruooyagi@yahoo.co.jp>\n"
+"PO-Revision-Date: 2018-12-04 22:14+0000\n"
+"Last-Translator: nitenook <admin@alterbaum.net>\n"
"Language-Team: Japanese <https://hosted.weblate.org/projects/godot-engine/"
"godot/ja/>\n"
"Language: ja\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8-bit\n"
"Plural-Forms: nplurals=1; plural=0;\n"
-"X-Generator: Weblate 3.2.1\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -52,11 +53,11 @@ msgstr "インスタンス㌠null ã®ãŸã‚ã€self ã¯ä½¿ç”¨ã§ãã¾ã›ã‚“"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
-msgstr "æ¼”ç®—å­ ï¼…s 〠%s 〠%s ã«å¯¾ã™ã‚‹å€¤ãŒç„¡åŠ¹ã§ã™ã€‚"
+msgstr "æ¼”ç®—å­ %s 〠%s 〠%s ã«å¯¾ã™ã‚‹å€¤ãŒç„¡åŠ¹ã§ã™ã€‚"
#: core/math/expression.cpp
msgid "Invalid index of type %s for base type %s"
-msgstr "基本型 ï¼…s ã®åž‹ ï¼…s ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒç„¡åŠ¹ã§ã™"
+msgstr "基本型 %s ã®åž‹ %s ã®ã‚¤ãƒ³ãƒ‡ãƒƒã‚¯ã‚¹ãŒç„¡åŠ¹ã§ã™"
#: core/math/expression.cpp
msgid "Invalid named index '%s' for base type %s"
@@ -68,7 +69,7 @@ msgstr "'%s' ã®å¼•æ•°ã¯ç„¡åŠ¹ã§ã™"
#: core/math/expression.cpp
msgid "On call to '%s':"
-msgstr "'ï¼…s' ã¸ã®å‘¼ã³å‡ºã—:"
+msgstr "'%s' ã¸ã®å‘¼ã³å‡ºã—:"
#: editor/animation_bezier_editor.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -194,7 +195,7 @@ msgstr "ã“ã®ãƒˆãƒ©ãƒƒã‚¯ã‚’除去ã™ã‚‹ã€‚"
#: editor/animation_track_editor.cpp
msgid "Time (s): "
-msgstr "時間: "
+msgstr "時間 (秒): "
#: editor/animation_track_editor.cpp
msgid "Continuous"
@@ -559,8 +560,9 @@ msgid "Warnings:"
msgstr "警告:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "ズーム:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "ソース フォントサイズ:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -579,8 +581,8 @@ msgid ""
"Target method not found! Specify a valid method or attach a script to target "
"Node."
msgstr ""
-"対象メソッドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ï¼ã€€æœ‰åŠ¹ãªãƒ¡ã‚½ãƒƒãƒ‰ã‚’指定ã™ã‚‹ã‹ã€å¯¾è±¡ãƒŽãƒ¼ãƒ‰ã«ã‚¹ã‚¯"
-"リプトを添付ã—ã¦ãã ã•ã„。"
+"対象メソッドãŒè¦‹ã¤ã‹ã‚Šã¾ã›ã‚“ï¼æœ‰åŠ¹ãªãƒ¡ã‚½ãƒƒãƒ‰ã‚’指定ã™ã‚‹ã‹ã€å¯¾è±¡ãƒŽãƒ¼ãƒ‰ã«ã‚¹ã‚¯ãƒª"
+"プトを添付ã—ã¦ãã ã•ã„。"
#: editor/connections_dialog.cpp
msgid "Connect To Node:"
@@ -649,7 +651,7 @@ msgstr "'%s' ã‚’ '%s' ã«æŽ¥ç¶š"
#: editor/connections_dialog.cpp
msgid "Disconnect '%s' from '%s'"
-msgstr "'%s' ã‹ã‚‰ '%s' を切断"
+msgstr "'%s' ã‚’ '%s' ã‹ã‚‰åˆ‡æ–­"
#: editor/connections_dialog.cpp
msgid "Disconnect all from signal: '%s'"
@@ -835,7 +837,7 @@ msgstr "ä¾å­˜é–¢ä¿‚ãŒç¢ºèªã§ããšã€ã‚·ãƒ¼ãƒ³ã‚’読込ã‚ã¾ã›ã‚“:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
-msgstr "ã¨ã‚‚ã‹ãé–‹ã"
+msgstr "ã¨ã«ã‹ãé–‹ã"
#: editor/dependency_editor.cpp
msgid "Which action should be taken?"
@@ -1117,7 +1119,7 @@ msgstr "オーディオãƒã‚¹ã®ãƒ¬ã‚¤ã‚¢ã‚¦ãƒˆã‚’é–‹ã"
#: editor/editor_audio_buses.cpp
msgid "There is no 'res://default_bus_layout.tres' file."
-msgstr "'res://default_bus_layout.tres' ファイルãŒã‚ã‚Šã¾ã›ã‚“ï¼"
+msgstr "'res://default_bus_layout.tres' ファイルãŒã‚ã‚Šã¾ã›ã‚“。"
#: editor/editor_audio_buses.cpp
msgid "Invalid file, not an audio bus layout."
@@ -1310,9 +1312,8 @@ msgid "File Exists, Overwrite?"
msgstr "ファイルãŒæ—¢ã«å­˜åœ¨ã—ã¾ã™ã€‚上書ãã—ã¾ã™ã‹ï¼Ÿ"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
-msgstr "ã™ã¹ã¦é¸æŠž"
+msgstr "ã“ã®ãƒ•ã‚©ãƒ«ãƒ€ãƒ¼ã‚’é¸æŠž"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
@@ -1510,14 +1511,12 @@ msgid "Constants:"
msgstr "定数:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description"
-msgstr "説明"
+msgstr "クラスã®èª¬æ˜Ž"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description:"
-msgstr "説明:"
+msgstr "クラスã®èª¬æ˜Žï¼š"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1651,7 +1650,7 @@ msgstr "出力をクリア"
#: editor/editor_node.cpp
msgid "Project export failed with error code %d."
-msgstr "エラーコード %d ã«ã‚ˆã‚Šã€ãƒ—ロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆã«å¤±æ•—ã—ã¾ã—ãŸã€‚"
+msgstr "プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆãŒã‚¨ãƒ©ãƒ¼ã‚³ãƒ¼ãƒ‰ %d ã§å¤±æ•—ã—ã¾ã—ãŸã€‚"
#: editor/editor_node.cpp editor/plugins/animation_player_editor_plugin.cpp
msgid "Error saving resource!"
@@ -1681,8 +1680,7 @@ msgstr "ä¿å­˜ä¸­ã«ã‚¨ãƒ©ãƒ¼ãŒç™ºç”Ÿã—ã¾ã—ãŸã€‚"
#: editor/editor_node.cpp editor/plugins/script_editor_plugin.cpp
msgid "Can't open '%s'. The file could have been moved or deleted."
msgstr ""
-"'ï¼…s' ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“。ファイルãŒç§»å‹•ã¾ãŸã¯å‰Šé™¤ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾"
-"ã™ã€‚"
+"'%s' ã‚’é–‹ãã“ã¨ãŒã§ãã¾ã›ã‚“。ファイルãŒç§»å‹•ã¾ãŸã¯å‰Šé™¤ã•ã‚ŒãŸå¯èƒ½æ€§ãŒã‚ã‚Šã¾ã™ã€‚"
#: editor/editor_node.cpp
msgid "Error while parsing '%s'."
@@ -1718,6 +1716,12 @@ msgstr "ã“ã®æ“作ã¯ã€ãƒ„リー㮠root ãªã—ã§ã¯å®Ÿè¡Œã§ãã¾ã›ã‚“。
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -1726,7 +1730,7 @@ msgstr ""
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "é–‹ã„ã¦ã„るシーンを上書ãã™ã‚‹ã“ã¨ã¯ã§ãã¾ã›ã‚“!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -1980,7 +1984,7 @@ msgstr ""
#: editor/editor_node.cpp
msgid "Unable to load addon script from path: '%s'."
-msgstr "パス 'ï¼…s' ã‹ã‚‰ã‚¢ãƒ‰ã‚ªãƒ³ã‚¹ã‚¯ãƒªãƒ—トを読込ã‚ã¾ã›ã‚“。"
+msgstr "パス '%s' ã‹ã‚‰ã‚¢ãƒ‰ã‚ªãƒ³ã‚¹ã‚¯ãƒªãƒ—トを読込ã‚ã¾ã›ã‚“。"
#: editor/editor_node.cpp
#, fuzzy
@@ -2009,7 +2013,7 @@ msgid ""
"Scene '%s' was automatically imported, so it can't be modified.\n"
"To make changes to it, a new inherited scene can be created."
msgstr ""
-"シーン 'ï¼…s' ã¯è‡ªå‹•çš„ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸã®ã§ã€å¤‰æ›´ã§ãã¾ã›ã‚“。\n"
+"シーン '%s' ã¯è‡ªå‹•çš„ã«ã‚¤ãƒ³ãƒãƒ¼ãƒˆã•ã‚ŒãŸã®ã§ã€å¤‰æ›´ã§ãã¾ã›ã‚“。\n"
"変更ã™ã‚‹ãŸã‚ã«ã¯ã€æ–°ãŸã«ç¶™æ‰¿ã•ã‚ŒãŸã‚·ãƒ¼ãƒ³ã‚’作æˆã—ã¦ãã ã•ã„。"
#: editor/editor_node.cpp
@@ -2062,7 +2066,7 @@ msgstr "シーンタブを切替ãˆ"
#: editor/editor_node.cpp
msgid "%d more files or folders"
-msgstr "ï¼…d 以上ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ•ã‚©ãƒ«ãƒ€"
+msgstr "%d 以上ã®ãƒ•ã‚¡ã‚¤ãƒ«ã¨ãƒ•ã‚©ãƒ«ãƒ€"
#: editor/editor_node.cpp
msgid "%d more folders"
@@ -2078,11 +2082,11 @@ msgstr "ドックã®ä½ç½®"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
-msgstr "よã見知らãšãƒ¢ãƒ¼ãƒ‰"
+msgstr "集中モード"
#: editor/editor_node.cpp
msgid "Toggle distraction-free mode."
-msgstr "よã見知らãšãƒ¢ãƒ¼ãƒ‰ã‚’切替ãˆã‚‹ã€‚"
+msgstr "集中モードを切替ãˆã‚‹ã€‚"
#: editor/editor_node.cpp
msgid "Add a new scene."
@@ -2156,12 +2160,12 @@ msgstr "タイルセット..."
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Undo"
-msgstr "アンドゥ"
+msgstr "å…ƒã«æˆ»ã™"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
-msgstr "リドゥ"
+msgstr "ã‚„ã‚Šç›´ã™"
#: editor/editor_node.cpp
msgid "Revert Scene"
@@ -2848,7 +2852,7 @@ msgid ""
"found at '%s'."
msgstr ""
"テンプレートã®ã‚¤ãƒ³ã‚¹ãƒˆãƒ¼ãƒ«ã«å¤±æ•—ã—ã¾ã—ãŸã€‚ å•é¡Œã®ãƒ†ãƒ³ãƒ—レートã®ã‚¢ãƒ¼ã‚«ã‚¤ãƒ–㯠"
-"'ï¼…s' ã«ã‚ã‚Šã¾ã™ã€‚"
+"'%s' ã«ã‚ã‚Šã¾ã™ã€‚"
#: editor/export_template_manager.cpp
msgid "Error requesting url: "
@@ -2898,7 +2902,7 @@ msgstr "接続エラー"
#: editor/export_template_manager.cpp
msgid "SSL Handshake Error"
-msgstr "SS ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚¨ãƒ©ãƒ¼"
+msgstr "SSL ãƒãƒ³ãƒ‰ã‚·ã‚§ã‚¤ã‚¯ã‚¨ãƒ©ãƒ¼"
#: editor/export_template_manager.cpp
msgid "Current Version:"
@@ -3033,9 +3037,8 @@ msgid "Add to favorites"
msgstr "ãŠæ°—ã«å…¥ã‚Š:"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from favorites"
-msgstr "グループã‹ã‚‰é™¤åŽ»"
+msgstr "ãŠæ°—ã«å…¥ã‚Šã‹ã‚‰å‰Šé™¤"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3863,7 +3866,7 @@ msgstr "サブトランジションã«ã¯ã€é–‹å§‹ãƒŽãƒ¼ãƒ‰ã¨çµ‚了ノードãŒ
#: editor/plugins/animation_state_machine_editor.cpp
msgid "No playback resource set at path: %s."
-msgstr "パス( ï¼…s )ã«å†ç”Ÿãƒªã‚½ãƒ¼ã‚¹ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
+msgstr "パス( %s )ã«å†ç”Ÿãƒªã‚½ãƒ¼ã‚¹ãŒè¨­å®šã•ã‚Œã¦ã„ã¾ã›ã‚“。"
#: editor/plugins/animation_state_machine_editor.cpp
msgid ""
@@ -4341,7 +4344,7 @@ msgstr "Alt+ドラッグ:移動"
#, fuzzy
msgid "Press 'v' to Change Pivot, 'Shift+v' to Drag Pivot (while moving)."
msgstr ""
-"vキーを押ã™ã¨ãƒ”ボットã®å¤‰æ›´ã€'Shift+v' ã§ãƒ”ボットをドラッグ(移動中ã§ã‚‚)"
+"vキーを押ã™ã¨ãƒ”ボットã®å¤‰æ›´ã€'Shift+v' ã§ãƒ”ボットをドラッグ(移動中ã§ã‚‚)"
#: editor/plugins/canvas_item_editor_plugin.cpp
#, fuzzy
@@ -4694,7 +4697,7 @@ msgstr "点を追加"
#: editor/plugins/curve_editor_plugin.cpp
msgid "Remove point"
-msgstr "é¸æŠžã—ã¦ã„ã‚‹ãƒã‚¤ãƒ³ãƒˆï¼ç‚¹ã‚’削除"
+msgstr "ãƒã‚¤ãƒ³ãƒˆã‚’除去"
#: editor/plugins/curve_editor_plugin.cpp
#, fuzzy
@@ -5384,7 +5387,7 @@ msgstr "ãƒãƒªã‚´ãƒ³ï¼’Dã®UVエディタ"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5460,7 +5463,7 @@ msgstr ""
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "åŠå¾„:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
#, fuzzy
@@ -5813,7 +5816,7 @@ msgstr "ç›´å‰ã®ã€Œç·¨é›†ã—ãŸæ–‡æ›¸ã€ã¸ç§»å‹•."
#: editor/plugins/script_editor_plugin.cpp
msgid "Go to next edited document."
-msgstr "次ã®ã®ã€Œç·¨é›†ã—ãŸæ–‡æ›¸ã€ã¸ç§»å‹•."
+msgstr "次ã®ã€Œç·¨é›†ã—ãŸæ–‡æ›¸ã€ã¸ç§»å‹•."
#: editor/plugins/script_editor_plugin.cpp
#, fuzzy
@@ -6116,7 +6119,7 @@ msgstr "æç”»ã•ã‚ŒãŸã‚ªãƒ–ジェクト"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Material Changes"
-msgstr "ç´ æã®å¤‰æ›´"
+msgstr "マテリアルã®å¤‰æ›´"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Shader Changes"
@@ -6128,7 +6131,7 @@ msgstr "サーフェースã®å¤‰æ›´"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Draw Calls"
-msgstr "ドローコール(Daw call)"
+msgstr "ドローコール"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Vertices"
@@ -7065,9 +7068,8 @@ msgid "Add..."
msgstr "追加..."
#: editor/project_export.cpp
-#, fuzzy
msgid "Export Path:"
-msgstr "プロジェクトã®ã‚¨ã‚¯ã‚¹ãƒãƒ¼ãƒˆ"
+msgstr "エクスãƒãƒ¼ãƒˆãƒ‘ス:"
#: editor/project_export.cpp
msgid "Resources"
@@ -7284,7 +7286,7 @@ msgstr "プロジェクトパス:"
#: editor/project_manager.cpp
msgid "Browse"
-msgstr "å‚照…"
+msgstr "å‚ç…§"
#: editor/project_manager.cpp
msgid "Unnamed Project"
@@ -7578,6 +7580,8 @@ msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'."
msgstr ""
+"無効ãªã‚¢ã‚¯ã‚·ãƒ§ãƒ³åã§ã™ã€‚空もã—ãã¯'/', ':', '=', '\\' ã‚„ '\"'ã‚’å«ã‚ã‚‹ã“ã¨ã¯ã§"
+"ãã¾ã›ã‚“。"
#: editor/project_settings_editor.cpp
#, fuzzy
@@ -8384,9 +8388,8 @@ msgid "Wrong extension chosen"
msgstr "æ‹¡å¼µå­ãŒèª¤ã£ã¦ã„ã¾ã™"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid Path"
-msgstr "無効ãªãƒ•ã‚©ãƒ³ãƒˆ サイズã§ã™ã€‚"
+msgstr "無効ãªãƒ‘ス"
#: editor/script_create_dialog.cpp
msgid "Invalid class name"
@@ -8923,7 +8926,7 @@ msgstr "リソース読ã¿è¾¼ã¿å¤±æ•—"
#: modules/mono/editor/godotsharp_editor.cpp
msgid "Mono"
-msgstr "モノラル音声"
+msgstr "Mono"
#: modules/mono/editor/godotsharp_editor.cpp
msgid "About C# support"
@@ -9710,7 +9713,7 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr "æ画パスã®ãŸã‚ã®ãƒ¡ãƒƒã‚·ãƒ¥ãŒæŒ‡å®šã•ã‚Œã¦ã„ã¾ã›ã‚“ã®ã§è¦‹ãˆã¾ã›ã‚“"
#: scene/3d/cpu_particles.cpp
@@ -9793,10 +9796,13 @@ msgstr ""
"セット) ã”ã¨ã«è¨±å¯ã•ã‚Œã¾ã™ã€‚"
#: scene/3d/scenario_fx.cpp
+#, fuzzy
msgid ""
"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
"this environment's Background Mode to Canvas (for 2D scenes)."
msgstr ""
+"ã“ã®WorldEnvironmentã¯ç„¡è¦–ã•ã‚Œã¾ã—ãŸã€‚カメラを追加ã™ã‚‹ã‹(3Dシーンã®å ´åˆ)ã€ã“"
+"ã®Environmentã® Backgroundモード ã‚’ Canvas ã«è¨­å®šã—ã¾ã™(2Dシーンã®å ´åˆ)。"
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh"
@@ -9975,6 +9981,9 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#~ msgid "Zoom:"
+#~ msgstr "ズーム:"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "\" ã‹ã‚‰å…¨ã¦ã®æŽ¥ç¶šã‚’除去ã—ã¦ã‚‚よã‚ã—ã„ã§ã™ã‹"
@@ -10756,10 +10765,6 @@ msgstr ""
#~ msgstr "ソース フォント:"
#, fuzzy
-#~ msgid "Source Font Size:"
-#~ msgstr "ソース フォントサイズ:"
-
-#, fuzzy
#~ msgid "Dest Resource:"
#~ msgstr "é€ã‚Šå…ˆã®ãƒªã‚½ãƒ¼ã‚¹:"
diff --git a/editor/translations/ka.po b/editor/translations/ka.po
index 7e13731d6a..e8b20b048f 100644
--- a/editor/translations/ka.po
+++ b/editor/translations/ka.po
@@ -549,9 +549,8 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "ზუმის გáƒáƒ–რდáƒ"
+msgid "Font Size:"
+msgstr ""
#: editor/code_editor.cpp
msgid "Line:"
@@ -1693,6 +1692,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2090,7 +2095,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -8940,7 +8945,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9169,6 +9174,10 @@ msgid "Varyings can only be assigned in vertex function."
msgstr ""
#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "ზუმის გáƒáƒ–რდáƒ"
+
+#, fuzzy
#~ msgid "Whole words"
#~ msgstr "მთლიáƒáƒœáƒ˜ სიტყვები"
diff --git a/editor/translations/ko.po b/editor/translations/ko.po
index 31c64514ca..c598e5cb59 100644
--- a/editor/translations/ko.po
+++ b/editor/translations/ko.po
@@ -16,7 +16,7 @@ msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-11-16 16:07+0000\n"
+"PO-Revision-Date: 2018-12-03 19:25+0000\n"
"Last-Translator: 송태섭 <xotjq237@gmail.com>\n"
"Language-Team: Korean <https://hosted.weblate.org/projects/godot-engine/"
"godot/ko/>\n"
@@ -25,7 +25,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 3.3-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -406,12 +406,10 @@ msgid "Delete Selection"
msgstr "ì„ íƒ ì‚­ì œ"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
msgstr "ë‹¤ìŒ ìŠ¤í…으로 ì´ë™"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
msgstr "ì´ì „ 스í…으로 ì´ë™"
@@ -552,8 +550,9 @@ msgid "Warnings:"
msgstr "경고:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "확대:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "소스 í°íŠ¸ í¬ê¸°:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -666,9 +665,8 @@ msgid "Edit Connection: "
msgstr "연결 편집 "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "ì´ ì‹œê·¸ë„ì—ì„œ 모든 ì—°ê²°ì„ ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ?"
+msgstr "\"%s\" 시그ë„ì—ì„œ 모든 ì—°ê²°ì„ ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -822,9 +820,8 @@ msgid "Error loading:"
msgstr "불러오기 중 ì—러:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr "ì¢…ì† ê´€ê³„ë¥¼ ì°¾ì„ ìˆ˜ 없어 씬를 불러올 수 없습니다:"
+msgstr "ì¢…ì† ê´€ê³„ë¥¼ ì°¾ì„ ìˆ˜ 없어 ì”¬ì„ ë¶ˆëŸ¬ì˜¬ 수 없습니다:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1305,7 +1302,6 @@ msgid "File Exists, Overwrite?"
msgstr "파ì¼ì´ 존재합니다. ë®ì–´ì“°ì‹œê² ìŠµë‹ˆê¹Œ?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
msgstr "ì´ í´ë” ì„ íƒ"
@@ -1314,15 +1310,13 @@ msgid "Copy Path"
msgstr "경로 복사"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "íŒŒì¼ ë§¤ë‹ˆì €ì—ì„œ 보기"
+msgstr "íŒŒì¼ íƒìƒ‰ê¸°ì—ì„œ 열기"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
-msgstr "íŒŒì¼ ë§¤ë‹ˆì €ì—ì„œ 보기"
+msgstr "íŒŒì¼ íƒìƒ‰ê¸°ì—ì„œ 보기"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1465,19 +1459,16 @@ msgid "Methods"
msgstr "메서드"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Methods:"
-msgstr "메서드"
+msgstr "메서드:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "ì†ì„±"
+msgstr "테마 ì†ì„±"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties:"
-msgstr "ì†ì„±:"
+msgstr "테마 ì†ì„±:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1504,14 +1495,12 @@ msgid "Constants:"
msgstr "ìƒìˆ˜:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description"
-msgstr "설명"
+msgstr "í´ëž˜ìŠ¤ 설명"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description:"
-msgstr "설명:"
+msgstr "í´ëž˜ìŠ¤ 설명:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1528,12 +1517,10 @@ msgstr ""
"니다."
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "ì†ì„± 설명:"
+msgstr "ì†ì„± 설명"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions:"
msgstr "ì†ì„± 설명:"
@@ -1546,12 +1533,10 @@ msgstr ""
"기여하여[/url][/color] ë” ë‚˜ì•„ì§€ê²Œ ë„와주세요!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "메서드 설명:"
+msgstr "메서드 설명"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions:"
msgstr "메서드 설명:"
@@ -1569,49 +1554,40 @@ msgid "Search Help"
msgstr "ë„ì›€ë§ ê²€ìƒ‰"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "Normal 표시"
+msgstr "ëª¨ë‘ í‘œì‹œ"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Classes Only"
-msgstr "í´ëž˜ìŠ¤(Class)"
+msgstr "í´ëž˜ìŠ¤ë§Œ"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "메서드"
+msgstr "메서드만"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "시그ë„(Signal)"
+msgstr "시그ë„만"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "ìƒìˆ˜(Constant)"
+msgstr "ìƒìˆ˜ë§Œ"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "ì†ì„±"
+msgstr "ì†ì„±ë§Œ"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "ì†ì„±"
+msgstr "테마 ì†ì„±ë§Œ"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Member Type"
-msgstr "멤버"
+msgstr "멤버 타입"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "í´ëž˜ìŠ¤:"
+msgstr "í´ëž˜ìŠ¤"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -1710,6 +1686,12 @@ msgstr "ì´ ìž‘ì—…ì€ íŠ¸ë¦¬ 루트 ì—†ì´ëŠ” 불가합니다."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -1718,7 +1700,7 @@ msgstr ""
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "열려있는 ì”¬ì„ ë®ì–´ 쓸 수 없습니다!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -1968,13 +1950,12 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "애드온 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 없습니다: '%s'."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
-"해당 경로ì—ì„œ 애드온 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 없습니다: '%s' 스í¬ë¦½íŠ¸ê°€ tool 모드"
-"가 아닙니다."
+"해당 경로ì—ì„œ 애드온 스í¬ë¦½íŠ¸ë¥¼ 불러올 수 없습니다: '%s' ì½”ë“œì— ì˜¤ë¥˜ê°€ 있는 "
+"것 같습니다, êµ¬ë¬¸ì„ í™•ì¸í•´ 보십시오."
#: editor/editor_node.cpp
msgid ""
@@ -2028,7 +2009,6 @@ msgstr "기본"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
msgstr "íŒŒì¼ ì‹œìŠ¤í…œì—ì„œ 보기"
@@ -2113,7 +2093,6 @@ msgid "Save Scene"
msgstr "씬 저장"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
msgstr "모든 씬 저장"
@@ -2143,7 +2122,7 @@ msgid "Undo"
msgstr "ë˜ëŒë¦¬ê¸°"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "다시 실행"
@@ -2601,6 +2580,8 @@ msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"파ì¼ë¡œ ì €ìž¥ëœ ë¦¬ì†ŒìŠ¤ì—ì„œ ViewportTexture를 만들 수 없습니다.\n"
+"리소스가 ì”¬ì— ì†í•´ 있어야 합니다."
#: editor/editor_properties.cpp
msgid ""
@@ -2609,6 +2590,10 @@ msgid ""
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"리소스가 ì”¬ì— ë¡œì»¬ë¡œ 설정ë˜ì§€ 않았기 ë•Œë¬¸ì— ViewportTexture를 만들 수 없습니"
+"다.\n"
+"ë¦¬ì†ŒìŠ¤ì˜ 'local to scene' ì†ì„±ì„ 켜십시오 (그리고 모든 리소스를 노드가 í¬í•¨í•˜"
+"고 있어야 합니다)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
@@ -2923,9 +2908,8 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr "file_type_cache.cch를 열수 없어서, íŒŒì¼ íƒ€ìž… ìºì‰¬ë¥¼ 저장하지 않습니다!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "ì¦ê²¨ì°¾ê¸°:"
+msgstr "ì¦ê²¨ì°¾ê¸°"
#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
@@ -3009,14 +2993,12 @@ msgid "Instance"
msgstr "ì¸ìŠ¤í„´ìŠ¤"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to favorites"
-msgstr "ì¦ê²¨ì°¾ê¸°:"
+msgstr "ì¦ê²¨ì°¾ê¸°ë¡œ 추가"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from favorites"
-msgstr "그룹ì—ì„œ 제거"
+msgstr "ì¦ê²¨ì°¾ê¸°ì—ì„œ 제거"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3047,12 +3029,10 @@ msgid "New Resource..."
msgstr "새 리소스..."
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Expand All"
msgstr "ëª¨ë‘ í™•ìž¥"
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
msgstr "ëª¨ë‘ ì ‘ê¸°"
@@ -3076,9 +3056,8 @@ msgid "Re-Scan Filesystem"
msgstr "íŒŒì¼ ì‹œìŠ¤í…œ 재검사"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle split mode"
-msgstr "모드 토글"
+msgstr "분할 모드 토글"
#: editor/filesystem_dock.cpp
msgid "Search files"
@@ -3113,24 +3092,20 @@ msgid "Create Script"
msgstr "스í¬ë¦½íŠ¸ 만들기"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find in Files"
msgstr "파ì¼ì—ì„œ 찾기"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "찾기: "
+msgstr "찾기:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "í´ë”: "
+msgstr "í´ë”:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "í•„í„°"
+msgstr "í•„í„°:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3308,12 +3283,10 @@ msgid "Failed to load resource."
msgstr "리소스 불러오기 실패."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
msgstr "모든 ì†ì„± 펼치기"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
msgstr "모든 ì†ì„± 접기"
@@ -4261,9 +4234,8 @@ msgid "Resize CanvasItem"
msgstr "CanvasItem í¬ê¸° ì¡°ì ˆ"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale CanvasItem"
-msgstr "CanvasItem 회전"
+msgstr "CanvasItem 규모"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
@@ -4326,9 +4298,8 @@ msgid "Rotate Mode"
msgstr "회전 모드"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Mode"
-msgstr "í¬ê¸° ì¡°ì ˆ 모드 (R)"
+msgstr "규모 모드"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4427,9 +4398,8 @@ msgid "Restores the object's children's ability to be selected."
msgstr "오브ì íŠ¸ì˜ ìžì‹ë…¸ë“œê°€ ì„ íƒë  수 있ë„ë¡ ë³µì›í•©ë‹ˆë‹¤."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton Options"
-msgstr "스켈레톤"
+msgstr "스켈레톤 설정"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
@@ -4483,7 +4453,7 @@ msgstr "ë·°í¬íŠ¸ 보기"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "그룹과 잠금 ì•„ì´ì½˜ ë³´ì´ê¸°"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -4924,9 +4894,8 @@ msgid "Create Navigation Polygon"
msgstr "네비게ì´ì…˜ í´ë¦¬ê³¤ 만들기"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Generating Visibility Rect"
-msgstr "가시성 ì§ì‚¬ê°í˜•ì„ 만들기"
+msgstr "가시성 ì§ì‚¬ê°í˜• 만들기"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -5404,9 +5373,8 @@ msgid "Error writing TextFile:"
msgstr "í…스트 íŒŒì¼ ì“°ê¸° ì—러:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error: could not load file."
-msgstr "ì—러로 파ì¼ì„ 불러올 수 ì—†ìŒ."
+msgstr "ì—러: 파ì¼ì„ 불러올 수 ì—†ìŒ."
#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
@@ -5505,7 +5473,6 @@ msgid "Copy Script Path"
msgstr "스í¬ë¦½íŠ¸ 경로 복사"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "History Previous"
msgstr "ì´ì „ 히스토리"
@@ -5577,9 +5544,8 @@ msgid "Keep Debugger Open"
msgstr "디버거 í•­ìƒ ì—´ì–´ë†“ê¸°"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Debug with External Editor"
-msgstr "외부 ì—디터와 디버그"
+msgstr "외부 ì—디터로 디버깅"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
@@ -5622,7 +5588,6 @@ msgid "Debugger"
msgstr "디버거"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
msgstr "검색 결과"
@@ -5635,9 +5600,8 @@ msgid "(ignore)"
msgstr "(무시함)"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "함수로 ì´ë™..."
+msgstr "함수로 ì´ë™"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -5726,12 +5690,10 @@ msgid "Trim Trailing Whitespace"
msgstr "후행 공백 ë¬¸ìž ì œê±°"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Spaces"
-msgstr "들여쓰기를 스페ì´ìŠ¤ë¡œ 변환"
+msgstr "들여쓰기를 공백으로 변환"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Tabs"
msgstr "들여쓰기를 탭으로 변환"
@@ -5749,12 +5711,10 @@ msgid "Remove All Breakpoints"
msgstr "ì¤‘ë‹¨ì  ëª¨ë‘ ì‚­ì œ"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Breakpoint"
msgstr "ë‹¤ìŒ ì¤‘ë‹¨ì ìœ¼ë¡œ ì´ë™"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Breakpoint"
msgstr "ì´ì „ 중단ì ìœ¼ë¡œ ì´ë™"
@@ -5763,17 +5723,14 @@ msgid "Find Previous"
msgstr "ì´ì „ 찾기"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find in Files..."
msgstr "파ì¼ì—ì„œ 찾기..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
msgstr "함수로 ì´ë™..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
msgstr "ë¼ì¸ìœ¼ë¡œ ì´ë™..."
@@ -5872,7 +5829,7 @@ msgstr "피치"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Yaw"
-msgstr ""
+msgstr "ìš”"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
@@ -6039,9 +5996,8 @@ msgid "Freelook Speed Modifier"
msgstr "ìžìœ ì‹œì  ì†ë„ 변화"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View Rotation Locked"
-msgstr "뷰 회전 잠금"
+msgstr "뷰 회전 잠김"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
@@ -6543,9 +6499,8 @@ msgid "Fix Invalid Tiles"
msgstr "ìž˜ëª»ëœ íƒ€ì¼ ìˆ˜ì •"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Cut Selection"
-msgstr "ì„ íƒ í•­ëª© 화면 ì¤‘ì•™ì— í‘œì‹œ"
+msgstr "ì„ íƒ ìž˜ë¼ë‚´ê¸°"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6592,32 +6547,28 @@ msgid "Pick Tile"
msgstr "íƒ€ì¼ ì„ íƒ"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "ì„ íƒ ì´ë™"
+msgstr "ì„ íƒ ë³µì‚¬"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate left"
-msgstr "회전 모드"
+msgstr "왼쪽으로 회전"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate right"
-msgstr "오른쪽으로 ì´ë™"
+msgstr "오른쪽으로 회전"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip horizontally"
-msgstr ""
+msgstr "가로로 뒤집기"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip vertically"
-msgstr ""
+msgstr "세로로 뒤집기"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear transform"
-msgstr "변형"
+msgstr "변형 지우기"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Add Texture(s) to TileSet"
@@ -6648,9 +6599,8 @@ msgid "Display tile's names (hold Alt Key)"
msgstr "íƒ€ì¼ ì´ë¦„ ë³´ì´ê¸° (Alt 키를 누르세요)"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected texture and ALL TILES which use it?"
-msgstr "ì„ íƒí•œ í…스ì³ì™€ 모든 타ì¼ì„ 삭제하시겠습니까?"
+msgstr "ì„ íƒí•œ í…스ì³ì™€ ê·¸ê²ƒì„ ì‚¬ìš©í•˜ëŠ” 모든 타ì¼ì„ 삭제하겠습니까?"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
@@ -6665,9 +6615,8 @@ msgid "Merge from scene?"
msgstr "씬으로부터 병합하시겠습니까?"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "%s file(s) were not added because was already on the list."
-msgstr " %s 파ì¼ì´ ì´ë¯¸ 목ë¡ì— 존재하여 추가ë˜ì§€ 않습니다."
+msgstr "%s 파ì¼ì´ ì´ë¯¸ 목ë¡ì— 존재하여 추가ë˜ì§€ 않습니다."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -6755,12 +6704,11 @@ msgstr "ì´ í”Œëž«í¼ì— 대한 내보내기 í…œí”Œë¦¿ì´ ì—†ê±°ë‚˜ ì†ìƒë¨:"
#: editor/project_export.cpp
msgid "Release"
-msgstr ""
+msgstr "ë°°í¬"
#: editor/project_export.cpp
-#, fuzzy
msgid "Exporting All"
-msgstr "%s 내보내기"
+msgstr "ëª¨ë‘ ë‚´ë³´ë‚´ê¸°"
#: editor/project_export.cpp
msgid "Presets"
@@ -6771,9 +6719,8 @@ msgid "Add..."
msgstr "추가..."
#: editor/project_export.cpp
-#, fuzzy
msgid "Export Path:"
-msgstr "프리셋 내보내기:"
+msgstr "경로 내보내기:"
#: editor/project_export.cpp
msgid "Resources"
@@ -6834,14 +6781,12 @@ msgid "Export PCK/Zip"
msgstr "PCK/Zip 내보내기"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "내보내기 모드:"
+msgstr "내보내기 모드?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "내보내기"
+msgstr "ëª¨ë‘ ë‚´ë³´ë‚´ê¸°"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
@@ -7526,16 +7471,14 @@ msgid "Step"
msgstr "단계"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Amount by which counter is incremented for each node"
-msgstr "ì¹´ìš´í„°ê°€ ê° ë…¸ë“œì—ì„œ ì¦ê°€í•˜ëŠ” ì–‘"
+msgstr "ê° ë…¸ë“œì— ëŒ€í•´ ì¹´ìš´í„°ê°€ ì¦ê°€í•˜ëŠ” ì–‘"
#: editor/rename_dialog.cpp
msgid "Padding"
msgstr "패딩(Padding)"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid ""
"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
@@ -7682,6 +7625,8 @@ msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
msgstr ""
+"\"editable_instance\"를 비활설화 하면 ë…¸ë“œì˜ ëª¨ë“  ì†ì„±ì´ 기본 값으로 ë˜ëŒì•„ê°‘"
+"니다."
#: editor/scene_tree_dock.cpp
msgid "Editable Children"
@@ -7755,9 +7700,8 @@ msgid "Clear Inheritance"
msgstr "ìƒì† 지우기"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open documentation"
-msgstr "Godot 온ë¼ì¸ 문서 열기"
+msgstr "문서 열기"
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
@@ -7772,9 +7716,8 @@ msgid "Change Type"
msgstr "타입 변경"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
-msgstr "스í¬ë¦½íŠ¸ 열기"
+msgstr "스í¬ë¦½íŠ¸ 확장"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -7936,9 +7879,8 @@ msgid "Path is empty"
msgstr "경로가 비어 있ìŒ"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty"
-msgstr "스프ë¼ì´íŠ¸ê°€ 비었습니다!"
+msgstr "íŒŒì¼ ì´ë¦„ì´ ë¹„ì—ˆìŠµë‹ˆë‹¤"
#: editor/script_create_dialog.cpp
msgid "Path is not local"
@@ -8029,9 +7971,8 @@ msgid "Bytes:"
msgstr "ë°”ì´íŠ¸:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Stack Trace"
-msgstr "ìŠ¤íƒ í”„ë ˆìž„"
+msgstr "ìŠ¤íƒ ì¶”ì "
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8481,7 +8422,7 @@ msgstr "내부 예외 ìŠ¤íƒ ì¶”ì ì˜ ë"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Bake NavMesh"
-msgstr ""
+msgstr "NavMesh ë² ì´í¬"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8867,12 +8808,11 @@ msgstr "비주얼 스í¬ë¦½íŠ¸ 검색"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "Get %s"
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Set %s"
-msgstr "Set "
+msgstr "Set %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -8970,6 +8910,8 @@ msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"CPUParticles2D 애니메ì´ì…˜ì„ 사용하려면 \"Particles Animation\"ì´ í™œì„±í™”ëœ "
+"CanvasItemMaterialì´ í•„ìš”í•©ë‹ˆë‹¤."
#: scene/2d/light_2d.cpp
msgid ""
@@ -9022,6 +8964,8 @@ msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"Particles2D 애니메ì´ì…˜ì„ 사용하려면 \"Particles Animation\"ì´ í™œì„±í™”ëœ "
+"CanvasItemMaterialì´ í•„ìš”í•©ë‹ˆë‹¤."
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
@@ -9161,14 +9105,16 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
-msgstr "ë©”ì‹œë“¤ì„ íŒ¨ìŠ¤ë¥¼ 그리ë„ë¡ í• ë‹¹í•˜ì§€ 않았으므로 ë³´ì´ì§€ 않습니다."
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "ì§€ì •ëœ ë©”ì‹œê°€ 없으므로 ì•„ë¬´ê²ƒë„ ë³´ì´ì§€ 않습니다."
#: scene/3d/cpu_particles.cpp
msgid ""
"CPUParticles animation requires the usage of a SpatialMaterial with "
"\"Billboard Particles\" enabled."
msgstr ""
+"CPUParticles 애니메ì´ì…˜ì„ 사용하려면 \"Billboard Particles\"ì´ í™œì„±í™”ëœ "
+"SpatialMaterialì´ í•„ìš”í•©ë‹ˆë‹¤."
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
@@ -9198,20 +9144,20 @@ msgid ""
"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
"Particles\" enabled."
msgstr ""
+"Particles 애니메ì´ì…˜ì„ 사용하려면 \"Billboard Particles\"ì´ í™œì„±í™”ëœ "
+"SpatialMaterialì´ í•„ìš”í•©ë‹ˆë‹¤."
#: scene/3d/path.cpp
-#, fuzzy
msgid "PathFollow only works when set as a child of a Path node."
-msgstr "PathFollow2D는 Path2D ë…¸ë“œì˜ ìžì‹ë…¸ë“œë¡œ ìžˆì„ ë•Œë§Œ ë™ìž‘합니다."
+msgstr "PathFollow는 Path ë…¸ë“œì˜ ìžì‹ìœ¼ë¡œ ìžˆì„ ë•Œë§Œ ë™ìž‘합니다."
#: scene/3d/path.cpp
-#, fuzzy
msgid "OrientedPathFollow only works when set as a child of a Path node."
-msgstr "PathFollow2D는 Path2D ë…¸ë“œì˜ ìžì‹ë…¸ë“œë¡œ ìžˆì„ ë•Œë§Œ ë™ìž‘합니다."
+msgstr "OrientedPathFollow는 Path ë…¸ë“œì˜ ìžì‹ìœ¼ë¡œ ìžˆì„ ë•Œë§Œ ë™ìž‘합니다."
#: scene/3d/path.cpp
msgid "OrientedPathFollow requires up vectors enabled in its parent Path."
-msgstr ""
+msgstr "OrientedPathFollow는 부모 Pathì—ì„œ 벡터를 활성화해야 합니다."
#: scene/3d/physics_body.cpp
msgid ""
@@ -9249,7 +9195,6 @@ msgid "This body will be ignored until you set a mesh"
msgstr "ì´ ë°”ë””ëŠ” 메시를 설정할 ë•Œ 까지 무시ë©ë‹ˆë‹¤"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
@@ -9340,7 +9285,7 @@ msgstr ""
#: scene/gui/range.cpp
msgid "If exp_edit is true min_value must be > 0."
-msgstr ""
+msgstr "exp_editì´ ì°¸ì´ë¼ë©´ min_value는 반드시 > 0 ì´ì–´ì•¼ 합니다."
#: scene/gui/scroll_container.cpp
msgid ""
@@ -9416,6 +9361,9 @@ msgstr "ê· ì¼í•˜ê²Œ 배치함."
msgid "Varyings can only be assigned in vertex function."
msgstr "Varyings는 ì˜¤ì§ ë²„í…스 함수ì—서만 지정할 수 있습니다."
+#~ msgid "Zoom:"
+#~ msgstr "확대:"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "\" ì—ì„œ 모든 ì—°ê²°ì„ ì œê±°í•˜ì‹œê² ìŠµë‹ˆê¹Œ"
@@ -10115,9 +10063,6 @@ msgstr "Varyings는 ì˜¤ì§ ë²„í…스 함수ì—서만 지정할 수 있습니다.
#~ msgid "Source Font:"
#~ msgstr "소스 í°íŠ¸:"
-#~ msgid "Source Font Size:"
-#~ msgstr "소스 í°íŠ¸ í¬ê¸°:"
-
#~ msgid "Dest Resource:"
#~ msgstr "리소스 경로:"
diff --git a/editor/translations/lt.po b/editor/translations/lt.po
index 3926aea3e4..954bd17af1 100644
--- a/editor/translations/lt.po
+++ b/editor/translations/lt.po
@@ -547,9 +547,8 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Priartinti"
+msgid "Font Size:"
+msgstr ""
#: editor/code_editor.cpp
msgid "Line:"
@@ -1680,6 +1679,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2077,7 +2082,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -8955,7 +8960,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9186,6 +9191,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Priartinti"
+
#~ msgid "Disabled"
#~ msgstr "IÅ¡jungta"
diff --git a/editor/translations/lv.po b/editor/translations/lv.po
index ff10ecd88c..07a4ac0444 100644
--- a/editor/translations/lv.po
+++ b/editor/translations/lv.po
@@ -542,8 +542,8 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "PietuvinÄt:"
+msgid "Font Size:"
+msgstr ""
#: editor/code_editor.cpp
msgid "Line:"
@@ -1681,6 +1681,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2079,7 +2085,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -8924,7 +8930,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9151,6 +9157,9 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#~ msgid "Zoom:"
+#~ msgstr "PietuvinÄt:"
+
#~ msgid "Disabled"
#~ msgstr "Atspējots"
diff --git a/editor/translations/ml.po b/editor/translations/ml.po
index 0f15ac029c..4981f02aae 100644
--- a/editor/translations/ml.po
+++ b/editor/translations/ml.po
@@ -532,7 +532,7 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
#: editor/code_editor.cpp
@@ -1647,6 +1647,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2043,7 +2049,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -8843,7 +8849,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
diff --git a/editor/translations/ms.po b/editor/translations/ms.po
index 07b812a5dc..d9a769878b 100644
--- a/editor/translations/ms.po
+++ b/editor/translations/ms.po
@@ -541,7 +541,7 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
#: editor/code_editor.cpp
@@ -1656,6 +1656,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2052,7 +2058,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -8861,7 +8867,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
diff --git a/editor/translations/nb.po b/editor/translations/nb.po
index 6f08cbbc12..a32f59eef6 100644
--- a/editor/translations/nb.po
+++ b/editor/translations/nb.po
@@ -567,8 +567,8 @@ msgstr ""
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Zoom Inn"
+msgid "Font Size:"
+msgstr "Frontvisning"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1736,6 +1736,12 @@ msgstr "Denne operasjonen kan ikke gjennomføres uten en trerot."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2175,7 +2181,7 @@ msgid "Undo"
msgstr "Angre"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Gjenta"
@@ -9344,7 +9350,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9574,6 +9580,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Zoom Inn"
+
#~ msgid "Class List:"
#~ msgstr "Klasseliste:"
diff --git a/editor/translations/nl.po b/editor/translations/nl.po
index ba5a4db2dc..e4e85160a0 100644
--- a/editor/translations/nl.po
+++ b/editor/translations/nl.po
@@ -24,18 +24,19 @@
# Wout Standaert <wout@blobkat.com>, 2017.
# Zatherz <zatherz@linux.pl>, 2017.
# Tahar Meijs <tntmeijs@gmail.com>, 2018.
+# Laurent Windels <laurentwindels@yahoo.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-09-24 22:24+0000\n"
-"Last-Translator: frank <frankvprive@gmail.com>\n"
+"PO-Revision-Date: 2018-12-04 22:14+0000\n"
+"Last-Translator: Laurent Windels <laurentwindels@yahoo.com>\n"
"Language-Team: Dutch <https://hosted.weblate.org/projects/godot-engine/godot/"
"nl/>\n"
"Language: nl\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 3.2-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -309,10 +310,14 @@ msgid ""
"-AudioStreamPlayer2D\n"
"-AudioStreamPlayer3D"
msgstr ""
+"Audio tracks kunnen enkel verwijzen naar nodes van het type:\n"
+"-AudioStreamPlayer\n"
+"-AudioStreamPlayer2D\n"
+"-AudioStreamPlayer3D"
#: editor/animation_track_editor.cpp
msgid "Animation tracks can only point to AnimationPlayer nodes."
-msgstr ""
+msgstr "Animatie tracks kunnen enkel verwijzen naar AnimatiePlayer nodes."
#: editor/animation_track_editor.cpp
msgid "An animation player can't animate itself, only other players."
@@ -320,33 +325,31 @@ msgstr "Een animatiespeler kan zichzelf niet animeren, alleen andere spelers."
#: editor/animation_track_editor.cpp
msgid "Not possible to add a new track without a root"
-msgstr ""
+msgstr "Niet mogelijk om een nieuwe track toe te voegen zonder een root"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a key."
-msgstr ""
+msgstr "Track path is niet geldig, dus kan geen key toevoegen."
#: editor/animation_track_editor.cpp
msgid "Track is not of type Spatial, can't insert key"
-msgstr ""
+msgstr "Track is niet van het type Spatial, kan geen key invoegen"
#: editor/animation_track_editor.cpp
msgid "Track path is invalid, so can't add a method key."
-msgstr ""
+msgstr "Track path is niet geldig, dus kan geen methode key toevoegen."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Method not found in object: "
-msgstr "VariableGet niet gevonden in script: "
+msgstr "Methode niet gevonden in object "
#: editor/animation_track_editor.cpp
msgid "Anim Move Keys"
msgstr "Anim Verplaats Keys"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Clipboard is empty"
-msgstr "Bronnen klembord is leeg!"
+msgstr "Klembord is leeg"
#: editor/animation_track_editor.cpp
msgid "Anim Scale Keys"
@@ -385,19 +388,16 @@ msgid "Edit"
msgstr "Bewerken"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Animation properties."
-msgstr "AnimatieBoom"
+msgstr "Animatie kenmerken."
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Copy Tracks"
-msgstr "Kopieer Parameters"
+msgstr "Kopieer Tracks"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Paste Tracks"
-msgstr "Plak Parameters"
+msgstr "Plak Tracks"
#: editor/animation_track_editor.cpp
msgid "Scale Selection"
@@ -416,9 +416,8 @@ msgid "Duplicate Transposed"
msgstr "Dupliceer Getransponeerde"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Delete Selection"
-msgstr "Geselecteerde Verwijderen"
+msgstr "Verwijder Selectie"
#: editor/animation_track_editor.cpp
#, fuzzy
@@ -440,11 +439,11 @@ msgstr "Animatie Opschonen"
#: editor/animation_track_editor.cpp
msgid "Pick the node that will be animated:"
-msgstr ""
+msgstr "Kies de node die geanimeerd zal worden:"
#: editor/animation_track_editor.cpp
msgid "Use Bezier Curves"
-msgstr ""
+msgstr "Gebruik Bezier Curves"
#: editor/animation_track_editor.cpp
msgid "Anim. Optimizer"
@@ -568,8 +567,8 @@ msgstr ""
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Inzoomen"
+msgid "Font Size:"
+msgstr "Vooraanzicht"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1737,6 +1736,12 @@ msgstr "Deze operatie kan niet gedaan worden zonder boomwortel."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2183,7 +2188,7 @@ msgid "Undo"
msgstr "Ongedaan Maken"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Opnieuw"
@@ -7105,9 +7110,8 @@ msgid "Import Existing Project"
msgstr "Importeer bestaand project"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Import & Edit"
-msgstr "Importeren"
+msgstr "Importeer & Bewerk"
#: editor/project_manager.cpp
msgid "Create New Project"
@@ -7123,9 +7127,8 @@ msgid "Install Project:"
msgstr "Installeer project:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Install & Edit"
-msgstr "Installeer"
+msgstr "Installeer & Bewerk"
#: editor/project_manager.cpp
msgid "Project Name:"
@@ -7141,9 +7144,8 @@ msgid "Project Path:"
msgstr "Projectpad:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Projectpad:"
+msgstr "Project Installatie Path:"
#: editor/project_manager.cpp
msgid "Browse"
@@ -7154,9 +7156,8 @@ msgid "Unnamed Project"
msgstr "Naamloos Project"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Can't open project"
-msgstr "Verbind..."
+msgstr "Kan project niet openen"
#: editor/project_manager.cpp
msgid "Are you sure to open more than one project?"
@@ -8074,7 +8075,7 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
-msgstr ""
+msgstr "Toggle Zichtbaarheid"
#: editor/scene_tree_editor.cpp
msgid ""
@@ -8088,7 +8089,7 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid "Rename Node"
-msgstr ""
+msgstr "Hernoem Node"
#: editor/scene_tree_editor.cpp
msgid "Scene Tree (Nodes):"
@@ -8100,73 +8101,67 @@ msgstr ""
#: editor/scene_tree_editor.cpp
msgid "Select a Node"
-msgstr ""
+msgstr "Selecteer een Node"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Error loading template '%s'"
-msgstr "Error bij het laden van lettertype."
+msgstr "Error bij het laden van sjabloon '%s'"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Error - Could not create script in filesystem."
-msgstr "Map kon niet gemaakt worden."
+msgstr "Fout - Kon geen script aanmaken in bestandssysteem."
#: editor/script_create_dialog.cpp
msgid "Error loading script from %s"
-msgstr ""
+msgstr "Fout bij het laden script van %s"
#: editor/script_create_dialog.cpp
msgid "N/A"
-msgstr ""
+msgstr "Niet van toepassing"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script/Choose Location"
-msgstr "Open Script Bewerker"
+msgstr "Open Script/Kies Locatie"
#: editor/script_create_dialog.cpp
msgid "Path is empty"
-msgstr ""
+msgstr "Path is leeg"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty"
-msgstr "Mesh is leeg!"
+msgstr "Bestandsnaam is leeg"
#: editor/script_create_dialog.cpp
msgid "Path is not local"
-msgstr ""
+msgstr "Path is niet lokaal"
#: editor/script_create_dialog.cpp
msgid "Invalid base path"
-msgstr ""
+msgstr "Ongeldig basis path"
#: editor/script_create_dialog.cpp
msgid "Directory of the same name exists"
-msgstr ""
+msgstr "Directory met dezelfde naam bestaat al"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "File exists, will be reused"
-msgstr "Bestand Bestaat, Overschrijven?"
+msgstr "Bestand Bestaat, zal herbruikt worden"
#: editor/script_create_dialog.cpp
msgid "Invalid extension"
-msgstr ""
+msgstr "Ongeldige extensie"
#: editor/script_create_dialog.cpp
msgid "Wrong extension chosen"
-msgstr ""
+msgstr "Verkeerde extensie gekozen"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Invalid Path"
-msgstr "Ongeldig Pad."
+msgstr "Ongeldig Path"
#: editor/script_create_dialog.cpp
msgid "Invalid class name"
-msgstr ""
+msgstr "Ongeldige klassenaam"
#: editor/script_create_dialog.cpp
#, fuzzy
@@ -8175,47 +8170,43 @@ msgstr "Ongeldige index eigenschap naam."
#: editor/script_create_dialog.cpp
msgid "Script valid"
-msgstr ""
+msgstr "Script geldig"
#: editor/script_create_dialog.cpp
msgid "Allowed: a-z, A-Z, 0-9 and _"
-msgstr ""
+msgstr "Toegestaan: a-z, A-Z, 0-9 en _"
#: editor/script_create_dialog.cpp
msgid "Built-in script (into scene file)"
-msgstr ""
+msgstr "Ingebouwd script (in scene bestand)"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Create new script file"
-msgstr "Subscriptie Maken"
+msgstr "Maak nieuw script bestand"
#: editor/script_create_dialog.cpp
msgid "Load existing script file"
-msgstr ""
+msgstr "Laad bestaand script"
#: editor/script_create_dialog.cpp
msgid "Language"
-msgstr ""
+msgstr "Taal"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Inherits"
-msgstr "Erft:"
+msgstr "Erft"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Class Name"
-msgstr "Klasse:"
+msgstr "Klasse Naam"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Template"
-msgstr "Verwijder Selectie"
+msgstr "Sjabloon"
#: editor/script_create_dialog.cpp
msgid "Built-in Script"
-msgstr ""
+msgstr "Ingebouwd Script"
#: editor/script_create_dialog.cpp
msgid "Attach Node Script"
@@ -8240,24 +8231,23 @@ msgstr ""
#: editor/script_editor_debugger.cpp modules/mono/editor/mono_bottom_panel.cpp
msgid "Errors"
-msgstr ""
+msgstr "Fouten"
#: editor/script_editor_debugger.cpp
msgid "Child Process Connected"
msgstr ""
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Copy Error"
-msgstr "Laadfouten"
+msgstr "Kopieer Fout"
#: editor/script_editor_debugger.cpp
msgid "Inspect Previous Instance"
-msgstr ""
+msgstr "Inspecteer vorige instantie"
#: editor/script_editor_debugger.cpp
msgid "Inspect Next Instance"
-msgstr ""
+msgstr "Inspecteer Volgende Instantie"
#: editor/script_editor_debugger.cpp
msgid "Stack Frames"
@@ -8285,7 +8275,7 @@ msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Total:"
-msgstr ""
+msgstr "Totaal:"
#: editor/script_editor_debugger.cpp
msgid "Video Mem"
@@ -8297,7 +8287,7 @@ msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Type"
-msgstr ""
+msgstr "Type"
#: editor/script_editor_debugger.cpp
msgid "Format"
@@ -8305,7 +8295,7 @@ msgstr ""
#: editor/script_editor_debugger.cpp
msgid "Usage"
-msgstr ""
+msgstr "Gebruik"
#: editor/script_editor_debugger.cpp
msgid "Misc"
@@ -8329,7 +8319,7 @@ msgstr ""
#: editor/settings_config_dialog.cpp
msgid "Shortcuts"
-msgstr ""
+msgstr "Snelkoppelingen"
#: editor/settings_config_dialog.cpp
msgid "Binding"
@@ -8345,7 +8335,7 @@ msgstr ""
#: editor/spatial_editor_gizmos.cpp
msgid "Change Camera FOV"
-msgstr ""
+msgstr "Wijzig Camera FOV"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Camera Size"
@@ -8365,7 +8355,7 @@ msgstr ""
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Sphere Shape Radius"
-msgstr ""
+msgstr "Wijzig Sphere Vorm Straal"
#: editor/spatial_editor_gizmos.cpp modules/csg/csg_gizmos.cpp
msgid "Change Box Shape Extents"
@@ -8373,11 +8363,11 @@ msgstr ""
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Radius"
-msgstr ""
+msgstr "Wijzig Capsule Vorm Straal"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Capsule Shape Height"
-msgstr ""
+msgstr "Wijzig Capsule Vorm Hoogte"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Cylinder Shape Radius"
@@ -8389,43 +8379,39 @@ msgstr ""
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
-msgstr ""
+msgstr "Wijzig Ray Vorm Lengte"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Wijzig Meng Tijd"
+msgstr "Wijzig Cylinder Straal"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Wijzig Meng Tijd"
+msgstr "Wijzig Cylinder Hoogte"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Wijzig Ankers en Marges"
+msgstr "Wijzig Torus Binnenste Straal"
#: modules/csg/csg_gizmos.cpp
msgid "Change Torus Outer Radius"
-msgstr ""
+msgstr "Wijzig Torus Buitenste Straal"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
-msgstr ""
+msgstr "Selecteer de dynamische bibliotheek voor deze ingave"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select dependencies of the library for this entry"
-msgstr ""
+msgstr "Selecteer afhankelijkheden van de bibliotheek voor deze ingave"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
-#, fuzzy
msgid "Remove current entry"
-msgstr "Verwijder Signaal"
+msgstr "Verwijder huidige ingave"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Double click to create a new entry"
-msgstr ""
+msgstr "Dubbelklikken om een nieuwe ingave te creëren"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Platform:"
@@ -8445,23 +8431,23 @@ msgstr ""
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "GDNativeLibrary"
-msgstr ""
+msgstr "GDInheemsBibliotheek"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Library"
-msgstr ""
+msgstr "Bibliotheek"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Status"
-msgstr ""
+msgstr "Status"
#: modules/gdnative/gdnative_library_singleton_editor.cpp
msgid "Libraries: "
-msgstr ""
+msgstr "Bibliotheken: "
#: modules/gdnative/register_types.cpp
msgid "GDNative"
-msgstr ""
+msgstr "GDInheems"
#: modules/gdscript/gdscript_functions.cpp
msgid "step argument is zero!"
@@ -8565,27 +8551,27 @@ msgstr ""
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit X Axis"
-msgstr ""
+msgstr "Bewerk X As"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit Y Axis"
-msgstr ""
+msgstr "Bewerk Y As"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Edit Z Axis"
-msgstr ""
+msgstr "Bewerk Z As"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate X"
-msgstr ""
+msgstr "Cursor Roteer X"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate Y"
-msgstr ""
+msgstr "Cursor Roteer Y"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Rotate Z"
-msgstr ""
+msgstr "Cursor Roteer Z"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate X"
@@ -9403,7 +9389,7 @@ msgstr ""
"alsjeblieft een vorm resource voor deze!"
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9656,6 +9642,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Inzoomen"
+
#~ msgid "Class List:"
#~ msgstr "Klasse Lijst:"
diff --git a/editor/translations/pl.po b/editor/translations/pl.po
index a068bc8123..47f8918039 100644
--- a/editor/translations/pl.po
+++ b/editor/translations/pl.po
@@ -30,7 +30,7 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-11-10 20:07+0000\n"
+"PO-Revision-Date: 2018-12-04 22:15+0000\n"
"Last-Translator: Tomek <kobewi4e@gmail.com>\n"
"Language-Team: Polish <https://hosted.weblate.org/projects/godot-engine/"
"godot/pl/>\n"
@@ -39,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 3.3-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -347,7 +347,6 @@ msgid "Method not found in object: "
msgstr "Metoda nie znaleziona w obiekcie: "
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Anim Move Keys"
msgstr "Przemieść klucze animacji"
@@ -423,12 +422,10 @@ msgid "Delete Selection"
msgstr "Usuń zaznaczone"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
msgstr "Przejdź do następnego kroku"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
msgstr "Przejdź do poprzedniego kroku"
@@ -569,8 +566,9 @@ msgid "Warnings:"
msgstr "Ostrzeżenia:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "Powiększenie:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "Wielkość oryginalna fontu:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -683,9 +681,8 @@ msgid "Edit Connection: "
msgstr "Edytuj połączenie: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "Na pewno chcesz usunąć wszystkie połączenia z tego sygnału?"
+msgstr "Na pewno chcesz usunąć wszystkie połączenia z sygnału \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -839,9 +836,8 @@ msgid "Error loading:"
msgstr "BÅ‚Ä…d Å‚adowania:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr "Scena nie została wczytana z powodu brakujących zależności:"
+msgstr "Wczytywanie nieudane z powodu brakujących zależności:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1323,24 +1319,21 @@ msgid "File Exists, Overwrite?"
msgstr "Plik istnieje, nadpisać?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
-msgstr "Wybierz ten Folder"
+msgstr "Wybierz ten folder"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Skopiuj Ścieżkę"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "Otwórz w menadżerze plików"
+msgstr "Otwórz w menedżerze plików"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
-msgstr "Pokaż w menadżerze plików"
+msgstr "Pokaż w menedżerze plików"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1483,19 +1476,16 @@ msgid "Methods"
msgstr "Metody"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Methods:"
-msgstr "Metody"
+msgstr "Metody:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "Właściwości"
+msgstr "Właściwości motywu"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties:"
-msgstr "Właściwości:"
+msgstr "Właściwości motywu:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1522,14 +1512,12 @@ msgid "Constants:"
msgstr "Stałe:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description"
-msgstr "Opis"
+msgstr "Opis klasy"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description:"
-msgstr "Opis:"
+msgstr "Opis klasy:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1546,14 +1534,12 @@ msgstr ""
"jakiÅ›[/url][/color]."
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "Opis właściwości:"
+msgstr "Opisy właściwości"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions:"
-msgstr "Opis właściwości:"
+msgstr "Opisy właściwości:"
#: editor/editor_help.cpp
msgid ""
@@ -1564,14 +1550,12 @@ msgstr ""
"$url]wysyłając ją[/url][/color]!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "Opis metody:"
+msgstr "Opisy metod"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions:"
-msgstr "Opis metody:"
+msgstr "Opisy metod:"
#: editor/editor_help.cpp
msgid ""
@@ -1587,49 +1571,40 @@ msgid "Search Help"
msgstr "Wyszukaj w Pomocy"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "Widok normalny"
+msgstr "Pokaż wszystko"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Classes Only"
-msgstr "Klasy"
+msgstr "Tylko klasy"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "Metody"
+msgstr "Tylko metody"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "Sygnały"
+msgstr "Tylko sygnały"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "Stałe"
+msgstr "Tylko stałe"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "Właściwości"
+msgstr "Tylko właściwości"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "Właściwości"
+msgstr "Tylko właściwości motywu"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Member Type"
-msgstr "Członkowie"
+msgstr "Typ członka"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "Klasa:"
+msgstr "Klasa"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -1728,6 +1703,12 @@ msgstr "Ta operacja nie może zostać wykonana bez sceny."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -1736,7 +1717,7 @@ msgstr ""
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "Nie można nadpisać sceny, która wciąż jest otwarta!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -1992,13 +1973,12 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Nie można załadować skryptu dodatku z ścieżki: '%s'."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
-"Nie można załadować skryptu dodatku z ścieżki: '%s' Skrypt nie jest w trybie "
-"narzędzia (tool)."
+"Nie można załadować skryptu dodatku ze ścieżki: '%s' W kodzie znajduje się "
+"błąd, sprawdź składnię."
#: editor/editor_node.cpp
msgid ""
@@ -2054,7 +2034,6 @@ msgstr "Domyślny"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
msgstr "Pokaż w systemie plików"
@@ -2139,7 +2118,6 @@ msgid "Save Scene"
msgstr "Zapisz scenÄ™"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
msgstr "Zapisz wszystkie sceny"
@@ -2169,7 +2147,7 @@ msgid "Undo"
msgstr "Cofnij"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Ponów"
@@ -2623,6 +2601,8 @@ msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"Nie można utworzyć ViewportTexture na zasobach zapisanych jako plik.\n"
+"Zasób musi należeć do sceny."
#: editor/editor_properties.cpp
msgid ""
@@ -2631,6 +2611,10 @@ msgid ""
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"Nie można utworzyć ViewportTexture na tym zasobie, ponieważ nie jest "
+"ustawiony jako lokalny dla sceny.\n"
+"Włącz mu właściwość \"lokalny dla sceny\" (i wszystkim zasobom, które go "
+"zawierają, aż do węzła)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
@@ -2948,9 +2932,8 @@ msgstr ""
"typu plików nie będzie zapisana!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "Ulubione:"
+msgstr "Ulubione"
#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
@@ -3035,14 +3018,12 @@ msgid "Instance"
msgstr "Instancja"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to favorites"
-msgstr "Ulubione:"
+msgstr "Dodaj do ulubionych"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from favorites"
-msgstr "Usuń z Grupy"
+msgstr "Usuń z ulubionych"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3073,14 +3054,12 @@ msgid "New Resource..."
msgstr "Nowy zasób..."
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Expand All"
-msgstr "Rozwiń foldery"
+msgstr "Rozwiń wszystko"
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
-msgstr "Zwiń foldery"
+msgstr "Zwiń wszystko"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3102,9 +3081,8 @@ msgid "Re-Scan Filesystem"
msgstr "Przeskanuj system plików ponownie"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle split mode"
-msgstr "Przełącz tryby"
+msgstr "Przełącz tryb podziału"
#: editor/filesystem_dock.cpp
msgid "Search files"
@@ -3112,7 +3090,7 @@ msgstr "Przeszukaj pliki"
#: editor/filesystem_dock.cpp
msgid "Instance the selected scene(s) as child of the selected node."
-msgstr "Utwórz instancje wybranej sceny/scen jako dziecko wybranego węzła."
+msgstr "Utwórz instancję wybranej sceny/scen jako dziecko wybranego węzła."
#: editor/filesystem_dock.cpp
msgid ""
@@ -3139,24 +3117,20 @@ msgid "Create Script"
msgstr "Utwórz Skrypt"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find in Files"
msgstr "Znajdź w plikach"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "Znajdź: "
+msgstr "Znajdź:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "Folder: "
+msgstr "Folder:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "Filtry"
+msgstr "Filtry:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3335,12 +3309,10 @@ msgid "Failed to load resource."
msgstr "Nie udało się wczytać zasobu."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
msgstr "Rozwiń wszystkie właściwości"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
msgstr "Zwiń wszystkie właściwości"
@@ -3358,7 +3330,6 @@ msgid "Paste Params"
msgstr "Wklej parametry"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Edit Resource Clipboard"
msgstr "Edytuj schowek zasobów"
@@ -3473,7 +3444,7 @@ msgstr "Usuń wielokąt i punkt"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid "Create a new polygon from scratch"
-msgstr "Utwórz nowy wielokąt"
+msgstr "Utwórz nowy wielokąt od zera"
#: editor/plugins/abstract_polygon_2d_editor.cpp
msgid ""
@@ -4038,7 +4009,6 @@ msgid "TimeScale Node"
msgstr "Węzeł Skalowania Czasu"
#: editor/plugins/animation_tree_player_editor_plugin.cpp
-#, fuzzy
msgid "TimeSeek Node"
msgstr "Węzeł TimeSeek"
@@ -4301,9 +4271,8 @@ msgid "Resize CanvasItem"
msgstr "Zmień rozmiar CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale CanvasItem"
-msgstr "Obróć CanvasItem"
+msgstr "Skaluj CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
@@ -4368,9 +4337,8 @@ msgid "Rotate Mode"
msgstr "Tryb Rotacji"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Mode"
-msgstr "Tryb skalowania (R)"
+msgstr "Tryb skalowania"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4469,9 +4437,8 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Odblokuj selekcję węzłów podrzędnych."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton Options"
-msgstr "Szkielet..."
+msgstr "Opcje szkieletu"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
@@ -4525,7 +4492,7 @@ msgstr "Pokaż widok"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "Pokaż ikony grup i blokady"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -4713,7 +4680,7 @@ msgstr "Stwórz Occluder Polygon"
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Create a new polygon from scratch."
-msgstr "Utwórz nowy wielokąt."
+msgstr "Utwórz nowy wielokąt od zera."
#: editor/plugins/light_occluder_2d_editor_plugin.cpp
msgid "Edit existing polygon:"
@@ -4814,7 +4781,6 @@ msgid "Create Trimesh Collision Sibling"
msgstr "Utwórz trójsiatkę sąsiednich kolizji"
#: editor/plugins/mesh_instance_editor_plugin.cpp
-#, fuzzy
msgid "Create Convex Collision Sibling"
msgstr "Utwórz wypukłego sąsiada kolizji"
@@ -4968,9 +4934,8 @@ msgid "Create Navigation Polygon"
msgstr "Utwórz wielokąt nawigacyjny"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Generating Visibility Rect"
-msgstr "Wygeneruj prostokąta widzialności"
+msgstr "Generowanie prostokąta widzialności"
#: editor/plugins/particles_2d_editor_plugin.cpp
#, fuzzy
@@ -5219,49 +5184,43 @@ msgstr "Przesuń złącze"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid ""
"The skeleton property of the Polygon2D does not point to a Skeleton2D node"
-msgstr ""
+msgstr "Właściwość skeleton węzła Polygon2D nie wskazuje na węzeł Skeleton2D"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync bones"
-msgstr "Pokaż kości"
+msgstr "Synchronizuj kości"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Create UV Map"
msgstr "Utwórz Mapę UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon & UV"
-msgstr "Utwórz Polygon"
+msgstr "Utwórz wielokąt i UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Split point with itself."
-msgstr ""
+msgstr "Podziel punkt ze sobÄ…."
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Split can't form an existing edge."
-msgstr ""
+msgstr "Podział nie może uformować istniejącej krawędzi."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Split already exists."
-msgstr "Akcja %s już istnieje!"
+msgstr "Podział już istnieje."
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Add Split"
-msgstr "Dodaj punkt"
+msgstr "Dodaj podział"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Invalid Split: "
-msgstr "Niepoprawna ścieżka!"
+msgstr "Niepoprawny podział: "
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Remove Split"
-msgstr "Usuń punkt"
+msgstr "Usuń podział"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Transform UV Map"
@@ -5269,7 +5228,7 @@ msgstr "Przekształć Mapę UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Paint bone weights"
-msgstr ""
+msgstr "Maluj wagi kości"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon 2D UV Editor"
@@ -5277,27 +5236,23 @@ msgstr "WielokÄ…t 2D UV Edytor"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UV"
-msgstr ""
+msgstr "UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Poly"
-msgstr "Edytuj wielokÄ…t"
+msgstr "WielokÄ…t"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Splits"
-msgstr "Podziel Ścieżkę"
+msgstr "Podziały"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Bones"
-msgstr "Utwórz Kości"
+msgstr "Kości"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Create Polygon"
-msgstr "Utwórz Polygon"
+msgstr "Utwórz wielokąt"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Move Point"
@@ -5329,24 +5284,23 @@ msgstr "Skaluj WielokÄ…t"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Connect two points to make a split"
-msgstr ""
+msgstr "Połącz dwa punkty, by utworzyć podział"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Select a split to erase it"
-msgstr "Najpierw wybierz ustawienie z listy!"
+msgstr "Wybierz podział, by go usunąć"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Paint weights with specified intensity"
-msgstr ""
+msgstr "Maluj wagi z podaną intensywnością"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "UnPaint weights with specified intensity"
-msgstr ""
+msgstr "Odmaluj wagi z podaną intensywnością"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Radius:"
-msgstr ""
+msgstr "Promień:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Polygon->UV"
@@ -5361,9 +5315,8 @@ msgid "Clear UV"
msgstr "Wyczyść UV"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Settings"
-msgstr "Ustawienia GridMap"
+msgstr "Ustawienia siatki"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Enable Snap"
@@ -5374,34 +5327,28 @@ msgid "Grid"
msgstr "Siatka"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Configure Grid:"
-msgstr "Konfiguruj przyciÄ…ganie"
+msgstr "Konfiguruj siatkÄ™:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset X:"
-msgstr "Offset siatki:"
+msgstr "Przesunięcie X siatki:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Offset Y:"
-msgstr "Offset siatki:"
+msgstr "Przesunięcie Y siatki:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step X:"
-msgstr "Krok siatki:"
+msgstr "Krok X siatki:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Grid Step Y:"
-msgstr "Krok siatki:"
+msgstr "Krok Y siatki:"
#: editor/plugins/polygon_2d_editor_plugin.cpp
-#, fuzzy
msgid "Sync Bones to Polygon"
-msgstr "Skaluj WielokÄ…t"
+msgstr "Synchronizuj kości z wielokątem"
#: editor/plugins/resource_preloader_editor_plugin.cpp
msgid "ERROR: Couldn't load resource!"
@@ -5450,13 +5397,12 @@ msgid "Load Resource"
msgstr "Wczytaj Zasób"
#: editor/plugins/resource_preloader_editor_plugin.cpp
-#, fuzzy
msgid "ResourcePreloader"
-msgstr "Ścieżka zasobu"
+msgstr "Wstępny ładowacz zasobów"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "AnimationTree has no path set to an AnimationPlayer"
-msgstr ""
+msgstr "Węzeł AnimationTree nie ma ustawionej ścieżki do AnimationPlayer"
#: editor/plugins/root_motion_editor_plugin.cpp
msgid "Path to AnimationPlayer is invalid"
@@ -5471,24 +5417,20 @@ msgid "Close and save changes?"
msgstr "Zamknąć i zapisać zmiany?"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error writing TextFile:"
-msgstr "BÅ‚Ä…d wczytywania obrazu:"
+msgstr "BÅ‚Ä…d pisania pliku tekstowego:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error: could not load file."
-msgstr "Nie można wczytać obrazu"
+msgstr "Błąd: nie udało się wczytać pliku."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error could not load file."
-msgstr "Nie można wczytać obrazu"
+msgstr "Błąd nie udało się wczytać pliku."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error saving file!"
-msgstr "BÅ‚Ä…d podczas zapisywania TileSet!"
+msgstr "BÅ‚Ä…d zapisywania pliku!"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error while saving theme"
@@ -5507,19 +5449,16 @@ msgid "Error importing"
msgstr "BÅ‚Ä…d importowania"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile..."
-msgstr "Utwórz katalog..."
+msgstr "Nowy plik tekstowy..."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Open File"
msgstr "Otwórz plik"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Save File As..."
-msgstr "Zapisz jako..."
+msgstr "Zapisz plik jako..."
#: editor/plugins/script_editor_plugin.cpp
msgid "Import Theme"
@@ -5536,12 +5475,11 @@ msgstr " Referencja klas"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle alphabetical sorting of the method list."
-msgstr ""
+msgstr "Przełącz alfabetyczne sortowanie listy metod."
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Sort"
-msgstr "Sortuj:"
+msgstr "Sortuj"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp editor/scene_tree_dock.cpp
@@ -5568,9 +5506,8 @@ msgid "File"
msgstr "Plik"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "New TextFile"
-msgstr "Pokaż pliki"
+msgstr "Nowy plik tekstowy"
#: editor/plugins/script_editor_plugin.cpp
msgid "Save All"
@@ -5585,7 +5522,6 @@ msgid "Copy Script Path"
msgstr "Skopiuj ścieżkę skryptu"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "History Previous"
msgstr "Poprzedni plik"
@@ -5657,9 +5593,8 @@ msgid "Keep Debugger Open"
msgstr "Pozostaw Debugger otwarty"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Debug with External Editor"
-msgstr "Debugowanie z zewnętrznego edytora"
+msgstr "Debugowanie z zewnętrznym edytorem"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
@@ -5702,32 +5637,28 @@ msgid "Debugger"
msgstr "Debugger"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
-msgstr "Wyszukaj w Pomocy"
+msgstr "Wyniki wyszukiwania"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Line"
-msgstr "Linia:"
+msgstr "Linia"
#: editor/plugins/script_text_editor.cpp
msgid "(ignore)"
-msgstr ""
+msgstr "(ignoruj)"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "Przejdź do funkcji..."
+msgstr "Przejdź do funkcji"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
msgstr "Jedynie zasoby z systemu plików mogą zostać tu upuszczone."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Lookup Symbol"
-msgstr "Uzupełnij symbol"
+msgstr "Podejrzyj symbol"
#: editor/plugins/script_text_editor.cpp
msgid "Pick Color"
@@ -5751,11 +5682,11 @@ msgstr "Wielkie litery na początku słów"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Syntax Highlighter"
-msgstr ""
+msgstr "Podświetlacz składni"
#: editor/plugins/script_text_editor.cpp editor/plugins/text_editor.cpp
msgid "Standard"
-msgstr ""
+msgstr "Standardowy"
#: editor/plugins/script_text_editor.cpp scene/gui/line_edit.cpp
#: scene/gui/text_edit.cpp
@@ -5808,12 +5739,10 @@ msgid "Trim Trailing Whitespace"
msgstr "Przytnij końcowe spacje"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Spaces"
msgstr "Zamień wcięcia na spacje"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Tabs"
msgstr "Zamień wcięcia na tabulatory"
@@ -5824,38 +5753,33 @@ msgstr "Automatyczne wcięcie"
#: editor/plugins/script_text_editor.cpp
#: modules/visual_script/visual_script_editor.cpp
msgid "Toggle Breakpoint"
-msgstr "Przełącz pułapkę"
+msgstr "Przełącz punkt wstrzymania"
#: editor/plugins/script_text_editor.cpp
msgid "Remove All Breakpoints"
-msgstr "Usuń wszystkie pułapki"
+msgstr "Usuń wszystkie punkty wstrzymania"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Breakpoint"
-msgstr "Przejdź do następnej pułapki"
+msgstr "Przejdź do następnego punktu wstrzymania"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Breakpoint"
-msgstr "Przejdź do poprzedniej pułapki"
+msgstr "Przejdź do poprzedniego punktu wstrzymania"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Znajdź poprzedni"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find in Files..."
-msgstr "Filtrowanie plików..."
+msgstr "Znajdź w plikach..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
msgstr "Przejdź do funkcji..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
msgstr "Przejdź do linii..."
@@ -5869,40 +5793,35 @@ msgstr "Shader"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "This skeleton has no bones, create some children Bone2D nodes."
-msgstr ""
+msgstr "Ten szkielet nie ma kości. Stwórz jakieś węzły potomne Bone2D."
#: editor/plugins/skeleton_2d_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton2D"
-msgstr "Szkielet..."
+msgstr "Szkielet 2D"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Make Rest Pose (From Bones)"
-msgstr ""
+msgstr "Utwórz pozę spoczynkową (z kości)"
#: editor/plugins/skeleton_2d_editor_plugin.cpp
msgid "Set Bones to Rest Pose"
-msgstr ""
+msgstr "Ustaw kości do pozy spoczynkowej"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical bones"
-msgstr "Utwórz siatkę nawigacyjną (Navigation Mesh)"
+msgstr "Utwórz fizyczne kości"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton"
-msgstr "Szkielet..."
+msgstr "Szkielet"
#: editor/plugins/skeleton_editor_plugin.cpp
-#, fuzzy
msgid "Create physical skeleton"
-msgstr "Utwórz solucję C#"
+msgstr "Utwórz fizyczny szkielet"
#: editor/plugins/skeleton_ik_editor_plugin.cpp
-#, fuzzy
msgid "Play IK"
-msgstr "Uruchom"
+msgstr "Odtwórz IK"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Orthogonal"
@@ -5930,29 +5849,25 @@ msgstr "Transformacja osi Z."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Plane Transform."
-msgstr ""
+msgstr "Pokaż transformację płaszczyzny."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Scaling: "
-msgstr "Skala:"
+msgstr "Skalowanie: "
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Translating: "
-msgstr "TÅ‚umaczenia:"
+msgstr "Przesuwanie: "
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Rotating %s degrees."
msgstr "Obracanie o %s stopni."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Keying is disabled (no key inserted)."
msgstr "Kluczowanie jest wyłączone (nie wstawiono klucza)."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Animation Key Inserted."
msgstr "Wstawiono klucz animacji."
@@ -5962,15 +5877,13 @@ msgstr "Wysokość"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Yaw"
-msgstr ""
+msgstr "Odchylenie"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Objects Drawn"
msgstr "Narysowane obiekty"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Material Changes"
msgstr "Zmiany materiału"
@@ -5979,9 +5892,8 @@ msgid "Shader Changes"
msgstr "Zmiany Shadera"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Surface Changes"
-msgstr "Odśwież Zmiany"
+msgstr "Zmiany powierzchni"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Draw Calls"
@@ -6052,9 +5964,8 @@ msgid "This operation requires a single selected node."
msgstr "Ta operacja wymaga pojedynczego wybranego węzła."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Lock View Rotation"
-msgstr "Wyświetlaj informacje"
+msgstr "Zablokuj obrót widoku"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
@@ -6079,7 +5990,7 @@ msgstr "Wyświetlaj środowisko"
#: editor/plugins/spatial_editor_plugin.cpp
#, fuzzy
msgid "View Gizmos"
-msgstr "Wyświetlaj uchwyty"
+msgstr "Pokaż uchwyty"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Information"
@@ -6094,18 +6005,16 @@ msgid "Half Resolution"
msgstr "Połowa rozdzielczości"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Audio Listener"
-msgstr "Nasłuchiwacz dźwięku"
+msgstr "Słuchacz dźwięku"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Doppler Enable"
msgstr "Efekt Dopplera"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Cinematic Preview"
-msgstr "Tworzenie podglÄ…du Mesh"
+msgstr "PodglÄ…d kinowy"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Freelook Left"
@@ -6136,9 +6045,8 @@ msgid "Freelook Speed Modifier"
msgstr "Zmiennik prędkości \"Wolnego widoku\""
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View Rotation Locked"
-msgstr "Wyświetlaj informacje"
+msgstr "Obroty widoku zablokowane"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
@@ -6171,9 +6079,8 @@ msgid "Scale Mode (R)"
msgstr "Tryb skalowania (R)"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Local Coords"
-msgstr "Local Coords"
+msgstr "Lokalne koordynaty"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Local Space Mode (%s)"
@@ -6228,24 +6135,20 @@ msgid "Align Selection With View"
msgstr "Dopasuj zaznaczenie do widoku"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Tool Select"
-msgstr "Wybierz narzędzie"
+msgstr "Narzędzie wyboru"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Tool Move"
-msgstr "PrzenieÅ›"
+msgstr "Narzędzie poruszania"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Tool Rotate"
-msgstr "Narzędzie Obracanie"
+msgstr "Narzędzie obracania"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Tool Scale"
-msgstr "Narzędzia Skala"
+msgstr "Narzędzie skalowania"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Toggle Freelook"
@@ -6257,7 +6160,7 @@ msgstr "Przekształcanie"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Snap object to floor"
-msgstr ""
+msgstr "Przyciągnij obiekt do podłogi"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Transform Dialog..."
@@ -6288,9 +6191,8 @@ msgid "4 Viewports"
msgstr "4 widoki"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Gizmos"
-msgstr "Wyświetlaj uchwyty"
+msgstr "Uchwyty"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "View Origin"
@@ -6368,51 +6270,45 @@ msgid "Post"
msgstr "Po"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite is empty!"
-msgstr "Ścieżka zapisu jest pusta!"
+msgstr "Sprite jest pusty!"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Can't convert a sprite using animation frames to mesh."
msgstr ""
+"Nie można przekonwertować sprite'a używającego klatek animacji na siatkę."
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Invalid geometry, can't replace by mesh."
-msgstr ""
+msgstr "Nieprawidłowa geometria, nie można zastąpić przez siatkę."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Sprite"
-msgstr "SpriteFrames"
+msgstr "Sprite"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Convert to 2D Mesh"
-msgstr "Konwersja do %s"
+msgstr "Konwertuj do siatki 2D"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Create 2D Mesh"
-msgstr "Utwórz siatkę zarysu"
+msgstr "Utwórz siatkę 2D"
#: editor/plugins/sprite_editor_plugin.cpp
msgid "Simplification: "
-msgstr ""
+msgstr "Uproszczenie: "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Grow (Pixels): "
-msgstr "PrzyciÄ…ganie (piksele):"
+msgstr "Wzrost (piksele): "
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Update Preview"
-msgstr "PodglÄ…d"
+msgstr "Odśwież podgląd"
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Settings:"
-msgstr "Ustawienia"
+msgstr "Ustawienia:"
#: editor/plugins/sprite_frames_editor_plugin.cpp
msgid "ERROR: Couldn't load frame resource!"
@@ -6516,10 +6412,9 @@ msgstr "Krok:"
#: editor/plugins/texture_region_editor_plugin.cpp
msgid "Sep.:"
-msgstr ""
+msgstr "Sep.:"
#: editor/plugins/texture_region_editor_plugin.cpp
-#, fuzzy
msgid "TextureRegion"
msgstr "Obszar tekstury"
@@ -6548,9 +6443,8 @@ msgid "Edit theme..."
msgstr "Edytuj motyw interfejsu..."
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Theme editing menu."
-msgstr "Menu zmiany wyglÄ…du programu."
+msgstr "Menu edycji motywu."
#: editor/plugins/theme_editor_plugin.cpp
msgid "Add Class Items"
@@ -6585,23 +6479,20 @@ msgid "Item"
msgstr "Element"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Check Item"
-msgstr "Sprawdź element"
+msgstr "Element wyboru"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Checked Item"
-msgstr "Zaznaczony element"
+msgstr "Zaznaczony element wyboru"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Radio Item"
-msgstr "Dodaj element"
+msgstr "Element opcji"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Checked Radio Item"
-msgstr "Zaznaczony element"
+msgstr "Zaznaczony element opcji"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Has"
@@ -6612,17 +6503,14 @@ msgid "Many"
msgstr "Wiele"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Has,Many,Options"
-msgstr "Ma,Wiele,Różnych,Opcji!"
+msgstr "Ma,Wiele,Opcji"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Tab 1"
msgstr "Zakładka 1"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Tab 2"
msgstr "Zakładka 2"
@@ -6631,9 +6519,8 @@ msgid "Tab 3"
msgstr "Zakładka 3"
#: editor/plugins/theme_editor_plugin.cpp
-#, fuzzy
msgid "Data Type:"
-msgstr "Rodzaj Daty:"
+msgstr "Typ danych:"
#: editor/plugins/theme_editor_plugin.cpp
msgid "Icon"
@@ -6660,14 +6547,12 @@ msgid "Erase Selection"
msgstr "Usuń zaznaczenie"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Fix Invalid Tiles"
-msgstr "Niewłaściwa nazwa."
+msgstr "Napraw niewłaściwe kafelki"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Cut Selection"
-msgstr "Wyśrodkowywanie na zaznaczeniu"
+msgstr "Wytnij zaznaczenie"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6679,7 +6564,7 @@ msgstr "Rysuj LiniÄ™"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Rectangle Paint"
-msgstr ""
+msgstr "Malowanie prostokÄ…tne"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Bucket Fill"
@@ -6690,9 +6575,8 @@ msgid "Erase TileMap"
msgstr "Wyczyść TileMap"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Find Tile"
-msgstr "Znajdź tile"
+msgstr "Znajdź kafelek"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Transpose"
@@ -6708,49 +6592,43 @@ msgstr "Odbij Y"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint Tile"
-msgstr "Maluj Tile"
+msgstr "Maluj kafelek"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Pick Tile"
-msgstr "Wybierz tile"
+msgstr "Wybierz kafelek"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "Usuń zaznaczone"
+msgstr "Kopiuj zaznaczenie"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate left"
-msgstr "Tryb Rotacji"
+msgstr "Obróć w lewo"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate right"
-msgstr "Przesuń w prawo"
+msgstr "Obróć w prawo"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip horizontally"
-msgstr ""
+msgstr "Odbij poziomo"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip vertically"
-msgstr ""
+msgstr "Odbij pionowo"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear transform"
-msgstr "Przekształcanie"
+msgstr "Wyczyść przekształcenie"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Add Texture(s) to TileSet"
-msgstr "Dodaj węzeł(y) z drzewa"
+msgstr "Dodaj teksturÄ™ do TileSetu"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove current Texture from TileSet"
-msgstr "Usuń punkt krzywej"
+msgstr "Usuń aktualną teksturę z TileSetu"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from Scene"
@@ -6765,18 +6643,20 @@ msgid ""
"Select sub-tile to use as icon, this will be also used on invalid autotile "
"bindings."
msgstr ""
+"Wybierz pod-kafelek do użycia jako ikona. Zostanie on użyty również do "
+"niewłaściwych ustawień autokafelków."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Display tile's names (hold Alt Key)"
-msgstr ""
+msgstr "Pokaż nazwy kafelków (przytrzymaj Alt)"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Remove selected texture and ALL TILES which use it?"
-msgstr ""
+msgstr "Usunąć wybraną teksturę i WSZYSTKIE KAFELKI, które jej używają?"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
-msgstr ""
+msgstr "Nie wybrano tekstury do usunięcia."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Create from scene?"
@@ -6788,13 +6668,15 @@ msgstr "Połącz ze sceny?"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "%s file(s) were not added because was already on the list."
-msgstr ""
+msgstr "%s plik(ów) nie zostało dodane, bo był(y) już na liście."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Drag handles to edit Rect.\n"
"Click on another Tile to edit it."
msgstr ""
+"Przeciągnij uchwyty, by edytować prostokąt.\n"
+"Kliknij na inny kafelek, by go edytować."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -6802,13 +6684,17 @@ msgid ""
"RMB: set bit off.\n"
"Click on another Tile to edit it."
msgstr ""
+"LPM: włącz bit.\n"
+"PPM: wyłącz bit.\n"
+"Kliknij inny kafelek, by go edytować."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid ""
"Select current edited sub-tile.\n"
"Click on another Tile to edit it."
-msgstr "Wybierz aktualnie edytowany sub-tile."
+msgstr ""
+"Wybierz aktualnie edytowany pod-kafelek.\n"
+"Kliknij inny kafelek, by go edytować."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -6816,42 +6702,41 @@ msgid ""
"bindings.\n"
"Click on another Tile to edit it."
msgstr ""
+"Wybierz pod-kafelek do użycia jako ikona. Zostanie on również użyty do "
+"niewłaściwych ustawień autokafelków.\n"
+"Kliknij inny kafelek, by go edytować."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
"Select sub-tile to change its priority.\n"
"Click on another Tile to edit it."
msgstr ""
+"Wybierz pod-kafelek, by zmienić jego priorytet.\n"
+"Kliknij inny kafelek, by go edytować."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "This property can't be changed."
-msgstr "Ta operacja nie może zostać wykonana bez sceny."
+msgstr "Ta właściwość nie może zostać zmieniona."
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Tile Set"
-msgstr "TileSet..."
+msgstr "Zbiór kafelków"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Vertex"
-msgstr "Wierzchołki"
+msgstr "Wierzchołek"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Fragment"
-msgstr "Argumenty:"
+msgstr "Fragmenty"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "Light"
-msgstr "Prawa"
+msgstr "Światło"
#: editor/plugins/visual_shader_editor_plugin.cpp
-#, fuzzy
msgid "VisualShader"
-msgstr "Shader"
+msgstr "Shader wizualny"
#: editor/project_export.cpp
msgid "Runnable"
@@ -6871,12 +6756,11 @@ msgstr "Brakuje szablonów eksportu dla tej platformy lub są uszkodzone:"
#: editor/project_export.cpp
msgid "Release"
-msgstr ""
+msgstr "Wydanie"
#: editor/project_export.cpp
-#, fuzzy
msgid "Exporting All"
-msgstr "Exportowanie do %s"
+msgstr "Eksportowanie wszystkiego"
#: editor/project_export.cpp
msgid "Presets"
@@ -6887,9 +6771,8 @@ msgid "Add..."
msgstr "Dodaj..."
#: editor/project_export.cpp
-#, fuzzy
msgid "Export Path:"
-msgstr "Szablon eksportu:"
+msgstr "Ścieżka eksportu:"
#: editor/project_export.cpp
msgid "Resources"
@@ -6954,14 +6837,12 @@ msgid "Export PCK/Zip"
msgstr "Eksport PCK/Zip"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "Tryb eksportu:"
+msgstr "Tryb eksportu?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "Eksport"
+msgstr "Eksportuj wszystko"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
@@ -6976,32 +6857,29 @@ msgid "The path does not exist."
msgstr "Ścieżka nie istnieje."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid '.zip' project file, does not contain a 'project.godot' file."
-msgstr "Proszę wybrać folder nie zawierający pliku 'project.godot'."
+msgstr ""
+"Niewłaściwy projekt pliku \".zip\", nie zawiera pliku \"project.godot\"."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose an empty folder."
-msgstr "Proszę wybrać plik 'project.godot'."
+msgstr "Proszę wybrać pusty folder."
#: editor/project_manager.cpp
-#, fuzzy
msgid "Please choose a 'project.godot' or '.zip' file."
-msgstr "Proszę wybrać plik 'project.godot'."
+msgstr "Proszę wybrać plik \"project.godot\" lub \".zip\"."
#: editor/project_manager.cpp
msgid "Directory already contains a Godot project."
-msgstr ""
+msgstr "Folder już zawiera projekt Godota."
#: editor/project_manager.cpp
msgid "Imported Project"
msgstr "Zaimportowano projekt"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Invalid Project Name."
-msgstr "Nazwa projektu:"
+msgstr "Nieprawidłowa nazwa projektu."
#: editor/project_manager.cpp
msgid "Couldn't create folder."
@@ -7020,11 +6898,12 @@ 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."
-msgstr "Nie można było edytować engine.cfg w ścieżce projektu."
+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."
@@ -7083,9 +6962,8 @@ msgid "Project Path:"
msgstr "Ścieżka do projektu:"
#: editor/project_manager.cpp
-#, fuzzy
msgid "Project Installation Path:"
-msgstr "Ścieżka do projektu:"
+msgstr "Ścieżka instalacji projektu:"
#: editor/project_manager.cpp
msgid "Browse"
@@ -7205,13 +7083,12 @@ msgid "Mouse Button"
msgstr "Przycisk myszy"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. it cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'"
msgstr ""
-"Niepoprawna nazwa akcji. Nazwa nie może być pusta ani zawierać znaki takie "
-"jak: '/', ':', '=', '\\' lub '\"'"
+"Niepoprawna nazwa akcji. Nie może być pusta ani zawierać '/', ':', '=', '\\' "
+"lub '\"'"
#: editor/project_settings_editor.cpp
msgid "Action '%s' already exists!"
@@ -7222,18 +7099,16 @@ msgid "Rename Input Action Event"
msgstr "Zmień nazwę zdarzenia akcji wejścia"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Change Action deadzone"
-msgstr "Zmień nazwę animacji:"
+msgstr "Zmień martwą strefę akcji"
#: editor/project_settings_editor.cpp
msgid "Add Input Action Event"
msgstr "Dodaj zdarzenie akcji wejścia"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "All Devices"
-msgstr "UrzÄ…dzenie"
+msgstr "Wszystkie urzÄ…dzenia"
#: editor/project_settings_editor.cpp
msgid "Device"
@@ -7280,24 +7155,20 @@ msgid "Wheel Down Button"
msgstr "Kółko myszy w dół"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Left Button"
-msgstr "Kółko myszy w górę"
+msgstr "Kółko w lewo"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "Wheel Right Button"
-msgstr "Prawy guzik"
+msgstr "Kółko w prawo"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 1"
-msgstr "Przycisk 6"
+msgstr "Przycisk X 1"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid "X Button 2"
-msgstr "Przycisk 6"
+msgstr "Przycisk X 2"
#: editor/project_settings_editor.cpp
msgid "Joypad Axis Index:"
@@ -7368,13 +7239,12 @@ msgid "Delete Item"
msgstr "Usuń element"
#: editor/project_settings_editor.cpp
-#, fuzzy
msgid ""
"Invalid action name. It cannot be empty nor contain '/', ':', '=', '\\' or "
"'\"'."
msgstr ""
-"Niepoprawna nazwa akcji. Nazwa nie może być pusta ani zawierać znaki takie "
-"jak: '/', ':', '=', '\\' lub '\"'"
+"Niepoprawna nazwa akcji. Nie może być pusta ani zawierać '/', ':', '=', '\\' "
+"lub '\"'."
#: editor/project_settings_editor.cpp
msgid "Already existing"
@@ -7394,7 +7264,7 @@ msgstr "Ustawienia zapisane pomyślnie."
#: editor/project_settings_editor.cpp
msgid "Override for Feature"
-msgstr ""
+msgstr "Nadpisanie dla cechy"
#: editor/project_settings_editor.cpp
msgid "Add Translation"
@@ -7410,7 +7280,7 @@ msgstr "Dodaj zmapowaną ścieżkę"
#: editor/project_settings_editor.cpp
msgid "Resource Remap Add Remap"
-msgstr ""
+msgstr "Dodaj mapowanie zasobu"
#: editor/project_settings_editor.cpp
msgid "Change Resource Remap Language"
@@ -7446,7 +7316,7 @@ msgstr "Nadpisz dla..."
#: editor/project_settings_editor.cpp editor/settings_config_dialog.cpp
msgid "Editor must be restarted for changes to take effect"
-msgstr ""
+msgstr "Edytor musi zostać zrestartowany, by zmiany miały efekt"
#: editor/project_settings_editor.cpp
msgid "Input Map"
@@ -7462,7 +7332,7 @@ msgstr "Akcja"
#: editor/project_settings_editor.cpp
msgid "Deadzone"
-msgstr ""
+msgstr "Martwa strefa"
#: editor/project_settings_editor.cpp
msgid "Device:"
@@ -7569,7 +7439,6 @@ msgid "Pick a Node"
msgstr "Wybierz węzeł"
#: editor/property_editor.cpp
-#, fuzzy
msgid "Bit %d, val %d."
msgstr "Bit %d, wartość %d."
@@ -7601,44 +7470,39 @@ msgstr "Zmień nazwę"
#: editor/rename_dialog.cpp
msgid "Prefix"
-msgstr ""
+msgstr "Przedrostek"
#: editor/rename_dialog.cpp
msgid "Suffix"
-msgstr ""
+msgstr "Przyrostek"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Advanced options"
-msgstr "Opcje przyciÄ…gania"
+msgstr "Opcje zaawansowane"
#: editor/rename_dialog.cpp
msgid "Substitute"
-msgstr ""
+msgstr "Substytut"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node name"
-msgstr "Nazwa węzła:"
+msgstr "Nazwa węzła"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr ""
+msgstr "Nazwa rodzica węzła, jeśli dostępna"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Node type"
-msgstr "Znajdź typ węzła"
+msgstr "Typ węzła"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Current scene name"
-msgstr "Aktualna scena"
+msgstr "Nazwa aktualnej sceny"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Root node name"
-msgstr "Nazwa węzła:"
+msgstr "Nazwa korzenia"
#: editor/rename_dialog.cpp
msgid ""
@@ -7652,35 +7516,35 @@ msgstr ""
#: editor/rename_dialog.cpp
msgid "If set the counter restarts for each group of child nodes"
-msgstr ""
+msgstr "Gdy ustawione, licznik restartuje dla każdej grupy węzłów potomnych"
#: editor/rename_dialog.cpp
msgid "Initial value for the counter"
-msgstr ""
+msgstr "Początkowa wartość dla licznika"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Step"
-msgstr "Krok:"
+msgstr "Krok"
#: editor/rename_dialog.cpp
msgid "Amount by which counter is incremented for each node"
-msgstr ""
+msgstr "Liczba, o którą licznik jest zwiększany dla każdego węzła"
#: editor/rename_dialog.cpp
msgid "Padding"
-msgstr ""
+msgstr "Wyrównanie"
#: editor/rename_dialog.cpp
msgid ""
"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
msgstr ""
+"Minimalna liczba cyfr dla licznika.\n"
+"Brakujące cyfry są wyrównywane zerami poprzedzającymi."
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Regular Expressions"
-msgstr "Zmień wyrażenie"
+msgstr "Wyrażenia regularne"
#: editor/rename_dialog.cpp
#, fuzzy
@@ -7693,30 +7557,27 @@ msgstr "Bez zmian"
#: editor/rename_dialog.cpp
msgid "CamelCase to under_scored"
-msgstr ""
+msgstr "CamelCase na under_scored"
#: editor/rename_dialog.cpp
msgid "under_scored to CamelCase"
-msgstr ""
+msgstr "under_scored na CamelCase"
#: editor/rename_dialog.cpp
msgid "Case"
-msgstr ""
+msgstr "Notacja"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Lowercase"
-msgstr "Małe Litery"
+msgstr "Na małe litery"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "To Uppercase"
-msgstr "Wielkie Litery"
+msgstr "Na wielkie litery"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Reset"
-msgstr "Wyzeruj przybliżenie"
+msgstr "Resetuj"
#: editor/rename_dialog.cpp
msgid "Error"
@@ -7774,9 +7635,8 @@ msgstr ""
"Nie można utworzyć sceny '%s' ponieważ obecna scena jest jednym z jej wezłów."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Instance Scene(s)"
-msgstr "Instancja Scen(y)"
+msgstr "Dodaj instancjÄ™ sceny"
#: editor/scene_tree_dock.cpp
msgid "Instance Child Scene"
@@ -7791,12 +7651,10 @@ msgid "This operation can't be done on the tree root."
msgstr "Nie można wykonać tej operacji na głównym węźle drzewa."
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Move Node In Parent"
-msgstr "Przenieś węzeł w nadrzędny"
+msgstr "Przenieś węzeł w nadrzędnym"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Move Nodes In Parent"
msgstr "Przenieś węzły w nadrzędnym"
@@ -7825,6 +7683,8 @@ msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
msgstr ""
+"Wyłączenie \"edytowalnej instancji\" sprawi, że wszystkie właściwości węzła "
+"zostaną przywrócone do domyślnych."
#: editor/scene_tree_dock.cpp
msgid "Editable Children"
@@ -7835,34 +7695,28 @@ msgid "Load As Placeholder"
msgstr "Wczytaj jako zastępczy"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Local"
-msgstr "Uczyń lokalnym"
+msgstr "Zrób lokalne"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Create Root Node:"
-msgstr "Utwórz węzeł"
+msgstr "Utwórz korzeń:"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "2D Scene"
-msgstr "Scena"
+msgstr "Scena 2D"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "3D Scene"
-msgstr "Scena"
+msgstr "Scena 3D"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "User Interface"
-msgstr "Wyczyść dziedziczenie"
+msgstr "Interfejs użytkownika"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Custom Node"
-msgstr "Wytnij Węzły"
+msgstr "Inny węzeł"
#: editor/scene_tree_dock.cpp
msgid "Can't operate on nodes from a foreign scene!"
@@ -7905,9 +7759,8 @@ msgid "Clear Inheritance"
msgstr "Wyczyść dziedziczenie"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open documentation"
-msgstr "Otwórz dokumentację online"
+msgstr "Otwórz dokumentację"
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
@@ -7922,14 +7775,12 @@ msgid "Change Type"
msgstr "Zmień typ"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
-msgstr "Otwórz skrypt"
+msgstr "Rozszerz skrypt"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Make Scene Root"
-msgstr "To ma sens!"
+msgstr "Zmień na korzeń sceny"
#: editor/scene_tree_dock.cpp
msgid "Merge From Scene"
@@ -7956,7 +7807,7 @@ msgid ""
"Instance a scene file as a Node. Creates an inherited scene if no root node "
"exists."
msgstr ""
-"Stwórz instancję sceny jako węzeł. Tworzy dziedziczącą scenę jeśli węzeł "
+"Dodaj instancję sceny jako węzeł. Tworzy dziedziczącą scenę jeśli węzeł "
"główny nie istnieje."
#: editor/scene_tree_dock.cpp
@@ -7980,7 +7831,6 @@ msgid "Clear Inheritance? (No Undo!)"
msgstr "Wyczyścić dziedziczenie? (Nie można cofnąć!)"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid "Toggle Visible"
msgstr "Przełącz widoczność"
@@ -7989,12 +7839,11 @@ msgid "Node configuration warning:"
msgstr "Ostrzeżenie konfiguracji węzła:"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node has connection(s) and group(s).\n"
"Click to show signals dock."
msgstr ""
-"Węzeł posiada połączenia i grupy\n"
+"Węzeł posiada połączenie(a) i grupę(y).\n"
"Kliknij, aby wyświetlić panel sygnałów."
#: editor/scene_tree_editor.cpp
@@ -8014,27 +7863,24 @@ msgstr ""
"Kliknij, aby wyświetlić panel grup."
#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script"
msgstr "Otwórz skrypt"
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Node is locked.\n"
"Click to unlock it."
msgstr ""
"Węzeł jest zablokowany.\n"
-"Kliknij by odblokować"
+"Kliknij, by go odblokować."
#: editor/scene_tree_editor.cpp
-#, fuzzy
msgid ""
"Children are not selectable.\n"
"Click to make selectable."
msgstr ""
-"Dziecko nie jest możliwe do zaznaczenia.\n"
-"Kliknij by móc zaznaczyć"
+"Dzieci nie są możliwe do zaznaczenia.\n"
+"Kliknij, by móc zaznaczyć."
#: editor/scene_tree_editor.cpp
msgid "Toggle Visibility"
@@ -8045,6 +7891,8 @@ msgid ""
"AnimationPlayer is pinned.\n"
"Click to unpin."
msgstr ""
+"AnimationPlayer jest przypięty.\n"
+"Kliknij, by odpiąć."
#: editor/scene_tree_editor.cpp
msgid "Invalid node name, the following characters are not allowed:"
@@ -8083,18 +7931,16 @@ msgid "N/A"
msgstr "N/A"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Open Script/Choose Location"
-msgstr "Otwórz edytor skryptów"
+msgstr "Otwórz skrypt/Wybierz lokację"
#: editor/script_create_dialog.cpp
msgid "Path is empty"
msgstr "Ścieżka jest pusta"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty"
-msgstr "Ścieżka zapisu jest pusta!"
+msgstr "Nazwa pliku jest pusta"
#: editor/script_create_dialog.cpp
msgid "Path is not local"
@@ -8185,9 +8031,8 @@ msgid "Bytes:"
msgstr "Bajty:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Stack Trace"
-msgstr "Ramki stosu"
+msgstr "Åšlad stosu"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8275,7 +8120,7 @@ msgstr "Typ klikniętej kontrolki:"
#: editor/script_editor_debugger.cpp
msgid "Live Edit Root:"
-msgstr ""
+msgstr "Korzeń edycji:"
#: editor/script_editor_debugger.cpp
msgid "Set From Tree"
@@ -8295,7 +8140,7 @@ msgstr "Zmień promień światła"
#: editor/spatial_editor_gizmos.cpp
msgid "Change AudioStreamPlayer3D Emission Angle"
-msgstr ""
+msgstr "Zmień kąt emisji węzła AudioStreamPlayer3D"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Camera FOV"
@@ -8307,11 +8152,11 @@ msgstr "Zmień rozmiar kamery"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Notifier AABB"
-msgstr ""
+msgstr "Zmień AABB powiadamiacza"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Particles AABB"
-msgstr ""
+msgstr "Zmień AABB cząsteczek"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Probe Extents"
@@ -8334,38 +8179,32 @@ msgid "Change Capsule Shape Height"
msgstr "Zmień wysokość kształtu kapsuły"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Radius"
-msgstr "Zmień średnicę Capsule Shape"
+msgstr "Zmień promień kształtu cylindra"
#: editor/spatial_editor_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Shape Height"
-msgstr "Zmień wysokość kształtu kapsuły"
+msgstr "Zmień wysokość kształtu cylindra"
#: editor/spatial_editor_gizmos.cpp
msgid "Change Ray Shape Length"
msgstr "Zmień długość Ray Shape"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Radius"
-msgstr "Zmień promień światła"
+msgstr "Zmień promień cylindra"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Cylinder Height"
-msgstr "Zmień wysokość kształtu kapsuły"
+msgstr "Zmień wysokość cylindra"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Inner Radius"
-msgstr "Zmień promień Sphere Shape"
+msgstr "Zmień wewnętrzny promień torusa"
#: modules/csg/csg_gizmos.cpp
-#, fuzzy
msgid "Change Torus Outer Radius"
-msgstr "Zmień promień światła"
+msgstr "Zmień zewnętrzny promień torusa"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Select the dynamic library for this entry"
@@ -8376,9 +8215,8 @@ msgid "Select dependencies of the library for this entry"
msgstr "Zaznacz zależności biblioteki dla tego pola"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
-#, fuzzy
msgid "Remove current entry"
-msgstr "Usuń punkt krzywej"
+msgstr "Usuń aktualny wpis"
#: modules/gdnative/gdnative_library_editor_plugin.cpp
msgid "Double click to create a new entry"
@@ -8455,21 +8293,19 @@ msgstr "Niepoprawna instancja słownika (niepoprawne podklasy)"
#: modules/gdscript/gdscript_functions.cpp
msgid "Object can't provide a length."
-msgstr ""
+msgstr "Obiekt nie może podać długości."
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Next Plane"
-msgstr "Następna zakładka"
+msgstr "Następna płaszczyzna"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Previous Plane"
-msgstr "Poprzednia zakładka"
+msgstr "Poprzednia płaszczyzna"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Plane:"
-msgstr ""
+msgstr "PÅ‚aszczyzna:"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Next Floor"
@@ -8488,9 +8324,8 @@ msgid "GridMap Delete Selection"
msgstr "GridMap Usuń zaznaczenie"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "GridMap Fill Selection"
-msgstr "GridMap Usuń zaznaczenie"
+msgstr "GridMap Wypełnij zaznaczenie"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Duplicate Selection"
@@ -8545,44 +8380,39 @@ msgstr "Kursor Obróć Z"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate X"
-msgstr ""
+msgstr "Kursor Obróć w tył X"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate Y"
-msgstr ""
+msgstr "Kursor Obróć w tył Y"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Back Rotate Z"
-msgstr ""
+msgstr "Kursor Obróć w tył Z"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "Cursor Clear Rotation"
-msgstr ""
+msgstr "Kursor Wyczyść obrót"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Create Area"
-msgstr "Tworzenie obszaru"
+msgstr "Utwórz obszar"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Create Exterior Connector"
-msgstr "Utwórz nowy projekt"
+msgstr "Utwórz łącznik zewnętrzny"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Erase Area"
msgstr "Usuń obszar"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear Selection"
-msgstr "Wyczyść zaznaczenie"
+msgstr "Wyczyść zaznaczone"
#: modules/gridmap/grid_map_editor_plugin.cpp
-#, fuzzy
msgid "Fill Selection"
-msgstr "Wszystkie zaznaczenia"
+msgstr "Wypełnij zaznaczone"
#: modules/gridmap/grid_map_editor_plugin.cpp
msgid "GridMap Settings"
@@ -8893,9 +8723,8 @@ msgid "Change Input Value"
msgstr "Zmień wartość wejściową"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Can't copy the function node."
-msgstr "Nie można skopiować funkcji węzła."
+msgstr "Nie można skopiować węzła funkcji."
#: modules/visual_script/visual_script_editor.cpp
msgid "Clipboard is empty!"
@@ -8970,9 +8799,8 @@ msgid "Paste Nodes"
msgstr "Wklej węzły"
#: modules/visual_script/visual_script_editor.cpp
-#, fuzzy
msgid "Edit Member"
-msgstr "Członkowie"
+msgstr "Edytuj członka"
#: modules/visual_script/visual_script_flow_control.cpp
msgid "Input type not iterable: "
@@ -8987,9 +8815,8 @@ msgid "Iterator became invalid: "
msgstr "Iterator stał się nieprawidłowy: "
#: modules/visual_script/visual_script_func_nodes.cpp
-#, fuzzy
msgid "Invalid index property name."
-msgstr "Nieprawidłowa nazwa klasy bazowej"
+msgstr "Nieprawidłowa nazwa właściwości indeksowej."
#: modules/visual_script/visual_script_func_nodes.cpp
msgid "Base object is not a Node!"
@@ -9033,17 +8860,16 @@ msgstr ""
"całkowitą (seq out), lub tekstową (error)."
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Search VisualScript"
-msgstr "Usuń węzeł VisualScript"
+msgstr "Przeszukaj VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "Przyjmij %s"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Set %s"
-msgstr ""
+msgstr "Ustaw %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9096,16 +8922,15 @@ msgstr ""
"przy czym pozostałe zostaną zignorowane."
#: scene/2d/collision_object_2d.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape2D or CollisionPolygon2D as a child to "
"define its shape."
msgstr ""
-"Ten węzeł nie posiada podwezła, który definiował by jego kształt, więc nie "
-"może wchodzić w interakcje.\n"
-"Powinieneś dodać węzeł \"CollisionShape2D\" lub \"CollisionPolygon2D\" jako "
-"podwęzeł aby zdefiniować kształt."
+"Ten węzeł nie posiada kształtu, więc nie może kolidować, czy wchodzić w "
+"interakcje z innymi obiektami.\n"
+"Rozważ dodanie węzła CollisionShape2D lub CollisionPolygon2D jako podrzędny, "
+"aby zdefiniować kształt."
#: scene/2d/collision_polygon_2d.cpp
msgid ""
@@ -9144,6 +8969,8 @@ msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"Animacja CPUParticles2D wymaga użycia CanvasItemMaterial z włączonym "
+"\"Particles Animation\"."
#: scene/2d/light_2d.cpp
msgid ""
@@ -9199,6 +9026,8 @@ msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"Animacja Particles2D wymaga użycia CanvasItemMaterial z włączonym "
+"\"Particles Animation\"."
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
@@ -9221,16 +9050,20 @@ msgstr "Żeby zadziałało, pole Path musi wskazywać na istniejący węzeł Nod
#: scene/2d/skeleton_2d.cpp
msgid "This Bone2D chain should end at a Skeleton2D node."
-msgstr ""
+msgstr "Ten łańcuch kości 2D powinien się kończyć na węźle Skeleton2D."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
msgstr ""
+"Węzeł Bone2D działa tylko z węzłem Skeleton2D lub innym Bone2D jako "
+"nadrzędnym węzłem."
#: scene/2d/skeleton_2d.cpp
msgid ""
"This bone lacks a proper REST pose. Go to the Skeleton2D node and set one."
msgstr ""
+"Tej kości brakuje odpowiedniej pozy spoczynkowej. Pójdź do węzła Skeleton2D "
+"i ustaw jÄ…."
#: scene/2d/visibility_notifier_2d.cpp
msgid ""
@@ -9245,9 +9078,8 @@ msgid "ARVRCamera must have an ARVROrigin node as its parent"
msgstr "ARVRCamera musi dziedziczyć po węźle ARVROrigin"
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRController must have an ARVROrigin node as its parent"
-msgstr "ARVRController musi posiadać węzeł ARVROrigin jako rodzica"
+msgstr "ARVRController musi posiadać węzeł ARVROrigin jako nadrzędny"
#: scene/3d/arvr_nodes.cpp
msgid ""
@@ -9258,15 +9090,16 @@ msgstr ""
"przypisany do żadnego rzeczywistego kontrolera"
#: scene/3d/arvr_nodes.cpp
-#, fuzzy
msgid "ARVRAnchor must have an ARVROrigin node as its parent"
-msgstr "ARVRAnchor musi posiadać węzeł ARVROrigin jako rodzica"
+msgstr "ARVRAnchor musi posiadać węzeł ARVROrigin jako nadrzędny"
#: scene/3d/arvr_nodes.cpp
msgid ""
"The anchor id must not be 0 or this anchor will not be bound to an actual "
"anchor"
msgstr ""
+"ID kotwicy nie może być 0, bo inaczej ta kotwica nie będzie przypisana do "
+"rzeczywistej kotwicy"
#: scene/3d/arvr_nodes.cpp
msgid "ARVROrigin requires an ARVRCamera child node"
@@ -9298,16 +9131,15 @@ msgid "Lighting Meshes: "
msgstr "Oświetlanie siatek: "
#: scene/3d/collision_object.cpp
-#, fuzzy
msgid ""
"This node has no shape, so it can't collide or interact with other objects.\n"
"Consider adding a CollisionShape or CollisionPolygon as a child to define "
"its shape."
msgstr ""
-"Ten węzeł nie posiada podwezła, który definiowałby jego kształt, więc nie "
-"może wchodzić w interakcje z przestrzenią.\n"
-"Powinieneś dodać węzeł \"CollisionShape2D\" lub \"CollisionPolygon2D\" jako "
-"jego podwęzeł aby zdefiniować jego kształt."
+"Ten węzeł nie posiada kształtu, więc nie może kolidować, czy wchodzić w "
+"interakcje z innymi obiektami.\n"
+"Rozważ dodanie węzła CollisionShape lub CollisionPolygon jako podrzędny, aby "
+"zdefiniować kształt."
#: scene/3d/collision_polygon.cpp
msgid ""
@@ -9342,14 +9174,17 @@ msgstr ""
"Utwórz zasób typu CollisionShape w odpowiednim polu obiektu!"
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
-msgstr ""
+#, fuzzy
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Nic nie jest widoczne, bo nie została przypisana żadna siatka."
#: scene/3d/cpu_particles.cpp
msgid ""
"CPUParticles animation requires the usage of a SpatialMaterial with "
"\"Billboard Particles\" enabled."
msgstr ""
+"Animacja CPUParticles wymaga użycia SpatialMaterial z włączonym \"Billboard "
+"Particles\"."
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
@@ -9373,26 +9208,28 @@ msgstr ""
msgid ""
"Nothing is visible because meshes have not been assigned to draw passes."
msgstr ""
+"Nic nie jest widoczne, bo siatki nie zostały przypisane do kolejki rysowania."
#: scene/3d/particles.cpp
msgid ""
"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
"Particles\" enabled."
msgstr ""
+"Animacja Particles wymaga użycia SpatialMaterial z włączonym \"Billboard "
+"Particles\"."
#: scene/3d/path.cpp
-#, fuzzy
msgid "PathFollow only works when set as a child of a Path node."
-msgstr "PathFollow2D zadziała tylko wtedy, gdy będzie dzieckiem węzeł Path2D."
+msgstr "PathFollow działa tylko, gdy jest węzłem podrzędnym Path."
#: scene/3d/path.cpp
-#, fuzzy
msgid "OrientedPathFollow only works when set as a child of a Path node."
-msgstr "PathFollow2D zadziała tylko wtedy, gdy będzie dzieckiem węzeł Path2D."
+msgstr "OrientedPathFollow działa tylko, gdy jest węzłem podrzędnym Path."
#: scene/3d/path.cpp
msgid "OrientedPathFollow requires up vectors enabled in its parent Path."
msgstr ""
+"OrientedPathFollow wymaga włączonych wektorów w górę w jego nadrzędnym Path."
#: scene/3d/physics_body.cpp
#, fuzzy
@@ -9411,7 +9248,7 @@ msgstr "Pole Path musi wskazywać na węzeł Spatial."
#: scene/3d/scenario_fx.cpp
msgid "WorldEnvironment needs an Environment resource."
-msgstr ""
+msgstr "WorldEnvironment wymaga zasobu Environment."
#: scene/3d/scenario_fx.cpp
msgid ""
@@ -9425,20 +9262,21 @@ msgid ""
"This WorldEnvironment is ignored. Either add a Camera (for 3D scenes) or set "
"this environment's Background Mode to Canvas (for 2D scenes)."
msgstr ""
+"Ten WorldEnvironment jest ignorowany. Dodaj Camera (dla scen 3D) lub ustaw "
+"Background Mode tego środowiska na Canvas (dla scen 2D)."
#: scene/3d/soft_body.cpp
msgid "This body will be ignored until you set a mesh"
-msgstr ""
+msgstr "To ciało będzie ignorowane, dopóki nie ustawisz siatki"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
"Change the size in children collision shapes instead."
msgstr ""
-"Zmiany rozmiaru w RigidBody (w trybach character i rigid) zostanÄ… nadpisane "
-"przez silnik fizyki podczas działania.\n"
+"Zmiany rozmiaru dla SoftBody zostanÄ… nadpisane przez silnik fizyki podczas "
+"działania.\n"
"Zamiast tego, zmień rozmiary kształtów kolizji w węzłach podrzędnych."
#: scene/3d/sprite_3d.cpp
@@ -9459,44 +9297,41 @@ msgstr ""
#: scene/animation/animation_blend_tree.cpp
msgid "On BlendTree node '%s', animation not found: '%s'"
-msgstr ""
+msgstr "W węźle BlendTree '%s', animacja nie znaleziona: '%s'"
#: scene/animation/animation_blend_tree.cpp
-#, fuzzy
msgid "Animation not found: '%s'"
-msgstr "Narzędzia do animacji"
+msgstr "Animacja nie znaleziona: '%s'"
#: scene/animation/animation_tree.cpp
msgid "In node '%s', invalid animation: '%s'."
-msgstr ""
+msgstr "W węźle '%s', nieprawidłowa animacja: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Invalid animation: '%s'."
-msgstr "BÅÄ„D: bÅ‚Ä™dna nazwa animacji!"
+msgstr "Nieprawidłowa animacja: '%s'."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Nothing connected to input '%s' of node '%s'."
-msgstr "Rozłącz '%s' z '%s'"
+msgstr "Nic nie podłączono do wejścia '%s' węzła '%s'."
#: scene/animation/animation_tree.cpp
msgid "A root AnimationNode for the graph is not set."
-msgstr ""
+msgstr "Korzeń dla grafu AnimationNode nie jest ustawiony."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "Path to an AnimationPlayer node containing animations is not set."
-msgstr "Zaznacz węzeł AnimationPlayer w drzewie sceny aby edytować animacje."
+msgstr ""
+"Ścieżka do węzła AnimationPlayer zawierającego animacje nie jest ustawiona."
#: scene/animation/animation_tree.cpp
msgid "Path set for AnimationPlayer does not lead to an AnimationPlayer node."
msgstr ""
+"Ścieżka do węzła AnimationPlayer nie prowadzi do węzła AnimationPlayer."
#: scene/animation/animation_tree.cpp
-#, fuzzy
msgid "AnimationPlayer root is not a valid node."
-msgstr "Drzewo animacji jest wadliwe."
+msgstr "Korzeń AnimationPlayer nie jest poprawnym węzłem."
#: scene/gui/color_picker.cpp
msgid "Raw Mode"
@@ -9544,13 +9379,12 @@ msgid "(Other)"
msgstr "Inne"
#: scene/main/scene_tree.cpp
-#, fuzzy
msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
msgstr ""
-"Domyślne Środowisko określone w Ustawieniach Projektu (Renderowanie -> "
-"Viewport -> Domyślne Środowisko) nie mogło zostać załadowane."
+"Domyślne środowisko określone w Ustawieniach Projektu (Renderowanie -> "
+"Environment -> Default Environment) nie mogło zostać załadowane."
#: scene/main/viewport.cpp
msgid ""
@@ -9581,31 +9415,31 @@ msgid "Invalid font size."
msgstr "Niepoprawny rozmiar fonta."
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "Input"
-msgstr "Dodaj Wejście"
+msgstr "Wejście"
#: scene/resources/visual_shader.cpp
-#, fuzzy
msgid "None"
-msgstr "<żaden>"
+msgstr "Brak"
#: scene/resources/visual_shader_nodes.cpp
-#, fuzzy
msgid "Invalid source for shader."
-msgstr "Wadliwe źródło!"
+msgstr "Niewłaściwe źródło dla shadera."
#: servers/visual/shader_language.cpp
msgid "Assignment to function."
-msgstr ""
+msgstr "Przypisanie do funkcji."
#: servers/visual/shader_language.cpp
msgid "Assignment to uniform."
-msgstr ""
+msgstr "Przypisanie do uniformu."
#: servers/visual/shader_language.cpp
msgid "Varyings can only be assigned in vertex function."
-msgstr ""
+msgstr "Varying może być przypisane tylko w funkcji wierzchołków."
+
+#~ msgid "Zoom:"
+#~ msgstr "Powiększenie:"
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "Na pewno chcesz usunąć wszystkie połączenia z \""
@@ -10286,9 +10120,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "Źródło fontu:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Wielkość oryginalna fontu:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Zasób docelowy:"
diff --git a/editor/translations/pr.po b/editor/translations/pr.po
index 065cbdfc59..482ea49196 100644
--- a/editor/translations/pr.po
+++ b/editor/translations/pr.po
@@ -553,7 +553,7 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
#: editor/code_editor.cpp
@@ -1688,6 +1688,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2086,7 +2092,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -9025,7 +9031,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
diff --git a/editor/translations/pt_BR.po b/editor/translations/pt_BR.po
index e7fcb8b27d..eb6a625e3e 100644
--- a/editor/translations/pt_BR.po
+++ b/editor/translations/pt_BR.po
@@ -37,12 +37,14 @@
# LucasSouza6 <lucasosouza66@gmail.com>, 2018.
# Pedro Pacheco <pedroxixipa@hotmail.com>, 2018.
# Bruno Henrique <nimbusdroid@gmail.com>, 2018.
+# Luciano Scilletta <lucianoscilletta@gmail.com>, 2018.
+# Julio Yagami <juliohenrique31501234@hotmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: 2016-05-30\n"
-"PO-Revision-Date: 2018-11-26 16:10+0000\n"
-"Last-Translator: Bruno Henrique <nimbusdroid@gmail.com>\n"
+"PO-Revision-Date: 2018-12-04 22:15+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"
@@ -50,7 +52,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 3.3-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -433,12 +435,10 @@ msgid "Delete Selection"
msgstr "Deletar Seleção"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
msgstr "Ir ao Próximo Passo"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
msgstr "Ir ao Passo Anterior"
@@ -579,8 +579,9 @@ msgid "Warnings:"
msgstr "Avisos:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "Ampliação:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "Tamanho da Fonte de Origem:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -693,9 +694,8 @@ msgid "Edit Connection: "
msgstr "Editar Conexão: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "Tem certeza que quer remover todas conexões desse sinal?"
+msgstr "Tem certeza que quer remover todas as conexões do sinal \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -1344,7 +1344,6 @@ msgid "Copy Path"
msgstr "Copiar Caminho"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
msgstr "Mostrar no Gerenciador de Arquivos"
@@ -1495,9 +1494,8 @@ msgid "Methods"
msgstr "Métodos"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Methods:"
-msgstr "Métodos"
+msgstr "Métodos:"
#: editor/editor_help.cpp
#, fuzzy
@@ -1741,6 +1739,12 @@ msgstr "Essa operação não pode ser realizada sem uma raiz da cena."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -1748,8 +1752,9 @@ msgstr ""
"herança) não foram satisfeitas."
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
+#, fuzzy
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "Não é possível sobrescrever cena que ainda está aberta!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -2183,7 +2188,7 @@ msgid "Undo"
msgstr "Desfazer"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Refazer"
@@ -2636,18 +2641,26 @@ msgid "Assign.."
msgstr "Atribuir.."
#: editor/editor_properties.cpp
+#, fuzzy
msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"Não é possível criar uma ViewportTexture nos recursos salvos como um "
+"arquivo.\n"
+"Recursos precisam pertencer à cena."
#: editor/editor_properties.cpp
+#, fuzzy
msgid ""
"Can't create a ViewportTexture on this resource because it's not set as "
"local to scene.\n"
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"Não é possível criar uma ViewportTexture nesse recurso porque não está "
+"definido como uma cena local.\n"
+"Por favor troque na 'local para cena' propriedade"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
@@ -9371,7 +9384,7 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
"Nada está visível porque as meshes não foram atribuídas a passes de desenho."
@@ -9641,6 +9654,9 @@ msgstr "Atribuição à uniforme."
msgid "Varyings can only be assigned in vertex function."
msgstr "Variáveis só podem ser atribuídas na função de vértice."
+#~ msgid "Zoom:"
+#~ msgstr "Ampliação:"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "Tem certeza que quer remover todas conexões do \""
@@ -10366,9 +10382,6 @@ msgstr "Variáveis só podem ser atribuídas na função de vértice."
#~ msgid "Source Font:"
#~ msgstr "Fonte Origem:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Tamanho da Fonte de Origem:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Recurso Destino:"
diff --git a/editor/translations/pt_PT.po b/editor/translations/pt_PT.po
index 8ace02c1e0..1e0b10fce8 100644
--- a/editor/translations/pt_PT.po
+++ b/editor/translations/pt_PT.po
@@ -16,7 +16,7 @@
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
-"PO-Revision-Date: 2018-11-21 19:08+0000\n"
+"PO-Revision-Date: 2018-12-04 22:15+0000\n"
"Last-Translator: João Lopes <linux-man@hotmail.com>\n"
"Language-Team: Portuguese (Portugal) <https://hosted.weblate.org/projects/"
"godot-engine/godot/pt_PT/>\n"
@@ -24,7 +24,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 3.3-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -409,14 +409,12 @@ msgid "Delete Selection"
msgstr "Apagar Seleção"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
-msgstr "Ir Próximo Passo"
+msgstr "Ir para Próximo Passo"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
-msgstr "Ir Passo Anterior"
+msgstr "Ir para Passo Anterior"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -555,8 +553,9 @@ msgid "Warnings:"
msgstr "Avisos:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "Zoom:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "Vista de frente"
#: editor/code_editor.cpp
msgid "Line:"
@@ -669,9 +668,8 @@ msgid "Edit Connection: "
msgstr "Editar Conexão: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "Deseja remover todas as conexões deste sinal?"
+msgstr "Deseja remover todas as conexões do sinal \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -826,9 +824,8 @@ msgid "Error loading:"
msgstr "Erro ao carregar:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr "Cena falha ao carregar devido a dependências que estão em falta:"
+msgstr "Falha no carregamento devido a dependências em falta:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1314,22 +1311,19 @@ msgid "File Exists, Overwrite?"
msgstr "O Ficheiro existe, sobrescrever?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
-msgstr "Selecionar esta pasta"
+msgstr "Selecionar esta Pasta"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Copiar Caminho"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
msgstr "Abrir no Gestor de Ficheiros"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
msgstr "Mostrar no Gestor de Ficheiros"
@@ -1474,19 +1468,16 @@ msgid "Methods"
msgstr "Métodos"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Methods:"
-msgstr "Métodos"
+msgstr "Métodos:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "Propriedades"
+msgstr "Propriedades do Tema"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties:"
-msgstr "Propriedades:"
+msgstr "Propriedades do Tema:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1513,14 +1504,12 @@ msgid "Constants:"
msgstr "Constantes:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description"
-msgstr "Descrição"
+msgstr "Descrição da Classe"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description:"
-msgstr "Descrição:"
+msgstr "Descrição da Classe:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1537,14 +1526,12 @@ msgstr ""
"um[/url][/color]."
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "Descrição da Propriedade:"
+msgstr "Descrições da Propriedade"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions:"
-msgstr "Descrição da Propriedade:"
+msgstr "Descrições da Propriedade:"
#: editor/editor_help.cpp
msgid ""
@@ -1555,14 +1542,12 @@ msgstr ""
"[color=$color][url=$url]contribuindo com uma[/url][/color]!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "Descrição do Método:"
+msgstr "Descrições do Método"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions:"
-msgstr "Descrição do Método:"
+msgstr "Descrições do Método:"
#: editor/editor_help.cpp
msgid ""
@@ -1578,49 +1563,40 @@ msgid "Search Help"
msgstr "Procurar em Ajuda"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "Vista normal"
+msgstr "Mostrar Tudo"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Classes Only"
-msgstr "Classes"
+msgstr "Apenas Classes"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "Métodos"
+msgstr "Apenas Métodos"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "Sinais"
+msgstr "Apenas Sinais"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "Constantes"
+msgstr "Apenas Constantes"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "Propriedades"
+msgstr "Apenas Propriedades"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "Propriedades"
+msgstr "Apenas Propriedades do Tema"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Member Type"
-msgstr "Membros"
+msgstr "Tipo do Membro"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "Classe:"
+msgstr "Classe"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -1719,6 +1695,12 @@ msgstr "Esta operação não pode ser feita sem uma raiz da árvore."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -1727,7 +1709,7 @@ msgstr ""
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "Não se consegue sobrescrever cena ainda aberta!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -1986,13 +1968,12 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Incapaz de carregar Script addon do Caminho: '%s'."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
-"Incapaz de carregar Script addon do Caminho: '%s' Script não está no modo "
-"ferramenta."
+"Incapaz de carregar Script addon do caminho: '%s' Parece haver um erro no "
+"código, reveja a sintaxe."
#: editor/editor_node.cpp
msgid ""
@@ -2046,7 +2027,6 @@ msgstr "Padrão"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
msgstr "Mostrar no Sistema de Ficheiros"
@@ -2131,7 +2111,6 @@ msgid "Save Scene"
msgstr "Guardar Cena"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
msgstr "Guardar todas as Cenas"
@@ -2161,7 +2140,7 @@ msgid "Undo"
msgstr "Desfazer"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Refazer"
@@ -2227,8 +2206,8 @@ msgid ""
"On Android, deploy will use the USB cable for faster performance. This "
"option speeds up testing for games with a large footprint."
msgstr ""
-"Quando esta opção está ativa, exportação ou distribuição criará um "
-"executável mínimo.\n"
+"Quando esta opção é ativada, exportação ou distribuição criará um executável "
+"mínimo.\n"
"O Sistema de Ficheiros será fornecido ao Projeto pelo Editor sobre a rede.\n"
"Em Android, a distribuição irá usar a ligação USB para melhor performance. "
"Esta opção acelera o teste de jogos pesados."
@@ -2617,6 +2596,8 @@ msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"Não se consegue criar Textura Viewport em recursos guardados como ficheiro.\n"
+"O recurso tem de pertencer a uma cena."
#: editor/editor_properties.cpp
msgid ""
@@ -2625,6 +2606,10 @@ msgid ""
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"Não se consegue criar Textura Viewport neste recurso porque não está "
+"definido na cena como local.\n"
+"Ative a sua propriedade 'local to scene' (e em todos os recursos que o "
+"contêm até a um Nó)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
@@ -2941,9 +2926,8 @@ msgstr ""
"leitura!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "Favoritos:"
+msgstr "Favoritos"
#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
@@ -3028,14 +3012,12 @@ msgid "Instance"
msgstr "Instância"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to favorites"
-msgstr "Favoritos:"
+msgstr "Adicionar aos Favoritos"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from favorites"
-msgstr "Remover do Grupo"
+msgstr "Remover dos Favoritos"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3066,14 +3048,12 @@ msgid "New Resource..."
msgstr "Novo Recurso..."
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Expand All"
-msgstr "Expandir tudo"
+msgstr "Expandir Tudo"
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
-msgstr "Colapsar tudo"
+msgstr "Colapsar Tudo"
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3095,9 +3075,8 @@ msgid "Re-Scan Filesystem"
msgstr "Carregar novamente o Sistema de Ficheiros"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle split mode"
-msgstr "Alternar modo"
+msgstr "Alternar modo de divisão"
#: editor/filesystem_dock.cpp
msgid "Search files"
@@ -3132,24 +3111,20 @@ msgid "Create Script"
msgstr "Criar Script"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find in Files"
-msgstr "Localizar em ficheiros"
+msgstr "Localizar em Ficheiros"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "Localizar: "
+msgstr "Localizar:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "Pasta: "
+msgstr "Pasta:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "Filtro: "
+msgstr "Filtros:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3299,11 +3274,11 @@ msgstr "A guardar..."
#: editor/import_dock.cpp
msgid "Set as Default for '%s'"
-msgstr "Definir como padrão para '%s'"
+msgstr "Definir como Padrão para '%s'"
#: editor/import_dock.cpp
msgid "Clear Default for '%s'"
-msgstr "Limpar padrão para '%s'"
+msgstr "Limpar Padrão para '%s'"
#: editor/import_dock.cpp
msgid " Files"
@@ -3326,14 +3301,12 @@ msgid "Failed to load resource."
msgstr "Falha ao carregar recurso."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
-msgstr "Expandir tudo"
+msgstr "Expandir Todas as Propriedades"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
-msgstr "Colapsar todas as Propriedades"
+msgstr "Colapsar Todas as Propriedades"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -4201,7 +4174,7 @@ msgid ""
"No meshes to bake. Make sure they contain an UV2 channel and that the 'Bake "
"Light' flag is on."
msgstr ""
-"Não há Meshes para cozinhar. Assegure-se que contêm um canal UV2 e que a "
+"Não há Meshes para consolidar. Assegure-se que contêm um canal UV2 e que a "
"referência 'Bake Light' flag está on."
#: editor/plugins/baked_lightmap_editor_plugin.cpp
@@ -4210,7 +4183,7 @@ msgstr "Falha ao criar imagens lightmap, assegure-se que o caminho é gravável.
#: editor/plugins/baked_lightmap_editor_plugin.cpp
msgid "Bake Lightmaps"
-msgstr "Cozinhar Lightmaps"
+msgstr "Consolidar Lightmaps"
#: editor/plugins/camera_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp editor/rename_dialog.cpp
@@ -4282,9 +4255,8 @@ msgid "Resize CanvasItem"
msgstr "Redimensionar CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale CanvasItem"
-msgstr "Rodar CanvasItem"
+msgstr "Escalar CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
@@ -4348,9 +4320,8 @@ msgid "Rotate Mode"
msgstr "Modo rodar"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Mode"
-msgstr "Modo escalar (R)"
+msgstr "Modo Escalar"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4449,9 +4420,8 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Restaura a capacidade de selecionar os Objetos-filho."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton Options"
-msgstr "Esqueleto"
+msgstr "Opções do Esqueleto"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
@@ -4505,7 +4475,7 @@ msgstr "Mostrar Vista"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "Mostrar Grupo e Bloquear Ãcones"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -4665,7 +4635,7 @@ msgstr "Pressione Shift para editar tangentes individualmente"
#: editor/plugins/gi_probe_editor_plugin.cpp
msgid "Bake GI Probe"
-msgstr "Cozinhar a sonda GI"
+msgstr "Consolidar Sonda GI"
#: editor/plugins/item_list_editor_plugin.cpp
msgid "Item %d"
@@ -4946,9 +4916,8 @@ msgid "Create Navigation Polygon"
msgstr "Criar Polígono de navegação"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Generating Visibility Rect"
-msgstr "Gerar Visibilidade do Rect"
+msgstr "A Gerar Visibilidade Rect"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -5426,7 +5395,6 @@ msgid "Error writing TextFile:"
msgstr "Erro ao escrever TextFile:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error: could not load file."
msgstr "Erro ao carregar ficheiro."
@@ -5527,9 +5495,8 @@ msgid "Copy Script Path"
msgstr "Copiar Caminho do Script"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "History Previous"
-msgstr "Histórico anterior"
+msgstr "Histórico Anterior"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5599,9 +5566,8 @@ msgid "Keep Debugger Open"
msgstr "Manter depurador aberto"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Debug with External Editor"
-msgstr "Depurar com Editor externo"
+msgstr "Depurar com Editor Externo"
#: editor/plugins/script_editor_plugin.cpp
msgid "Open Godot online documentation"
@@ -5644,9 +5610,8 @@ msgid "Debugger"
msgstr "Depurador"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
-msgstr "Resultados da pesquisa"
+msgstr "Resultados da Pesquisa"
#: editor/plugins/script_text_editor.cpp
msgid "Line"
@@ -5657,9 +5622,8 @@ msgid "(ignore)"
msgstr "(ignorar)"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "Ir para Função..."
+msgstr "Ir para Função"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -5748,14 +5712,12 @@ msgid "Trim Trailing Whitespace"
msgstr "Apagar espaços nos limites"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Spaces"
-msgstr "Converter Indentação em espaços"
+msgstr "Converter Indentação em Espaços"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Tabs"
-msgstr "Converter Indentação em tabulação"
+msgstr "Converter Indentação em Tabulação"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5771,33 +5733,28 @@ msgid "Remove All Breakpoints"
msgstr "Remover todos os Breakpoints"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Breakpoint"
-msgstr "Ir para próximo Breakpoint"
+msgstr "Ir para Próximo Breakpoint"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Breakpoint"
-msgstr "Ir para Breakpoint anterior"
+msgstr "Ir para Breakpoint Anterior"
#: editor/plugins/script_text_editor.cpp
msgid "Find Previous"
msgstr "Localizar Anterior"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find in Files..."
-msgstr "Localizar em ficheiros..."
+msgstr "Localizar em Ficheiros..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
msgstr "Ir para Função..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
-msgstr "Ir para linha..."
+msgstr "Ir para Linha..."
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5888,13 +5845,12 @@ msgid "Animation Key Inserted."
msgstr "Chave de Animação inserida."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Pitch"
-msgstr "Trocar"
+msgstr "Inclinação"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Yaw"
-msgstr ""
+msgstr "Direção"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
@@ -5982,7 +5938,7 @@ msgstr "Esta operação requer um único Nó selecionado."
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Lock View Rotation"
-msgstr "Trancar Rotação da Vista"
+msgstr "Bloquear Rotação da Vista"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Display Normal"
@@ -6061,9 +6017,8 @@ msgid "Freelook Speed Modifier"
msgstr "Modificador de velocidade Freelook"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View Rotation Locked"
-msgstr "Trancar Rotação da Vista"
+msgstr "Rotação da Vista Bloqueada"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
@@ -6097,7 +6052,7 @@ msgstr "Modo escalar (R)"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Local Coords"
-msgstr "Coordenadas locais"
+msgstr "Coordenadas Locais"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Local Space Mode (%s)"
@@ -6565,9 +6520,8 @@ msgid "Fix Invalid Tiles"
msgstr "Reparar Tiles inválidos"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Cut Selection"
-msgstr "Centrar seleção"
+msgstr "Cortar Seleção"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6614,32 +6568,28 @@ msgid "Pick Tile"
msgstr "Escolher Tile"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "Mover Seleção"
+msgstr "Copiar Seleção"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate left"
-msgstr "Modo rodar"
+msgstr "Rodar p/ esquerda"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate right"
-msgstr "Rodar Polígono"
+msgstr "Rodar p/ direita"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip horizontally"
-msgstr ""
+msgstr "Inverter horizontalmente"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip vertically"
-msgstr ""
+msgstr "Inverter verticalmente"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear transform"
-msgstr "Transformar"
+msgstr "Limpar Transformação"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Add Texture(s) to TileSet"
@@ -6670,9 +6620,8 @@ msgid "Display tile's names (hold Alt Key)"
msgstr "Exibir nome dos tiles (segure tecla Alt)"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected texture and ALL TILES which use it?"
-msgstr "Remover Textura Selecionada e TODOS OS TILES que a usam?"
+msgstr "Remover textura selecionada e TODOS OS TILES que a usam?"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "You haven't selected a texture to remove."
@@ -6687,9 +6636,8 @@ msgid "Merge from scene?"
msgstr "Fundir a partir da Cena?"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "%s file(s) were not added because was already on the list."
-msgstr " ficheiro(s) não foi adicionado por já estar na lista."
+msgstr "%s ficheiro(s) não foi/foram adicionado(s) por já estar(em) na lista."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -6778,12 +6726,11 @@ msgstr ""
#: editor/project_export.cpp
msgid "Release"
-msgstr ""
+msgstr "Libertar"
#: editor/project_export.cpp
-#, fuzzy
msgid "Exporting All"
-msgstr "Exportar"
+msgstr "A Exportar Tudo"
#: editor/project_export.cpp
msgid "Presets"
@@ -6794,9 +6741,8 @@ msgid "Add..."
msgstr "Adicionar..."
#: editor/project_export.cpp
-#, fuzzy
msgid "Export Path:"
-msgstr "Exportar Projeto"
+msgstr "Caminho da Exportação:"
#: editor/project_export.cpp
msgid "Resources"
@@ -6861,14 +6807,12 @@ msgid "Export PCK/Zip"
msgstr "Exportar PCK/Zip"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "Modo exportação:"
+msgstr "Modo Exportação?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "Exportar"
+msgstr "Exportar Tudo"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
@@ -7515,7 +7459,7 @@ msgstr "Nome do Nó"
#: editor/rename_dialog.cpp
msgid "Node's parent name, if available"
-msgstr "Nome do pai do Nó, se disponível"
+msgstr "Nome do parente do Nó, se disponível"
#: editor/rename_dialog.cpp
msgid "Node type"
@@ -7554,7 +7498,6 @@ msgid "Step"
msgstr "Passo"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Amount by which counter is incremented for each node"
msgstr "Valor pelo qual cada contador é incrementado para cada nó"
@@ -7563,7 +7506,6 @@ msgid "Padding"
msgstr "Preenchimento"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid ""
"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
@@ -7617,7 +7559,7 @@ msgstr "Recolocar Nó"
#: editor/reparent_dialog.cpp
msgid "Reparent Location (Select new Parent):"
-msgstr "Recolocar localização (selecionar novo parente):"
+msgstr "Recolocar localização (selecionar novo Parente):"
#: editor/reparent_dialog.cpp
msgid "Keep Global Transform"
@@ -7681,11 +7623,11 @@ msgstr "Esta operação não pode ser feita na raiz da árvore."
#: editor/scene_tree_dock.cpp
msgid "Move Node In Parent"
-msgstr "Mover Nó no parente"
+msgstr "Mover Nó no Parente"
#: editor/scene_tree_dock.cpp
msgid "Move Nodes In Parent"
-msgstr "Mover Nós no parente"
+msgstr "Mover Nós no Parente"
#: editor/scene_tree_dock.cpp
msgid "Duplicate Node(s)"
@@ -7712,6 +7654,8 @@ msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
msgstr ""
+"Desativar \"editable_instance\" irá reverter todas as propriedades do Nó "
+"para os seus valores padrão."
#: editor/scene_tree_dock.cpp
msgid "Editable Children"
@@ -7786,9 +7730,8 @@ msgid "Clear Inheritance"
msgstr "Limpar herança"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open documentation"
-msgstr "Abrir documentação online do Godot"
+msgstr "Abrir documentação"
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
@@ -7803,9 +7746,8 @@ msgid "Change Type"
msgstr "Mudar tipo"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
-msgstr "Abrir Script"
+msgstr "Estender Script"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -7968,9 +7910,8 @@ msgid "Path is empty"
msgstr "Caminho está vazio"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty"
-msgstr "Sprite está vazia!"
+msgstr "Nome do ficheiro vazio"
#: editor/script_create_dialog.cpp
msgid "Path is not local"
@@ -8061,9 +8002,8 @@ msgid "Bytes:"
msgstr "Bytes:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Stack Trace"
-msgstr "Empilhar Frames"
+msgstr "Rastreamento de Pilha"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8513,7 +8453,7 @@ msgstr "Fim do stack trace de exceção interna"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Bake NavMesh"
-msgstr ""
+msgstr "Consolidar NavMesh"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8621,7 +8561,7 @@ msgstr "Mudar nome do argumento"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Default Value"
-msgstr "Definir valor padrão da variável"
+msgstr "Definir Valor Padrão da Variável"
#: modules/visual_script/visual_script_editor.cpp
msgid "Set Variable Type"
@@ -8897,12 +8837,11 @@ msgstr "Procurar VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "Obter %s"
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Set %s"
-msgstr "Definir "
+msgstr "Definir %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -8934,7 +8873,7 @@ msgstr "Impossível ler Ficheiro de imagem do ecrã de inicialização:"
#: platform/javascript/export/export.cpp
msgid "Using default boot splash image."
-msgstr "A usar imagem de inicialização por defeito."
+msgstr "A usar imagem padrão de inicialização."
#: scene/2d/animated_sprite.cpp
msgid ""
@@ -9001,6 +8940,8 @@ msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"Animação CPUParticles2D requer o uso de um CanvasItemMaterial com "
+"\"Particles Animation\" ativada."
#: scene/2d/light_2d.cpp
msgid ""
@@ -9057,6 +8998,8 @@ msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"Animação Particles2D requer o uso de um CanvasItemMaterial com \"Particles "
+"Animation\" ativada."
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
@@ -9085,7 +9028,7 @@ msgstr "Esta corrente de Bone2D deve terminar em um nó Skeleton2D."
#: scene/2d/skeleton_2d.cpp
msgid "A Bone2D only works with a Skeleton2D or another Bone2D as parent node."
-msgstr "Um Bone2D só funciona com um nó pai Skeleton2D ou Bone2D."
+msgstr "Um Bone2D só funciona com um nó parente Skeleton2D ou Bone2D."
#: scene/2d/skeleton_2d.cpp
msgid ""
@@ -9201,15 +9144,16 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
-msgstr ""
-"Nada é visível porque não foram atribuídas Meshes aos passos de desenho."
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Nada é visível porque nenhuma Malha foi atribuída."
#: scene/3d/cpu_particles.cpp
msgid ""
"CPUParticles animation requires the usage of a SpatialMaterial with "
"\"Billboard Particles\" enabled."
msgstr ""
+"Animação CPUParticles requer o uso de um SpatialMaterial com \"Billboard "
+"Particles\" ativada."
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
@@ -9240,22 +9184,21 @@ msgid ""
"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
"Particles\" enabled."
msgstr ""
+"Animação Particles requer o uso de um SpatialMaterial com \"Billboard "
+"Particles\" ativada."
#: scene/3d/path.cpp
-#, fuzzy
msgid "PathFollow only works when set as a child of a Path node."
-msgstr ""
-"PathFollow2D apenas funciona quando definido como filho de um Nó Path2D."
+msgstr "PathFollow apenas funciona quando definido como filho de um Nó Path."
#: scene/3d/path.cpp
-#, fuzzy
msgid "OrientedPathFollow only works when set as a child of a Path node."
msgstr ""
-"PathFollow2D apenas funciona quando definido como filho de um Nó Path2D."
+"OrientedPathFollow apenas funciona quando definido como filho de um Nó Path."
#: scene/3d/path.cpp
msgid "OrientedPathFollow requires up vectors enabled in its parent Path."
-msgstr ""
+msgstr "OrientedPathFollow requer vetores cima ativados no Caminho do parente."
#: scene/3d/physics_body.cpp
msgid ""
@@ -9297,7 +9240,6 @@ msgid "This body will be ignored until you set a mesh"
msgstr "Este corpo será ignorado até se definir uma Malha"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
@@ -9305,7 +9247,7 @@ msgid ""
msgstr ""
"Mudanças no tamanho do SoftBody serão reescritas pelo motor de física na "
"execução.\n"
-"Mude antes o tamanho das formas de colisão filhas."
+"Em vez disso, mude o tamanho das formas de colisão filhas."
#: scene/3d/sprite_3d.cpp
msgid ""
@@ -9389,7 +9331,7 @@ msgstr ""
#: scene/gui/range.cpp
msgid "If exp_edit is true min_value must be > 0."
-msgstr ""
+msgstr "Se exp_edit é verdadeiro min_value tem de ser > 0."
#: scene/gui/scroll_container.cpp
msgid ""
@@ -9410,7 +9352,7 @@ msgid ""
"Default Environment as specified in Project Settings (Rendering -> "
"Environment -> Default Environment) could not be loaded."
msgstr ""
-"Ambiente padrão especificado em Configuração do Projeto (Rendering -> "
+"Ambiente Padrão especificado em Configuração do Projeto (Rendering -> "
"Environment -> Default Environment) não pode ser carregado."
#: scene/main/viewport.cpp
@@ -9465,6 +9407,9 @@ msgstr "Atribuição a uniforme."
msgid "Varyings can only be assigned in vertex function."
msgstr "Variações só podem ser atribuídas na função vértice."
+#~ msgid "Zoom:"
+#~ msgstr "Zoom:"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "Está seguro que quer remover todas as conexões de \""
diff --git a/editor/translations/ro.po b/editor/translations/ro.po
index 9359389f36..752c69bfab 100644
--- a/editor/translations/ro.po
+++ b/editor/translations/ro.po
@@ -559,8 +559,8 @@ msgstr ""
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Zoom-ați În"
+msgid "Font Size:"
+msgstr "Dimensiunea Conturului:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1729,6 +1729,12 @@ msgstr "Aceasta operațiune nu se poate face fără o rădăcină de copac."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2174,7 +2180,7 @@ msgid "Undo"
msgstr "Revenire"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Reîntoarcere"
@@ -9215,7 +9221,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9444,6 +9450,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Zoom-ați În"
+
#~ msgid "Class List:"
#~ msgstr "Listă de Clase:"
diff --git a/editor/translations/ru.po b/editor/translations/ru.po
index 957af1f5e7..b7d0bf0a21 100644
--- a/editor/translations/ru.po
+++ b/editor/translations/ru.po
@@ -28,12 +28,13 @@
# V. <Unit68189@gmail.com>, 2018.
# Victor Butorin <mrwebsterchannel@gmail.com>, 2018.
# ÐлекÑандр <ol-vin@mail.ru>, 2018.
+# Ðнатолий Горбунов <afgorbunov@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Godot Engine editor\n"
"POT-Creation-Date: \n"
-"PO-Revision-Date: 2018-11-26 16:10+0000\n"
-"Last-Translator: ÐлекÑандр <ol-vin@mail.ru>\n"
+"PO-Revision-Date: 2018-12-04 22:15+0000\n"
+"Last-Translator: Ðнатолий Горбунов <afgorbunov@gmail.com>\n"
"Language-Team: Russian <https://hosted.weblate.org/projects/godot-engine/"
"godot/ru/>\n"
"Language: ru\n"
@@ -42,7 +43,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 3.3-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -424,12 +425,10 @@ msgid "Delete Selection"
msgstr "Удалить выделенное"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
msgstr "Перейти к Ñледующему шагу"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
msgstr "Перейти к предыдущему шагу"
@@ -570,8 +569,9 @@ msgid "Warnings:"
msgstr "ПредупреждениÑ:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "Приближение:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "ИÑходный размер шрифта:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -684,9 +684,8 @@ msgid "Edit Connection: "
msgstr "Редактировать Подключение: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "Ð’Ñ‹ уверены, что хотите удалить вÑе Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚ Ñигнала?"
+msgstr "Ð’Ñ‹ уверены, что хотите удалить вÑе Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¸Ð· Ñигнала \"%s\"?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -840,7 +839,6 @@ msgid "Error loading:"
msgstr "Ошибка при загрузке:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
msgstr "Ðе удалоÑÑŒ загрузить Ñцену из-за отÑутÑÑ‚Ð²Ð¸Ñ Ð·Ð°Ð²Ð¸ÑимоÑтей:"
@@ -1328,7 +1326,6 @@ msgid "File Exists, Overwrite?"
msgstr "Файл ÑущеÑтвует, перезапиÑать?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
msgstr "Выбрать Ñту папку"
@@ -1337,13 +1334,11 @@ msgid "Copy Path"
msgstr "Копировать путь"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "ПроÑмотреть в проводнике"
+msgstr "Открыть в проводнике"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
msgstr "ПроÑмотреть в проводнике"
@@ -1488,19 +1483,16 @@ msgid "Methods"
msgstr "Методы"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Methods:"
-msgstr "Методы"
+msgstr "Методы:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "СвойÑтва"
+msgstr "СвойÑтва темы"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties:"
-msgstr "СвойÑтва:"
+msgstr "СвойÑтва темы:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1527,14 +1519,12 @@ msgid "Constants:"
msgstr "КонÑтанты:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description"
-msgstr "ОпиÑание"
+msgstr "ОпиÑание клаÑÑа"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description:"
-msgstr "ОпиÑание:"
+msgstr "ОпиÑание клаÑÑа:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1551,12 +1541,10 @@ msgstr ""
"$url2]запроÑить[/url][/color]."
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
msgstr "ОпиÑание ÑвойÑтв:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions:"
msgstr "ОпиÑание ÑвойÑтв:"
@@ -1569,12 +1557,10 @@ msgstr ""
"$color][url=$url]помогите нам[/url][/color]!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "ОпиÑание методов:"
+msgstr "ОпиÑание методов"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions:"
msgstr "ОпиÑание методов:"
@@ -1592,49 +1578,40 @@ msgid "Search Help"
msgstr "Помощь"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "Режим нормалей"
+msgstr "Отображать вÑÑ‘"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Classes Only"
-msgstr "КлаÑÑÑ‹"
+msgstr "Только клаÑÑÑ‹"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "Методы"
+msgstr "Только методы"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "Сигналы"
+msgstr "Только Ñигналы"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "КонÑтанты"
+msgstr "Только конÑтанты"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "СвойÑтва"
+msgstr "Только ÑвойÑтва"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "СвойÑтва"
+msgstr "Только ÑвойÑтва темы"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Member Type"
-msgstr "СвойÑтва"
+msgstr "Тип члена"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "КлаÑÑ:"
+msgstr "КлаÑÑ"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -1733,6 +1710,12 @@ msgstr "Эта Ð¾Ð¿ÐµÑ€Ð°Ñ†Ð¸Ñ Ð½Ðµ может быть выполнена бе
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -1741,7 +1724,7 @@ msgstr ""
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "Ðевозможно перезапиÑать Ñцену, ÐºÐ¾Ñ‚Ð¾Ñ€Ð°Ñ Ð²Ñе еще открыта!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -1996,13 +1979,12 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Ðе удалоÑÑŒ загрузить Ñкрипт из иÑточника: '%s'."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
-"Ðе удалоÑÑŒ загрузить Ñкрипт из иÑточника: '%s' Ñкрипт не в режиме "
-"инÑтрумента."
+"Ðевозможно загрузить Ñкрипт аддона из иÑточника: \"% s\". Ð’ коде еÑÑ‚ÑŒ "
+"ошибка. ПожалуйÑта, проверьте ÑинтакÑиÑ."
#: editor/editor_node.cpp
msgid ""
@@ -2142,7 +2124,6 @@ msgid "Save Scene"
msgstr "Сохранить Ñцену"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
msgstr "Сохранить вÑе Ñцены"
@@ -2172,7 +2153,7 @@ msgid "Undo"
msgstr "Отменить"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Повторить"
@@ -2629,6 +2610,8 @@ msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"Ðевозможно Ñоздать ViewportTexture Ð´Ð»Ñ Ñ€ÐµÑурÑов, Ñохраненных в виде файла.\n"
+"РеÑÑƒÑ€Ñ Ð´Ð¾Ð»Ð¶ÐµÐ½ принадлежать Ñцене."
#: editor/editor_properties.cpp
msgid ""
@@ -2637,6 +2620,10 @@ msgid ""
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"Ðевозможно Ñоздать ViewportTexture Ð´Ð»Ñ Ñтого реÑурÑа, потому что он не "
+"уÑтановлен как локальный Ð´Ð»Ñ Ñцены.\n"
+"Включите ÑвойÑтво «Локально Ð´Ð»Ñ Ñцены» (и вÑе реÑурÑÑ‹, Ñодержащие его вверх "
+"от узла)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
@@ -2952,9 +2939,8 @@ msgstr ""
"типов файлов!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "Избранное:"
+msgstr "Избранное"
#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
@@ -3040,14 +3026,12 @@ msgid "Instance"
msgstr "Добавить ÑкземплÑÑ€"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to favorites"
-msgstr "Избранное:"
+msgstr "Добавить в избранное"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from favorites"
-msgstr "Удалить из группы"
+msgstr "Удалить из избранного"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3083,7 +3067,6 @@ msgid "Expand All"
msgstr "Развернуть вÑе"
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
msgstr "Свернуть вÑе"
@@ -3107,9 +3090,8 @@ msgid "Re-Scan Filesystem"
msgstr "ПереÑканировать файловую ÑиÑтему"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle split mode"
-msgstr "Переключить режим отображениÑ"
+msgstr "Переключить режим разделениÑ"
#: editor/filesystem_dock.cpp
msgid "Search files"
@@ -3144,24 +3126,22 @@ msgid "Create Script"
msgstr "Создать Ñкрипт"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find in Files"
msgstr "Ðайти в файлах"
#: editor/find_in_files.cpp
#, fuzzy
msgid "Find:"
-msgstr "Ðайти: "
+msgstr "Ðайти:"
#: editor/find_in_files.cpp
#, fuzzy
msgid "Folder:"
-msgstr "Папка: "
+msgstr "Папка:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "Фильтры"
+msgstr "Фильтры:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3338,12 +3318,10 @@ msgid "Failed to load resource."
msgstr "Ðе удалоÑÑŒ загрузить реÑурÑ."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
msgstr "Развернуть вÑе ÑвойÑтва"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
msgstr "Свернуть вÑе ÑвойÑтва"
@@ -4296,7 +4274,6 @@ msgid "Resize CanvasItem"
msgstr "Изменить размер CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale CanvasItem"
msgstr "Вращать CanvasItem"
@@ -4363,9 +4340,8 @@ msgid "Rotate Mode"
msgstr "Режим поворота"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Mode"
-msgstr "Режим маÑÑˆÑ‚Ð°Ð±Ð¸Ñ€Ð¾Ð²Ð°Ð½Ð¸Ñ (R)"
+msgstr "Режим маÑштабированиÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4464,9 +4440,8 @@ msgid "Restores the object's children's ability to be selected."
msgstr "ВоÑÑтанавливает возможноÑÑ‚ÑŒ выбора потомков объекта."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton Options"
-msgstr "Скелет"
+msgstr "Опции Ñкелета"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
@@ -4520,7 +4495,7 @@ msgstr "Показать окно проÑмотра"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "Показать группу и заблокировать иконки"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -4961,7 +4936,6 @@ msgid "Create Navigation Polygon"
msgstr "Создать Navigation Polygon"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Generating Visibility Rect"
msgstr "Создать облаÑÑ‚ÑŒ видимоÑти"
@@ -5442,9 +5416,8 @@ msgid "Error writing TextFile:"
msgstr "Ошибка при запиÑи:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error: could not load file."
-msgstr "Ðе удалоÑÑŒ загрузить файл."
+msgstr "Ошибка: Ðе удалоÑÑŒ загрузить файл."
#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
@@ -5615,7 +5588,6 @@ msgid "Keep Debugger Open"
msgstr "ОÑтавить отладчик открытым"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Debug with External Editor"
msgstr "Отладка Ñ Ð¿Ð¾Ð¼Ð¾Ñ‰ÑŒÑŽ внешнего редактора"
@@ -5660,7 +5632,6 @@ msgid "Debugger"
msgstr "Отладчик"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
msgstr "Результаты поиÑка"
@@ -5673,9 +5644,8 @@ msgid "(ignore)"
msgstr "(игнорировать)"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "Перейти к функции..."
+msgstr "Перейти к функции"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -5764,12 +5734,10 @@ msgid "Trim Trailing Whitespace"
msgstr "Удаление пробелов в конце Ñтрок"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Spaces"
msgstr "Преобразовать отÑтуп в пробелы"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Tabs"
msgstr "Преобразовать отÑтуп в табулÑцию"
@@ -5787,12 +5755,10 @@ msgid "Remove All Breakpoints"
msgstr "Удалить вÑе точки оÑтановок"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Breakpoint"
msgstr "Перейти к Ñледующей точке оÑтановки"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Breakpoint"
msgstr "Перейти к предыдущей точке оÑтановки"
@@ -5801,17 +5767,14 @@ msgid "Find Previous"
msgstr "Ðайти предыдущее"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find in Files..."
msgstr "Ðайти в файлах..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
msgstr "Перейти к функции..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
msgstr "Перейти к Ñтроке..."
@@ -6309,7 +6272,6 @@ msgstr ""
"Ðе удаетÑÑ Ð¿Ñ€ÐµÐ¾Ð±Ñ€Ð°Ð·Ð¾Ð²Ð°Ñ‚ÑŒ Ñпрайт иÑпользующий анимационные кадры в Ñетку."
#: editor/plugins/sprite_editor_plugin.cpp
-#, fuzzy
msgid "Invalid geometry, can't replace by mesh."
msgstr "ÐедопуÑÑ‚Ð¸Ð¼Ð°Ñ Ð³ÐµÐ¾Ð¼ÐµÑ‚Ñ€Ð¸Ñ, не удаетÑÑ Ð·Ð°Ð¼ÐµÐ½Ð¸Ñ‚ÑŒ Ñетки."
@@ -6582,9 +6544,8 @@ msgid "Fix Invalid Tiles"
msgstr "ИÑправить недопуÑтимые плитки"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Cut Selection"
-msgstr "Центрировать выбранное"
+msgstr "Вырезать выделенное"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6631,27 +6592,24 @@ msgid "Pick Tile"
msgstr "Выбрать тайл"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "Передвинуть выделенное"
+msgstr "Копировать выделенное"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate left"
-msgstr "Режим поворота"
+msgstr "Повернуть влево"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate right"
-msgstr "Двигать вправо"
+msgstr "Повернуть вправо"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip horizontally"
-msgstr ""
+msgstr "Отразить по горизонтали"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip vertically"
-msgstr ""
+msgstr "Отразить по вертикали"
#: editor/plugins/tile_map_editor_plugin.cpp
#, fuzzy
@@ -9272,7 +9230,7 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr "Ðичего не видно, потому что полиÑетки не были назначены на отриÑовку."
#: scene/3d/cpu_particles.cpp
@@ -9546,6 +9504,9 @@ msgstr "Ðазначить форму"
msgid "Varyings can only be assigned in vertex function."
msgstr "Переменные могут быть назначены только в функции вершин."
+#~ msgid "Zoom:"
+#~ msgstr "Приближение:"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "Ð’Ñ‹ уверены, что хотите удалить вÑе Ð¿Ð¾Ð´ÐºÐ»ÑŽÑ‡ÐµÐ½Ð¸Ñ Ð¾Ñ‚ \""
@@ -10261,9 +10222,6 @@ msgstr "Переменные могут быть назначены только
#~ msgid "Source Font:"
#~ msgstr "ИÑходный шрифт:"
-#~ msgid "Source Font Size:"
-#~ msgstr "ИÑходный размер шрифта:"
-
#~ msgid "Dest Resource:"
#~ msgstr "РеÑÑƒÑ€Ñ Ð½Ð°Ð·Ð½Ð°Ñ‡ÐµÐ½Ð¸Ñ:"
diff --git a/editor/translations/si.po b/editor/translations/si.po
index 726eb15d37..cad4ac4e20 100644
--- a/editor/translations/si.po
+++ b/editor/translations/si.po
@@ -536,7 +536,7 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
#: editor/code_editor.cpp
@@ -1651,6 +1651,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2047,7 +2053,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -8849,7 +8855,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
diff --git a/editor/translations/sk.po b/editor/translations/sk.po
index d2bd63b02a..bb1597a3b9 100644
--- a/editor/translations/sk.po
+++ b/editor/translations/sk.po
@@ -543,7 +543,7 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
#: editor/code_editor.cpp
@@ -1686,6 +1686,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2086,7 +2092,7 @@ msgid "Undo"
msgstr "Späť"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -9016,7 +9022,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
diff --git a/editor/translations/sl.po b/editor/translations/sl.po
index 19a658939b..ca2e63448e 100644
--- a/editor/translations/sl.po
+++ b/editor/translations/sl.po
@@ -561,9 +561,8 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Približaj"
+msgid "Font Size:"
+msgstr ""
#: editor/code_editor.cpp
msgid "Line:"
@@ -1725,6 +1724,12 @@ msgstr "Te operacije ne moremo storiti brez osnovnega drevesa."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2162,7 +2167,7 @@ msgid "Undo"
msgstr "Razveljavi"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Ponovi"
@@ -9210,7 +9215,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9443,6 +9448,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Približaj"
+
#~ msgid "Class List:"
#~ msgstr "Seznam Razredov:"
diff --git a/editor/translations/sr_Cyrl.po b/editor/translations/sr_Cyrl.po
index 9dec0b6def..1f8bbe8cfd 100644
--- a/editor/translations/sr_Cyrl.po
+++ b/editor/translations/sr_Cyrl.po
@@ -564,8 +564,8 @@ msgstr ""
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Увеличај"
+msgid "Font Size:"
+msgstr "Поглед иÑпред"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1735,6 +1735,12 @@ msgid "This operation can't be done without a tree root."
msgstr "Ова операција Ñе не може обавити без корена дрвета."
#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
#, fuzzy
msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
@@ -2174,7 +2180,7 @@ msgid "Undo"
msgstr "Опозови"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Поново уради"
@@ -9292,7 +9298,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9523,6 +9529,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Увеличај"
+
#~ msgid "Class List:"
#~ msgstr "ЛиÑта клаÑа:"
diff --git a/editor/translations/sr_Latn.po b/editor/translations/sr_Latn.po
index 864685e72a..9781b261b7 100644
--- a/editor/translations/sr_Latn.po
+++ b/editor/translations/sr_Latn.po
@@ -543,7 +543,7 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
#: editor/code_editor.cpp
@@ -1660,6 +1660,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2056,7 +2062,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -8876,7 +8882,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
diff --git a/editor/translations/sv.po b/editor/translations/sv.po
index 0493e3eec8..7ddf0a981d 100644
--- a/editor/translations/sv.po
+++ b/editor/translations/sv.po
@@ -582,8 +582,8 @@ msgstr "Varning"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "Zooma In"
+msgid "Font Size:"
+msgstr "Vy framifrån"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1894,6 +1894,12 @@ msgid "This operation can't be done without a tree root."
msgstr "Åtgärden kan inte göras utan en trädrot."
#: editor/editor_node.cpp
+msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
#, fuzzy
msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
@@ -2389,7 +2395,7 @@ msgid "Undo"
msgstr "Ã…ngra"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
#, fuzzy
msgid "Redo"
msgstr "Ã…ngra"
@@ -9715,7 +9721,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9956,6 +9962,10 @@ msgid "Varyings can only be assigned in vertex function."
msgstr ""
#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Zooma In"
+
+#, fuzzy
#~ msgid "Class List:"
#~ msgstr "Klasslista:"
diff --git a/editor/translations/ta.po b/editor/translations/ta.po
index de4e62702b..b6a30c7fe7 100644
--- a/editor/translations/ta.po
+++ b/editor/translations/ta.po
@@ -541,7 +541,7 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
#: editor/code_editor.cpp
@@ -1657,6 +1657,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2053,7 +2059,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -8863,7 +8869,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
diff --git a/editor/translations/th.po b/editor/translations/th.po
index 021f57822e..a8661d6968 100644
--- a/editor/translations/th.po
+++ b/editor/translations/th.po
@@ -569,8 +569,8 @@ msgstr "คำเตือน"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "ซูม (%):"
+msgid "Font Size:"
+msgstr "ขนาดฟอนต์ต้นฉบับ:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1724,6 +1724,12 @@ msgstr "ทำไม่ได้ถ้าไม่มีฉาà¸"
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr "บันทึà¸à¸‰à¸²à¸à¹„ม่ได้ อาจจะมีà¸à¸²à¸£à¸­à¹‰à¸²à¸‡à¸­à¸´à¸‡à¹„ม่สมบูรณ์ (อินสà¹à¸•à¸™à¸‹à¹Œà¸«à¸£à¸·à¸­à¸à¸²à¸£à¸ªà¸·à¸šà¸—อด)"
@@ -2145,7 +2151,7 @@ msgid "Undo"
msgstr "เลิà¸à¸—ำ"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "ทำซ้ำ"
@@ -9258,7 +9264,7 @@ msgstr "ต้องมีรูปทรงเพื่อให้ CollisionSh
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr "ไม่มีà¸à¸²à¸£à¹à¸ªà¸”งผลเนื่องจาà¸à¹„ม่ได้à¸à¸³à¸«à¸™à¸” mesh ใน draw pass"
#: scene/3d/cpu_particles.cpp
@@ -9508,6 +9514,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "ซูม (%):"
+
#~ msgid "Class List:"
#~ msgstr "รายชื่อคลาส:"
@@ -10210,9 +10220,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "ฟอนต์ต้นฉบับ:"
-#~ msgid "Source Font Size:"
-#~ msgstr "ขนาดฟอนต์ต้นฉบับ:"
-
#~ msgid "Dest Resource:"
#~ msgstr "นำเข้ามาเป็นรีซอร์ส:"
diff --git a/editor/translations/tr.po b/editor/translations/tr.po
index 64c03e3f0b..a57b573cf9 100644
--- a/editor/translations/tr.po
+++ b/editor/translations/tr.po
@@ -582,8 +582,8 @@ msgstr "Uyarılar"
#: editor/code_editor.cpp
#, fuzzy
-msgid "Zoom:"
-msgstr "YaklaÅŸ (%):"
+msgid "Font Size:"
+msgstr "Kaynak Yazı Türü Boyutu:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -1745,6 +1745,12 @@ msgstr "Bu işlem bir kök sahne olmadan yapılamaz."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2184,7 +2190,7 @@ msgid "Undo"
msgstr "Geri"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Geri"
@@ -9375,7 +9381,7 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
"Hiçbirşey görünebilir değil çünkü örüntüler çizim geçişlerine atanmış değil."
@@ -9646,6 +9652,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "YaklaÅŸ (%):"
+
#~ msgid "Class List:"
#~ msgstr "Sınıf Listesi:"
@@ -10346,9 +10356,6 @@ msgstr ""
#~ msgid "Source Font:"
#~ msgstr "Yazı Türü Kaynağı:"
-#~ msgid "Source Font Size:"
-#~ msgstr "Kaynak Yazı Türü Boyutu:"
-
#~ msgid "Dest Resource:"
#~ msgstr "Varış Kaynağı:"
diff --git a/editor/translations/uk.po b/editor/translations/uk.po
index 6d61acce23..befdfbd46d 100644
--- a/editor/translations/uk.po
+++ b/editor/translations/uk.po
@@ -9,11 +9,12 @@
# МакÑим Якимчук <xpinovo@gmail.com>, 2018.
# ÐœÐ°Ñ€Ñ Ð¯Ð¼Ð±Ð°Ñ€ <mjambarmeta@gmail.com>, 2017-2018.
# ОлекÑандр Пилипчук <pilipchukap@rambler.ru>, 2018.
+# Kirill Omelchenko <kirill.omelchenko@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Ukrainian (Godot Engine)\n"
-"PO-Revision-Date: 2018-08-24 19:45+0000\n"
-"Last-Translator: Yuri Chornoivan <yurchor@ukr.net>\n"
+"PO-Revision-Date: 2018-12-04 22:15+0000\n"
+"Last-Translator: МакÑим Якимчук <xpinovo@gmail.com>\n"
"Language-Team: Ukrainian <https://hosted.weblate.org/projects/godot-engine/"
"godot/uk/>\n"
"Language: uk\n"
@@ -21,7 +22,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 3.2-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -42,8 +43,7 @@ msgstr "Ðекоректні вхідні дані %i (не передано) у
#: core/math/expression.cpp
msgid "self can't be used because instance is null (not passed)"
msgstr ""
-"не можна викориÑтовувати self, оÑкільки екземплÑÑ€ може бути порожнім (не "
-"передано)"
+"не можна викориÑтовувати self, оÑкільки екземплÑÑ€ Ñ” порожнім (не передано)"
#: core/math/expression.cpp
msgid "Invalid operands to operator %s, %s and %s."
@@ -407,14 +407,12 @@ msgid "Delete Selection"
msgstr "Вилучити позначене"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
-msgstr "Перейти до наÑтупного кроку"
+msgstr "До наÑтупного кроку"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
-msgstr "ПовернутиÑÑ Ð´Ð¾ попереднього кроку"
+msgstr "До попереднього кроку"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -553,8 +551,9 @@ msgid "Warnings:"
msgstr "ПопередженнÑ:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "МаÑштаб:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "ВиглÑд Ñпереду"
#: editor/code_editor.cpp
msgid "Line:"
@@ -667,9 +666,8 @@ msgid "Edit Connection: "
msgstr "Редагувати з’єднаннÑ: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "Ви Ñправді хочете вилучити уÑÑ– з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· цього Ñигналу?"
+msgstr "Ви Ñправді хочете вилучити уÑÑ– з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñигналу «%s»?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -824,9 +822,8 @@ msgid "Error loading:"
msgstr "Помилка завантаженнÑ:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ у зв'Ñзку з відÑутніми залежноÑÑ‚Ñми Ñцени:"
+msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ через неÑтачу залежноÑтей:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1310,24 +1307,21 @@ msgid "File Exists, Overwrite?"
msgstr "Файл Ñ–Ñнує, перезапиÑати його?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
-msgstr "Обрати цю теку"
+msgstr "Вибрати цю теку"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "Копіювати шлÑÑ…"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "Відкрити в менеджері файлів"
+msgstr "Відкрити у менеджері файлів"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
-msgstr "Показати в файловому менеджері"
+msgstr "Показати у менеджері файлів"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1470,19 +1464,16 @@ msgid "Methods"
msgstr "Методи"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Methods:"
-msgstr "Методи"
+msgstr "Методи:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "ВлаÑтивоÑÑ‚Ñ–"
+msgstr "ВлаÑтивоÑÑ‚Ñ– теми"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties:"
-msgstr "ВлаÑтивоÑÑ‚Ñ–:"
+msgstr "ВлаÑтивоÑÑ‚Ñ– теми:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1509,18 +1500,16 @@ msgid "Constants:"
msgstr "КонÑтанти:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description"
-msgstr "ОпиÑ"
+msgstr "ÐžÐ¿Ð¸Ñ ÐºÐ»Ð°Ñу"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description:"
-msgstr "ОпиÑ:"
+msgstr "ÐžÐ¿Ð¸Ñ ÐºÐ»Ð°Ñу:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
-msgstr "Підручники у інтернеті:"
+msgstr "Підручники в інтернеті:"
#: editor/editor_help.cpp
msgid ""
@@ -1533,14 +1522,12 @@ msgstr ""
"щодо їхнього ÑтвореннÑ[/url][/color]."
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "ÐžÐ¿Ð¸Ñ Ð²Ð»Ð°ÑтивоÑтей:"
+msgstr "ОпиÑи влаÑтивоÑтей"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions:"
-msgstr "ÐžÐ¿Ð¸Ñ Ð²Ð»Ð°ÑтивоÑтей:"
+msgstr "ОпиÑи влаÑтивоÑтей:"
#: editor/editor_help.cpp
msgid ""
@@ -1551,14 +1538,12 @@ msgstr ""
"[url=$url]Ñтворіть його[/url][/color]!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "ÐžÐ¿Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñ–Ð²:"
+msgstr "ОпиÑи методів"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions:"
-msgstr "ÐžÐ¿Ð¸Ñ Ð¼ÐµÑ‚Ð¾Ð´Ñ–Ð²:"
+msgstr "ОпиÑи методів:"
#: editor/editor_help.cpp
msgid ""
@@ -1574,49 +1559,40 @@ msgid "Search Help"
msgstr "Пошук довідки"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "Ðормальний переглÑд"
+msgstr "Показати уÑе"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Classes Only"
-msgstr "КлаÑи"
+msgstr "Лише клаÑи"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "Методи"
+msgstr "Лише методи"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "Сигнали"
+msgstr "Лише Ñигнали"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "КонÑтанти"
+msgstr "Лише Ñталі"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "ВлаÑтивоÑÑ‚Ñ–"
+msgstr "Лише влаÑтивоÑÑ‚Ñ–"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "ВлаÑтивоÑÑ‚Ñ–"
+msgstr "Лише влаÑтивоÑÑ‚Ñ– теми"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Member Type"
-msgstr "Члени"
+msgstr "Тип члена"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "КлаÑ:"
+msgstr "КлаÑ"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -1715,6 +1691,12 @@ msgstr "Ð¦Ñ Ð¾Ð¿ÐµÑ€Ð°Ñ†Ñ–Ñ Ð½Ðµ може бути виконана без кÐ
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -1723,7 +1705,7 @@ msgstr ""
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "Ðеможливо перезапиÑати Ñцену, Ñка Ñ” ще відкритою!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -1982,13 +1964,12 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "Ðеможливо завантажити Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ñкрипт зі шлÑху: '%s'."
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
msgstr ""
-"Ðеможливо завантажити Ñкрипт Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð· шлÑху: '%s' Скрипт не в режимі "
-"інÑтрументу."
+"Ðеможливо завантажити Ñкрипт Ð´Ð¾Ð¿Ð¾Ð²Ð½ÐµÐ½Ð½Ñ Ð· шлÑху «%s». ЗдаєтьÑÑ, у коді Ñ” "
+"помилка, будь лаÑка, перевірте ÑинтакÑиÑ."
#: editor/editor_node.cpp
msgid ""
@@ -2043,9 +2024,8 @@ msgstr "Типовий"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
-msgstr "Показати в файловій ÑиÑтемі"
+msgstr "Показати у файловій ÑиÑтемі"
#: editor/editor_node.cpp
msgid "Play This Scene"
@@ -2128,7 +2108,6 @@ msgid "Save Scene"
msgstr "Зберегти Ñцену"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
msgstr "Зберегти вÑÑ– Ñцени"
@@ -2158,7 +2137,7 @@ msgid "Undo"
msgstr "СкаÑувати"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "Повернути"
@@ -2615,6 +2594,9 @@ msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"Ðеможливо Ñтворити ViewportTexture на оÑнові реÑурÑів, Ñкі збережено Ñк "
+"файл.\n"
+"РеÑÑƒÑ€Ñ Ð¼Ð°Ñ” належати до Ñцени."
#: editor/editor_properties.cpp
msgid ""
@@ -2623,6 +2605,10 @@ msgid ""
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"Ðеможливо Ñтворити ViewportTexture на оÑнові цього реÑурÑу, оÑкільки його не "
+"вÑтановлено Ñк локальний щодо Ñцени.\n"
+"Будь лаÑка, увімкніть влаÑтивіÑÑ‚ÑŒ «Локальний щодо Ñцени» Ð´Ð»Ñ Ð½ÑŒÐ¾Ð³Ð¾ (Ñ– уÑÑ–Ñ… "
+"реÑурÑів, що його міÑÑ‚ÑÑ‚ÑŒ, аж до вузла)."
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
@@ -2939,9 +2925,8 @@ msgstr ""
"тип кешу!"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "Вибране:"
+msgstr "Вибране"
#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
@@ -3027,14 +3012,12 @@ msgid "Instance"
msgstr "ЕкземплÑÑ€"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to favorites"
-msgstr "Вибране:"
+msgstr "Додати до вибраного"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from favorites"
-msgstr "Вилучити з групи"
+msgstr "Вилучити з вибраного"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3065,12 +3048,10 @@ msgid "New Resource..."
msgstr "Створити реÑурÑ…"
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Expand All"
msgstr "Розгорнути вÑе"
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
msgstr "Згорнути вÑе"
@@ -3094,9 +3075,8 @@ msgid "Re-Scan Filesystem"
msgstr "ПереÑÐºÐ°Ð½ÑƒÐ²Ð°Ð½Ð½Ñ Ñ„Ð°Ð¹Ð»Ð¾Ð²Ð¾Ñ— ÑиÑтеми"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle split mode"
-msgstr "Режим ПеремиканнÑ"
+msgstr "Перемкнути режим поділу"
#: editor/filesystem_dock.cpp
msgid "Search files"
@@ -3128,27 +3108,23 @@ msgstr "ПерезапиÑати"
#: editor/filesystem_dock.cpp editor/plugins/script_editor_plugin.cpp
msgid "Create Script"
-msgstr "Створити Ñценарій"
+msgstr "Створити Ñкрипт"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find in Files"
msgstr "Знайти у файлах"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "Знайти: "
+msgstr "Знайти:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "Тека: "
+msgstr "Тека:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "Фільтр: "
+msgstr "Фільтри:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3325,12 +3301,10 @@ msgid "Failed to load resource."
msgstr "Ðе вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ реÑурÑ."
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
msgstr "Розгорнути вÑÑ– влаÑтивоÑÑ‚Ñ–"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
msgstr "Згорнути вÑÑ– влаÑтивоÑÑ‚Ñ–"
@@ -4289,9 +4263,8 @@ msgid "Resize CanvasItem"
msgstr "Змінити розмір CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale CanvasItem"
-msgstr "Обертати CanvasItem"
+msgstr "МаÑштабувати CanvasItem"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
@@ -4356,9 +4329,8 @@ msgid "Rotate Mode"
msgstr "Режим повороту"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Mode"
-msgstr "Режим маÑÑˆÑ‚Ð°Ð±ÑƒÐ²Ð°Ð½Ð½Ñ (R)"
+msgstr "Режим маÑштабуваннÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4457,9 +4429,8 @@ msgid "Restores the object's children's ability to be selected."
msgstr "Відновлює можливіÑÑ‚ÑŒ вибору нащадків об'єкта."
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton Options"
-msgstr "КаркаÑ"
+msgstr "Параметри каркаÑа"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
@@ -4513,7 +4484,7 @@ msgstr "Показати панель переглÑду"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "Показати піктограми Ð³Ñ€ÑƒÐ¿ÑƒÐ²Ð°Ð½Ð½Ñ Ñ‚Ð° блокуваннÑ"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -4955,9 +4926,8 @@ msgid "Create Navigation Polygon"
msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð½Ð°Ð²Ñ–Ð³Ð°Ñ†Ñ–Ð¹Ð½Ð¾Ð³Ð¾ полігону"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Generating Visibility Rect"
-msgstr "Створити облаÑÑ‚ÑŒ видимоÑÑ‚Ñ–"
+msgstr "Ð¡Ñ‚Ð²Ð¾Ñ€ÐµÐ½Ð½Ñ Ð¾Ð±Ð»Ð°ÑÑ‚Ñ– видимоÑÑ‚Ñ–"
#: editor/plugins/particles_2d_editor_plugin.cpp
msgid "Can only set point into a ParticlesMaterial process material"
@@ -5436,7 +5406,6 @@ msgid "Error writing TextFile:"
msgstr "Помилка під Ñ‡Ð°Ñ Ñпроби запиÑати TextFile:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error: could not load file."
msgstr "Помилка: не вдалоÑÑ Ð·Ð°Ð²Ð°Ð½Ñ‚Ð°Ð¶Ð¸Ñ‚Ð¸ файл."
@@ -5510,11 +5479,11 @@ msgstr "ПереміÑтити вниз"
#: editor/plugins/script_editor_plugin.cpp
msgid "Next script"
-msgstr "ÐаÑтупний Ñценарій"
+msgstr "ÐаÑтупний Ñкрипт"
#: editor/plugins/script_editor_plugin.cpp
msgid "Previous script"
-msgstr "Попередній Ñценарій"
+msgstr "Попередній Ñкрипт"
#: editor/plugins/script_editor_plugin.cpp
msgid "File"
@@ -5530,16 +5499,15 @@ msgstr "Зберегти вÑе"
#: editor/plugins/script_editor_plugin.cpp
msgid "Soft Reload Script"
-msgstr "Ðœ'Ñко перезавантажити Ñценарії"
+msgstr "Ðœ'Ñко перезавантажити Ñкрипт"
#: editor/plugins/script_editor_plugin.cpp
msgid "Copy Script Path"
msgstr "Копіювати шлÑÑ… до Ñкрипту"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "History Previous"
-msgstr "Попередній файл"
+msgstr "Попередній у журналі"
#: editor/plugins/script_editor_plugin.cpp
msgid "History Next"
@@ -5580,7 +5548,7 @@ msgstr "ЗапуÑтити"
#: editor/plugins/script_editor_plugin.cpp
msgid "Toggle Scripts Panel"
-msgstr "Перемкнути панель Ñценаріїв"
+msgstr "Перемкнути панель Ñкриптів"
#: editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -5609,7 +5577,6 @@ msgid "Keep Debugger Open"
msgstr "Залишити зневаджувач відкритим"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Debug with External Editor"
msgstr "Ð—Ð½ÐµÐ²Ð°Ð´Ð¶ÐµÐ½Ð½Ñ Ð·Ð° допомогою зовнішнього редактора"
@@ -5654,7 +5621,6 @@ msgid "Debugger"
msgstr "Зневаджувач"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
msgstr "Результати пошуку"
@@ -5667,9 +5633,8 @@ msgid "(ignore)"
msgstr "(ігнорувати)"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "Перейти до функції..."
+msgstr "Перейти до функції"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -5758,12 +5723,10 @@ msgid "Trim Trailing Whitespace"
msgstr "Обрізати кінцевий пробіл"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Spaces"
msgstr "Перетворити відÑтуп на пропуÑки"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Tabs"
msgstr "Перетворити відÑтуп на табулÑції"
@@ -5781,12 +5744,10 @@ msgid "Remove All Breakpoints"
msgstr "Вилучити вÑÑ– точки зупинки"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Breakpoint"
msgstr "Перейти до наÑтупної точки зупинки"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Breakpoint"
msgstr "Перейти до попередньої точки зупинки"
@@ -5795,17 +5756,14 @@ msgid "Find Previous"
msgstr "Знайти попереднє"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find in Files..."
msgstr "Знайти у файлах…"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
msgstr "Перейти до функції..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
msgstr "Перейти до Ñ€Ñдка..."
@@ -5898,13 +5856,12 @@ msgid "Animation Key Inserted."
msgstr "Ð’Ñтавлено ключ анімації."
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "Pitch"
-msgstr "Перемикач"
+msgstr "ХилитаннÑ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Yaw"
-msgstr ""
+msgstr "ВідхиленнÑ"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
@@ -6071,9 +6028,8 @@ msgid "Freelook Speed Modifier"
msgstr "Коефіцієнт швидкоÑÑ‚Ñ– оглÑду"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View Rotation Locked"
-msgstr "ЗафікÑувати Ð¾Ð±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду"
+msgstr "ÐžÐ±ÐµÑ€Ñ‚Ð°Ð½Ð½Ñ Ð¿ÐµÑ€ÐµÐ³Ð»Ñду заблоковано"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "XForm Dialog"
@@ -6577,9 +6533,8 @@ msgid "Fix Invalid Tiles"
msgstr "Виправити некоректні плитки"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Cut Selection"
-msgstr "Центрувати на вибраному"
+msgstr "Вирізати позначене"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6626,32 +6581,28 @@ msgid "Pick Tile"
msgstr "Вибрати плитку"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "ПереÑунути позначене"
+msgstr "Копіювати позначене"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate left"
-msgstr "Режим повороту"
+msgstr "Обертати ліворуч"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate right"
-msgstr "Повернути полігон"
+msgstr "Обертати праворуч"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip horizontally"
-msgstr ""
+msgstr "Відзеркалити горизонтально"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip vertically"
-msgstr ""
+msgstr "Віддзеркалити вертикально"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear transform"
-msgstr "ПеретвореннÑ"
+msgstr "ЗнÑти перетвореннÑ"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Add Texture(s) to TileSet"
@@ -6682,7 +6633,6 @@ msgid "Display tile's names (hold Alt Key)"
msgstr "Показувати назви плиток (Ñкщо утримують клавішу Alt)"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected texture and ALL TILES which use it?"
msgstr "Вилучити позначену текÑтуру Ñ– уÑÑ– плитки, у Ñких Ñ—Ñ— викориÑтано?"
@@ -6699,9 +6649,8 @@ msgid "Merge from scene?"
msgstr "Об'єднати зі Ñцени?"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "%s file(s) were not added because was already on the list."
-msgstr " файлів не додано, оÑкільки вони вже були у ÑпиÑку."
+msgstr "%s файлів не додано, оÑкільки вони вже були у ÑпиÑку."
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -6790,12 +6739,11 @@ msgstr ""
#: editor/project_export.cpp
msgid "Release"
-msgstr ""
+msgstr "ВипуÑк"
#: editor/project_export.cpp
-#, fuzzy
msgid "Exporting All"
-msgstr "ЕкÑпортуваннÑ"
+msgstr "ЕкÑÐ¿Ð¾Ñ€Ñ‚ÑƒÐ²Ð°Ð½Ð½Ñ ÑƒÑього"
#: editor/project_export.cpp
msgid "Presets"
@@ -6806,9 +6754,8 @@ msgid "Add..."
msgstr "Додати..."
#: editor/project_export.cpp
-#, fuzzy
msgid "Export Path:"
-msgstr "ЕкÑпортувати проект"
+msgstr "ШлÑÑ… екÑпорту:"
#: editor/project_export.cpp
msgid "Resources"
@@ -6873,14 +6820,12 @@ msgid "Export PCK/Zip"
msgstr "ЕкÑпортувати PCK/Zip"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "Режим екÑпортуваннÑ:"
+msgstr "Режим екÑпортуваннÑ?"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "ЕкÑпортуваннÑ"
+msgstr "ЕкÑпортувати уÑе"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
@@ -7569,7 +7514,6 @@ msgid "Step"
msgstr "Крок"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Amount by which counter is incremented for each node"
msgstr "Величина, на Ñку збільшуєтьÑÑ Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð»Ñ–Ñ‡Ð¸Ð»ÑŒÐ½Ð¸ÐºÐ° Ð´Ð»Ñ ÐºÐ¾Ð¶Ð½Ð¾Ð³Ð¾ вузла"
@@ -7578,7 +7522,6 @@ msgid "Padding"
msgstr "ФаÑка"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid ""
"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
@@ -7727,6 +7670,8 @@ msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
msgstr ""
+"Ð’Ð¸Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Â«editable_instance» призведе до Ð¿Ð¾Ð²ÐµÑ€Ð½ÐµÐ½Ð½Ñ Ñ‚Ð¸Ð¿Ð¾Ð²Ð¸Ñ… значень Ð´Ð»Ñ "
+"уÑÑ–Ñ… влаÑтивоÑтей вузла."
#: editor/scene_tree_dock.cpp
msgid "Editable Children"
@@ -7801,9 +7746,8 @@ msgid "Clear Inheritance"
msgstr "УÑунути уÑпадкуваннÑ"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open documentation"
-msgstr "Відкрити онлайнову документацію Godot"
+msgstr "Відкрити документацію"
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
@@ -7818,9 +7762,8 @@ msgid "Change Type"
msgstr "Змінити тип"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
-msgstr "Відкрити Ñценарій"
+msgstr "Розширити Ñкрипт"
#: editor/scene_tree_dock.cpp
msgid "Make Scene Root"
@@ -7908,7 +7851,7 @@ msgstr ""
#: editor/scene_tree_editor.cpp editor/script_create_dialog.cpp
msgid "Open Script"
-msgstr "Відкрити Ñценарій"
+msgstr "Відкрити Ñкрипт"
#: editor/scene_tree_editor.cpp
msgid ""
@@ -7983,9 +7926,8 @@ msgid "Path is empty"
msgstr "Порожній шлÑÑ…"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty"
-msgstr "Спрайт порожній!"
+msgstr "Ðазва файла Ñ” порожньою"
#: editor/script_create_dialog.cpp
msgid "Path is not local"
@@ -8076,9 +8018,8 @@ msgid "Bytes:"
msgstr "Байтів:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Stack Trace"
-msgstr "СтоÑувати кадри"
+msgstr "ТраÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтека"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8528,7 +8469,7 @@ msgstr "Кінець траÑÑƒÐ²Ð°Ð½Ð½Ñ Ñтека Ð´Ð»Ñ Ð²Ð½ÑƒÑ‚Ñ€Ñ–ÑˆÐ½ÑŒÐ¾
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Bake NavMesh"
-msgstr ""
+msgstr "Запекти NavMesh"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8912,12 +8853,11 @@ msgstr "Шукати VisualScript"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "Отримати %s"
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Set %s"
-msgstr "Ð’Ñтановити "
+msgstr "Ð’Ñтановити %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -9015,6 +8955,8 @@ msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ CPUParticles2D потребує викориÑÑ‚Ð°Ð½Ð½Ñ CanvasItemMaterial із "
+"увімкненим параметром «ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ Ñ‡Ð°Ñток»."
#: scene/2d/light_2d.cpp
msgid ""
@@ -9072,6 +9014,8 @@ msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
msgstr ""
+"ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ Particles2D потребує викориÑÑ‚Ð°Ð½Ð½Ñ CanvasItemMaterial із увімкненим "
+"параметром «ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ Ñ‡Ð°Ñток»."
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
@@ -9217,15 +9161,16 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
-msgstr ""
-"Ðічого не видно, оÑкільки Ñітки не було пов'Ñзано із проходами малюваннÑ."
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "Ðічого не видно, оÑкільки не призначено Ñітки."
#: scene/3d/cpu_particles.cpp
msgid ""
"CPUParticles animation requires the usage of a SpatialMaterial with "
"\"Billboard Particles\" enabled."
msgstr ""
+"ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ CPUParticles потребує викориÑÑ‚Ð°Ð½Ð½Ñ SpatialMaterial із увімкненим "
+"параметром «ЧаÑтки дошки»."
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
@@ -9234,8 +9179,8 @@ msgstr "Побудова Ñітки"
#: scene/3d/navigation_mesh.cpp
msgid "A NavigationMesh resource must be set or created for this node to work."
msgstr ""
-"РеÑÑƒÑ€Ñ Ðавігаційна Ñітка повинен бути вÑтановлений або Ñтворений Ð´Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ "
-"цього вузла."
+"Ð”Ð»Ñ Ñ€Ð¾Ð±Ð¾Ñ‚Ð¸ цього вузла Ñлід вÑтановити або Ñтворити реÑÑƒÑ€Ñ Â«Ðавігаційна "
+"Ñітка»."
#: scene/3d/navigation_mesh.cpp
msgid ""
@@ -9256,20 +9201,21 @@ msgid ""
"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
"Particles\" enabled."
msgstr ""
+"ÐÐ½Ñ–Ð¼Ð°Ñ†Ñ–Ñ Ñ‡Ð°Ñток потребує викориÑÑ‚Ð°Ð½Ð½Ñ SpatialMaterial із увімкненим "
+"параметром «ЧаÑтки дошки»."
#: scene/3d/path.cpp
-#, fuzzy
msgid "PathFollow only works when set as a child of a Path node."
-msgstr "PathFollow2D працюватиме лише Ñк дочірній елемент вузла Path2D."
+msgstr "PathFollow працюватиме лише Ñк дочірній елемент вузла Path."
#: scene/3d/path.cpp
-#, fuzzy
msgid "OrientedPathFollow only works when set as a child of a Path node."
-msgstr "PathFollow2D працюватиме лише Ñк дочірній елемент вузла Path2D."
+msgstr "OrientedPathFollow працюватиме лише Ñк дочірній елемент вузла Path."
#: scene/3d/path.cpp
msgid "OrientedPathFollow requires up vectors enabled in its parent Path."
msgstr ""
+"OrientedPathFollow потребує Ð²Ð¼Ð¸ÐºÐ°Ð½Ð½Ñ Ð²ÐµÐºÑ‚Ð¾Ñ€Ñ–Ð² у його батьківÑькому Path."
#: scene/3d/physics_body.cpp
msgid ""
@@ -9312,7 +9258,6 @@ msgid "This body will be ignored until you set a mesh"
msgstr "Це тіло буде проігноровано, аж доки ви не вÑтановите Ñітку"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
@@ -9402,7 +9347,7 @@ msgstr ""
#: scene/gui/range.cpp
msgid "If exp_edit is true min_value must be > 0."
-msgstr ""
+msgstr "Якщо exp_edit має Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ true, min_value має бути > 0."
#: scene/gui/scroll_container.cpp
msgid ""
@@ -9479,6 +9424,9 @@ msgstr "ÐŸÑ€Ð¸Ð·Ð½Ð°Ñ‡ÐµÐ½Ð½Ñ Ð¾Ð´Ð½Ð¾Ñ€Ñ–Ð´Ð½Ð¾Ð³Ð¾."
msgid "Varyings can only be assigned in vertex function."
msgstr "Змінні величини можна пов'Ñзувати лише із функцією вузлів."
+#~ msgid "Zoom:"
+#~ msgstr "МаÑштаб:"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "Ви Ñправді хочете вилучити уÑÑ– з'Ñ”Ð´Ð½Ð°Ð½Ð½Ñ Ð· Ñигналу \""
diff --git a/editor/translations/ur_PK.po b/editor/translations/ur_PK.po
index eb509e1a82..688f386b3c 100644
--- a/editor/translations/ur_PK.po
+++ b/editor/translations/ur_PK.po
@@ -540,7 +540,7 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-msgid "Zoom:"
+msgid "Font Size:"
msgstr ""
#: editor/code_editor.cpp
@@ -1673,6 +1673,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2071,7 +2077,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -8955,7 +8961,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
diff --git a/editor/translations/vi.po b/editor/translations/vi.po
index 950964a00c..f6e694d4e5 100644
--- a/editor/translations/vi.po
+++ b/editor/translations/vi.po
@@ -557,9 +557,8 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "Phóng to"
+msgid "Font Size:"
+msgstr ""
#: editor/code_editor.cpp
msgid "Line:"
@@ -1705,6 +1704,12 @@ msgstr ""
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2110,7 +2115,7 @@ msgid "Undo"
msgstr ""
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr ""
@@ -9012,7 +9017,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9239,6 +9244,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "Phóng to"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "Bạn có chắc muốn xóa bỠtất cả kết nối từ \""
diff --git a/editor/translations/zh_CN.po b/editor/translations/zh_CN.po
index 169c31c1c3..512589d2df 100644
--- a/editor/translations/zh_CN.po
+++ b/editor/translations/zh_CN.po
@@ -13,7 +13,7 @@
# Geequlim <geequlim@gmail.com>, 2016-2018.
# jie Shi <meishijiemeimeimei@gmail.com>, 2018.
# Jingtian Pan <panjingtian@126.com>, 2018.
-# lalalaring <783482203@qq.com>, 2017.
+# lalalaring <783482203@qq.com>, 2017, 2018.
# Luo Jun <vipsbpig@gmail.com>, 2016-2017, 2018.
# oberon-tonya <360119124@qq.com>, 2016.
# plumsky <x-wolf@163.com>, 2018.
@@ -34,12 +34,14 @@
# 刘庆文 <liuqingwen@163.com>, 2018.
# Haowen Liu <liu.haowen.andy@gmail.com>, 2018.
# tangdou1 <1093505442@qq.com>, 2018.
+# yzt <834950797@qq.com>, 2018.
+# DKLost <514dklost@gmail.com>, 2018.
msgid ""
msgstr ""
"Project-Id-Version: Chinese (Simplified) (Godot Engine)\n"
"POT-Creation-Date: 2018-01-20 12:15+0200\n"
-"PO-Revision-Date: 2018-11-26 16:10+0000\n"
-"Last-Translator: Luo Jun <vipsbpig@gmail.com>\n"
+"PO-Revision-Date: 2018-12-04 05:19+0000\n"
+"Last-Translator: tangdou1 <1093505442@qq.com>\n"
"Language-Team: Chinese (Simplified) <https://hosted.weblate.org/projects/"
"godot-engine/godot/zh_Hans/>\n"
"Language: zh_CN\n"
@@ -47,7 +49,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 3.3-dev\n"
+"X-Generator: Weblate 3.4-dev\n"
#: core/math/expression.cpp modules/gdscript/gdscript_functions.cpp
#: modules/visual_script/visual_script_builtin_funcs.cpp
@@ -228,7 +230,7 @@ msgstr "触å‘器"
#: editor/animation_track_editor.cpp
msgid "Capture"
-msgstr "æ•èŽ·"
+msgstr "截图"
#: editor/animation_track_editor.cpp
msgid "Nearest"
@@ -425,14 +427,12 @@ msgid "Delete Selection"
msgstr "删除已选中项"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Next Step"
msgstr "å‰å¾€ä¸‹ä¸€æ­¥"
#: editor/animation_track_editor.cpp
-#, fuzzy
msgid "Go to Previous Step"
-msgstr "å‰å¾€ä¸Šä¸€æ­¥"
+msgstr "返回上一步"
#: editor/animation_track_editor.cpp
msgid "Optimize Animation"
@@ -571,8 +571,9 @@ msgid "Warnings:"
msgstr "警告:"
#: editor/code_editor.cpp
-msgid "Zoom:"
-msgstr "缩放:"
+#, fuzzy
+msgid "Font Size:"
+msgstr "æºå­—体大å°:"
#: editor/code_editor.cpp
msgid "Line:"
@@ -683,9 +684,8 @@ msgid "Edit Connection: "
msgstr "编辑广播订阅: "
#: editor/connections_dialog.cpp
-#, fuzzy
msgid "Are you sure you want to remove all connections from the \"%s\" signal?"
-msgstr "你确定è¦ä»Žè¯¥å¹¿æ’­ä¿¡å·ä¸­ç§»é™¤æ‰€æœ‰è¿žæŽ¥å—?"
+msgstr "你确定è¦ä»Žä¿¡å· “%s†中移除所有连接å—?"
#: editor/connections_dialog.cpp editor/editor_help.cpp editor/node_dock.cpp
msgid "Signals"
@@ -833,9 +833,8 @@ msgid "Error loading:"
msgstr "加载出错:"
#: editor/dependency_editor.cpp
-#, fuzzy
msgid "Load failed due to missing dependencies:"
-msgstr "加载场景失败,找ä¸åˆ°ä»¥ä¸‹ä¾èµ–项目:"
+msgstr "由于缺少ä¾èµ–项, 加载失败:"
#: editor/dependency_editor.cpp editor/editor_node.cpp
msgid "Open Anyway"
@@ -1313,24 +1312,21 @@ msgid "File Exists, Overwrite?"
msgstr "文件已存在,确定è¦è¦†ç›–它å—?"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
-#, fuzzy
msgid "Select This Folder"
-msgstr "选择当å‰ç›®å½•"
+msgstr "选择此文件夹"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "Copy Path"
msgstr "æ‹·è´è·¯å¾„"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
-#, fuzzy
msgid "Open in File Manager"
-msgstr "在资æºç®¡ç†å™¨ä¸­æ‰“å¼€"
+msgstr "在文件管ç†å™¨ä¸­æ‰“å¼€"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
#: editor/project_manager.cpp
-#, fuzzy
msgid "Show in File Manager"
-msgstr "在资æºç®¡ç†å™¨ä¸­æ‰“å¼€"
+msgstr "在文件管ç†å™¨ä¸­æ˜¾ç¤º"
#: editor/editor_file_dialog.cpp editor/filesystem_dock.cpp
msgid "New Folder..."
@@ -1354,7 +1350,7 @@ msgstr "打开å•ä¸ªæ–‡ä»¶"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open File(s)"
-msgstr "打开文件"
+msgstr "打开一个或多个文件"
#: editor/editor_file_dialog.cpp scene/gui/file_dialog.cpp
msgid "Open a Directory"
@@ -1473,19 +1469,16 @@ msgid "Methods"
msgstr "方法"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Methods:"
-msgstr "方法"
+msgstr "方法:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties"
-msgstr "属性"
+msgstr "主题属性"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Theme Properties:"
-msgstr "属性:"
+msgstr "Theme Properties:"
#: editor/editor_help.cpp modules/visual_script/visual_script_editor.cpp
msgid "Signals:"
@@ -1512,14 +1505,12 @@ msgid "Constants:"
msgstr "常é‡:"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description"
-msgstr "æè¿°"
+msgstr "类说明"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Class Description:"
-msgstr "æè¿°:"
+msgstr "类说明:"
#: editor/editor_help.cpp
msgid "Online Tutorials:"
@@ -1535,14 +1526,12 @@ msgstr ""
"url][/color]çš„æ–¹å¼å¸®åŠ©æˆ‘们完善文档。"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions"
-msgstr "属性æ述:"
+msgstr "属性说明"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Property Descriptions:"
-msgstr "属性æ述:"
+msgstr "属性说明:"
#: editor/editor_help.cpp
msgid ""
@@ -1553,14 +1542,12 @@ msgstr ""
"[/color]!"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions"
-msgstr "方法æè¿°:"
+msgstr "方法说明"
#: editor/editor_help.cpp
-#, fuzzy
msgid "Method Descriptions:"
-msgstr "方法æè¿°:"
+msgstr "方法说明:"
#: editor/editor_help.cpp
msgid ""
@@ -1576,49 +1563,40 @@ msgid "Search Help"
msgstr "æœç´¢å¸®åŠ©"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Display All"
-msgstr "显示法线"
+msgstr "全部显示"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Classes Only"
-msgstr "类型"
+msgstr "ä»…é™ç±»"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Methods Only"
-msgstr "方法"
+msgstr "仅方法"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Signals Only"
-msgstr "ä¿¡å·"
+msgstr "ä»…ä¿¡å·"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Constants Only"
-msgstr "常é‡"
+msgstr "仅常é‡"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Properties Only"
-msgstr "属性"
+msgstr "仅属性"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Theme Properties Only"
-msgstr "属性"
+msgstr "仅主题属性"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Member Type"
-msgstr "æˆå‘˜"
+msgstr "æˆå‘˜ç±»åž‹"
#: editor/editor_help_search.cpp
-#, fuzzy
msgid "Class"
-msgstr "ç±»:"
+msgstr "ç±»"
#: editor/editor_inspector.cpp editor/project_settings_editor.cpp
msgid "Property:"
@@ -1717,13 +1695,19 @@ msgstr "æ­¤æ“作必须在打开一个场景åŽæ‰èƒ½æ‰§è¡Œã€‚"
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr "无法ä¿å­˜åœºæ™¯ï¼Œä¾èµ–项(实例或基类)验è¯å¤±è´¥ã€‚"
#: editor/editor_node.cpp editor/scene_tree_dock.cpp
msgid "Can't overwrite scene that is still open!"
-msgstr ""
+msgstr "无法覆盖ä»å¤„于打开状æ€çš„场景!"
#: editor/editor_node.cpp
msgid "Can't load MeshLibrary for merging!"
@@ -1967,11 +1951,10 @@ msgid "Unable to load addon script from path: '%s'."
msgstr "无法从路径中加载æ’件脚本: \"%s\"。"
#: editor/editor_node.cpp
-#, fuzzy
msgid ""
"Unable to load addon script from path: '%s' There seems to be an error in "
"the code, please check the syntax."
-msgstr "无法从路径加载æ’件脚本: \"%s\" 脚本ä¸åœ¨å·¥å…·æ¨¡å¼ä¸‹ã€‚"
+msgstr "无法从路径加载æ’件脚本: ‘%s’ 脚本看上去似乎有代ç é”™è¯¯ï¼Œè¯·æ£€æŸ¥å…¶è¯­æ³•ã€‚"
#: editor/editor_node.cpp
msgid ""
@@ -2020,9 +2003,8 @@ msgstr "默认"
#: editor/editor_node.cpp editor/editor_properties.cpp
#: editor/plugins/script_editor_plugin.cpp editor/property_editor.cpp
-#, fuzzy
msgid "Show in FileSystem"
-msgstr "在资æºç®¡ç†å™¨ä¸­å±•ç¤º"
+msgstr "在文件系统中显示"
#: editor/editor_node.cpp
msgid "Play This Scene"
@@ -2050,7 +2032,7 @@ msgstr "%d 个文件未展示"
#: editor/editor_node.cpp
msgid "Dock Position"
-msgstr "åœé åŒºä½ç½®"
+msgstr "é¢æ¿ä½ç½®"
#: editor/editor_node.cpp
msgid "Distraction Free Mode"
@@ -2105,7 +2087,6 @@ msgid "Save Scene"
msgstr "ä¿å­˜åœºæ™¯"
#: editor/editor_node.cpp
-#, fuzzy
msgid "Save All Scenes"
msgstr "ä¿å­˜æ‰€æœ‰åœºæ™¯"
@@ -2135,7 +2116,7 @@ msgid "Undo"
msgstr "撤销"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "é‡åš"
@@ -2161,7 +2142,7 @@ msgstr "导出"
#: editor/editor_node.cpp
msgid "Tools"
-msgstr "工具(tools)"
+msgstr "工具"
#: editor/editor_node.cpp
msgid "Open Project Data Folder"
@@ -2582,6 +2563,8 @@ msgid ""
"Can't create a ViewportTexture on resources saved as a file.\n"
"Resource needs to belong to a scene."
msgstr ""
+"无法在ä¿å­˜ä¸ºæ–‡ä»¶çš„资æºä¸Šåˆ›å»ºè§†å›¾çº¹ç†ã€‚\n"
+"资æºéœ€è¦å±žäºŽåœºæ™¯ã€‚"
#: editor/editor_properties.cpp
msgid ""
@@ -2590,6 +2573,8 @@ msgid ""
"Please switch on the 'local to scene' property on it (and all resources "
"containing it up to a node)."
msgstr ""
+"无法在此资æºä¸Šåˆ›å»ºè§†å›¾çº¹ç†, 因为它未设置为本地到场景。\n"
+"请打开上é¢çš„ `本地到场景` 属性 (以åŠåŒ…å«å®ƒçš„所有资æºåˆ°èŠ‚点)。"
#: editor/editor_properties.cpp editor/property_editor.cpp
msgid "Pick a Viewport"
@@ -2771,7 +2756,7 @@ msgstr "导入:"
msgid ""
"No download links found for this version. Direct download is only available "
"for official releases."
-msgstr "当å‰ç‰ˆæœ¬æ²¡æœ‰ä¸‹è½½é“¾æŽ¥ã€‚仅有官方正å¼ç‰ˆæ供直链下载。"
+msgstr "没有找到这个版本的下载链接。直接下载åªé€‚用于正å¼ç‰ˆæœ¬ã€‚"
#: editor/export_template_manager.cpp
#: editor/plugins/asset_library_editor_plugin.cpp
@@ -2900,9 +2885,8 @@ msgid "Can't open file_type_cache.cch for writing, not saving file type cache!"
msgstr "无法以å¯å†™æ–¹å¼æ‰“å¼€file_type_cache.cchï¼"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Favorites"
-msgstr "收è—:"
+msgstr "收è—夹"
#: editor/filesystem_dock.cpp
msgid "Cannot navigate to '%s' as it has not been found in the file system!"
@@ -2985,14 +2969,12 @@ msgid "Instance"
msgstr "创建实例节点"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Add to favorites"
-msgstr "收è—:"
+msgstr "添加到收è—夹"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Remove from favorites"
-msgstr "从分组中移除"
+msgstr "从收è—夹中删除"
#: editor/filesystem_dock.cpp
msgid "Edit Dependencies..."
@@ -3023,14 +3005,12 @@ msgid "New Resource..."
msgstr "新建资æºâ€¦"
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Expand All"
-msgstr "展开所有"
+msgstr "全部展开"
#: editor/filesystem_dock.cpp editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Collapse All"
-msgstr "收起所有"
+msgstr "全部折å "
#: editor/filesystem_dock.cpp
#: editor/plugins/animation_tree_player_editor_plugin.cpp
@@ -3052,9 +3032,8 @@ msgid "Re-Scan Filesystem"
msgstr "é‡æ–°æ‰«æ文件系统"
#: editor/filesystem_dock.cpp
-#, fuzzy
msgid "Toggle split mode"
-msgstr "切æ¢æ¨¡å¼"
+msgstr "切æ¢æ‹†åˆ†æ¨¡å¼"
#: editor/filesystem_dock.cpp
msgid "Search files"
@@ -3089,24 +3068,20 @@ msgid "Create Script"
msgstr "创建脚本"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find in Files"
msgstr "在文件中查找"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Find:"
-msgstr "查找: "
+msgstr "查找:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Folder:"
-msgstr "文件夹: "
+msgstr "文件夹:"
#: editor/find_in_files.cpp
-#, fuzzy
msgid "Filters:"
-msgstr "筛选"
+msgstr "筛选:"
#: editor/find_in_files.cpp editor/plugins/script_editor_plugin.cpp
#: editor/plugins/script_text_editor.cpp
@@ -3207,7 +3182,7 @@ msgstr "与独立的æ质和动画一åŒå¯¼å…¥"
#: editor/import/resource_importer_scene.cpp
msgid "Import with Separate Objects+Materials+Animations"
-msgstr "导入独立的物体ã€æ质和动画"
+msgstr "使用å•ç‹¬çš„对象 + æè´¨ + 动画导入"
#: editor/import/resource_importer_scene.cpp
msgid "Import as Multiple Scenes"
@@ -3283,14 +3258,12 @@ msgid "Failed to load resource."
msgstr "加载资æºå¤±è´¥ã€‚"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Expand All Properties"
msgstr "展开所有属性"
#: editor/inspector_dock.cpp
-#, fuzzy
msgid "Collapse All Properties"
-msgstr "收起所有属性"
+msgstr "折å æ‰€æœ‰å±žæ€§"
#: editor/inspector_dock.cpp editor/plugins/animation_player_editor_plugin.cpp
#: editor/plugins/script_editor_plugin.cpp
@@ -4228,9 +4201,8 @@ msgid "Resize CanvasItem"
msgstr "调整 CanvasItem 尺寸"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale CanvasItem"
-msgstr "旋转 CanvasItem"
+msgstr "缩放包å«é¡¹"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Move CanvasItem"
@@ -4293,9 +4265,8 @@ msgid "Rotate Mode"
msgstr "旋转模å¼"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Scale Mode"
-msgstr "缩放模å¼ï¼ˆR)"
+msgstr "缩放模å¼"
#: editor/plugins/canvas_item_editor_plugin.cpp
#: editor/plugins/spatial_editor_plugin.cpp
@@ -4392,9 +4363,8 @@ msgid "Restores the object's children's ability to be selected."
msgstr "æ¢å¤èŠ‚点的å­å­™èƒ½å¤Ÿè¢«é€‰ä¸­ã€‚"
#: editor/plugins/canvas_item_editor_plugin.cpp
-#, fuzzy
msgid "Skeleton Options"
-msgstr "骨架"
+msgstr "骨架选项"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Bones"
@@ -4448,7 +4418,7 @@ msgstr "显示视图窗å£"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Show Group And Lock Icons"
-msgstr ""
+msgstr "显示组和é”定图标"
#: editor/plugins/canvas_item_editor_plugin.cpp
msgid "Center Selection"
@@ -4889,7 +4859,6 @@ msgid "Create Navigation Polygon"
msgstr "创建导航多边形"
#: editor/plugins/particles_2d_editor_plugin.cpp
-#, fuzzy
msgid "Generating Visibility Rect"
msgstr "生æˆå¯è§†åŒ–区域"
@@ -5208,7 +5177,7 @@ msgstr "移动点"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Ctrl: Rotate"
-msgstr "Ctrl:旋转"
+msgstr "Ctrl:旋转"
#: editor/plugins/polygon_2d_editor_plugin.cpp
msgid "Shift: Move All"
@@ -5369,9 +5338,8 @@ msgid "Error writing TextFile:"
msgstr "写入文本文件时出错:"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Error: could not load file."
-msgstr "错误,无法加载文件。"
+msgstr "错误:无法加载文件。"
#: editor/plugins/script_editor_plugin.cpp
msgid "Error could not load file."
@@ -5470,7 +5438,6 @@ msgid "Copy Script Path"
msgstr "æ‹·è´è„šæœ¬è·¯å¾„"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "History Previous"
msgstr "åŽé€€"
@@ -5542,7 +5509,6 @@ msgid "Keep Debugger Open"
msgstr "ä¿æŒè°ƒè¯•å™¨æ‰“å¼€"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Debug with External Editor"
msgstr "使用外部编辑器进行调试"
@@ -5587,7 +5553,6 @@ msgid "Debugger"
msgstr "调试器"
#: editor/plugins/script_editor_plugin.cpp
-#, fuzzy
msgid "Search Results"
msgstr "æœç´¢ç»“æžœ"
@@ -5600,9 +5565,8 @@ msgid "(ignore)"
msgstr "(忽略)"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function"
-msgstr "å‰å¾€å‡½æ•°..."
+msgstr "转到函数"
#: editor/plugins/script_text_editor.cpp
msgid "Only resources from filesystem can be dropped."
@@ -5691,14 +5655,12 @@ msgid "Trim Trailing Whitespace"
msgstr "修剪行åŽç©ºç™½"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Spaces"
msgstr "将缩进转为空格"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Convert Indent to Tabs"
-msgstr "将缩进转为Tab"
+msgstr "将缩进转为Tabs"
#: editor/plugins/script_text_editor.cpp
msgid "Auto Indent"
@@ -5714,12 +5676,10 @@ msgid "Remove All Breakpoints"
msgstr "移除所有断点"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Next Breakpoint"
msgstr "å‰å¾€ä¸‹ä¸€ä¸ªæ–­ç‚¹"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Previous Breakpoint"
msgstr "å‰å¾€ä¸Šä¸€ä¸ªæ–­ç‚¹"
@@ -5728,19 +5688,16 @@ msgid "Find Previous"
msgstr "查找上一项"
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Find in Files..."
msgstr "在文件中查找..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Function..."
-msgstr "å‰å¾€å‡½æ•°..."
+msgstr "转到函数..."
#: editor/plugins/script_text_editor.cpp
-#, fuzzy
msgid "Go to Line..."
-msgstr "å‰å¾€è¡Œ..."
+msgstr "转到行..."
#: editor/plugins/script_text_editor.cpp
msgid "Contextual Help"
@@ -5836,7 +5793,7 @@ msgstr "音调"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Yaw"
-msgstr ""
+msgstr "å航"
#: editor/plugins/spatial_editor_plugin.cpp
msgid "Objects Drawn"
@@ -6003,7 +5960,6 @@ msgid "Freelook Speed Modifier"
msgstr "自由视图速度调整"
#: editor/plugins/spatial_editor_plugin.cpp
-#, fuzzy
msgid "View Rotation Locked"
msgstr "é”定视角旋转"
@@ -6507,9 +6463,8 @@ msgid "Fix Invalid Tiles"
msgstr "ä¿®å¤æ— æ•ˆçš„瓦片"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Cut Selection"
-msgstr "居中显示选中节点"
+msgstr "切割选择"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Paint TileMap"
@@ -6556,32 +6511,28 @@ msgid "Pick Tile"
msgstr "选择砖å—(Tile)"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Copy Selection"
-msgstr "移动选中项"
+msgstr "å¤åˆ¶é€‰æ‹©"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate left"
-msgstr "旋转模å¼"
+msgstr "å‘左旋转"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Rotate right"
-msgstr "å‘å³ç§»åŠ¨"
+msgstr "å‘å³æ—‹è½¬"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip horizontally"
-msgstr ""
+msgstr "水平翻转"
#: editor/plugins/tile_map_editor_plugin.cpp
msgid "Flip vertically"
-msgstr ""
+msgstr "垂直翻转"
#: editor/plugins/tile_map_editor_plugin.cpp
-#, fuzzy
msgid "Clear transform"
-msgstr "å˜æ¢"
+msgstr "清除å˜æ¢"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid "Add Texture(s) to TileSet"
@@ -6611,7 +6562,6 @@ msgid "Display tile's names (hold Alt Key)"
msgstr "显示瓦片的åå­—ï¼ˆæŒ‰ä½ Alt 键)"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "Remove selected texture and ALL TILES which use it?"
msgstr "确定移除选中的纹ç†ä»¥åŠã€æ‰€æœ‰ã€‘使用它的ã€ç“¦ç‰‡é›†ã€‘å—?"
@@ -6628,9 +6578,8 @@ msgid "Merge from scene?"
msgstr "确定è¦åˆå¹¶åœºæ™¯ï¼Ÿ"
#: editor/plugins/tile_set_editor_plugin.cpp
-#, fuzzy
msgid "%s file(s) were not added because was already on the list."
-msgstr " 文件没有被添加,因为已添加在列表中。"
+msgstr "%s 文件没有被添加,因为已添加在列表中。"
#: editor/plugins/tile_set_editor_plugin.cpp
msgid ""
@@ -6716,14 +6665,12 @@ msgid "Export templates for this platform are missing/corrupted:"
msgstr "没有此平å°çš„导出模æ¿:"
#: editor/project_export.cpp
-#, fuzzy
msgid "Release"
-msgstr "刚好释放"
+msgstr "å‘è¡Œ"
#: editor/project_export.cpp
-#, fuzzy
msgid "Exporting All"
-msgstr "正在导出 %s"
+msgstr "全部导出"
#: editor/project_export.cpp
msgid "Presets"
@@ -6734,9 +6681,8 @@ msgid "Add..."
msgstr "添加..."
#: editor/project_export.cpp
-#, fuzzy
msgid "Export Path:"
-msgstr "导出预设:"
+msgstr "导出路径:"
#: editor/project_export.cpp
msgid "Resources"
@@ -6797,14 +6743,12 @@ msgid "Export PCK/Zip"
msgstr "导出 PCK/ZIP"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export mode?"
-msgstr "导出模å¼:"
+msgstr "导出模å¼ï¼Ÿ"
#: editor/project_export.cpp
-#, fuzzy
msgid "Export All"
-msgstr "导出"
+msgstr "全部导出"
#: editor/project_export.cpp
msgid "Export templates for this platform are missing:"
@@ -7482,7 +7426,6 @@ msgid "Step"
msgstr "步长"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid "Amount by which counter is incremented for each node"
msgstr "由计数器增é‡å¾—到的æ¯ä¸ªèŠ‚点的总é‡"
@@ -7491,7 +7434,6 @@ msgid "Padding"
msgstr "内边è·"
#: editor/rename_dialog.cpp
-#, fuzzy
msgid ""
"Minimum number of digits for the counter.\n"
"Missing digits are padded with leading zeros."
@@ -7637,7 +7579,7 @@ msgstr "将新场景å¦å­˜ä¸º..."
msgid ""
"Disabling \"editable_instance\" will cause all properties of the node to be "
"reverted to their default."
-msgstr ""
+msgstr "ç¦ç”¨â€œå¯ç¼–辑实例â€å°†å¯¼è‡´èŠ‚点的所有属性æ¢å¤ä¸ºå…¶é»˜è®¤å€¼ã€‚"
#: editor/scene_tree_dock.cpp
msgid "Editable Children"
@@ -7710,9 +7652,8 @@ msgid "Clear Inheritance"
msgstr "清除继承"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Open documentation"
-msgstr "打开Godot在线文档"
+msgstr "打开Godot文档"
#: editor/scene_tree_dock.cpp
msgid "Delete Node(s)"
@@ -7727,7 +7668,6 @@ msgid "Change Type"
msgstr "更改类型"
#: editor/scene_tree_dock.cpp
-#, fuzzy
msgid "Extend Script"
msgstr "打开脚本"
@@ -7890,9 +7830,8 @@ msgid "Path is empty"
msgstr "文件路径为空"
#: editor/script_create_dialog.cpp
-#, fuzzy
msgid "Filename is empty"
-msgstr "Sprite 是空的ï¼"
+msgstr "文件å为空"
#: editor/script_create_dialog.cpp
msgid "Path is not local"
@@ -7983,9 +7922,8 @@ msgid "Bytes:"
msgstr "字节:"
#: editor/script_editor_debugger.cpp
-#, fuzzy
msgid "Stack Trace"
-msgstr "堆栈帧(Stack Frames)"
+msgstr "栈追踪"
#: editor/script_editor_debugger.cpp
msgid "Pick one or more items from the list to display the graph."
@@ -8433,7 +8371,7 @@ msgstr "内部异常堆栈追朔结æŸ"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Bake NavMesh"
-msgstr ""
+msgstr "烘焙导航网"
#: modules/recast/navigation_mesh_editor_plugin.cpp
msgid "Clear the navigation mesh."
@@ -8806,12 +8744,11 @@ msgstr "æœç´¢å¯è§†åŒ–脚本节点"
#: modules/visual_script/visual_script_property_selector.cpp
msgid "Get %s"
-msgstr ""
+msgstr "得到 %s"
#: modules/visual_script/visual_script_property_selector.cpp
-#, fuzzy
msgid "Set %s"
-msgstr "设值 "
+msgstr "设值 %s"
#: platform/javascript/export/export.cpp
msgid "Run in Browser"
@@ -8903,7 +8840,7 @@ msgstr "形状资æºå¿…须是通过CollisionShape2D节点的shape属性创建的
msgid ""
"CPUParticles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
-msgstr ""
+msgstr "CPUParticles2D动画需è¦ä½¿ç”¨å¯ç”¨äº†â€œç²’å­åŠ¨ç”»â€çš„CanvasItemMaterial。"
#: scene/2d/light_2d.cpp
msgid ""
@@ -8951,7 +8888,7 @@ msgstr "ç²’å­æ质没有指定,该行为无效。"
msgid ""
"Particles2D animation requires the usage of a CanvasItemMaterial with "
"\"Particles Animation\" enabled."
-msgstr ""
+msgstr "Particles2D 动画需è¦ä½¿ç”¨å¯ç”¨äº†â€œç²’å­åŠ¨ç”»â€çš„CanvasItemMaterial。"
#: scene/2d/path_2d.cpp
msgid "PathFollow2D only works when set as a child of a Path2D node."
@@ -9084,14 +9021,14 @@ msgstr ""
#: scene/3d/cpu_particles.cpp
#, fuzzy
-msgid "Nothing is visible because no mesh has not been assigned."
-msgstr "ç²’å­ä¸å¯è§ï¼Œå› ä¸ºæ²¡æœ‰ç½‘æ ¼(meshe)指定到绘制通é“(draw passes)。"
+msgid "Nothing is visible because no mesh has been assigned."
+msgstr "无物å¯è§ï¼Œå› ä¸ºæ²¡æœ‰æœªè¢«åˆ†é…的网格(mesh)。"
#: scene/3d/cpu_particles.cpp
msgid ""
"CPUParticles animation requires the usage of a SpatialMaterial with "
"\"Billboard Particles\" enabled."
-msgstr ""
+msgstr "CPUParticles动画需è¦ä½¿ç”¨å¯åŠ¨äº†â€œBillboard Particlesâ€çš„SpatialMaterial。"
#: scene/3d/gi_probe.cpp
msgid "Plotting Meshes"
@@ -9117,21 +9054,20 @@ msgstr "ç²’å­ä¸å¯è§ï¼Œå› ä¸ºæ²¡æœ‰ç½‘æ ¼(meshe)指定到绘制通é“(draw pa
msgid ""
"Particles animation requires the usage of a SpatialMaterial with \"Billboard "
"Particles\" enabled."
-msgstr ""
+msgstr "ç²’å­åŠ¨ç”»éœ€è¦ä½¿ç”¨å¯ç”¨äº†â€œBillboard Particlesâ€çš„SpatialMaterial。"
#: scene/3d/path.cpp
-#, fuzzy
msgid "PathFollow only works when set as a child of a Path node."
-msgstr "PathFollow2D类型的节点åªæœ‰ä½œä¸ºPath2Dçš„å­èŠ‚点节æ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
+msgstr "PathFollow类型的节点åªæœ‰ä½œä¸ºPath类型节点的å­èŠ‚点æ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
#: scene/3d/path.cpp
-#, fuzzy
msgid "OrientedPathFollow only works when set as a child of a Path node."
-msgstr "PathFollow2D类型的节点åªæœ‰ä½œä¸ºPath2Dçš„å­èŠ‚点节æ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
+msgstr ""
+"OrientedPathFollow 类型的节点åªæœ‰ä½œä¸ºPath类型节点的å­èŠ‚点æ‰èƒ½æ­£å¸¸å·¥ä½œã€‚"
#: scene/3d/path.cpp
msgid "OrientedPathFollow requires up vectors enabled in its parent Path."
-msgstr ""
+msgstr "OrientedPathFollow 需è¦å†å…¶çˆ¶è·¯å¾„中å¯ç”¨up vectors。"
#: scene/3d/physics_body.cpp
msgid ""
@@ -9169,7 +9105,6 @@ msgid "This body will be ignored until you set a mesh"
msgstr "这个物体将被忽略,除éžè®¾ç½®ä¸€ä¸ªç½‘æ ¼"
#: scene/3d/soft_body.cpp
-#, fuzzy
msgid ""
"Size changes to SoftBody will be overridden by the physics engine when "
"running.\n"
@@ -9257,7 +9192,7 @@ msgstr ""
#: scene/gui/range.cpp
msgid "If exp_edit is true min_value must be > 0."
-msgstr ""
+msgstr "如果exp_edit为true, 则min_value必须为>0。"
#: scene/gui/scroll_container.cpp
msgid ""
@@ -9329,6 +9264,9 @@ msgstr "对uniform的赋值。"
msgid "Varyings can only be assigned in vertex function."
msgstr "å˜é‡åªèƒ½åœ¨é¡¶ç‚¹å‡½æ•°ä¸­æŒ‡å®šã€‚"
+#~ msgid "Zoom:"
+#~ msgstr "缩放:"
+
#~ msgid "Are you sure you want to remove all connections from the \""
#~ msgstr "您确定è¦ç§»é™¤æ‰€æœ‰å¹¿æ’­è¿žæŽ¥ä»Ž \""
@@ -10045,9 +9983,6 @@ msgstr "å˜é‡åªèƒ½åœ¨é¡¶ç‚¹å‡½æ•°ä¸­æŒ‡å®šã€‚"
#~ msgid "Source Font:"
#~ msgstr "æºå­—体文件:"
-#~ msgid "Source Font Size:"
-#~ msgstr "æºå­—体大å°:"
-
#~ msgid "Dest Resource:"
#~ msgstr "目标资æº:"
diff --git a/editor/translations/zh_HK.po b/editor/translations/zh_HK.po
index 41ac16cd12..f70a7a2b2f 100644
--- a/editor/translations/zh_HK.po
+++ b/editor/translations/zh_HK.po
@@ -580,9 +580,8 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "放大"
+msgid "Font Size:"
+msgstr ""
#: editor/code_editor.cpp
#, fuzzy
@@ -1788,6 +1787,12 @@ msgstr "ä¸èƒ½åŸ·è¡Œé€™å€‹å‹•ä½œï¼Œå› ç‚ºæ²’有tree root."
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2215,7 +2220,7 @@ msgid "Undo"
msgstr "復原"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "é‡è£½"
@@ -9354,7 +9359,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9583,6 +9588,10 @@ msgid "Varyings can only be assigned in vertex function."
msgstr ""
#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "放大"
+
+#, fuzzy
#~ msgid "Public Methods"
#~ msgstr "é¸æ“‡æ¨¡å¼"
diff --git a/editor/translations/zh_TW.po b/editor/translations/zh_TW.po
index fe162ba39e..d902a58b73 100644
--- a/editor/translations/zh_TW.po
+++ b/editor/translations/zh_TW.po
@@ -561,9 +561,8 @@ msgid "Warnings:"
msgstr ""
#: editor/code_editor.cpp
-#, fuzzy
-msgid "Zoom:"
-msgstr "放大"
+msgid "Font Size:"
+msgstr ""
#: editor/code_editor.cpp
msgid "Line:"
@@ -1743,6 +1742,12 @@ msgstr "æ­¤æ“作無法復原, 確定è¦é‚„原嗎?"
#: editor/editor_node.cpp
msgid ""
+"This scene can't be saved because there is a cyclic instancing inclusion.\n"
+"Please resolve it and then attempt to save again."
+msgstr ""
+
+#: editor/editor_node.cpp
+msgid ""
"Couldn't save scene. Likely dependencies (instances or inheritance) couldn't "
"be satisfied."
msgstr ""
@@ -2151,7 +2156,7 @@ msgid "Undo"
msgstr "復原"
#: editor/editor_node.cpp editor/plugins/script_text_editor.cpp
-#: scene/gui/line_edit.cpp
+#: scene/gui/line_edit.cpp scene/gui/text_edit.cpp
msgid "Redo"
msgstr "å–消「復原ã€"
@@ -9200,7 +9205,7 @@ msgid ""
msgstr ""
#: scene/3d/cpu_particles.cpp
-msgid "Nothing is visible because no mesh has not been assigned."
+msgid "Nothing is visible because no mesh has been assigned."
msgstr ""
#: scene/3d/cpu_particles.cpp
@@ -9430,6 +9435,10 @@ msgstr ""
msgid "Varyings can only be assigned in vertex function."
msgstr ""
+#, fuzzy
+#~ msgid "Zoom:"
+#~ msgstr "放大"
+
#~ msgid "Class List:"
#~ msgstr "Class 列表:"
diff --git a/main/main.cpp b/main/main.cpp
index db23a6c214..7383294167 100644
--- a/main/main.cpp
+++ b/main/main.cpp
@@ -1697,12 +1697,17 @@ bool Main::start() {
#ifdef TOOLS_ENABLED
if (editor) {
- Error serr = editor_node->load_scene(local_game_path);
- if (serr != OK)
- ERR_PRINT("Failed to load scene");
+ if (game_path != GLOBAL_GET("application/run/main_scene") || !editor_node->has_scenes_in_session()) {
+ Error serr = editor_node->load_scene(local_game_path);
+ if (serr != OK)
+ ERR_PRINT("Failed to load scene");
+ }
OS::get_singleton()->set_context(OS::CONTEXT_EDITOR);
}
#endif
+ if (!editor) {
+ OS::get_singleton()->set_context(OS::CONTEXT_ENGINE);
+ }
}
if (!project_manager && !editor) { // game
diff --git a/main/tests/test_io.cpp b/main/tests/test_io.cpp
deleted file mode 100644
index 4e43ee6a54..0000000000
--- a/main/tests/test_io.cpp
+++ /dev/null
@@ -1,133 +0,0 @@
-/*************************************************************************/
-/* test_io.cpp */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 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 "test_io.h"
-
-#ifdef MINIZIP_ENABLED
-
-#include "core/io/resource_loader.h"
-#include "core/io/resource_saver.h"
-#include "core/os/dir_access.h"
-#include "core/os/main_loop.h"
-#include "core/os/os.h"
-#include "core/print_string.h"
-#include "core/project_settings.h"
-#include "scene/resources/texture.h"
-
-#include "core/io/file_access_memory.h"
-
-namespace TestIO {
-
-class TestMainLoop : public MainLoop {
-
- bool quit;
-
-public:
- virtual void input_event(const Ref<InputEvent> &p_event) {
- }
- virtual bool idle(float p_time) {
- return false;
- }
-
- virtual void request_quit() {
-
- quit = true;
- }
- virtual void init() {
-
- quit = true;
- }
- virtual bool iteration(float p_time) {
-
- return quit;
- }
- virtual void finish() {
- }
-};
-
-MainLoop *test() {
-
- print_line("this is test io");
- DirAccess *da = DirAccess::create(DirAccess::ACCESS_FILESYSTEM);
- da->change_dir(".");
- print_line("Opening current dir " + da->get_current_dir());
- String entry;
- da->list_dir_begin();
- while ((entry = da->get_next()) != "") {
-
- print_line("entry " + entry + " is dir: " + Variant(da->current_is_dir()));
- };
- da->list_dir_end();
-
- RES texture = ResourceLoader::load("test_data/rock.png");
- ERR_FAIL_COND_V(texture.is_null(), NULL);
-
- ResourceSaver::save("test_data/rock.xml", texture);
-
- print_line("localize paths");
- print_line(ProjectSettings::get_singleton()->localize_path("algo.xml"));
- print_line(ProjectSettings::get_singleton()->localize_path("c:\\windows\\algo.xml"));
- print_line(ProjectSettings::get_singleton()->localize_path(ProjectSettings::get_singleton()->get_resource_path() + "/something/something.xml"));
- print_line(ProjectSettings::get_singleton()->localize_path("somedir/algo.xml"));
-
- {
-
- FileAccess *z = FileAccess::open("test_data/archive.zip", FileAccess::READ);
- int len = z->get_len();
- Vector<uint8_t> zip;
- zip.resize(len);
- z->get_buffer(zip.ptrw(), len);
- z->close();
- memdelete(z);
-
- FileAccessMemory::register_file("a_package", zip);
- FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_RESOURCES);
- FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_FILESYSTEM);
- FileAccess::make_default<FileAccessMemory>(FileAccess::ACCESS_USERDATA);
-
- print_line("archive test");
- };
-
- print_line("test done");
-
- return memnew(TestMainLoop);
-}
-} // namespace TestIO
-
-#else
-
-namespace TestIO {
-
-MainLoop *test() {
-
- return NULL;
-}
-} // namespace TestIO
-#endif
diff --git a/main/tests/test_io.h b/main/tests/test_io.h
deleted file mode 100644
index ffebd05160..0000000000
--- a/main/tests/test_io.h
+++ /dev/null
@@ -1,45 +0,0 @@
-/*************************************************************************/
-/* test_io.h */
-/*************************************************************************/
-/* This file is part of: */
-/* GODOT ENGINE */
-/* https://godotengine.org */
-/*************************************************************************/
-/* Copyright (c) 2007-2018 Juan Linietsky, Ariel Manzur. */
-/* Copyright (c) 2014-2018 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 TEST_IO_H
-#define TEST_IO_H
-
-/**
- @author Juan Linietsky <reduzio@gmail.com>
-*/
-
-#include "core/os/main_loop.h"
-
-namespace TestIO {
-
-MainLoop *test();
-}
-
-#endif
diff --git a/main/tests/test_main.cpp b/main/tests/test_main.cpp
index 714a254371..a36b619ba0 100644
--- a/main/tests/test_main.cpp
+++ b/main/tests/test_main.cpp
@@ -37,7 +37,6 @@
#include "test_gdscript.h"
#include "test_gui.h"
#include "test_image.h"
-#include "test_io.h"
#include "test_math.h"
#include "test_oa_hash_map.h"
#include "test_ordered_hash_map.h"
@@ -57,7 +56,6 @@ const char **tests_get_names() {
"render",
"oa_hash_map",
"gui",
- "io",
"shaderlang",
"gd_tokenizer",
"gd_parser",
@@ -111,11 +109,6 @@ MainLoop *test_main(String p_test, const List<String> &p_args) {
}
#endif
- if (p_test == "io") {
-
- return TestIO::test();
- }
-
if (p_test == "shaderlang") {
return TestShaderLang::test();
diff --git a/misc/dist/document_icon.svg b/misc/dist/document_icon.svg
deleted file mode 100644
index 2652110fa5..0000000000
--- a/misc/dist/document_icon.svg
+++ /dev/null
@@ -1,12 +0,0 @@
-<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024">
-<path d="M159.143 69.856v884.288h705.714v-665.51L646.08 69.856z" fill="#fff" stroke="#d2d2d2" stroke-width="20"/>
-<g stroke-width=".32">
- <path d="M723.128 594.284s-.701-4.304-1.111-4.265l-78.083 7.534a12.691 12.691 0 0 0-11.474 11.78l-2.145 30.747-60.408 4.31-4.11-27.866c-.914-6.198-6.326-10.87-12.591-10.87h-82.412c-6.263 0-11.675 4.672-12.59 10.87l-4.111 27.865-60.408-4.31-2.145-30.745a12.692 12.692 0 0 0-11.475-11.783l-78.12-7.532c-.404-.039-.7 4.269-1.104 4.269l-.105 16.897 66.161 10.67 2.167 31.02c.438 6.28 5.505 11.357 11.79 11.808l83.194 5.935c.315.022.626.035.937.035 6.252 0 11.655-4.675 12.57-10.873l4.228-28.671h60.436l4.228 28.671c.913 6.196 6.323 10.87 12.583 10.87.307 0 .613-.01.913-.032l83.206-5.935c6.282-.45 11.351-5.528 11.79-11.808l2.164-31.02 66.133-10.717z" fill="#fff"/>
- <path d="M300.84 466.87v127.413c.233.003.466.011.697.033l78.113 7.531a8.41 8.41 0 0 1 7.583 7.789l2.409 34.481 68.138 4.862 4.694-31.825a8.41 8.41 0 0 1 8.321-7.184h82.412a8.41 8.41 0 0 1 8.32 7.184l4.693 31.825 68.14-4.862 2.407-34.481a8.414 8.414 0 0 1 7.583-7.789l78.082-7.531c.231-.022.462-.03.695-.033v-10.166l.033-.01V466.87h.289c10.348-13.207 19.923-27.124 29.105-41.972-12.195-20.76-27.137-39.313-43.109-56.502-14.813 7.456-29.2 15.903-42.79 24.891-6.8-6.759-14.458-12.288-21.981-18.067-7.392-5.937-15.722-10.29-23.622-15.361 2.352-17.517 3.515-34.762 3.983-52.76-20.385-10.26-42.123-17.062-64.111-21.947-8.779 14.754-16.807 30.732-23.799 46.352-8.291-1.385-16.621-1.899-24.962-1.998v-.013c-.058 0-.112.013-.162.013-.052 0-.106-.013-.157-.013v.013c-8.356.1-16.68.613-24.973 1.998-6.988-15.62-15.012-31.598-23.804-46.352-21.977 4.885-43.717 11.688-64.1 21.947.466 17.998 1.63 35.243 3.988 52.76-7.916 5.071-16.235 9.424-23.629 15.36-7.512 5.78-15.184 11.31-21.986 18.068-13.589-8.988-27.972-17.435-42.79-24.89-15.971 17.188-30.905 35.74-43.104 56.501 9.178 14.848 18.76 28.765 29.105 41.972z" fill="#478cbf"/>
- <path d="M653.052 617.91l-2.42 34.664a8.413 8.413 0 0 1-7.792 7.803l-83.204 5.937a8.412 8.412 0 0 1-8.92-7.165l-4.77-32.357h-67.89l-4.772 32.358c-.64 4.354-4.534 7.486-8.92 7.164l-83.203-5.937a8.413 8.413 0 0 1-7.792-7.803l-2.42-34.665-70.238-6.772c.033 7.55.13 15.819.13 17.465 0 74.181 94.102 109.836 211.016 110.246h.287c116.915-.41 210.984-36.065 210.984-110.246 0-1.676.101-9.912.136-17.465z" fill="#478cbf"/>
- <path d="M448.344 518.591c0 26.01-21.074 47.078-47.074 47.078-25.987 0-47.067-21.069-47.067-47.078 0-25.991 21.08-47.05 47.067-47.05 26 0 47.074 21.059 47.074 47.05" fill="#fff"/>
- <path d="M437.017 521.384c0 17.251-13.982 31.233-31.246 31.233-17.256 0-31.247-13.982-31.247-31.233 0-17.252 13.99-31.247 31.247-31.247 17.264 0 31.246 13.995 31.246 31.247" fill="#414042"/>
- <path d="M511.997 569.952c-8.37 0-15.152-6.168-15.152-13.77v-43.336c0-7.596 6.783-13.77 15.152-13.77 8.368 0 15.166 6.174 15.166 13.77v43.336c0 7.602-6.798 13.77-15.166 13.77M575.657 518.591c0 26.01 21.074 47.078 47.078 47.078 25.985 0 47.063-21.069 47.063-47.078 0-25.991-21.078-47.05-47.063-47.05-26.004 0-47.078 21.059-47.078 47.05" fill="#fff"/>
- <path d="M586.987 521.384c0 17.251 13.978 31.233 31.23 31.233 17.268 0 31.245-13.982 31.245-31.233 0-17.252-13.977-31.247-31.246-31.247-17.251 0-31.23 13.995-31.23 31.247" fill="#414042"/>
-</g>
-</svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/gdscript.svg b/misc/dist/document_icons/gdscript.svg
new file mode 100644
index 0000000000..ec65eb098a
--- /dev/null
+++ b/misc/dist/document_icons/gdscript.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024"><path d="M812.681 293.783c-23.575-32.543-141.93-39.865-197.505-34.983 2.17-68.048 31.457-117.656-37.966-177.026M161.89 49.151H464c77.128-2.02 126.554 37.835 178.444 84.881l123.665 109.83c63.819 56.94 89.13 110.625 96 188.174v542.886H161.89z" fill="#eff1f5" stroke="#9f9fa1" stroke-width="19.603" stroke-linecap="round" stroke-linejoin="round"/><text style="line-height:1.25;-inkscape-font-specification:'Montserrat Ultra-Bold'" x="207.666" y="878.644" font-weight="800" font-size="16" font-family="Montserrat" letter-spacing="0" word-spacing="0" fill="#333f67"><tspan x="207.666" y="878.644" font-size="112">GDSCRIPT</tspan></text><path d="M481.818 300.713l-17.037 68.149a150.92 150.92 0 0 0-20.81 8.43l-60.015-36.021-42.683 42.683 36.079 60.19a150.92 150.92 0 0 0-8.608 20.693l-68.031 16.978v60.368l68.149 17.037a150.92 150.92 0 0 0 8.43 20.752l-36.021 60.072 42.683 42.683 60.19-36.079a150.92 150.92 0 0 0 20.693 8.608l16.978 68.031h60.368l17.037-68.149a150.92 150.92 0 0 0 20.752-8.43l60.072 36.021 42.683-42.683-36.079-60.19a150.92 150.92 0 0 0 8.608-20.693l68.031-16.978v-60.368l-68.149-17.037a150.92 150.92 0 0 0-8.43-20.752l36.021-60.072-42.683-42.683-60.19 36.079a150.92 150.92 0 0 0-20.693-8.608l-16.978-68.031h-60.368zm30.184 150.92A60.368 60.368 0 0 1 572.37 512a60.368 60.368 0 0 1-60.368 60.368A60.368 60.368 0 0 1 451.634 512a60.368 60.368 0 0 1 60.368-60.368z" fill="#478cbf"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/gdscript_extra_small.svg b/misc/dist/document_icons/gdscript_extra_small.svg
new file mode 100644
index 0000000000..1c3545ef9d
--- /dev/null
+++ b/misc/dist/document_icons/gdscript_extra_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M12.698 4.59c-.368-.508-2.218-.623-3.086-.546.034-1.064.492-1.839-.593-2.766m-6.49-.51H7.25c1.205-.032 1.977.591 2.788 1.326L11.97 3.81c.998.89 1.393 1.729 1.5 2.94v8.483H2.53z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><path d="M7.39 4.721l-.346 1.38a3.056 3.056 0 0 0-.421.171l-1.216-.73-.864.865.73 1.219a3.056 3.056 0 0 0-.174.419l-1.377.344V9.61l1.38.345a3.056 3.056 0 0 0 .17.42l-.729 1.217.864.864 1.22-.73a3.056 3.056 0 0 0 .418.174l.344 1.377h1.222l.345-1.38a3.056 3.056 0 0 0 .42-.17l1.217.73.864-.865-.73-1.219a3.056 3.056 0 0 0 .174-.42l1.378-.343V8.39l-1.38-.345a3.056 3.056 0 0 0-.17-.42l.729-1.217-.865-.864-1.219.73a3.056 3.056 0 0 0-.419-.174L8.611 4.72H7.39zM8 7.777A1.222 1.222 0 0 1 9.223 9 1.222 1.222 0 0 1 8 10.222 1.222 1.222 0 0 1 6.778 9 1.222 1.222 0 0 1 8 7.777z" fill="#478cbf"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/gdscript_small.svg b/misc/dist/document_icons/gdscript_small.svg
new file mode 100644
index 0000000000..468f4243a2
--- /dev/null
+++ b/misc/dist/document_icons/gdscript_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32"><path d="M25.396 9.18c-.736-1.016-4.435-1.245-6.172-1.093.068-2.126.983-3.676-1.186-5.532M5.059 1.536H14.5c2.41-.063 3.955 1.182 5.576 2.652l3.865 3.433c1.994 1.779 2.785 3.457 3 5.88v16.965H5.059z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><path d="M15.057 11.397l-.532 2.13a4.716 4.716 0 0 0-.65.263l-1.876-1.126-1.334 1.334 1.128 1.881a4.716 4.716 0 0 0-.27.647l-2.125.53v1.887l2.13.532a4.716 4.716 0 0 0 .263.649L10.665 22 12 23.335l1.881-1.127a4.716 4.716 0 0 0 .647.269l.53 2.125h1.887l.532-2.13a4.716 4.716 0 0 0 .649-.263l1.877 1.126 1.334-1.334-1.128-1.88a4.716 4.716 0 0 0 .27-.647l2.125-.531v-1.886l-2.13-.533a4.716 4.716 0 0 0-.263-.648l1.126-1.878-1.334-1.333-1.881 1.127a4.716 4.716 0 0 0-.647-.269l-.53-2.126h-1.887zm.944 4.716A1.887 1.887 0 0 1 17.887 18a1.887 1.887 0 0 1-1.886 1.886A1.887 1.887 0 0 1 14.114 18a1.887 1.887 0 0 1 1.887-1.887z" fill="#478cbf"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/project.svg b/misc/dist/document_icons/project.svg
new file mode 100644
index 0000000000..aa9b936f27
--- /dev/null
+++ b/misc/dist/document_icons/project.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024"><path d="M812.681 293.783c-23.575-32.542-141.93-39.864-197.505-34.983 2.17-68.048 31.457-117.655-37.966-177.025M161.89 49.15H464c77.128-2.02 126.554 37.836 178.444 84.882l123.665 109.83c63.819 56.94 89.13 110.624 96 188.174v542.885H161.89z" fill="#eff1f5" stroke="#9f9fa1" stroke-width="19.603" stroke-linecap="round" stroke-linejoin="round"/><g stroke-width=".32"><path d="M712.572 590.17s-.666-4.089-1.056-4.052l-74.179 7.157a12.056 12.056 0 0 0-10.9 11.191l-2.038 29.21-57.387 4.094-3.905-26.472c-.868-5.888-6.01-10.327-11.961-10.327h-78.292c-5.95 0-11.09 4.439-11.96 10.327l-3.906 26.472-57.387-4.095-2.038-29.208a12.057 12.057 0 0 0-10.901-11.194l-74.214-7.155c-.384-.037-.665 4.056-1.049 4.056l-.1 16.052 62.853 10.136 2.059 29.47c.416 5.965 5.23 10.788 11.2 11.217l79.035 5.638c.299.021.594.033.89.033 5.94 0 11.072-4.44 11.941-10.329l4.017-27.237h57.414l4.017 27.237c.867 5.886 6.006 10.326 11.953 10.326.292 0 .583-.009.868-.03l79.046-5.638c5.967-.428 10.783-5.252 11.2-11.218l2.056-29.469 62.826-10.18z" fill="#fff"/><path d="M311.398 469.127v121.042c.221.003.443.01.662.031l74.207 7.155a7.99 7.99 0 0 1 7.204 7.4l2.289 32.756 64.731 4.619 4.46-30.234a7.99 7.99 0 0 1 7.904-6.824h78.292a7.99 7.99 0 0 1 7.904 6.824l4.458 30.234 64.733-4.619 2.287-32.757a7.993 7.993 0 0 1 7.203-7.4l74.178-7.154c.22-.02.44-.028.66-.031v-9.658l.032-.01V469.128h.275c9.83-12.547 18.926-25.768 27.65-39.874-11.586-19.722-25.78-37.347-40.954-53.677-14.073 7.083-27.74 15.108-40.65 23.647-6.46-6.421-13.736-11.674-20.883-17.164-7.022-5.64-14.936-9.775-22.44-14.593 2.234-16.641 3.339-33.024 3.783-50.122-19.366-9.747-40.017-16.209-60.905-20.85-8.34 14.017-15.967 29.196-22.61 44.035-7.876-1.316-15.79-1.804-23.713-1.898v-.013c-.055 0-.107.013-.154.013-.05 0-.1-.013-.15-.013v.013c-7.937.095-15.845.582-23.724 1.898-6.638-14.84-14.261-30.018-22.613-44.035-20.879 4.641-41.532 11.104-60.895 20.85.442 17.098 1.548 33.48 3.788 50.122-7.52 4.818-15.423 8.953-22.447 14.592-7.137 5.491-14.425 10.745-20.887 17.165-12.91-8.539-26.573-16.564-40.65-23.646-15.173 16.329-29.36 33.953-40.95 53.676 8.72 14.106 17.823 27.327 27.65 39.874z" fill="#478cbf"/><path d="M646 612.615l-2.3 32.93a7.992 7.992 0 0 1-7.402 7.413l-79.044 5.64a7.991 7.991 0 0 1-8.474-6.806l-4.531-30.74h-64.496l-4.533 30.74c-.608 4.137-4.308 7.112-8.474 6.806l-79.043-5.64a7.992 7.992 0 0 1-7.402-7.413l-2.3-32.931-66.726-6.434c.032 7.173.124 15.028.124 16.592 0 70.472 89.397 104.344 200.465 104.734h.273c111.07-.39 200.435-34.262 200.435-104.734 0-1.592.096-9.416.129-16.592z" fill="#478cbf"/><path d="M451.527 518.261c0 24.71-20.02 44.725-44.72 44.725-24.688 0-44.714-20.016-44.714-44.725 0-24.691 20.026-44.697 44.713-44.697 24.7 0 44.72 20.006 44.72 44.697" fill="#fff"/><path d="M440.766 520.915c0 16.388-13.283 29.671-29.684 29.671-16.393 0-29.684-13.283-29.684-29.671 0-16.39 13.29-29.685 29.684-29.685 16.401 0 29.684 13.295 29.684 29.685" fill="#414042"/><path d="M511.997 567.054c-7.951 0-14.394-5.86-14.394-13.081v-41.17c0-7.216 6.444-13.08 14.394-13.08s14.408 5.864 14.408 13.08v41.17c0 7.222-6.458 13.081-14.408 13.081m60.477-48.793c0 24.71 20.02 44.725 44.724 44.725 24.686 0 44.71-20.016 44.71-44.725 0-24.691-20.024-44.697-44.71-44.697-24.704 0-44.724 20.006-44.724 44.697" fill="#fff"/><path d="M583.238 520.915c0 16.388 13.279 29.671 29.668 29.671 16.405 0 29.683-13.283 29.683-29.671 0-16.39-13.278-29.685-29.684-29.685-16.388 0-29.668 13.295-29.668 29.685" fill="#414042"/></g><text style="line-height:1.25;-inkscape-font-specification:'Montserrat Ultra-Bold'" x="234.416" y="878.644" font-weight="800" font-size="16" font-family="Montserrat" letter-spacing="0" word-spacing="0" fill="#333f67"><tspan x="234.416" y="878.644" font-size="112">PROJECT</tspan></text></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/project_extra_small.svg b/misc/dist/document_icons/project_extra_small.svg
new file mode 100644
index 0000000000..5482d27033
--- /dev/null
+++ b/misc/dist/document_icons/project_extra_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M12.698 4.59c-.368-.508-2.218-.623-3.086-.546.034-1.064.492-1.839-.593-2.766m-6.49-.51H7.25c1.205-.032 1.977.591 2.788 1.326L11.97 3.81c.998.89 1.393 1.729 1.5 2.94v8.483H2.53z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><g stroke-width=".32"><path d="M12.062 10.583s-.014-.083-.022-.082l-1.502.145a.244.244 0 0 0-.22.226l-.042.592-1.162.083-.079-.536a.246.246 0 0 0-.242-.21H7.208c-.12 0-.225.09-.243.21l-.079.536-1.162-.083-.041-.592a.244.244 0 0 0-.22-.226L3.958 10.5c-.007-.001-.013.082-.02.082l-.003.325 1.273.205.042.597c.008.12.105.218.226.227l1.6.114h.019c.12 0 .224-.089.242-.208l.081-.552h1.163l.08.552a.246.246 0 0 0 .26.208l1.601-.114a.246.246 0 0 0 .227-.227l.042-.597 1.272-.206z" fill="#fff"/><path d="M3.938 8.132v2.45l.013.001 1.503.145a.162.162 0 0 1 .146.15l.046.663 1.311.094.09-.612a.162.162 0 0 1 .16-.138h1.586a.162.162 0 0 1 .16.138l.09.612 1.311-.094.046-.663a.162.162 0 0 1 .146-.15l1.502-.145h.014V8.132h.006c.2-.254.383-.522.56-.808a6.285 6.285 0 0 0-.83-1.087 8.105 8.105 0 0 0-.823.48c-.13-.13-.278-.237-.422-.348-.143-.115-.303-.198-.455-.296a9.38 9.38 0 0 0 .077-1.015 5.275 5.275 0 0 0-1.234-.422 8.781 8.781 0 0 0-.457.892 3.13 3.13 0 0 0-.48-.039H8h-.003c-.16.002-.32.012-.48.039a8.71 8.71 0 0 0-.458-.892 5.276 5.276 0 0 0-1.233.422c.009.346.031.678.076 1.015-.152.098-.312.181-.454.296-.145.11-.292.217-.423.347a8.093 8.093 0 0 0-.823-.479c-.307.331-.595.688-.83 1.087.177.286.361.554.56.808z" fill="#478cbf"/><path d="M10.714 11.037l-.047.667a.162.162 0 0 1-.15.15l-1.6.114a.162.162 0 0 1-.172-.137l-.092-.623H7.347l-.092.623a.162.162 0 0 1-.171.137l-1.6-.114a.162.162 0 0 1-.15-.15l-.047-.667-1.351-.13.002.336c0 1.427 1.81 2.113 4.06 2.12h.005c2.25-.007 4.059-.693 4.059-2.12l.002-.336z" fill="#478cbf"/><path d="M6.776 9.127a.905.905 0 1 1-1.811 0 .905.905 0 0 1 1.81 0" fill="#fff"/><path d="M6.558 9.18a.6.6 0 1 1-1.202 0 .6.6 0 0 1 1.202 0" fill="#414042"/><path d="M8 10.115c-.16 0-.291-.119-.291-.265v-.834c0-.146.13-.265.291-.265.161 0 .292.119.292.265v.834c0 .146-.13.265-.292.265m1.225-.988a.906.906 0 1 0 1.81 0 .906.906 0 0 0-1.81 0" fill="#fff"/><path d="M9.443 9.18a.6.6 0 1 0 1.201 0 .6.6 0 0 0-1.201 0" fill="#414042"/></g></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/project_small.svg b/misc/dist/document_icons/project_small.svg
new file mode 100644
index 0000000000..76f501b80d
--- /dev/null
+++ b/misc/dist/document_icons/project_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32"><path d="M25.396 9.18c-.736-1.016-4.435-1.245-6.172-1.093.068-2.126.983-3.676-1.186-5.532M5.059 1.536H14.5c2.41-.063 3.955 1.182 5.576 2.652l3.865 3.433c1.994 1.779 2.785 3.457 3 5.88v16.965H5.059z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><g stroke-width=".32"><path d="M22.268 20.443s-.02-.128-.033-.127l-2.318.224a.377.377 0 0 0-.34.35l-.064.912-1.793.128-.122-.827a.38.38 0 0 0-.374-.323h-2.447a.38.38 0 0 0-.374.323l-.122.827-1.793-.128-.064-.913a.377.377 0 0 0-.34-.35l-2.32-.223c-.011-.001-.02.127-.032.127l-.003.501 1.964.317.064.921a.38.38 0 0 0 .35.35l2.47.177h.028a.38.38 0 0 0 .373-.322l.125-.851h1.795l.125.851a.38.38 0 0 0 .4.322l2.471-.176a.38.38 0 0 0 .35-.351l.064-.92 1.964-.32z" fill="#fff"/><path d="M9.732 16.66v3.783h.02l2.32.224a.25.25 0 0 1 .224.231l.072 1.024 2.023.144.14-.945a.25.25 0 0 1 .246-.213h2.447a.25.25 0 0 1 .247.213l.14.945 2.022-.144.072-1.024a.25.25 0 0 1 .225-.23l2.318-.225h.02v-.302h.001V16.66h.009c.307-.392.591-.805.864-1.246a9.7 9.7 0 0 0-1.28-1.677c-.44.22-.867.472-1.27.738-.202-.2-.43-.364-.653-.536-.22-.176-.466-.305-.701-.456.07-.52.104-1.032.118-1.566a8.14 8.14 0 0 0-1.903-.652c-.26.438-.499.913-.707 1.376a4.832 4.832 0 0 0-.74-.059h-.01a4.837 4.837 0 0 0-.742.06 13.44 13.44 0 0 0-.706-1.377 8.142 8.142 0 0 0-1.903.652c.014.534.048 1.046.118 1.566-.235.15-.482.28-.701.456-.223.172-.451.336-.653.536-.403-.266-.83-.517-1.27-.738a9.704 9.704 0 0 0-1.28 1.677c.273.44.557.854.864 1.246z" fill="#478cbf"/><path d="M20.188 21.144l-.072 1.029a.25.25 0 0 1-.231.232l-2.47.176a.25.25 0 0 1-.265-.213l-.142-.96h-2.015l-.142.96a.25.25 0 0 1-.265.213l-2.47-.176a.25.25 0 0 1-.231-.232l-.072-1.03-2.085-.2c0 .224.004.47.004.518 0 2.203 2.793 3.261 6.264 3.273h.009c3.47-.012 6.263-1.07 6.263-3.273l.004-.518z" fill="#478cbf"/><path d="M14.11 18.195a1.397 1.397 0 1 1-2.794.001 1.397 1.397 0 0 1 2.795 0" fill="#fff"/><path d="M13.774 18.278a.927.927 0 1 1-1.854 0 .927.927 0 0 1 1.854 0" fill="#414042"/><path d="M16 19.72c-.248 0-.45-.183-.45-.409v-1.286c0-.226.202-.409.45-.409.249 0 .45.183.45.409v1.286c0 .226-.201.41-.45.41m1.89-1.526a1.397 1.397 0 1 0 2.795 0 1.397 1.397 0 0 0-2.795 0" fill="#fff"/><path d="M18.227 18.278a.927.927 0 1 0 1.854 0 .927.927 0 0 0-1.854 0" fill="#414042"/></g></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/resource.svg b/misc/dist/document_icons/resource.svg
new file mode 100644
index 0000000000..2555e8f5c0
--- /dev/null
+++ b/misc/dist/document_icons/resource.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024"><path d="M812.681 293.783c-23.575-32.543-141.93-39.865-197.505-34.983 2.17-68.048 31.457-117.656-37.966-177.026M161.89 49.151H464c77.128-2.02 126.554 37.835 178.444 84.881l123.665 109.83c63.819 56.94 89.13 110.625 96 188.174v542.886H161.89z" fill="#eff1f5" stroke="#9f9fa1" stroke-width="19.603" stroke-linecap="round" stroke-linejoin="round"/><text style="line-height:1.25;-inkscape-font-specification:'Montserrat Ultra-Bold'" x="183.282" y="878.644" font-weight="800" font-size="16" letter-spacing="0" word-spacing="0" font-family="Montserrat" fill="#333f67"><tspan x="183.282" y="878.644" font-size="112">RESOURCE</tspan></text><path style="text-indent:0;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;isolation:auto;mix-blend-mode:normal" d="M510.825 290.281a31.683 31.683 0 0 0-12.994 3.28L307.75 388.6a31.683 31.683 0 0 0-17.51 28.339v190.08a31.683 31.683 0 0 0 17.51 28.338l190.08 95.04a31.683 31.683 0 0 0 28.338 0l190.08-95.04a31.683 31.683 0 0 0 17.51-28.338V416.94a31.683 31.683 0 0 0-17.51-28.34l-190.08-95.04a31.683 31.683 0 0 0-15.345-3.279zM512 357.354l119.234 59.587-43.747 21.904-119.234-59.647L512 357.356zm-158.4 110.88l126.72 63.36v119.234l-126.72-63.36zm316.8 0v119.234l-126.72 63.36V531.594z" color="#000" white-space="normal" fill-rule="evenodd" fill="#478cbf"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/resource_extra_small.svg b/misc/dist/document_icons/resource_extra_small.svg
new file mode 100644
index 0000000000..4ba41b0073
--- /dev/null
+++ b/misc/dist/document_icons/resource_extra_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M12.698 4.59c-.368-.508-2.218-.623-3.086-.546.034-1.064.492-1.839-.593-2.766m-6.49-.51H7.25c1.205-.032 1.977.591 2.788 1.326L11.97 3.81c.998.89 1.393 1.729 1.5 2.94v8.483H2.53z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><path style="text-indent:0;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;isolation:auto;mix-blend-mode:normal" d="M7.976 4.51a.642.642 0 0 0-.263.067L3.864 6.5a.642.642 0 0 0-.354.574v3.849a.642.642 0 0 0 .354.574l3.85 1.924a.642.642 0 0 0 .573 0l3.85-1.924a.642.642 0 0 0 .354-.574v-3.85a.642.642 0 0 0-.355-.573L8.287 4.576a.642.642 0 0 0-.31-.066zM8 5.868l2.415 1.207-.886.444L7.114 6.31 8 5.868zM4.793 8.114l2.566 1.283v2.414l-2.566-1.283zm6.415 0v2.414l-2.566 1.283V9.397z" color="#000" white-space="normal" fill="#478cbf" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/resource_small.svg b/misc/dist/document_icons/resource_small.svg
new file mode 100644
index 0000000000..502a4c6c36
--- /dev/null
+++ b/misc/dist/document_icons/resource_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32"><path d="M25.396 9.18c-.736-1.016-4.435-1.245-6.172-1.093.068-2.126.983-3.676-1.186-5.532M5.059 1.536H14.5c2.41-.063 3.955 1.182 5.576 2.652l3.865 3.433c1.994 1.779 2.785 3.457 3 5.88v16.965H5.059z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><path style="text-indent:0;text-decoration-line:none;text-decoration-style:solid;text-decoration-color:#000;text-transform:none;isolation:auto;mix-blend-mode:normal" d="M15.964 11.071a.99.99 0 0 0-.406.103l-5.94 2.97a.99.99 0 0 0-.547.885v5.94a.99.99 0 0 0 .547.886l5.94 2.97a.99.99 0 0 0 .885 0l5.94-2.97a.99.99 0 0 0 .547-.886v-5.94a.99.99 0 0 0-.547-.885l-5.94-2.97a.99.99 0 0 0-.48-.103zM16 13.167l3.726 1.862-1.367.685-3.727-1.864 1.368-.683zm-4.95 3.465l3.96 1.98v3.726l-3.96-1.98zm9.9 0v3.726l-3.96 1.98v-3.726z" color="#000" white-space="normal" fill="#478cbf" fill-rule="evenodd"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/scene.svg b/misc/dist/document_icons/scene.svg
new file mode 100644
index 0000000000..a4e1ca809e
--- /dev/null
+++ b/misc/dist/document_icons/scene.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="1024" height="1024"><path d="M812.681 293.783c-23.575-32.542-141.93-39.864-197.505-34.983 2.17-68.048 31.457-117.655-37.966-177.025M161.89 49.15H464c77.128-2.02 126.554 37.836 178.444 84.882l123.665 109.83c63.819 56.94 89.13 110.624 96 188.174v542.885H161.89z" fill="#eff1f5" stroke="#9f9fa1" stroke-width="19.603" stroke-linecap="round" stroke-linejoin="round"/><text style="line-height:1.25;-inkscape-font-specification:'Montserrat Ultra-Bold'" x="315.088" y="878.644" font-weight="800" font-size="16" font-family="Montserrat" letter-spacing="0" word-spacing="0" fill="#333f67"><tspan x="315.088" y="878.644" font-size="112">SCENE</tspan></text><path d="M714.504 315.805l-67.735 9.904 24.7 57.361 51.76-7.546zm-127.458 18.57l-59.719 8.725 24.702 57.419 59.719-8.725zm-119.498 17.45l-59.719 8.725 24.701 57.419 59.72-8.725zm-119.438 17.45l-51.76 7.546 8.725 59.719 67.736-9.904zm-43.036 97.449v181.104c0 33.34 27.027 60.368 60.368 60.368H727.65V466.724z" fill="#478cbf"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/scene_extra_small.svg b/misc/dist/document_icons/scene_extra_small.svg
new file mode 100644
index 0000000000..155aa843b2
--- /dev/null
+++ b/misc/dist/document_icons/scene_extra_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16"><path d="M12.698 4.59c-.368-.508-2.218-.623-3.086-.546.034-1.064.492-1.839-.593-2.766m-6.49-.51H7.25c1.205-.032 1.977.591 2.788 1.326L11.97 3.81c.998.89 1.393 1.729 1.5 2.94v8.483H2.53z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><path d="M12.101 5.027l-1.372.2.5 1.162 1.049-.153zm-2.581.376l-1.21.177.5 1.162 1.21-.176zm-2.42.353l-1.21.177.501 1.163 1.21-.177zm-2.419.354l-1.048.152.177 1.21 1.372-.2zM3.81 8.083v3.667c0 .676.547 1.223 1.222 1.223h7.335v-4.89z" fill="#478cbf"/></svg> \ No newline at end of file
diff --git a/misc/dist/document_icons/scene_small.svg b/misc/dist/document_icons/scene_small.svg
new file mode 100644
index 0000000000..d36d42f458
--- /dev/null
+++ b/misc/dist/document_icons/scene_small.svg
@@ -0,0 +1 @@
+<svg xmlns="http://www.w3.org/2000/svg" width="32" height="32"><path d="M25.396 9.18c-.736-1.016-4.435-1.245-6.172-1.093.068-2.126.983-3.676-1.186-5.532M5.059 1.536H14.5c2.41-.063 3.955 1.182 5.576 2.652l3.865 3.433c1.994 1.779 2.785 3.457 3 5.88v16.965H5.059z" fill="#eff1f5" stroke="#9f9fa1" stroke-linecap="round" stroke-linejoin="round"/><path d="M22.329 11.869l-2.117.31.772 1.792 1.617-.236zm-3.983.58l-1.867.273.772 1.794 1.867-.273zm-3.735.545l-1.866.273.772 1.794 1.866-.272zm-3.732.546l-1.618.235.273 1.867 2.117-.31zm-1.345 3.045v5.66c0 1.041.845 1.886 1.887 1.886H22.74v-7.546z" fill="#478cbf"/></svg> \ No newline at end of file
diff --git a/misc/dist/linux/godot.6 b/misc/dist/linux/godot.6
index 50cb420e4e..43ca4e9d10 100644
--- a/misc/dist/linux/godot.6
+++ b/misc/dist/linux/godot.6
@@ -149,7 +149,7 @@ Build the scripting solutions (e.g. for C# projects).
Generate JSON dump of the Godot API for GDNative bindings.
.TP
\fB\-\-test\fR <test>
-Run a unit test ('string', 'math', 'physics', 'physics_2d', 'render', 'oa_hash_map', 'gui', 'io', 'shaderlang', 'gd_tokenizer', 'gd_parser', 'gd_compiler', 'gd_bytecode', 'image', 'ordered_hash_map').
+Run a unit test ('string', 'math', 'physics', 'physics_2d', 'render', 'oa_hash_map', 'gui', 'shaderlang', 'gd_tokenizer', 'gd_parser', 'gd_compiler', 'gd_bytecode', 'image', 'ordered_hash_map').
.SH FILES
XDG_DATA_CONFIG/godot/ or ~/.config/godot/
.RS
diff --git a/misc/dist/osx_tools.app/Contents/Info.plist b/misc/dist/osx_tools.app/Contents/Info.plist
index faa929b818..a001fdf9d2 100755
--- a/misc/dist/osx_tools.app/Contents/Info.plist
+++ b/misc/dist/osx_tools.app/Contents/Info.plist
@@ -72,22 +72,67 @@
<key>UTTypeDescription</key>
<string>Godot Scene</string>
<key>UTTypeIconFile</key>
- <string>Document.icns</string>
+ <string>Scene.icns</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
- <key>com.apple.ostype</key>
- <string>TSCN</string>
<key>public.filename-extension</key>
<array>
<string>scn</string>
<string>tscn</string>
</array>
<key>public.mime-type</key>
- <string>scene/x-scn</string>
+ <string>application/x-godot-scene</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeIdentifier</key>
+ <string>public.gd</string>
+ <key>UTTypeReferenceURL</key>
+ <string></string>
+ <key>UTTypeDescription</key>
+ <string>Godot Script</string>
+ <key>UTTypeIconFile</key>
+ <string>GDScript.icns</string>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ </array>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>gd</string>
+ </array>
+ <key>public.mime-type</key>
+ <string>text/x-gdscript</string>
+ </dict>
+ </dict>
+ <dict>
+ <key>UTTypeIdentifier</key>
+ <string>public.res</string>
+ <key>UTTypeReferenceURL</key>
+ <string></string>
+ <key>UTTypeDescription</key>
+ <string>Godot Resource</string>
+ <key>UTTypeIconFile</key>
+ <string>Resource.icns</string>
+ <key>UTTypeConformsTo</key>
+ <array>
+ <string>public.data</string>
+ </array>
+ <key>UTTypeTagSpecification</key>
+ <dict>
+ <key>public.filename-extension</key>
+ <array>
+ <string>res</string>
+ <string>tres</string>
+ </array>
+ <key>public.mime-type</key>
+ <string>application/x-godot-resource</string>
</dict>
</dict>
<dict>
@@ -98,21 +143,19 @@
<key>UTTypeDescription</key>
<string>Godot Project</string>
<key>UTTypeIconFile</key>
- <string>Document.icns</string>
+ <string>Project.icns</string>
<key>UTTypeConformsTo</key>
<array>
<string>public.data</string>
</array>
<key>UTTypeTagSpecification</key>
<dict>
- <key>com.apple.ostype</key>
- <string>GODP</string>
<key>public.filename-extension</key>
<array>
<string>godot</string>
</array>
<key>public.mime-type</key>
- <string>project/x-godot</string>
+ <string>text/x-godot-project</string>
</dict>
</dict>
</array>
diff --git a/misc/dist/osx_tools.app/Contents/Resources/Document.icns b/misc/dist/osx_tools.app/Contents/Resources/Document.icns
deleted file mode 100644
index 06d7c65298..0000000000
--- a/misc/dist/osx_tools.app/Contents/Resources/Document.icns
+++ /dev/null
Binary files differ
diff --git a/misc/dist/osx_tools.app/Contents/Resources/GDScript.icns b/misc/dist/osx_tools.app/Contents/Resources/GDScript.icns
new file mode 100644
index 0000000000..b08e8df339
--- /dev/null
+++ b/misc/dist/osx_tools.app/Contents/Resources/GDScript.icns
Binary files differ
diff --git a/misc/dist/osx_tools.app/Contents/Resources/Project.icns b/misc/dist/osx_tools.app/Contents/Resources/Project.icns
new file mode 100644
index 0000000000..10e31528e4
--- /dev/null
+++ b/misc/dist/osx_tools.app/Contents/Resources/Project.icns
Binary files differ
diff --git a/misc/dist/osx_tools.app/Contents/Resources/Resource.icns b/misc/dist/osx_tools.app/Contents/Resources/Resource.icns
new file mode 100644
index 0000000000..9648cb616e
--- /dev/null
+++ b/misc/dist/osx_tools.app/Contents/Resources/Resource.icns
Binary files differ
diff --git a/misc/dist/osx_tools.app/Contents/Resources/Scene.icns b/misc/dist/osx_tools.app/Contents/Resources/Scene.icns
new file mode 100644
index 0000000000..c8c3dee07e
--- /dev/null
+++ b/misc/dist/osx_tools.app/Contents/Resources/Scene.icns
Binary files differ
diff --git a/modules/bullet/shape_bullet.cpp b/modules/bullet/shape_bullet.cpp
index 8bb621a863..2027d8e1eb 100644
--- a/modules/bullet/shape_bullet.cpp
+++ b/modules/bullet/shape_bullet.cpp
@@ -461,7 +461,47 @@ void HeightMapShapeBullet::set_data(const Variant &p_data) {
int l_width = d["width"];
int l_depth = d["depth"];
- PoolVector<real_t> l_heights = d["heights"];
+
+ // TODO This code will need adjustments if real_t is set to `double`,
+ // because that precision is unnecessary for a heightmap and Bullet doesn't support it...
+
+ PoolVector<real_t> l_heights;
+ Variant l_heights_v = d["heights"];
+
+ if (l_heights_v.get_type() == Variant::POOL_REAL_ARRAY) {
+ // Ready-to-use heights can be passed
+
+ l_heights = l_heights_v;
+
+ } else if (l_heights_v.get_type() == Variant::OBJECT) {
+ // If an image is passed, we have to convert it to a format Bullet supports.
+ // this would be expensive to do with a script, so it's nice to have it here.
+
+ Ref<Image> l_image = l_heights_v;
+ ERR_FAIL_COND(l_image.is_null());
+
+ // Float is the only common format between Godot and Bullet that can be used for decent collision.
+ // (Int16 would be nice too but we still don't have it)
+ // We could convert here automatically but it's better to not be intrusive and let the caller do it if necessary.
+ ERR_FAIL_COND(l_image->get_format() != Image::FORMAT_RF);
+
+ PoolByteArray im_data = l_image->get_data();
+
+ l_heights.resize(l_image->get_width() * l_image->get_width());
+
+ PoolRealArray::Write w = l_heights.write();
+ PoolByteArray::Read r = im_data.read();
+ float *rp = (float *)r.ptr();
+ // At this point, `rp` could be used directly for Bullet, but I don't know how safe it would be.
+
+ for (int i = 0; i < l_heights.size(); ++i) {
+ w[i] = rp[i];
+ }
+
+ } else {
+ ERR_EXPLAIN("Expected PoolRealArray or float Image.");
+ ERR_FAIL();
+ }
ERR_FAIL_COND(l_width <= 0);
ERR_FAIL_COND(l_depth <= 0);
@@ -497,19 +537,8 @@ PhysicsServer::ShapeType HeightMapShapeBullet::get_type() const {
void HeightMapShapeBullet::setup(PoolVector<real_t> &p_heights, int p_width, int p_depth, real_t p_min_height, real_t p_max_height) {
// TODO cell size must be tweaked using localScaling, which is a shared property for all Bullet shapes
- { // Copy
-
- // TODO If Godot supported 16-bit integer image format, we could share the same memory block for heightfields
- // without having to copy anything, optimizing memory and loading performance (Bullet only reads and doesn't take ownership of the data).
-
- const int heights_size = p_heights.size();
- heights.resize(heights_size);
- PoolVector<real_t>::Read p_heights_r = p_heights.read();
- PoolVector<real_t>::Write heights_w = heights.write();
- for (int i = heights_size - 1; 0 <= i; --i) {
- heights_w[i] = p_heights_r[i];
- }
- }
+ // If this array is resized outside of here, it should be preserved due to CoW
+ heights = p_heights;
width = p_width;
depth = p_depth;
diff --git a/modules/csg/csg_shape.cpp b/modules/csg/csg_shape.cpp
index 4e35014459..f4b061f494 100644
--- a/modules/csg/csg_shape.cpp
+++ b/modules/csg/csg_shape.cpp
@@ -197,17 +197,6 @@ void CSGShape::mikktGetTexCoord(const SMikkTSpaceContext *pContext, float fvTexc
fvTexcOut[1] = t.y;
}
-void CSGShape::mikktSetTSpaceBasic(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fSign, const int iFace, const int iVert) {
- ShapeUpdateSurface &surface = *((ShapeUpdateSurface *)pContext->m_pUserData);
-
- int i = (iFace * 3 + iVert) * 4;
-
- surface.tansw[i++] = fvTangent[0];
- surface.tansw[i++] = fvTangent[1];
- surface.tansw[i++] = fvTangent[2];
- surface.tansw[i++] = fSign;
-}
-
void CSGShape::mikktSetTSpaceDefault(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fvBiTangent[], const float fMagS, const float fMagT,
const tbool bIsOrientationPreserving, const int iFace, const int iVert) {
@@ -216,7 +205,7 @@ void CSGShape::mikktSetTSpaceDefault(const SMikkTSpaceContext *pContext, const f
int i = iFace * 3 + iVert;
Vector3 normal = surface.normalsw[i];
Vector3 tangent = Vector3(fvTangent[0], fvTangent[1], fvTangent[2]);
- Vector3 bitangent = Vector3(fvBiTangent[0], fvBiTangent[1], fvBiTangent[2]);
+ Vector3 bitangent = Vector3(-fvBiTangent[0], -fvBiTangent[1], -fvBiTangent[2]); // for some reason these are reversed, something with the coordinate system in Godot
float d = bitangent.dot(normal.cross(tangent));
i *= 4;
diff --git a/modules/csg/csg_shape.h b/modules/csg/csg_shape.h
index 0a4bb5f665..7326f3d36a 100644
--- a/modules/csg/csg_shape.h
+++ b/modules/csg/csg_shape.h
@@ -97,7 +97,6 @@ private:
static void mikktGetPosition(const SMikkTSpaceContext *pContext, float fvPosOut[], const int iFace, const int iVert);
static void mikktGetNormal(const SMikkTSpaceContext *pContext, float fvNormOut[], const int iFace, const int iVert);
static void mikktGetTexCoord(const SMikkTSpaceContext *pContext, float fvTexcOut[], const int iFace, const int iVert);
- static void mikktSetTSpaceBasic(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fSign, const int iFace, const int iVert);
static void mikktSetTSpaceDefault(const SMikkTSpaceContext *pContext, const float fvTangent[], const float fvBiTangent[], const float fMagS, const float fMagT,
const tbool bIsOrientationPreserving, const int iFace, const int iVert);
diff --git a/modules/gdscript/gdscript_functions.cpp b/modules/gdscript/gdscript_functions.cpp
index 2f31d59c46..9ff33594ce 100644
--- a/modules/gdscript/gdscript_functions.cpp
+++ b/modules/gdscript/gdscript_functions.cpp
@@ -758,22 +758,14 @@ void GDScriptFunctions::call(Function p_func, const Variant **p_args, int p_arg_
r_ret = Variant();
return;
}
+ r_ret = *p_args[0];
VariantParser::StreamString ss;
ss.s = *p_args[0];
String errs;
int line;
- Error err = VariantParser::parse(&ss, r_ret, errs, line);
-
- if (err != OK) {
- r_error.error = Variant::CallError::CALL_ERROR_INVALID_ARGUMENT;
- r_error.argument = 0;
- r_error.expected = Variant::STRING;
- r_ret = "Parse error at line " + itos(line) + ": " + errs;
- return;
- }
-
+ (void)VariantParser::parse(&ss, r_ret, errs, line);
} break;
case VAR_TO_BYTES: {
VALIDATE_ARG_COUNT(1);
diff --git a/modules/gdscript/gdscript_parser.cpp b/modules/gdscript/gdscript_parser.cpp
index 0926c1a1ab..6ea0dbcb19 100644
--- a/modules/gdscript/gdscript_parser.cpp
+++ b/modules/gdscript/gdscript_parser.cpp
@@ -5746,18 +5746,23 @@ bool GDScriptParser::_is_type_compatible(const DataType &p_container, const Data
if (p_container.kind == DataType::BUILTIN && p_expression.kind == DataType::BUILTIN) {
bool valid = p_container.builtin_type == p_expression.builtin_type;
if (p_allow_implicit_conversion) {
- valid = valid || (p_container.builtin_type == Variant::INT && p_expression.builtin_type == Variant::REAL);
- valid = valid || (p_container.builtin_type == Variant::REAL && p_expression.builtin_type == Variant::INT);
- valid = valid || (p_container.builtin_type == Variant::STRING && p_expression.builtin_type == Variant::NODE_PATH);
- valid = valid || (p_container.builtin_type == Variant::NODE_PATH && p_expression.builtin_type == Variant::STRING);
- valid = valid || (p_container.builtin_type == Variant::BOOL && p_expression.builtin_type == Variant::REAL);
- valid = valid || (p_container.builtin_type == Variant::BOOL && p_expression.builtin_type == Variant::INT);
- valid = valid || (p_container.builtin_type == Variant::INT && p_expression.builtin_type == Variant::BOOL);
- valid = valid || (p_container.builtin_type == Variant::REAL && p_expression.builtin_type == Variant::BOOL);
+ valid = valid || Variant::can_convert_strict(p_expression.builtin_type, p_container.builtin_type);
}
return valid;
}
+ if (p_container.kind == DataType::BUILTIN && p_container.builtin_type == Variant::OBJECT) {
+ // Object built-in is a special case, it's compatible with any object and with null
+ if (p_expression.kind == DataType::BUILTIN && p_expression.builtin_type == Variant::NIL) {
+ return true;
+ }
+ if (p_expression.kind == DataType::BUILTIN) {
+ return false;
+ }
+ // If it's not a built-in, must be an object
+ return true;
+ }
+
if (p_container.kind == DataType::BUILTIN || (p_expression.kind == DataType::BUILTIN && p_expression.builtin_type != Variant::NIL)) {
// Can't mix built-ins with objects
return false;
diff --git a/modules/mono/csharp_script.cpp b/modules/mono/csharp_script.cpp
index 3c818898e6..943d95bfc9 100644
--- a/modules/mono/csharp_script.cpp
+++ b/modules/mono/csharp_script.cpp
@@ -2474,6 +2474,18 @@ void CSharpScript::set_source_code(const String &p_code) {
#endif
}
+void CSharpScript::get_script_method_list(List<MethodInfo> *p_list) const {
+
+ if (!script_class)
+ return;
+
+ // TODO: Filter out things unsuitable for explicit calls, like constructors.
+ const Vector<GDMonoMethod *> &methods = script_class->get_all_methods();
+ for (int i = 0; i < methods.size(); ++i) {
+ p_list->push_back(methods[i]->get_method_info());
+ }
+}
+
bool CSharpScript::has_method(const StringName &p_method) const {
if (!script_class)
@@ -2482,6 +2494,25 @@ bool CSharpScript::has_method(const StringName &p_method) const {
return script_class->has_fetched_method_unknown_params(p_method);
}
+MethodInfo CSharpScript::get_method_info(const StringName &p_method) const {
+
+ if (!script_class)
+ return MethodInfo();
+
+ GDMonoClass *top = script_class;
+
+ while (top && top != native) {
+ GDMonoMethod *params = top->get_fetched_method_unknown_params(p_method);
+ if (params) {
+ return params->get_method_info();
+ }
+
+ top = top->get_parent_class();
+ }
+
+ return MethodInfo();
+}
+
Error CSharpScript::reload(bool p_keep_state) {
bool has_instances;
diff --git a/modules/mono/csharp_script.h b/modules/mono/csharp_script.h
index 501e0d9d6d..08466bae58 100644
--- a/modules/mono/csharp_script.h
+++ b/modules/mono/csharp_script.h
@@ -174,9 +174,9 @@ public:
virtual Ref<Script> get_base_script() const;
virtual ScriptLanguage *get_language() const;
- /* TODO */ virtual void get_script_method_list(List<MethodInfo> *p_list) const {}
+ virtual void get_script_method_list(List<MethodInfo> *p_list) const;
bool has_method(const StringName &p_method) const;
- /* TODO */ MethodInfo get_method_info(const StringName &p_method) const { return MethodInfo(); }
+ MethodInfo get_method_info(const StringName &p_method) const;
virtual int get_member_line(const StringName &p_member) const;
diff --git a/modules/mono/mono_gd/gd_mono_class.cpp b/modules/mono/mono_gd/gd_mono_class.cpp
index 4e515cde28..c55f9160bd 100644
--- a/modules/mono/mono_gd/gd_mono_class.cpp
+++ b/modules/mono/mono_gd/gd_mono_class.cpp
@@ -151,6 +151,7 @@ void GDMonoClass::fetch_methods_with_godot_api_checks(GDMonoClass *p_native_base
while ((raw_method = mono_class_get_methods(get_mono_ptr(), &iter)) != NULL) {
StringName name = mono_method_get_name(raw_method);
+ // get_method implicitly fetches methods and adds them to this->methods
GDMonoMethod *method = get_method(raw_method, name);
ERR_CONTINUE(!method);
@@ -449,6 +450,21 @@ const Vector<GDMonoClass *> &GDMonoClass::get_all_delegates() {
return delegates_list;
}
+const Vector<GDMonoMethod *> &GDMonoClass::get_all_methods() {
+
+ if (!method_list_fetched) {
+ void *iter = NULL;
+ MonoMethod *raw_method = NULL;
+ while ((raw_method = mono_class_get_methods(get_mono_ptr(), &iter)) != NULL) {
+ method_list.push_back(memnew(GDMonoMethod(mono_method_get_name(raw_method), raw_method)));
+ }
+
+ method_list_fetched = true;
+ }
+
+ return method_list;
+}
+
GDMonoClass::GDMonoClass(const StringName &p_namespace, const StringName &p_name, MonoClass *p_class, GDMonoAssembly *p_assembly) {
namespace_name = p_namespace;
@@ -460,6 +476,7 @@ GDMonoClass::GDMonoClass(const StringName &p_namespace, const StringName &p_name
attributes = NULL;
methods_fetched = false;
+ method_list_fetched = false;
fields_fetched = false;
properties_fetched = false;
delegates_fetched = false;
@@ -512,4 +529,8 @@ GDMonoClass::~GDMonoClass() {
methods.clear();
}
+
+ for (int i = 0; i < method_list.size(); ++i) {
+ memdelete(method_list[i]);
+ }
}
diff --git a/modules/mono/mono_gd/gd_mono_class.h b/modules/mono/mono_gd/gd_mono_class.h
index 477305d503..689001f494 100644
--- a/modules/mono/mono_gd/gd_mono_class.h
+++ b/modules/mono/mono_gd/gd_mono_class.h
@@ -79,9 +79,14 @@ class GDMonoClass {
bool attrs_fetched;
MonoCustomAttrInfo *attributes;
+ // This contains both the original method names and remapped method names from the native Godot identifiers to the C# functions.
+ // Most method-related functions refer to this and it's possible this is unintuitive for outside users; this may be a prime location for refactoring or renaming.
bool methods_fetched;
HashMap<MethodKey, GDMonoMethod *, MethodKey::Hasher> methods;
+ bool method_list_fetched;
+ Vector<GDMonoMethod *> method_list;
+
bool fields_fetched;
Map<StringName, GDMonoField *> fields;
Vector<GDMonoField *> fields_list;
@@ -143,6 +148,8 @@ public:
const Vector<GDMonoClass *> &get_all_delegates();
+ const Vector<GDMonoMethod *> &get_all_methods();
+
~GDMonoClass();
};
diff --git a/modules/mono/mono_gd/gd_mono_method.cpp b/modules/mono/mono_gd/gd_mono_method.cpp
index 630bda8b4e..6ef6e97f5a 100644
--- a/modules/mono/mono_gd/gd_mono_method.cpp
+++ b/modules/mono/mono_gd/gd_mono_method.cpp
@@ -68,6 +68,10 @@ void GDMonoMethod::_update_signature(MonoMethodSignature *p_method_sig) {
param_types.push_back(param_type);
}
+
+ // clear the cache
+ method_info_fetched = false;
+ method_info = MethodInfo();
}
bool GDMonoMethod::is_static() {
@@ -246,11 +250,34 @@ void GDMonoMethod::get_parameter_types(Vector<ManagedType> &types) const {
}
}
+const MethodInfo &GDMonoMethod::get_method_info() {
+
+ if (!method_info_fetched) {
+ method_info.name = name;
+ method_info.return_val = PropertyInfo(GDMonoMarshal::managed_to_variant_type(return_type), "");
+
+ Vector<StringName> names;
+ get_parameter_names(names);
+
+ for (int i = 0; i < params_count; ++i) {
+ method_info.arguments.push_back(PropertyInfo(GDMonoMarshal::managed_to_variant_type(param_types[i]), names[i]));
+ }
+
+ // TODO: default arguments
+
+ method_info_fetched = true;
+ }
+
+ return method_info;
+}
+
GDMonoMethod::GDMonoMethod(StringName p_name, MonoMethod *p_method) {
name = p_name;
mono_method = p_method;
+ method_info_fetched = false;
+
attrs_fetched = false;
attributes = NULL;
diff --git a/modules/mono/mono_gd/gd_mono_method.h b/modules/mono/mono_gd/gd_mono_method.h
index 444ec2a67d..6c3ae5fce0 100644
--- a/modules/mono/mono_gd/gd_mono_method.h
+++ b/modules/mono/mono_gd/gd_mono_method.h
@@ -43,6 +43,9 @@ class GDMonoMethod : public GDMonoClassMember {
ManagedType return_type;
Vector<ManagedType> param_types;
+ bool method_info_fetched;
+ MethodInfo method_info;
+
bool attrs_fetched;
MonoCustomAttrInfo *attributes;
@@ -83,6 +86,8 @@ public:
void get_parameter_names(Vector<StringName> &names) const;
void get_parameter_types(Vector<ManagedType> &types) const;
+ const MethodInfo &get_method_info();
+
GDMonoMethod(StringName p_name, MonoMethod *p_method);
~GDMonoMethod();
};
diff --git a/modules/visual_script/visual_script_editor.cpp b/modules/visual_script/visual_script_editor.cpp
index afaa6a9b95..080d0643a2 100644
--- a/modules/visual_script/visual_script_editor.cpp
+++ b/modules/visual_script/visual_script_editor.cpp
@@ -3491,6 +3491,7 @@ VisualScriptEditor::VisualScriptEditor() {
edit_menu = memnew(MenuButton);
edit_menu->set_text(TTR("Edit"));
+ edit_menu->set_switch_on_hover(true);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("visual_script_editor/delete_selected"), EDIT_DELETE_NODES);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("visual_script_editor/toggle_breakpoint"), EDIT_TOGGLE_BREAKPOINT);
edit_menu->get_popup()->add_shortcut(ED_GET_SHORTCUT("visual_script_editor/find_node_type"), EDIT_FIND_NODE_TYPE);
diff --git a/modules/webp/SCsub b/modules/webp/SCsub
index 8a4307fbe1..d215f19cef 100644
--- a/modules/webp/SCsub
+++ b/modules/webp/SCsub
@@ -42,7 +42,6 @@ if env['builtin_libwebp']:
"dsp/dec_neon.c",
"dsp/dec_sse2.c",
"dsp/dec_sse41.c",
- "dsp/enc_avx2.c",
"dsp/enc.c",
"dsp/enc_mips32.c",
"dsp/enc_mips_dsp_r2.c",
@@ -90,7 +89,6 @@ if env['builtin_libwebp']:
"enc/backward_references_enc.c",
"enc/config_enc.c",
"enc/cost_enc.c",
- "enc/delta_palettization_enc.c",
"enc/filter_enc.c",
"enc/frame_enc.c",
"enc/histogram_enc.c",
diff --git a/platform/iphone/export/export.cpp b/platform/iphone/export/export.cpp
index 7fb3afe9a9..8a9b254cdc 100644
--- a/platform/iphone/export/export.cpp
+++ b/platform/iphone/export/export.cpp
@@ -99,6 +99,70 @@ class EditorExportPlatformIOS : public EditorExportPlatform {
Error _export_additional_assets(const String &p_out_dir, const Vector<String> &p_assets, bool p_is_framework, Vector<IOSExportAsset> &r_exported_assets);
Error _export_additional_assets(const String &p_out_dir, const Vector<SharedObject> &p_libraries, Vector<IOSExportAsset> &r_exported_assets);
+ bool is_package_name_valid(const String &p_package, String *r_error = NULL) const {
+
+ String pname = p_package;
+
+ if (pname.length() == 0) {
+ if (r_error) {
+ *r_error = "Identifier is missing.";
+ }
+ return false;
+ }
+
+ int segments = 0;
+ bool first = true;
+ for (int i = 0; i < pname.length(); i++) {
+ CharType c = pname[i];
+ if (first && c == '.') {
+ if (r_error) {
+ *r_error = "Identifier segments must be of non-zero length.";
+ }
+ return false;
+ }
+ if (c == '.') {
+ segments++;
+ first = true;
+ continue;
+ }
+ if (!((c >= 'a' && c <= 'z') || (c >= 'A' && c <= 'Z') || (c >= '0' && c <= '9') || c == '_')) {
+ if (r_error) {
+ *r_error = "The character '" + String::chr(c) + "' is not allowed in Identifier.";
+ }
+ return false;
+ }
+ if (first && (c >= '0' && c <= '9')) {
+ if (r_error) {
+ *r_error = "A digit cannot be the first character in a Identifier segment.";
+ }
+ return false;
+ }
+ if (first && c == '_') {
+ if (r_error) {
+ *r_error = "The character '" + String::chr(c) + "' cannot be the first character in a Identifier segment.";
+ }
+ return false;
+ }
+ first = false;
+ }
+
+ if (segments == 0) {
+ if (r_error) {
+ *r_error = "The Identifier must have at least one '.' separator.";
+ }
+ return false;
+ }
+
+ if (first) {
+ if (r_error) {
+ *r_error = "Identifier segments must be of non-zero length.";
+ }
+ return false;
+ }
+
+ return true;
+ }
+
protected:
virtual void get_preset_features(const Ref<EditorExportPreset> &p_preset, List<String> *r_features);
virtual void get_export_options(List<ExportOption> *r_options);
@@ -987,6 +1051,12 @@ bool EditorExportPlatformIOS::can_export(const Ref<EditorExportPreset> &p_preset
err += "App Store Team ID not specified - cannot configure the project.\n";
}
+ String identifier = p_preset->get("application/identifier");
+ String pn_err;
+ if (!is_package_name_valid(identifier, &pn_err)) {
+ err += "Invalid Identifier - " + pn_err + "\n";
+ }
+
for (unsigned int i = 0; i < (sizeof(icon_infos) / sizeof(icon_infos[0])); ++i) {
IconInfo info = icon_infos[i];
String icon_path = p_preset->get(info.preset_key);
diff --git a/platform/iphone/gl_view.mm b/platform/iphone/gl_view.mm
index 2925b46007..5b4d1f8226 100644
--- a/platform/iphone/gl_view.mm
+++ b/platform/iphone/gl_view.mm
@@ -84,7 +84,8 @@ Rect2 _get_ios_window_safe_area(float p_window_width, float p_window_height) {
}
ERR_FAIL_COND_V(insets.left < 0 || insets.top < 0 || insets.right < 0 || insets.bottom < 0,
Rect2(0, 0, p_window_width, p_window_height));
- return Rect2(insets.left, insets.top, p_window_width - insets.right - insets.left, p_window_height - insets.bottom - insets.top);
+ UIEdgeInsets window_insets = UIEdgeInsetsMake(_points_to_pixels(insets.top), _points_to_pixels(insets.left), _points_to_pixels(insets.bottom), _points_to_pixels(insets.right));
+ return Rect2(window_insets.left, window_insets.top, p_window_width - window_insets.right - window_insets.left, p_window_height - window_insets.bottom - window_insets.top);
}
bool _play_video(String p_path, float p_volume, String p_audio_track, String p_subtitle_track) {
diff --git a/platform/x11/os_x11.cpp b/platform/x11/os_x11.cpp
index 04854e93b6..0c02e47b5e 100644
--- a/platform/x11/os_x11.cpp
+++ b/platform/x11/os_x11.cpp
@@ -2853,11 +2853,19 @@ void OS_X11::set_context(int p_context) {
XClassHint *classHint = XAllocClassHint();
if (classHint) {
+ char *wm_class = (char *)"Godot";
if (p_context == CONTEXT_EDITOR)
classHint->res_name = (char *)"Godot_Editor";
if (p_context == CONTEXT_PROJECTMAN)
classHint->res_name = (char *)"Godot_ProjectList";
- classHint->res_class = (char *)"Godot";
+
+ if (p_context == CONTEXT_ENGINE) {
+ classHint->res_name = (char *)"Godot_Engine";
+ wm_class = (char *)((String)GLOBAL_GET("application/config/name")).utf8().ptrw();
+ }
+
+ classHint->res_class = wm_class;
+
XSetClassHint(x11_display, x11_window, classHint);
XFree(classHint);
}
diff --git a/scene/2d/canvas_item.cpp b/scene/2d/canvas_item.cpp
index 0ea2e85dfa..d847fa2471 100644
--- a/scene/2d/canvas_item.cpp
+++ b/scene/2d/canvas_item.cpp
@@ -1160,7 +1160,7 @@ void CanvasItem::_bind_methods() {
ClassDB::bind_method(D_METHOD("draw_string", "font", "position", "text", "modulate", "clip_w"), &CanvasItem::draw_string, DEFVAL(Color(1, 1, 1)), DEFVAL(-1));
ClassDB::bind_method(D_METHOD("draw_char", "font", "position", "char", "next", "modulate"), &CanvasItem::draw_char, DEFVAL(Color(1, 1, 1)));
ClassDB::bind_method(D_METHOD("draw_mesh", "mesh", "texture", "normal_map"), &CanvasItem::draw_mesh, DEFVAL(Ref<Texture>()));
- ClassDB::bind_method(D_METHOD("draw_multimesh", "mesh", "texture", "normal_map"), &CanvasItem::draw_mesh, DEFVAL(Ref<Texture>()));
+ ClassDB::bind_method(D_METHOD("draw_multimesh", "multimesh", "texture", "normal_map"), &CanvasItem::draw_multimesh, DEFVAL(Ref<Texture>()));
ClassDB::bind_method(D_METHOD("draw_set_transform", "position", "rotation", "scale"), &CanvasItem::draw_set_transform);
ClassDB::bind_method(D_METHOD("draw_set_transform_matrix", "xform"), &CanvasItem::draw_set_transform_matrix);
diff --git a/scene/2d/navigation_polygon.cpp b/scene/2d/navigation_polygon.cpp
index b36924e521..9154929e0b 100644
--- a/scene/2d/navigation_polygon.cpp
+++ b/scene/2d/navigation_polygon.cpp
@@ -349,8 +349,6 @@ void NavigationPolygonInstance::set_enabled(bool p_enabled) {
if (Engine::get_singleton()->is_editor_hint() || get_tree()->is_debugging_navigation_hint())
update();
-
- //update_gizmo();
}
bool NavigationPolygonInstance::is_enabled() const {
@@ -461,26 +459,28 @@ void NavigationPolygonInstance::_notification(int p_what) {
void NavigationPolygonInstance::set_navigation_polygon(const Ref<NavigationPolygon> &p_navpoly) {
- if (p_navpoly == navpoly)
+ if (p_navpoly == navpoly) {
return;
+ }
if (navigation && nav_id != -1) {
navigation->navpoly_remove(nav_id);
nav_id = -1;
}
+
if (navpoly.is_valid()) {
navpoly->disconnect(CoreStringNames::get_singleton()->changed, this, "_navpoly_changed");
}
navpoly = p_navpoly;
-
if (navpoly.is_valid()) {
navpoly->connect(CoreStringNames::get_singleton()->changed, this, "_navpoly_changed");
}
+ _navpoly_changed();
if (navigation && navpoly.is_valid() && enabled) {
nav_id = navigation->navpoly_add(navpoly, get_relative_transform_to_parent(navigation), this);
}
- //update_gizmo();
+
_change_notify("navpoly");
update_configuration_warning();
}
diff --git a/scene/2d/path_2d.cpp b/scene/2d/path_2d.cpp
index 4276918f53..5eae43b2d5 100644
--- a/scene/2d/path_2d.cpp
+++ b/scene/2d/path_2d.cpp
@@ -303,7 +303,7 @@ void PathFollow2D::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_lookahead", "lookahead"), &PathFollow2D::set_lookahead);
ClassDB::bind_method(D_METHOD("get_lookahead"), &PathFollow2D::get_lookahead);
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "offset", PROPERTY_HINT_EXP_RANGE, "0,10000,0.01,or_greater"), "set_offset", "get_offset");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "offset", PROPERTY_HINT_RANGE, "0,10000,0.01,or_greater"), "set_offset", "get_offset");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "unit_offset", PROPERTY_HINT_RANGE, "0,1,0.0001", PROPERTY_USAGE_EDITOR), "set_unit_offset", "get_unit_offset");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "h_offset"), "set_h_offset", "get_h_offset");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "v_offset"), "set_v_offset", "get_v_offset");
diff --git a/scene/2d/tile_map.cpp b/scene/2d/tile_map.cpp
index 8fe65f53a9..641cb161ca 100644
--- a/scene/2d/tile_map.cpp
+++ b/scene/2d/tile_map.cpp
@@ -327,6 +327,10 @@ void TileMap::update_dirty_quadrants() {
Ref<ShaderMaterial> mat = tile_set->tile_get_material(c.id);
int z_index = tile_set->tile_get_z_index(c.id);
+ if (tile_set->tile_get_tile_mode(c.id) == TileSet::AUTO_TILE) {
+ z_index += tile_set->autotile_get_z_index(c.id, Vector2(c.autotile_coord_x, c.autotile_coord_y));
+ }
+
RID canvas_item;
RID debug_canvas_item;
diff --git a/scene/3d/path.cpp b/scene/3d/path.cpp
index 339a434a6e..1b253d41e8 100644
--- a/scene/3d/path.cpp
+++ b/scene/3d/path.cpp
@@ -252,7 +252,7 @@ void PathFollow::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_loop", "loop"), &PathFollow::set_loop);
ClassDB::bind_method(D_METHOD("has_loop"), &PathFollow::has_loop);
- ADD_PROPERTY(PropertyInfo(Variant::REAL, "offset", PROPERTY_HINT_EXP_RANGE, "0,10000,0.01,or_greater"), "set_offset", "get_offset");
+ ADD_PROPERTY(PropertyInfo(Variant::REAL, "offset", PROPERTY_HINT_RANGE, "0,10000,0.01,or_greater"), "set_offset", "get_offset");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "unit_offset", PROPERTY_HINT_RANGE, "0,1,0.0001", PROPERTY_USAGE_EDITOR), "set_unit_offset", "get_unit_offset");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "h_offset"), "set_h_offset", "get_h_offset");
ADD_PROPERTY(PropertyInfo(Variant::REAL, "v_offset"), "set_v_offset", "get_v_offset");
diff --git a/scene/3d/sprite_3d.cpp b/scene/3d/sprite_3d.cpp
index 5bde224ce3..7b4c7de029 100644
--- a/scene/3d/sprite_3d.cpp
+++ b/scene/3d/sprite_3d.cpp
@@ -463,9 +463,9 @@ void Sprite3D::_draw() {
Plane tangent;
if (axis == Vector3::AXIS_X) {
- tangent = Plane(0, 0, -1, -1);
+ tangent = Plane(0, 0, -1, 1);
} else {
- tangent = Plane(1, 0, 0, -1);
+ tangent = Plane(1, 0, 0, 1);
}
RID mat = SpatialMaterial::get_material_rid_for_2d(get_draw_flag(FLAG_SHADED), get_draw_flag(FLAG_TRANSPARENT), get_draw_flag(FLAG_DOUBLE_SIDED), get_alpha_cut_mode() == ALPHA_CUT_DISCARD, get_alpha_cut_mode() == ALPHA_CUT_OPAQUE_PREPASS);
diff --git a/scene/animation/animation_tree_player.cpp b/scene/animation/animation_tree_player.cpp
index 524784df53..6adfb94695 100644
--- a/scene/animation/animation_tree_player.cpp
+++ b/scene/animation/animation_tree_player.cpp
@@ -401,6 +401,9 @@ void AnimationTreePlayer::_notification(int p_what) {
case NOTIFICATION_ENTER_TREE: {
+ ERR_EXPLAIN("AnimationTreePlayer has been deprecated. Use AnimationTree instead.");
+ WARN_DEPRECATED
+
if (!processing) {
//make sure that a previous process state was not saved
//only process if "processing" is set
@@ -409,12 +412,14 @@ void AnimationTreePlayer::_notification(int p_what) {
}
} break;
case NOTIFICATION_READY: {
+
dirty_caches = true;
if (master != NodePath()) {
_update_sources();
}
} break;
case NOTIFICATION_INTERNAL_PROCESS: {
+
if (animation_process_mode == ANIMATION_PROCESS_PHYSICS)
break;
@@ -1715,6 +1720,11 @@ Error AnimationTreePlayer::node_rename(const StringName &p_node, const StringNam
return OK;
}
+String AnimationTreePlayer::get_configuration_warning() const {
+
+ return TTR("This node has been deprecated. Use AnimationTree instead.");
+}
+
void AnimationTreePlayer::_bind_methods() {
ClassDB::bind_method(D_METHOD("add_node", "type", "id"), &AnimationTreePlayer::add_node);
diff --git a/scene/animation/animation_tree_player.h b/scene/animation/animation_tree_player.h
index d2d7b1c9ec..4e4c876e87 100644
--- a/scene/animation/animation_tree_player.h
+++ b/scene/animation/animation_tree_player.h
@@ -343,6 +343,8 @@ public:
int node_get_input_count(const StringName &p_node) const;
StringName node_get_input_source(const StringName &p_node, int p_input) const;
+ String get_configuration_warning() const;
+
/* ANIMATION NODE */
void animation_node_set_animation(const StringName &p_node, const Ref<Animation> &p_animation);
Ref<Animation> animation_node_get_animation(const StringName &p_node) const;
diff --git a/scene/gui/color_picker.cpp b/scene/gui/color_picker.cpp
index c5d3def4c1..19c6cde111 100644
--- a/scene/gui/color_picker.cpp
+++ b/scene/gui/color_picker.cpp
@@ -253,6 +253,24 @@ void ColorPicker::add_preset(const Color &p_color) {
bt_add_preset->hide();
}
+void ColorPicker::erase_preset(const Color &p_color) {
+
+ if (presets.find(p_color)) {
+ presets.erase(presets.find(p_color));
+ preset->update();
+ }
+}
+
+PoolColorArray ColorPicker::get_presets() const {
+
+ PoolColorArray arr;
+ arr.resize(presets.size());
+ for (int i = 0; i < presets.size(); i++) {
+ arr.set(i, presets[i]);
+ }
+ return arr;
+}
+
void ColorPicker::set_raw_mode(bool p_enabled) {
if (raw_mode_enabled == p_enabled)
@@ -446,7 +464,9 @@ void ColorPicker::_preset_input(const Ref<InputEvent> &p_event) {
set_pick_color(presets[index]);
} else if (bev->is_pressed() && bev->get_button_index() == BUTTON_RIGHT) {
int index = bev->get_position().x / (preset->get_size().x / presets.size());
- presets.erase(presets[index]);
+ Color clicked_preset = presets[index];
+ presets.erase(clicked_preset);
+ emit_signal("preset_removed", clicked_preset);
preset->update();
bt_add_preset->show();
}
@@ -501,6 +521,7 @@ void ColorPicker::_screen_input(const Ref<InputEvent> &p_event) {
void ColorPicker::_add_preset_pressed() {
add_preset(color);
+ emit_signal("preset_added", color);
}
void ColorPicker::_screen_pick_pressed() {
@@ -553,6 +574,8 @@ void ColorPicker::_bind_methods() {
ClassDB::bind_method(D_METHOD("set_edit_alpha", "show"), &ColorPicker::set_edit_alpha);
ClassDB::bind_method(D_METHOD("is_editing_alpha"), &ColorPicker::is_editing_alpha);
ClassDB::bind_method(D_METHOD("add_preset", "color"), &ColorPicker::add_preset);
+ ClassDB::bind_method(D_METHOD("erase_preset", "color"), &ColorPicker::erase_preset);
+ ClassDB::bind_method(D_METHOD("get_presets"), &ColorPicker::get_presets);
ClassDB::bind_method(D_METHOD("_value_changed"), &ColorPicker::_value_changed);
ClassDB::bind_method(D_METHOD("_html_entered"), &ColorPicker::_html_entered);
ClassDB::bind_method(D_METHOD("_text_type_toggled"), &ColorPicker::_text_type_toggled);
@@ -575,6 +598,8 @@ void ColorPicker::_bind_methods() {
ADD_PROPERTY(PropertyInfo(Variant::BOOL, "deferred_mode"), "set_deferred_mode", "is_deferred_mode");
ADD_SIGNAL(MethodInfo("color_changed", PropertyInfo(Variant::COLOR, "color")));
+ ADD_SIGNAL(MethodInfo("preset_added", PropertyInfo(Variant::COLOR, "color")));
+ ADD_SIGNAL(MethodInfo("preset_removed", PropertyInfo(Variant::COLOR, "color")));
}
ColorPicker::ColorPicker() :
diff --git a/scene/gui/color_picker.h b/scene/gui/color_picker.h
index 0166da7118..e32c830434 100644
--- a/scene/gui/color_picker.h
+++ b/scene/gui/color_picker.h
@@ -105,6 +105,9 @@ public:
Color get_pick_color() const;
void add_preset(const Color &p_color);
+ void erase_preset(const Color &p_color);
+ PoolColorArray get_presets() const;
+
void set_raw_mode(bool p_enabled);
bool is_raw_mode() const;
diff --git a/scene/gui/control.cpp b/scene/gui/control.cpp
index 79e1d35b94..a580d89439 100644
--- a/scene/gui/control.cpp
+++ b/scene/gui/control.cpp
@@ -451,6 +451,11 @@ void Control::_update_canvas_item_transform() {
Transform2D xform = _get_internal_transform();
xform[2] += get_position();
+ // We use a little workaround to avoid flickering when moving the pivot with _edit_set_pivot()
+ if (is_inside_tree() && Math::abs(Math::sin(data.rotation * 4.0f)) < 0.00001f && get_viewport()->is_snap_controls_to_pixels_enabled()) {
+ xform[2] = xform[2].round();
+ }
+
VisualServer::get_singleton()->canvas_item_set_transform(get_canvas_item(), xform);
}
@@ -1336,11 +1341,6 @@ void Control::_size_changed() {
new_size_cache.height = minimum_size.height;
}
- // We use a little workaround to avoid flickering when moving the pivot with _edit_set_pivot()
- if (is_inside_tree() && Math::abs(Math::sin(data.rotation * 4.0f)) < 0.00001f && get_viewport()->is_snap_controls_to_pixels_enabled()) {
- new_size_cache = new_size_cache.round();
- new_pos_cache = new_pos_cache.round();
- }
bool pos_changed = new_pos_cache != data.pos_cache;
bool size_changed = new_size_cache != data.size_cache;
@@ -1740,10 +1740,10 @@ Rect2 Control::_compute_child_rect(const float p_anchors[4], const float p_margi
void Control::_compute_margins(Rect2 p_rect, const float p_anchors[4], float (&r_margins)[4]) {
Size2 parent_rect_size = get_parent_anchorable_rect().size;
- r_margins[0] = Math::floor(p_rect.position.x - (p_anchors[0] * parent_rect_size.x));
- r_margins[1] = Math::floor(p_rect.position.y - (p_anchors[1] * parent_rect_size.y));
- r_margins[2] = Math::floor(p_rect.position.x + p_rect.size.x - (p_anchors[2] * parent_rect_size.x));
- r_margins[3] = Math::floor(p_rect.position.y + p_rect.size.y - (p_anchors[3] * parent_rect_size.y));
+ r_margins[0] = p_rect.position.x - (p_anchors[0] * parent_rect_size.x);
+ r_margins[1] = p_rect.position.y - (p_anchors[1] * parent_rect_size.y);
+ r_margins[2] = p_rect.position.x + p_rect.size.x - (p_anchors[2] * parent_rect_size.x);
+ r_margins[3] = p_rect.position.y + p_rect.size.y - (p_anchors[3] * parent_rect_size.y);
}
void Control::set_position(const Size2 &p_point) {
diff --git a/scene/gui/graph_edit.cpp b/scene/gui/graph_edit.cpp
index b3bebc88ec..eee3213fe7 100644
--- a/scene/gui/graph_edit.cpp
+++ b/scene/gui/graph_edit.cpp
@@ -1339,21 +1339,25 @@ GraphEdit::GraphEdit() {
zoom_minus = memnew(ToolButton);
zoom_hb->add_child(zoom_minus);
+ zoom_minus->set_tooltip(RTR("Zoom Out"));
zoom_minus->connect("pressed", this, "_zoom_minus");
zoom_minus->set_focus_mode(FOCUS_NONE);
zoom_reset = memnew(ToolButton);
zoom_hb->add_child(zoom_reset);
+ zoom_reset->set_tooltip(RTR("Zoom Reset"));
zoom_reset->connect("pressed", this, "_zoom_reset");
zoom_reset->set_focus_mode(FOCUS_NONE);
zoom_plus = memnew(ToolButton);
zoom_hb->add_child(zoom_plus);
+ zoom_plus->set_tooltip(RTR("Zoom In"));
zoom_plus->connect("pressed", this, "_zoom_plus");
zoom_plus->set_focus_mode(FOCUS_NONE);
snap_button = memnew(ToolButton);
snap_button->set_toggle_mode(true);
+ snap_button->set_tooltip(RTR("Enable snap and show grid."));
snap_button->connect("pressed", this, "_snap_toggled");
snap_button->set_pressed(true);
snap_button->set_focus_mode(FOCUS_NONE);
diff --git a/scene/gui/menu_button.cpp b/scene/gui/menu_button.cpp
index 95ec618c3b..b4cb297900 100644
--- a/scene/gui/menu_button.cpp
+++ b/scene/gui/menu_button.cpp
@@ -71,13 +71,24 @@ PopupMenu *MenuButton::get_popup() const {
return popup;
}
+void MenuButton::_set_items(const Array &p_items) {
+
+ popup->set("items", p_items);
+}
+
Array MenuButton::_get_items() const {
return popup->get("items");
}
-void MenuButton::_set_items(const Array &p_items) {
- popup->set("items", p_items);
+void MenuButton::set_switch_on_hover(bool p_enabled) {
+
+ switch_on_hover = p_enabled;
+}
+
+bool MenuButton::is_switch_on_hover() {
+
+ return switch_on_hover;
}
void MenuButton::_bind_methods() {
@@ -86,9 +97,12 @@ void MenuButton::_bind_methods() {
ClassDB::bind_method(D_METHOD("_unhandled_key_input"), &MenuButton::_unhandled_key_input);
ClassDB::bind_method(D_METHOD("_set_items"), &MenuButton::_set_items);
ClassDB::bind_method(D_METHOD("_get_items"), &MenuButton::_get_items);
+ ClassDB::bind_method(D_METHOD("set_switch_on_hover", "enable"), &MenuButton::set_switch_on_hover);
+ ClassDB::bind_method(D_METHOD("is_switch_on_hover"), &MenuButton::is_switch_on_hover);
ClassDB::bind_method(D_METHOD("set_disable_shortcuts", "disabled"), &MenuButton::set_disable_shortcuts);
ADD_PROPERTY(PropertyInfo(Variant::ARRAY, "items", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL), "_set_items", "_get_items");
+ ADD_PROPERTY(PropertyInfo(Variant::BOOL, "switch_on_hover"), "set_switch_on_hover", "is_switch_on_hover");
ADD_SIGNAL(MethodInfo("about_to_show"));
}
@@ -100,6 +114,7 @@ void MenuButton::set_disable_shortcuts(bool p_disabled) {
MenuButton::MenuButton() {
+ switch_on_hover = false;
set_flat(true);
set_disable_shortcuts(false);
set_enabled_focus_mode(FOCUS_NONE);
diff --git a/scene/gui/menu_button.h b/scene/gui/menu_button.h
index 0636accfee..abc49f4988 100644
--- a/scene/gui/menu_button.h
+++ b/scene/gui/menu_button.h
@@ -41,6 +41,7 @@ class MenuButton : public Button {
GDCLASS(MenuButton, Button);
bool clicked;
+ bool switch_on_hover;
bool disable_shortcuts;
PopupMenu *popup;
@@ -57,6 +58,8 @@ public:
virtual void pressed();
PopupMenu *get_popup() const;
+ void set_switch_on_hover(bool p_enabled);
+ bool is_switch_on_hover();
void set_disable_shortcuts(bool p_disabled);
MenuButton();
diff --git a/scene/gui/text_edit.cpp b/scene/gui/text_edit.cpp
index c339cf6374..18c80ba9a3 100644
--- a/scene/gui/text_edit.cpp
+++ b/scene/gui/text_edit.cpp
@@ -39,6 +39,7 @@
#ifdef TOOLS_ENABLED
#include "editor/editor_scale.h"
+#include "editor_settings.h"
#endif
#define TAB_PIXELS
@@ -918,6 +919,26 @@ void TextEdit::_notification(int p_what) {
}
}
+ int indent_level = get_indent_level(i);
+ if (draw_indent_guides && indent_level > 0) {
+#ifdef TOOLS_ENABLED
+ int indent_size = EditorSettings::get_singleton()->get("text_editor/indent/size");
+ float line_width = Math::round(EDSCALE);
+#else
+ int indent_size = 4;
+ float line_width = 1.0;
+#endif
+ int guides = 1 + (indent_level - 1) / indent_size;
+
+ for (int guide = 0; guide < guides; guide++) {
+ draw_line(
+ Point2(guide * indent_size * cache.font->get_char_size(' ').width + char_margin, ofs_y),
+ Point2(guide * indent_size * cache.font->get_char_size(' ').width + char_margin, ofs_y + get_row_height()),
+ cache.indent_guide_color,
+ line_width);
+ }
+ }
+
if (line_wrap_index == 0) {
// only do these if we are on the first wrapped part of a line
@@ -1179,9 +1200,14 @@ void TextEdit::_notification(int p_what) {
draw_rect(Rect2(char_ofs + char_margin + ofs_x, yofs + ascent + 2, w, line_width), in_selection && override_selected_font_color ? cache.font_selected_color : color);
}
- } else if (draw_tabs && str[j] == '\t') {
+ } else if (draw_tabs && (j > get_indent_level(i) || !draw_indent_guides) && str[j] == '\t') {
+ // If indent guides are enabled, only draw trailing or alignment tabs
+ // Otherwise, draw all tabs (including those used for indentation)
int yofs = (get_row_height() - cache.tab_icon->get_height()) / 2;
- cache.tab_icon->draw(ci, Point2(char_ofs + char_margin + ofs_x, ofs_y + yofs), in_selection && override_selected_font_color ? cache.font_selected_color : color);
+ cache.tab_icon->draw(
+ ci,
+ Point2(char_ofs + char_margin + ofs_x, ofs_y + yofs),
+ in_selection && override_selected_font_color ? cache.font_selected_color : color);
}
char_ofs += char_w;
@@ -4333,6 +4359,7 @@ void TextEdit::_update_caches() {
cache.font = get_font("font");
cache.caret_color = get_color("caret_color");
cache.caret_background_color = get_color("caret_background_color");
+ cache.indent_guide_color = get_color("indent_guide_color");
cache.line_number_color = get_color("line_number_color");
cache.safe_line_number_color = get_color("safe_line_number_color");
cache.font_color = get_color("font_color");
@@ -5446,6 +5473,16 @@ int TextEdit::get_indent_size() {
return indent_size;
}
+void TextEdit::set_draw_indent_guides(bool p_draw) {
+
+ draw_indent_guides = p_draw;
+}
+
+bool TextEdit::is_drawing_indent_guides() const {
+
+ return draw_indent_guides;
+}
+
void TextEdit::set_draw_tabs(bool p_draw) {
draw_tabs = p_draw;
diff --git a/scene/gui/text_edit.h b/scene/gui/text_edit.h
index b1a0b60442..4d398f56b6 100644
--- a/scene/gui/text_edit.h
+++ b/scene/gui/text_edit.h
@@ -167,6 +167,7 @@ private:
Color completion_font_color;
Color caret_color;
Color caret_background_color;
+ Color indent_guide_color;
Color line_number_color;
Color safe_line_number_color;
Color font_color;
@@ -276,6 +277,7 @@ private:
int wrap_right_offset;
bool setting_row;
+ bool draw_indent_guides;
bool draw_tabs;
bool override_selected_font_color;
bool cursor_changed_dirty;
@@ -590,6 +592,8 @@ public:
bool is_indent_using_spaces() const;
void set_indent_size(const int p_size);
int get_indent_size();
+ void set_draw_indent_guides(bool p_draw);
+ bool is_drawing_indent_guides() const;
void set_draw_tabs(bool p_draw);
bool is_drawing_tabs() const;
void set_override_selected_font_color(bool p_override_selected_font_color);
diff --git a/scene/main/viewport.cpp b/scene/main/viewport.cpp
index 3e27c86c67..5b1c2d8020 100644
--- a/scene/main/viewport.cpp
+++ b/scene/main/viewport.cpp
@@ -1955,10 +1955,9 @@ void Viewport::_gui_input_event(Ref<InputEvent> p_event) {
// If the mouse is over a menu button, this menu will open automatically
// if there is already a pop-up menu open at the same hierarchical level.
- if (popup_menu_parent && menu_button &&
- popup_menu_parent->get_icon().is_null() &&
- menu_button->get_icon().is_null() &&
- (popup_menu->get_parent()->get_parent()->is_a_parent_of(menu_button) ||
+ if (popup_menu_parent && menu_button && popup_menu_parent->is_switch_on_hover() &&
+ !menu_button->is_disabled() && menu_button->is_switch_on_hover() &&
+ (popup_menu_parent->get_parent()->is_a_parent_of(menu_button) ||
menu_button->get_parent()->is_a_parent_of(popup_menu))) {
popup_menu->notification(Control::NOTIFICATION_MODAL_CLOSE);
diff --git a/scene/resources/material.cpp b/scene/resources/material.cpp
index 5327ed318f..fa8c927813 100644
--- a/scene/resources/material.cpp
+++ b/scene/resources/material.cpp
@@ -699,7 +699,7 @@ void SpatialMaterial::_update_shader() {
if (features[FEATURE_DEPTH_MAPPING] && !flags[FLAG_UV1_USE_TRIPLANAR]) { //depthmap not supported with triplanar
code += "\t{\n";
- code += "\t\tvec3 view_dir = normalize(normalize(-VERTEX)*mat3(TANGENT*depth_flip.x,BINORMAL*depth_flip.y,NORMAL));\n"; // binormal is negative due to mikktspace
+ code += "\t\tvec3 view_dir = normalize(normalize(-VERTEX)*mat3(TANGENT*depth_flip.x,-BINORMAL*depth_flip.y,NORMAL));\n"; // binormal is negative due to mikktspace, flip 'unflips' it ;-)
if (deep_parallax) {
code += "\t\tfloat num_layers = mix(float(depth_max_layers),float(depth_min_layers), abs(dot(vec3(0.0, 0.0, 1.0), view_dir)));\n";
diff --git a/scene/resources/primitive_meshes.cpp b/scene/resources/primitive_meshes.cpp
index dafdddd990..6dedb74fad 100644
--- a/scene/resources/primitive_meshes.cpp
+++ b/scene/resources/primitive_meshes.cpp
@@ -306,7 +306,7 @@ void CapsuleMesh::_create_mesh_array(Array &p_arr) const {
Vector3 p = Vector3(x * radius * w, y * radius * w, z);
points.push_back(p + Vector3(0.0, 0.0, 0.5 * mid_height));
normals.push_back(p.normalized());
- ADD_TANGENT(-y, x, 0.0, -1.0)
+ ADD_TANGENT(-y, x, 0.0, 1.0)
uvs.push_back(Vector2(u, v * onethird));
point++;
@@ -345,7 +345,7 @@ void CapsuleMesh::_create_mesh_array(Array &p_arr) const {
Vector3 p = Vector3(x * radius, y * radius, z);
points.push_back(p);
normals.push_back(Vector3(x, y, 0.0));
- ADD_TANGENT(-y, x, 0.0, -1.0)
+ ADD_TANGENT(-y, x, 0.0, 1.0)
uvs.push_back(Vector2(u, onethird + (v * onethird)));
point++;
@@ -385,7 +385,7 @@ void CapsuleMesh::_create_mesh_array(Array &p_arr) const {
Vector3 p = Vector3(x * radius * w, y * radius * w, z);
points.push_back(p + Vector3(0.0, 0.0, -0.5 * mid_height));
normals.push_back(p.normalized());
- ADD_TANGENT(-y, x, 0.0, -1.0)
+ ADD_TANGENT(-y, x, 0.0, 1.0)
uvs.push_back(Vector2(u, twothirds + ((v - 1.0) * onethird)));
point++;
@@ -514,14 +514,14 @@ void CubeMesh::_create_mesh_array(Array &p_arr) const {
// front
points.push_back(Vector3(x, -y, -start_pos.z)); // double negative on the Z!
normals.push_back(Vector3(0.0, 0.0, 1.0));
- ADD_TANGENT(1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(u, v));
point++;
// back
points.push_back(Vector3(-x, -y, start_pos.z));
normals.push_back(Vector3(0.0, 0.0, -1.0));
- ADD_TANGENT(-1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(-1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(twothirds + u, v));
point++;
@@ -568,14 +568,14 @@ void CubeMesh::_create_mesh_array(Array &p_arr) const {
// right
points.push_back(Vector3(-start_pos.x, -y, -z));
normals.push_back(Vector3(1.0, 0.0, 0.0));
- ADD_TANGENT(0.0, 0.0, -1.0, -1.0);
+ ADD_TANGENT(0.0, 0.0, -1.0, 1.0);
uvs.push_back(Vector2(onethird + u, v));
point++;
// left
points.push_back(Vector3(start_pos.x, -y, z));
normals.push_back(Vector3(-1.0, 0.0, 0.0));
- ADD_TANGENT(0.0, 0.0, 1.0, -1.0);
+ ADD_TANGENT(0.0, 0.0, 1.0, 1.0);
uvs.push_back(Vector2(u, 0.5 + v));
point++;
@@ -622,14 +622,14 @@ void CubeMesh::_create_mesh_array(Array &p_arr) const {
// top
points.push_back(Vector3(-x, -start_pos.y, -z));
normals.push_back(Vector3(0.0, 1.0, 0.0));
- ADD_TANGENT(-1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(-1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(onethird + u, 0.5 + v));
point++;
// bottom
points.push_back(Vector3(x, start_pos.y, -z));
normals.push_back(Vector3(0.0, -1.0, 0.0));
- ADD_TANGENT(1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(twothirds + u, 0.5 + v));
point++;
@@ -773,7 +773,7 @@ void CylinderMesh::_create_mesh_array(Array &p_arr) const {
Vector3 p = Vector3(x * radius, y, z * radius);
points.push_back(p);
normals.push_back(Vector3(x, 0.0, z));
- ADD_TANGENT(z, 0.0, -x, -1.0)
+ ADD_TANGENT(z, 0.0, -x, 1.0)
uvs.push_back(Vector2(u, v * 0.5));
point++;
@@ -799,7 +799,7 @@ void CylinderMesh::_create_mesh_array(Array &p_arr) const {
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)
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0)
uvs.push_back(Vector2(0.25, 0.75));
point++;
@@ -816,7 +816,7 @@ void CylinderMesh::_create_mesh_array(Array &p_arr) const {
Vector3 p = Vector3(x * top_radius, y, z * top_radius);
points.push_back(p);
normals.push_back(Vector3(0.0, 1.0, 0.0));
- ADD_TANGENT(1.0, 0.0, 0.0, -1.0)
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0)
uvs.push_back(Vector2(u, v));
point++;
@@ -835,7 +835,7 @@ void CylinderMesh::_create_mesh_array(Array &p_arr) const {
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)
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0)
uvs.push_back(Vector2(0.75, 0.75));
point++;
@@ -852,7 +852,7 @@ void CylinderMesh::_create_mesh_array(Array &p_arr) const {
Vector3 p = Vector3(x * bottom_radius, y, z * bottom_radius);
points.push_back(p);
normals.push_back(Vector3(0.0, -1.0, 0.0));
- ADD_TANGENT(1.0, 0.0, 0.0, -1.0)
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0)
uvs.push_back(Vector2(u, v));
point++;
@@ -982,7 +982,7 @@ void PlaneMesh::_create_mesh_array(Array &p_arr) const {
points.push_back(Vector3(-x, 0.0, -z));
normals.push_back(Vector3(0.0, 1.0, 0.0));
- ADD_TANGENT(1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(1.0 - u, 1.0 - v)); /* 1.0 - uv to match orientation with Quad */
point++;
@@ -1108,14 +1108,14 @@ void PrismMesh::_create_mesh_array(Array &p_arr) const {
/* front */
points.push_back(Vector3(start_x + x, -y, -start_pos.z)); // double negative on the Z!
normals.push_back(Vector3(0.0, 0.0, 1.0));
- ADD_TANGENT(1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(offset_front + u, v));
point++;
/* back */
points.push_back(Vector3(start_x + scaled_size_x - x, -y, start_pos.z));
normals.push_back(Vector3(0.0, 0.0, -1.0));
- ADD_TANGENT(-1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(-1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(twothirds + offset_back + u, v));
point++;
@@ -1187,14 +1187,14 @@ void PrismMesh::_create_mesh_array(Array &p_arr) const {
/* right */
points.push_back(Vector3(right, -y, -z));
normals.push_back(normal_right);
- ADD_TANGENT(0.0, 0.0, -1.0, -1.0);
+ ADD_TANGENT(0.0, 0.0, -1.0, 1.0);
uvs.push_back(Vector2(onethird + u, v));
point++;
/* left */
points.push_back(Vector3(left, -y, z));
normals.push_back(normal_left);
- ADD_TANGENT(0.0, 0.0, 1.0, -1.0);
+ ADD_TANGENT(0.0, 0.0, 1.0, 1.0);
uvs.push_back(Vector2(u, 0.5 + v));
point++;
@@ -1241,7 +1241,7 @@ void PrismMesh::_create_mesh_array(Array &p_arr) const {
/* bottom */
points.push_back(Vector3(x, start_pos.y, -z));
normals.push_back(Vector3(0.0, -1.0, 0.0));
- ADD_TANGENT(1.0, 0.0, 0.0, -1.0);
+ ADD_TANGENT(1.0, 0.0, 0.0, 1.0);
uvs.push_back(Vector2(twothirds + u, 0.5 + v));
point++;
@@ -1382,7 +1382,7 @@ void QuadMesh::_create_mesh_array(Array &p_arr) const {
tangents.set(i * 4 + 0, 1.0);
tangents.set(i * 4 + 1, 0.0);
tangents.set(i * 4 + 2, 0.0);
- tangents.set(i * 4 + 3, -1.0);
+ tangents.set(i * 4 + 3, 1.0);
static const Vector2 quad_uv[4] = {
Vector2(0, 1),
@@ -1468,7 +1468,7 @@ void SphereMesh::_create_mesh_array(Array &p_arr) const {
points.push_back(p);
normals.push_back(p.normalized());
};
- ADD_TANGENT(z, 0.0, -x, -1.0)
+ ADD_TANGENT(z, 0.0, -x, 1.0)
uvs.push_back(Vector2(u, v));
point++;
diff --git a/scene/resources/surface_tool.cpp b/scene/resources/surface_tool.cpp
index 9907636e91..842252d5d9 100644
--- a/scene/resources/surface_tool.cpp
+++ b/scene/resources/surface_tool.cpp
@@ -853,7 +853,7 @@ void SurfaceTool::mikktSetTSpaceDefault(const SMikkTSpaceContext *pContext, cons
if (vtx != NULL) {
vtx->tangent = Vector3(fvTangent[0], fvTangent[1], fvTangent[2]);
- vtx->binormal = Vector3(fvBiTangent[0], fvBiTangent[1], fvBiTangent[2]);
+ vtx->binormal = Vector3(-fvBiTangent[0], -fvBiTangent[1], -fvBiTangent[2]); // for some reason these are reversed, something with the coordinate system in Godot
}
}
diff --git a/scene/resources/tile_set.cpp b/scene/resources/tile_set.cpp
index f852ecd7eb..c2c2c0ff32 100644
--- a/scene/resources/tile_set.cpp
+++ b/scene/resources/tile_set.cpp
@@ -129,6 +129,22 @@ bool TileSet::_set(const StringName &p_name, const Variant &p_value) {
}
p.pop_front();
}
+ } else if (what == "z_index_map") {
+ tile_map[id].autotile_data.z_index_map.clear();
+ Array p = p_value;
+ Vector3 val;
+ Vector2 v;
+ int z_index;
+ while (p.size() > 0) {
+ val = p[0];
+ if (val.z != 0) {
+ v.x = val.x;
+ v.y = val.y;
+ z_index = (int)val.z;
+ tile_map[id].autotile_data.z_index_map[v] = z_index;
+ }
+ p.pop_front();
+ }
}
} else if (what == "shape")
tile_set_shape(id, 0, p_value);
@@ -228,6 +244,19 @@ bool TileSet::_get(const StringName &p_name, Variant &r_ret) const {
}
}
r_ret = p;
+ } else if (what == "z_index_map") {
+ Array p;
+ Vector3 v;
+ for (Map<Vector2, int>::Element *E = tile_map[id].autotile_data.z_index_map.front(); E; E = E->next()) {
+ if (E->value() != 0) {
+ //Don't save default value
+ v.x = E->key().x;
+ v.y = E->key().y;
+ v.z = E->value();
+ p.push_back(v);
+ }
+ }
+ r_ret = p;
}
} else if (what == "shape")
r_ret = tile_get_shape(id, 0);
@@ -278,6 +307,7 @@ void TileSet::_get_property_list(List<PropertyInfo> *p_list) const {
p_list->push_back(PropertyInfo(Variant::ARRAY, pre + "autotile/occluder_map", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
p_list->push_back(PropertyInfo(Variant::ARRAY, pre + "autotile/navpoly_map", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
p_list->push_back(PropertyInfo(Variant::ARRAY, pre + "autotile/priority_map", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
+ p_list->push_back(PropertyInfo(Variant::ARRAY, pre + "autotile/z_index_map", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
} else if (tile_get_tile_mode(id) == ATLAS_TILE) {
p_list->push_back(PropertyInfo(Variant::VECTOR2, pre + "autotile/icon_coordinate", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
p_list->push_back(PropertyInfo(Variant::VECTOR2, pre + "autotile/tile_size", PROPERTY_HINT_NONE, "", PROPERTY_USAGE_NOEDITOR | PROPERTY_USAGE_INTERNAL));
@@ -476,6 +506,23 @@ int TileSet::autotile_get_subtile_priority(int p_id, const Vector2 &p_coord) {
return 1;
}
+void TileSet::autotile_set_z_index(int p_id, const Vector2 &p_coord, int p_z_index) {
+
+ ERR_FAIL_COND(!tile_map.has(p_id));
+ tile_map[p_id].autotile_data.z_index_map[p_coord] = p_z_index;
+ emit_changed();
+}
+
+int TileSet::autotile_get_z_index(int p_id, const Vector2 &p_coord) {
+
+ ERR_FAIL_COND_V(!tile_map.has(p_id), 1);
+ if (tile_map[p_id].autotile_data.z_index_map.has(p_coord)) {
+ return tile_map[p_id].autotile_data.z_index_map[p_coord];
+ }
+ //When not custom z index set return the default value
+ return 0;
+}
+
const Map<Vector2, int> &TileSet::autotile_get_priority_map(int p_id) const {
static Map<Vector2, int> dummy;
diff --git a/scene/resources/tile_set.h b/scene/resources/tile_set.h
index 1802bf12b6..2ab771b1b0 100644
--- a/scene/resources/tile_set.h
+++ b/scene/resources/tile_set.h
@@ -87,6 +87,7 @@ public:
Map<Vector2, Ref<OccluderPolygon2D> > occluder_map;
Map<Vector2, Ref<NavigationPolygon> > navpoly_map;
Map<Vector2, int> priority_map;
+ Map<Vector2, int> z_index_map;
// Default size to prevent invalid value
explicit AutotileData() :
@@ -172,6 +173,9 @@ public:
int autotile_get_subtile_priority(int p_id, const Vector2 &p_coord);
const Map<Vector2, int> &autotile_get_priority_map(int p_id) const;
+ void autotile_set_z_index(int p_id, const Vector2 &p_coord, int p_z_index);
+ int autotile_get_z_index(int p_id, const Vector2 &p_coord);
+
void autotile_set_bitmask(int p_id, Vector2 p_coord, uint16_t p_flag);
uint16_t autotile_get_bitmask(int p_id, Vector2 p_coord);
const Map<Vector2, uint16_t> &autotile_get_bitmask_map(int p_id);
diff --git a/servers/visual/visual_server_canvas.cpp b/servers/visual/visual_server_canvas.cpp
index 734c295a72..26fb3cc493 100644
--- a/servers/visual/visual_server_canvas.cpp
+++ b/servers/visual/visual_server_canvas.cpp
@@ -339,7 +339,7 @@ void VisualServerCanvas::canvas_item_set_parent(RID p_item, RID p_parent) {
Item *ysort_owner = item_owner;
while (ysort_owner && ysort_owner->sort_y) {
item_owner->ysort_children_count = -1;
- ysort_owner = canvas_item_owner.getornull(ysort_owner->parent);
+ ysort_owner = canvas_item_owner.owns(ysort_owner->parent) ? canvas_item_owner.getornull(ysort_owner->parent) : NULL;
}
}
@@ -363,7 +363,7 @@ void VisualServerCanvas::canvas_item_set_parent(RID p_item, RID p_parent) {
Item *ysort_owner = item_owner;
while (ysort_owner && ysort_owner->sort_y) {
item_owner->ysort_children_count = -1;
- ysort_owner = canvas_item_owner.getornull(ysort_owner->parent);
+ ysort_owner = canvas_item_owner.owns(ysort_owner->parent) ? canvas_item_owner.getornull(ysort_owner->parent) : NULL;
}
} else {
@@ -1354,7 +1354,7 @@ bool VisualServerCanvas::free(RID p_rid) {
Item *ysort_owner = item_owner;
while (ysort_owner && ysort_owner->sort_y) {
item_owner->ysort_children_count = -1;
- ysort_owner = canvas_item_owner.getornull(ysort_owner->parent);
+ ysort_owner = canvas_item_owner.owns(ysort_owner->parent) ? canvas_item_owner.getornull(ysort_owner->parent) : NULL;
}
}
}
diff --git a/servers/visual_server.cpp b/servers/visual_server.cpp
index e1db123f58..34cc1cbd66 100644
--- a/servers/visual_server.cpp
+++ b/servers/visual_server.cpp
@@ -1909,7 +1909,7 @@ void VisualServer::_bind_methods() {
ClassDB::bind_method(D_METHOD("environment_set_ambient_light", "env", "color", "energy", "sky_contibution"), &VisualServer::environment_set_ambient_light, DEFVAL(1.0), DEFVAL(0.0));
ClassDB::bind_method(D_METHOD("environment_set_dof_blur_near", "env", "enable", "distance", "transition", "far_amount", "quality"), &VisualServer::environment_set_dof_blur_near);
ClassDB::bind_method(D_METHOD("environment_set_dof_blur_far", "env", "enable", "distance", "transition", "far_amount", "quality"), &VisualServer::environment_set_dof_blur_far);
- ClassDB::bind_method(D_METHOD("environment_set_glow", "env", "enable", "level_flags", "intensity", "strength", "bloom_threshold", "blend_mode", "hdr_bleed_threshold", "hdr_bleed_scale", "bicubic_upscale"), &VisualServer::environment_set_glow);
+ ClassDB::bind_method(D_METHOD("environment_set_glow", "env", "enable", "level_flags", "intensity", "strength", "bloom_threshold", "blend_mode", "hdr_bleed_threshold", "hdr_bleed_scale", "hdr_luminance_cap", "bicubic_upscale"), &VisualServer::environment_set_glow);
ClassDB::bind_method(D_METHOD("environment_set_tonemap", "env", "tone_mapper", "exposure", "white", "auto_exposure", "min_luminance", "max_luminance", "auto_exp_speed", "auto_exp_grey"), &VisualServer::environment_set_tonemap);
ClassDB::bind_method(D_METHOD("environment_set_adjustment", "env", "enable", "brightness", "contrast", "saturation", "ramp"), &VisualServer::environment_set_adjustment);
ClassDB::bind_method(D_METHOD("environment_set_ssr", "env", "enable", "max_steps", "fade_in", "fade_out", "depth_tolerance", "roughness"), &VisualServer::environment_set_ssr);
diff --git a/thirdparty/README.md b/thirdparty/README.md
index 55b693af96..e63e1fc109 100644
--- a/thirdparty/README.md
+++ b/thirdparty/README.md
@@ -233,7 +233,7 @@ Godot-made change marked with `// -- GODOT --` comments.
## libwebp
- Upstream: https://chromium.googlesource.com/webm/libwebp/
-- Version: 1.0.0
+- Version: 1.0.1
- License: BSD-3-Clause
Files extracted from upstream source:
@@ -503,7 +503,7 @@ changes are marked with `// -- GODOT --` comments.
## tinyexr
- Upstream: https://github.com/syoyo/tinyexr
-- Version: git (2d5375f, 2018)
+- Version: git (5ae30aa, 2018)
- License: BSD-3-Clause
Files extracted from upstream source:
diff --git a/thirdparty/libwebp/src/dec/alphai_dec.h b/thirdparty/libwebp/src/dec/alphai_dec.h
index e0fa281a55..a64104abeb 100644
--- a/thirdparty/libwebp/src/dec/alphai_dec.h
+++ b/thirdparty/libwebp/src/dec/alphai_dec.h
@@ -51,4 +51,4 @@ void WebPDeallocateAlphaMemory(VP8Decoder* const dec);
} // extern "C"
#endif
-#endif /* WEBP_DEC_ALPHAI_DEC_H_ */
+#endif // WEBP_DEC_ALPHAI_DEC_H_
diff --git a/thirdparty/libwebp/src/dec/buffer_dec.c b/thirdparty/libwebp/src/dec/buffer_dec.c
index 75eb3c40b4..3cd94eb4d9 100644
--- a/thirdparty/libwebp/src/dec/buffer_dec.c
+++ b/thirdparty/libwebp/src/dec/buffer_dec.c
@@ -74,7 +74,8 @@ static VP8StatusCode CheckDecBuffer(const WebPDecBuffer* const buffer) {
} else { // RGB checks
const WebPRGBABuffer* const buf = &buffer->u.RGBA;
const int stride = abs(buf->stride);
- const uint64_t size = MIN_BUFFER_SIZE(width, height, stride);
+ const uint64_t size =
+ MIN_BUFFER_SIZE(width * kModeBpp[mode], height, stride);
ok &= (size <= buf->size);
ok &= (stride >= width * kModeBpp[mode]);
ok &= (buf->rgba != NULL);
diff --git a/thirdparty/libwebp/src/dec/common_dec.h b/thirdparty/libwebp/src/dec/common_dec.h
index 9995f1a51a..b158550a80 100644
--- a/thirdparty/libwebp/src/dec/common_dec.h
+++ b/thirdparty/libwebp/src/dec/common_dec.h
@@ -51,4 +51,4 @@ enum { MB_FEATURE_TREE_PROBS = 3,
NUM_PROBAS = 11
};
-#endif // WEBP_DEC_COMMON_DEC_H_
+#endif // WEBP_DEC_COMMON_DEC_H_
diff --git a/thirdparty/libwebp/src/dec/frame_dec.c b/thirdparty/libwebp/src/dec/frame_dec.c
index a9d5430d00..bda9e1a6f6 100644
--- a/thirdparty/libwebp/src/dec/frame_dec.c
+++ b/thirdparty/libwebp/src/dec/frame_dec.c
@@ -338,7 +338,6 @@ void VP8InitDithering(const WebPDecoderOptions* const options,
for (s = 0; s < NUM_MB_SEGMENTS; ++s) {
VP8QuantMatrix* const dqm = &dec->dqm_[s];
if (dqm->uv_quant_ < DITHER_AMP_TAB_SIZE) {
- // TODO(skal): should we specially dither more for uv_quant_ < 0?
const int idx = (dqm->uv_quant_ < 0) ? 0 : dqm->uv_quant_;
dqm->dither_ = (f * kQuantToDitherAmp[idx]) >> 3;
}
@@ -669,15 +668,9 @@ int VP8GetThreadMethod(const WebPDecoderOptions* const options,
(void)height;
assert(headers == NULL || !headers->is_lossless);
#if defined(WEBP_USE_THREAD)
- if (width < MIN_WIDTH_FOR_THREADS) return 0;
- // TODO(skal): tune the heuristic further
-#if 0
- if (height < 2 * width) return 2;
+ if (width >= MIN_WIDTH_FOR_THREADS) return 2;
#endif
- return 2;
-#else // !WEBP_USE_THREAD
return 0;
-#endif
}
#undef MT_CACHE_LINES
diff --git a/thirdparty/libwebp/src/dec/idec_dec.c b/thirdparty/libwebp/src/dec/idec_dec.c
index a371ed7500..9bc9166808 100644
--- a/thirdparty/libwebp/src/dec/idec_dec.c
+++ b/thirdparty/libwebp/src/dec/idec_dec.c
@@ -140,10 +140,9 @@ static void DoRemap(WebPIDecoder* const idec, ptrdiff_t offset) {
if (NeedCompressedAlpha(idec)) {
ALPHDecoder* const alph_dec = dec->alph_dec_;
dec->alpha_data_ += offset;
- if (alph_dec != NULL) {
+ if (alph_dec != NULL && alph_dec->vp8l_dec_ != NULL) {
if (alph_dec->method_ == ALPHA_LOSSLESS_COMPRESSION) {
VP8LDecoder* const alph_vp8l_dec = alph_dec->vp8l_dec_;
- assert(alph_vp8l_dec != NULL);
assert(dec->alpha_data_size_ >= ALPHA_HEADER_LEN);
VP8LBitReaderSetBuffer(&alph_vp8l_dec->br_,
dec->alpha_data_ + ALPHA_HEADER_LEN,
@@ -283,10 +282,8 @@ static void RestoreContext(const MBContext* context, VP8Decoder* const dec,
static VP8StatusCode IDecError(WebPIDecoder* const idec, VP8StatusCode error) {
if (idec->state_ == STATE_VP8_DATA) {
- VP8Io* const io = &idec->io_;
- if (io->teardown != NULL) {
- io->teardown(io);
- }
+ // Synchronize the thread, clean-up and check for errors.
+ VP8ExitCritical((VP8Decoder*)idec->dec_, &idec->io_);
}
idec->state_ = STATE_ERROR;
return error;
@@ -451,7 +448,10 @@ static VP8StatusCode DecodeRemaining(WebPIDecoder* const idec) {
VP8Decoder* const dec = (VP8Decoder*)idec->dec_;
VP8Io* const io = &idec->io_;
- assert(dec->ready_);
+ // Make sure partition #0 has been read before, to set dec to ready_.
+ if (!dec->ready_) {
+ return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR);
+ }
for (; dec->mb_y_ < dec->mb_h_; ++dec->mb_y_) {
if (idec->last_mb_y_ != dec->mb_y_) {
if (!VP8ParseIntraModeRow(&dec->br_, dec)) {
@@ -473,6 +473,12 @@ static VP8StatusCode DecodeRemaining(WebPIDecoder* const idec) {
MemDataSize(&idec->mem_) > MAX_MB_SIZE) {
return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR);
}
+ // Synchronize the threads.
+ if (dec->mt_method_ > 0) {
+ if (!WebPGetWorkerInterface()->Sync(&dec->worker_)) {
+ return IDecError(idec, VP8_STATUS_BITSTREAM_ERROR);
+ }
+ }
RestoreContext(&context, dec, token_br);
return VP8_STATUS_SUSPENDED;
}
@@ -491,6 +497,7 @@ static VP8StatusCode DecodeRemaining(WebPIDecoder* const idec) {
}
// Synchronize the thread and check for errors.
if (!VP8ExitCritical(dec, io)) {
+ idec->state_ = STATE_ERROR; // prevent re-entry in IDecError
return IDecError(idec, VP8_STATUS_USER_ABORT);
}
dec->ready_ = 0;
@@ -571,6 +578,10 @@ static VP8StatusCode IDecode(WebPIDecoder* idec) {
status = DecodePartition0(idec);
}
if (idec->state_ == STATE_VP8_DATA) {
+ const VP8Decoder* const dec = (VP8Decoder*)idec->dec_;
+ if (dec == NULL) {
+ return VP8_STATUS_SUSPENDED; // can't continue if we have no decoder.
+ }
status = DecodeRemaining(idec);
}
if (idec->state_ == STATE_VP8L_HEADER) {
diff --git a/thirdparty/libwebp/src/dec/vp8_dec.h b/thirdparty/libwebp/src/dec/vp8_dec.h
index ca85b340cf..a05405df72 100644
--- a/thirdparty/libwebp/src/dec/vp8_dec.h
+++ b/thirdparty/libwebp/src/dec/vp8_dec.h
@@ -182,4 +182,4 @@ WEBP_EXTERN int VP8LGetInfo(
} // extern "C"
#endif
-#endif /* WEBP_DEC_VP8_DEC_H_ */
+#endif // WEBP_DEC_VP8_DEC_H_
diff --git a/thirdparty/libwebp/src/dec/vp8i_dec.h b/thirdparty/libwebp/src/dec/vp8i_dec.h
index c929933e1c..e5e89df57d 100644
--- a/thirdparty/libwebp/src/dec/vp8i_dec.h
+++ b/thirdparty/libwebp/src/dec/vp8i_dec.h
@@ -32,7 +32,7 @@ extern "C" {
// version numbers
#define DEC_MAJ_VERSION 1
#define DEC_MIN_VERSION 0
-#define DEC_REV_VERSION 0
+#define DEC_REV_VERSION 1
// YUV-cache parameters. Cache is 32-bytes wide (= one cacheline).
// Constraints are: We need to store one 16x16 block of luma samples (y),
@@ -316,4 +316,4 @@ const uint8_t* VP8DecompressAlphaRows(VP8Decoder* const dec,
} // extern "C"
#endif
-#endif /* WEBP_DEC_VP8I_DEC_H_ */
+#endif // WEBP_DEC_VP8I_DEC_H_
diff --git a/thirdparty/libwebp/src/dec/vp8l_dec.c b/thirdparty/libwebp/src/dec/vp8l_dec.c
index 0570f53a77..333bb3e80d 100644
--- a/thirdparty/libwebp/src/dec/vp8l_dec.c
+++ b/thirdparty/libwebp/src/dec/vp8l_dec.c
@@ -362,12 +362,19 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
VP8LMetadata* const hdr = &dec->hdr_;
uint32_t* huffman_image = NULL;
HTreeGroup* htree_groups = NULL;
+ // When reading htrees, some might be unused, as the format allows it.
+ // We will still read them but put them in this htree_group_bogus.
+ HTreeGroup htree_group_bogus;
HuffmanCode* huffman_tables = NULL;
+ HuffmanCode* huffman_tables_bogus = NULL;
HuffmanCode* next = NULL;
int num_htree_groups = 1;
+ int num_htree_groups_max = 1;
int max_alphabet_size = 0;
int* code_lengths = NULL;
const int table_size = kTableSize[color_cache_bits];
+ int* mapping = NULL;
+ int ok = 0;
if (allow_recursion && VP8LReadBits(br, 1)) {
// use meta Huffman codes.
@@ -384,9 +391,41 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
// The huffman data is stored in red and green bytes.
const int group = (huffman_image[i] >> 8) & 0xffff;
huffman_image[i] = group;
- if (group >= num_htree_groups) {
- num_htree_groups = group + 1;
+ if (group >= num_htree_groups_max) {
+ num_htree_groups_max = group + 1;
+ }
+ }
+ // Check the validity of num_htree_groups_max. If it seems too big, use a
+ // smaller value for later. This will prevent big memory allocations to end
+ // up with a bad bitstream anyway.
+ // The value of 1000 is totally arbitrary. We know that num_htree_groups_max
+ // is smaller than (1 << 16) and should be smaller than the number of pixels
+ // (though the format allows it to be bigger).
+ if (num_htree_groups_max > 1000 || num_htree_groups_max > xsize * ysize) {
+ // Create a mapping from the used indices to the minimal set of used
+ // values [0, num_htree_groups)
+ mapping = (int*)WebPSafeMalloc(num_htree_groups_max, sizeof(*mapping));
+ if (mapping == NULL) {
+ dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
+ goto Error;
+ }
+ // -1 means a value is unmapped, and therefore unused in the Huffman
+ // image.
+ memset(mapping, 0xff, num_htree_groups_max * sizeof(*mapping));
+ for (num_htree_groups = 0, i = 0; i < huffman_pixs; ++i) {
+ // Get the current mapping for the group and remap the Huffman image.
+ int* const mapped_group = &mapping[huffman_image[i]];
+ if (*mapped_group == -1) *mapped_group = num_htree_groups++;
+ huffman_image[i] = *mapped_group;
+ }
+ huffman_tables_bogus = (HuffmanCode*)WebPSafeMalloc(
+ table_size, sizeof(*huffman_tables_bogus));
+ if (huffman_tables_bogus == NULL) {
+ dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
+ goto Error;
}
+ } else {
+ num_htree_groups = num_htree_groups_max;
}
}
@@ -403,11 +442,11 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
}
}
+ code_lengths = (int*)WebPSafeCalloc((uint64_t)max_alphabet_size,
+ sizeof(*code_lengths));
huffman_tables = (HuffmanCode*)WebPSafeMalloc(num_htree_groups * table_size,
sizeof(*huffman_tables));
htree_groups = VP8LHtreeGroupsNew(num_htree_groups);
- code_lengths = (int*)WebPSafeCalloc((uint64_t)max_alphabet_size,
- sizeof(*code_lengths));
if (htree_groups == NULL || code_lengths == NULL || huffman_tables == NULL) {
dec->status_ = VP8_STATUS_OUT_OF_MEMORY;
@@ -415,28 +454,35 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
}
next = huffman_tables;
- for (i = 0; i < num_htree_groups; ++i) {
- HTreeGroup* const htree_group = &htree_groups[i];
+ for (i = 0; i < num_htree_groups_max; ++i) {
+ // If the index "i" is unused in the Huffman image, read the coefficients
+ // but store them to a bogus htree_group.
+ const int is_bogus = (mapping != NULL && mapping[i] == -1);
+ HTreeGroup* const htree_group =
+ is_bogus ? &htree_group_bogus :
+ &htree_groups[(mapping == NULL) ? i : mapping[i]];
HuffmanCode** const htrees = htree_group->htrees;
+ HuffmanCode* huffman_tables_i = is_bogus ? huffman_tables_bogus : next;
int size;
int total_size = 0;
int is_trivial_literal = 1;
int max_bits = 0;
for (j = 0; j < HUFFMAN_CODES_PER_META_CODE; ++j) {
int alphabet_size = kAlphabetSize[j];
- htrees[j] = next;
+ htrees[j] = huffman_tables_i;
if (j == 0 && color_cache_bits > 0) {
alphabet_size += 1 << color_cache_bits;
}
- size = ReadHuffmanCode(alphabet_size, dec, code_lengths, next);
+ size =
+ ReadHuffmanCode(alphabet_size, dec, code_lengths, huffman_tables_i);
if (size == 0) {
goto Error;
}
if (is_trivial_literal && kLiteralMap[j] == 1) {
- is_trivial_literal = (next->bits == 0);
+ is_trivial_literal = (huffman_tables_i->bits == 0);
}
- total_size += next->bits;
- next += size;
+ total_size += huffman_tables_i->bits;
+ huffman_tables_i += size;
if (j <= ALPHA) {
int local_max_bits = code_lengths[0];
int k;
@@ -448,38 +494,41 @@ static int ReadHuffmanCodes(VP8LDecoder* const dec, int xsize, int ysize,
max_bits += local_max_bits;
}
}
+ if (!is_bogus) next = huffman_tables_i;
htree_group->is_trivial_literal = is_trivial_literal;
htree_group->is_trivial_code = 0;
if (is_trivial_literal) {
const int red = htrees[RED][0].value;
const int blue = htrees[BLUE][0].value;
const int alpha = htrees[ALPHA][0].value;
- htree_group->literal_arb =
- ((uint32_t)alpha << 24) | (red << 16) | blue;
+ htree_group->literal_arb = ((uint32_t)alpha << 24) | (red << 16) | blue;
if (total_size == 0 && htrees[GREEN][0].value < NUM_LITERAL_CODES) {
htree_group->is_trivial_code = 1;
htree_group->literal_arb |= htrees[GREEN][0].value << 8;
}
}
- htree_group->use_packed_table = !htree_group->is_trivial_code &&
- (max_bits < HUFFMAN_PACKED_BITS);
+ htree_group->use_packed_table =
+ !htree_group->is_trivial_code && (max_bits < HUFFMAN_PACKED_BITS);
if (htree_group->use_packed_table) BuildPackedTable(htree_group);
}
- WebPSafeFree(code_lengths);
+ ok = 1;
- // All OK. Finalize pointers and return.
+ // All OK. Finalize pointers.
hdr->huffman_image_ = huffman_image;
hdr->num_htree_groups_ = num_htree_groups;
hdr->htree_groups_ = htree_groups;
hdr->huffman_tables_ = huffman_tables;
- return 1;
Error:
WebPSafeFree(code_lengths);
- WebPSafeFree(huffman_image);
- WebPSafeFree(huffman_tables);
- VP8LHtreeGroupsFree(htree_groups);
- return 0;
+ WebPSafeFree(huffman_tables_bogus);
+ WebPSafeFree(mapping);
+ if (!ok) {
+ WebPSafeFree(huffman_image);
+ WebPSafeFree(huffman_tables);
+ VP8LHtreeGroupsFree(htree_groups);
+ }
+ return ok;
}
//------------------------------------------------------------------------------
@@ -884,7 +933,11 @@ static WEBP_INLINE void CopyBlock8b(uint8_t* const dst, int dist, int length) {
#endif
break;
case 2:
+#if !defined(WORDS_BIGENDIAN)
memcpy(&pattern, src, sizeof(uint16_t));
+#else
+ pattern = ((uint32_t)src[0] << 8) | src[1];
+#endif
#if defined(__arm__) || defined(_M_ARM)
pattern |= pattern << 16;
#elif defined(WEBP_USE_MIPS_DSP_R2)
@@ -1523,7 +1576,6 @@ int VP8LDecodeAlphaHeader(ALPHDecoder* const alph_dec,
if (dec == NULL) return 0;
assert(alph_dec != NULL);
- alph_dec->vp8l_dec_ = dec;
dec->width_ = alph_dec->width_;
dec->height_ = alph_dec->height_;
@@ -1555,11 +1607,12 @@ int VP8LDecodeAlphaHeader(ALPHDecoder* const alph_dec,
if (!ok) goto Err;
+ // Only set here, once we are sure it is valid (to avoid thread races).
+ alph_dec->vp8l_dec_ = dec;
return 1;
Err:
- VP8LDelete(alph_dec->vp8l_dec_);
- alph_dec->vp8l_dec_ = NULL;
+ VP8LDelete(dec);
return 0;
}
diff --git a/thirdparty/libwebp/src/dec/vp8li_dec.h b/thirdparty/libwebp/src/dec/vp8li_dec.h
index 8e500cf9ff..0a4d613f99 100644
--- a/thirdparty/libwebp/src/dec/vp8li_dec.h
+++ b/thirdparty/libwebp/src/dec/vp8li_dec.h
@@ -132,4 +132,4 @@ void VP8LDelete(VP8LDecoder* const dec);
} // extern "C"
#endif
-#endif /* WEBP_DEC_VP8LI_DEC_H_ */
+#endif // WEBP_DEC_VP8LI_DEC_H_
diff --git a/thirdparty/libwebp/src/dec/webpi_dec.h b/thirdparty/libwebp/src/dec/webpi_dec.h
index c378ba6fc3..24baff5d27 100644
--- a/thirdparty/libwebp/src/dec/webpi_dec.h
+++ b/thirdparty/libwebp/src/dec/webpi_dec.h
@@ -130,4 +130,4 @@ int WebPAvoidSlowMemory(const WebPDecBuffer* const output,
} // extern "C"
#endif
-#endif /* WEBP_DEC_WEBPI_DEC_H_ */
+#endif // WEBP_DEC_WEBPI_DEC_H_
diff --git a/thirdparty/libwebp/src/demux/demux.c b/thirdparty/libwebp/src/demux/demux.c
index 684215e3de..a69c65b7cf 100644
--- a/thirdparty/libwebp/src/demux/demux.c
+++ b/thirdparty/libwebp/src/demux/demux.c
@@ -25,7 +25,7 @@
#define DMUX_MAJ_VERSION 1
#define DMUX_MIN_VERSION 0
-#define DMUX_REV_VERSION 0
+#define DMUX_REV_VERSION 1
typedef struct {
size_t start_; // start location of the data
diff --git a/thirdparty/libwebp/src/dsp/dsp.h b/thirdparty/libwebp/src/dsp/dsp.h
index 4ab77a5130..fafc2d05d3 100644
--- a/thirdparty/libwebp/src/dsp/dsp.h
+++ b/thirdparty/libwebp/src/dsp/dsp.h
@@ -76,10 +76,6 @@ extern "C" {
#define WEBP_USE_SSE41
#endif
-#if defined(__AVX2__) || defined(WEBP_HAVE_AVX2)
-#define WEBP_USE_AVX2
-#endif
-
// The intrinsics currently cause compiler errors with arm-nacl-gcc and the
// inline assembly would need to be modified for use with Native Client.
#if (defined(__ARM_NEON__) || \
@@ -679,4 +675,4 @@ void VP8FiltersInit(void);
} // extern "C"
#endif
-#endif /* WEBP_DSP_DSP_H_ */
+#endif // WEBP_DSP_DSP_H_
diff --git a/thirdparty/libwebp/src/dsp/enc.c b/thirdparty/libwebp/src/dsp/enc.c
index fa23b40a30..2fddbc4c52 100644
--- a/thirdparty/libwebp/src/dsp/enc.c
+++ b/thirdparty/libwebp/src/dsp/enc.c
@@ -734,7 +734,6 @@ VP8BlockCopy VP8Copy16x8;
extern void VP8EncDspInitSSE2(void);
extern void VP8EncDspInitSSE41(void);
-extern void VP8EncDspInitAVX2(void);
extern void VP8EncDspInitNEON(void);
extern void VP8EncDspInitMIPS32(void);
extern void VP8EncDspInitMIPSdspR2(void);
@@ -784,11 +783,6 @@ WEBP_DSP_INIT_FUNC(VP8EncDspInit) {
#endif
}
#endif
-#if defined(WEBP_USE_AVX2)
- if (VP8GetCPUInfo(kAVX2)) {
- VP8EncDspInitAVX2();
- }
-#endif
#if defined(WEBP_USE_MIPS32)
if (VP8GetCPUInfo(kMIPS32)) {
VP8EncDspInitMIPS32();
diff --git a/thirdparty/libwebp/src/dsp/enc_avx2.c b/thirdparty/libwebp/src/dsp/enc_avx2.c
deleted file mode 100644
index 8bc5798fee..0000000000
--- a/thirdparty/libwebp/src/dsp/enc_avx2.c
+++ /dev/null
@@ -1,21 +0,0 @@
-// Copyright 2014 Google Inc. All Rights Reserved.
-//
-// Use of this source code is governed by a BSD-style license
-// that can be found in the COPYING file in the root of the source
-// tree. An additional intellectual property rights grant can be found
-// in the file PATENTS. All contributing project authors may
-// be found in the AUTHORS file in the root of the source tree.
-// -----------------------------------------------------------------------------
-//
-// AVX2 version of speed-critical encoding functions.
-
-#include "src/dsp/dsp.h"
-
-#if defined(WEBP_USE_AVX2)
-
-#endif // WEBP_USE_AVX2
-
-//------------------------------------------------------------------------------
-// Entry point
-
-WEBP_DSP_INIT_STUB(VP8EncDspInitAVX2)
diff --git a/thirdparty/libwebp/src/dsp/lossless.c b/thirdparty/libwebp/src/dsp/lossless.c
index f9b3c182d3..d21aa6a0a0 100644
--- a/thirdparty/libwebp/src/dsp/lossless.c
+++ b/thirdparty/libwebp/src/dsp/lossless.c
@@ -23,8 +23,6 @@
#include "src/dsp/lossless.h"
#include "src/dsp/lossless_common.h"
-#define MAX_DIFF_COST (1e30f)
-
//------------------------------------------------------------------------------
// Image transforms.
diff --git a/thirdparty/libwebp/src/dsp/lossless.h b/thirdparty/libwebp/src/dsp/lossless.h
index b2bbdfc93c..f709cc86b2 100644
--- a/thirdparty/libwebp/src/dsp/lossless.h
+++ b/thirdparty/libwebp/src/dsp/lossless.h
@@ -163,7 +163,7 @@ extern VP8LCostCombinedFunc VP8LExtraCostCombined;
extern VP8LCombinedShannonEntropyFunc VP8LCombinedShannonEntropy;
typedef struct { // small struct to hold counters
- int counts[2]; // index: 0=zero steak, 1=non-zero streak
+ int counts[2]; // index: 0=zero streak, 1=non-zero streak
int streaks[2][2]; // [zero/non-zero][streak<3 / streak>=3]
} VP8LStreaks;
@@ -194,10 +194,14 @@ extern VP8LGetEntropyUnrefinedFunc VP8LGetEntropyUnrefined;
void VP8LBitsEntropyUnrefined(const uint32_t* const array, int n,
VP8LBitEntropy* const entropy);
-typedef void (*VP8LHistogramAddFunc)(const VP8LHistogram* const a,
- const VP8LHistogram* const b,
- VP8LHistogram* const out);
-extern VP8LHistogramAddFunc VP8LHistogramAdd;
+typedef void (*VP8LAddVectorFunc)(const uint32_t* a, const uint32_t* b,
+ uint32_t* out, int size);
+extern VP8LAddVectorFunc VP8LAddVector;
+typedef void (*VP8LAddVectorEqFunc)(const uint32_t* a, uint32_t* out, int size);
+extern VP8LAddVectorEqFunc VP8LAddVectorEq;
+void VP8LHistogramAdd(const VP8LHistogram* const a,
+ const VP8LHistogram* const b,
+ VP8LHistogram* const out);
// -----------------------------------------------------------------------------
// PrefixEncode()
diff --git a/thirdparty/libwebp/src/dsp/lossless_enc.c b/thirdparty/libwebp/src/dsp/lossless_enc.c
index d608326fef..1408fbf580 100644
--- a/thirdparty/libwebp/src/dsp/lossless_enc.c
+++ b/thirdparty/libwebp/src/dsp/lossless_enc.c
@@ -632,38 +632,67 @@ static double ExtraCostCombined_C(const uint32_t* X, const uint32_t* Y,
//------------------------------------------------------------------------------
-static void HistogramAdd_C(const VP8LHistogram* const a,
- const VP8LHistogram* const b,
- VP8LHistogram* const out) {
+static void AddVector_C(const uint32_t* a, const uint32_t* b, uint32_t* out,
+ int size) {
+ int i;
+ for (i = 0; i < size; ++i) out[i] = a[i] + b[i];
+}
+
+static void AddVectorEq_C(const uint32_t* a, uint32_t* out, int size) {
+ int i;
+ for (i = 0; i < size; ++i) out[i] += a[i];
+}
+
+#define ADD(X, ARG, LEN) do { \
+ if (a->is_used_[X]) { \
+ if (b->is_used_[X]) { \
+ VP8LAddVector(a->ARG, b->ARG, out->ARG, (LEN)); \
+ } else { \
+ memcpy(&out->ARG[0], &a->ARG[0], (LEN) * sizeof(out->ARG[0])); \
+ } \
+ } else if (b->is_used_[X]) { \
+ memcpy(&out->ARG[0], &b->ARG[0], (LEN) * sizeof(out->ARG[0])); \
+ } else { \
+ memset(&out->ARG[0], 0, (LEN) * sizeof(out->ARG[0])); \
+ } \
+} while (0)
+
+#define ADD_EQ(X, ARG, LEN) do { \
+ if (a->is_used_[X]) { \
+ if (out->is_used_[X]) { \
+ VP8LAddVectorEq(a->ARG, out->ARG, (LEN)); \
+ } else { \
+ memcpy(&out->ARG[0], &a->ARG[0], (LEN) * sizeof(out->ARG[0])); \
+ } \
+ } \
+} while (0)
+
+void VP8LHistogramAdd(const VP8LHistogram* const a,
+ const VP8LHistogram* const b, VP8LHistogram* const out) {
int i;
const int literal_size = VP8LHistogramNumCodes(a->palette_code_bits_);
assert(a->palette_code_bits_ == b->palette_code_bits_);
+
if (b != out) {
- for (i = 0; i < literal_size; ++i) {
- out->literal_[i] = a->literal_[i] + b->literal_[i];
- }
- for (i = 0; i < NUM_DISTANCE_CODES; ++i) {
- out->distance_[i] = a->distance_[i] + b->distance_[i];
- }
- for (i = 0; i < NUM_LITERAL_CODES; ++i) {
- out->red_[i] = a->red_[i] + b->red_[i];
- out->blue_[i] = a->blue_[i] + b->blue_[i];
- out->alpha_[i] = a->alpha_[i] + b->alpha_[i];
+ ADD(0, literal_, literal_size);
+ ADD(1, red_, NUM_LITERAL_CODES);
+ ADD(2, blue_, NUM_LITERAL_CODES);
+ ADD(3, alpha_, NUM_LITERAL_CODES);
+ ADD(4, distance_, NUM_DISTANCE_CODES);
+ for (i = 0; i < 5; ++i) {
+ out->is_used_[i] = (a->is_used_[i] | b->is_used_[i]);
}
} else {
- for (i = 0; i < literal_size; ++i) {
- out->literal_[i] += a->literal_[i];
- }
- for (i = 0; i < NUM_DISTANCE_CODES; ++i) {
- out->distance_[i] += a->distance_[i];
- }
- for (i = 0; i < NUM_LITERAL_CODES; ++i) {
- out->red_[i] += a->red_[i];
- out->blue_[i] += a->blue_[i];
- out->alpha_[i] += a->alpha_[i];
- }
+ ADD_EQ(0, literal_, literal_size);
+ ADD_EQ(1, red_, NUM_LITERAL_CODES);
+ ADD_EQ(2, blue_, NUM_LITERAL_CODES);
+ ADD_EQ(3, alpha_, NUM_LITERAL_CODES);
+ ADD_EQ(4, distance_, NUM_DISTANCE_CODES);
+ for (i = 0; i < 5; ++i) out->is_used_[i] |= a->is_used_[i];
}
}
+#undef ADD
+#undef ADD_EQ
//------------------------------------------------------------------------------
// Image transforms.
@@ -848,7 +877,8 @@ VP8LCombinedShannonEntropyFunc VP8LCombinedShannonEntropy;
VP8LGetEntropyUnrefinedFunc VP8LGetEntropyUnrefined;
VP8LGetCombinedEntropyUnrefinedFunc VP8LGetCombinedEntropyUnrefined;
-VP8LHistogramAddFunc VP8LHistogramAdd;
+VP8LAddVectorFunc VP8LAddVector;
+VP8LAddVectorEqFunc VP8LAddVectorEq;
VP8LVectorMismatchFunc VP8LVectorMismatch;
VP8LBundleColorMapFunc VP8LBundleColorMap;
@@ -885,7 +915,8 @@ WEBP_DSP_INIT_FUNC(VP8LEncDspInit) {
VP8LGetEntropyUnrefined = GetEntropyUnrefined_C;
VP8LGetCombinedEntropyUnrefined = GetCombinedEntropyUnrefined_C;
- VP8LHistogramAdd = HistogramAdd_C;
+ VP8LAddVector = AddVector_C;
+ VP8LAddVectorEq = AddVectorEq_C;
VP8LVectorMismatch = VectorMismatch_C;
VP8LBundleColorMap = VP8LBundleColorMap_C;
@@ -971,7 +1002,8 @@ WEBP_DSP_INIT_FUNC(VP8LEncDspInit) {
assert(VP8LCombinedShannonEntropy != NULL);
assert(VP8LGetEntropyUnrefined != NULL);
assert(VP8LGetCombinedEntropyUnrefined != NULL);
- assert(VP8LHistogramAdd != NULL);
+ assert(VP8LAddVector != NULL);
+ assert(VP8LAddVectorEq != NULL);
assert(VP8LVectorMismatch != NULL);
assert(VP8LBundleColorMap != NULL);
assert(VP8LPredictorsSub[0] != NULL);
diff --git a/thirdparty/libwebp/src/dsp/lossless_enc_mips32.c b/thirdparty/libwebp/src/dsp/lossless_enc_mips32.c
index e7b58f4e8c..0412a093cf 100644
--- a/thirdparty/libwebp/src/dsp/lossless_enc_mips32.c
+++ b/thirdparty/libwebp/src/dsp/lossless_enc_mips32.c
@@ -344,65 +344,29 @@ static void GetCombinedEntropyUnrefined_MIPS32(const uint32_t X[],
ASM_END_COMMON_0 \
ASM_END_COMMON_1
-#define ADD_VECTOR(A, B, OUT, SIZE, EXTRA_SIZE) do { \
- const uint32_t* pa = (const uint32_t*)(A); \
- const uint32_t* pb = (const uint32_t*)(B); \
- uint32_t* pout = (uint32_t*)(OUT); \
- const uint32_t* const LoopEnd = pa + (SIZE); \
- assert((SIZE) % 4 == 0); \
- ASM_START \
- ADD_TO_OUT(0, 4, 8, 12, 1, pa, pb, pout) \
- ASM_END_0 \
- if ((EXTRA_SIZE) > 0) { \
- const int last = (EXTRA_SIZE); \
- int i; \
- for (i = 0; i < last; ++i) pout[i] = pa[i] + pb[i]; \
- } \
-} while (0)
-
-#define ADD_VECTOR_EQ(A, OUT, SIZE, EXTRA_SIZE) do { \
- const uint32_t* pa = (const uint32_t*)(A); \
- uint32_t* pout = (uint32_t*)(OUT); \
- const uint32_t* const LoopEnd = pa + (SIZE); \
- assert((SIZE) % 4 == 0); \
- ASM_START \
- ADD_TO_OUT(0, 4, 8, 12, 0, pa, pout, pout) \
- ASM_END_1 \
- if ((EXTRA_SIZE) > 0) { \
- const int last = (EXTRA_SIZE); \
- int i; \
- for (i = 0; i < last; ++i) pout[i] += pa[i]; \
- } \
-} while (0)
-
-static void HistogramAdd_MIPS32(const VP8LHistogram* const a,
- const VP8LHistogram* const b,
- VP8LHistogram* const out) {
+static void AddVector_MIPS32(const uint32_t* pa, const uint32_t* pb,
+ uint32_t* pout, int size) {
uint32_t temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
- const int extra_cache_size = VP8LHistogramNumCodes(a->palette_code_bits_)
- - (NUM_LITERAL_CODES + NUM_LENGTH_CODES);
- assert(a->palette_code_bits_ == b->palette_code_bits_);
-
- if (b != out) {
- ADD_VECTOR(a->literal_, b->literal_, out->literal_,
- NUM_LITERAL_CODES + NUM_LENGTH_CODES, extra_cache_size);
- ADD_VECTOR(a->distance_, b->distance_, out->distance_,
- NUM_DISTANCE_CODES, 0);
- ADD_VECTOR(a->red_, b->red_, out->red_, NUM_LITERAL_CODES, 0);
- ADD_VECTOR(a->blue_, b->blue_, out->blue_, NUM_LITERAL_CODES, 0);
- ADD_VECTOR(a->alpha_, b->alpha_, out->alpha_, NUM_LITERAL_CODES, 0);
- } else {
- ADD_VECTOR_EQ(a->literal_, out->literal_,
- NUM_LITERAL_CODES + NUM_LENGTH_CODES, extra_cache_size);
- ADD_VECTOR_EQ(a->distance_, out->distance_, NUM_DISTANCE_CODES, 0);
- ADD_VECTOR_EQ(a->red_, out->red_, NUM_LITERAL_CODES, 0);
- ADD_VECTOR_EQ(a->blue_, out->blue_, NUM_LITERAL_CODES, 0);
- ADD_VECTOR_EQ(a->alpha_, out->alpha_, NUM_LITERAL_CODES, 0);
- }
+ const uint32_t end = ((size) / 4) * 4;
+ const uint32_t* const LoopEnd = pa + end;
+ int i;
+ ASM_START
+ ADD_TO_OUT(0, 4, 8, 12, 1, pa, pb, pout)
+ ASM_END_0
+ for (i = end; i < size; ++i) pout[i] = pa[i] + pb[i];
+}
+
+static void AddVectorEq_MIPS32(const uint32_t* pa, uint32_t* pout, int size) {
+ uint32_t temp0, temp1, temp2, temp3, temp4, temp5, temp6, temp7;
+ const uint32_t end = ((size) / 4) * 4;
+ const uint32_t* const LoopEnd = pa + end;
+ int i;
+ ASM_START
+ ADD_TO_OUT(0, 4, 8, 12, 0, pa, pout, pout)
+ ASM_END_1
+ for (i = end; i < size; ++i) pout[i] += pa[i];
}
-#undef ADD_VECTOR_EQ
-#undef ADD_VECTOR
#undef ASM_END_1
#undef ASM_END_0
#undef ASM_END_COMMON_1
@@ -422,7 +386,8 @@ WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInitMIPS32(void) {
VP8LExtraCostCombined = ExtraCostCombined_MIPS32;
VP8LGetEntropyUnrefined = GetEntropyUnrefined_MIPS32;
VP8LGetCombinedEntropyUnrefined = GetCombinedEntropyUnrefined_MIPS32;
- VP8LHistogramAdd = HistogramAdd_MIPS32;
+ VP8LAddVector = AddVector_MIPS32;
+ VP8LAddVectorEq = AddVectorEq_MIPS32;
}
#else // !WEBP_USE_MIPS32
diff --git a/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c b/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c
index f84a9909e1..36478c4912 100644
--- a/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c
+++ b/thirdparty/libwebp/src/dsp/lossless_enc_sse2.c
@@ -170,12 +170,13 @@ static void CollectColorRedTransforms_SSE2(const uint32_t* argb, int stride,
//------------------------------------------------------------------------------
+// Note we are adding uint32_t's as *signed* int32's (using _mm_add_epi32). But
+// that's ok since the histogram values are less than 1<<28 (max picture size).
#define LINE_SIZE 16 // 8 or 16
static void AddVector_SSE2(const uint32_t* a, const uint32_t* b, uint32_t* out,
int size) {
int i;
- assert(size % LINE_SIZE == 0);
- for (i = 0; i < size; i += LINE_SIZE) {
+ for (i = 0; i + LINE_SIZE <= size; i += LINE_SIZE) {
const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[i + 0]);
const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[i + 4]);
#if (LINE_SIZE == 16)
@@ -195,12 +196,14 @@ static void AddVector_SSE2(const uint32_t* a, const uint32_t* b, uint32_t* out,
_mm_storeu_si128((__m128i*)&out[i + 12], _mm_add_epi32(a3, b3));
#endif
}
+ for (; i < size; ++i) {
+ out[i] = a[i] + b[i];
+ }
}
static void AddVectorEq_SSE2(const uint32_t* a, uint32_t* out, int size) {
int i;
- assert(size % LINE_SIZE == 0);
- for (i = 0; i < size; i += LINE_SIZE) {
+ for (i = 0; i + LINE_SIZE <= size; i += LINE_SIZE) {
const __m128i a0 = _mm_loadu_si128((const __m128i*)&a[i + 0]);
const __m128i a1 = _mm_loadu_si128((const __m128i*)&a[i + 4]);
#if (LINE_SIZE == 16)
@@ -220,35 +223,11 @@ static void AddVectorEq_SSE2(const uint32_t* a, uint32_t* out, int size) {
_mm_storeu_si128((__m128i*)&out[i + 12], _mm_add_epi32(a3, b3));
#endif
}
-}
-#undef LINE_SIZE
-
-// Note we are adding uint32_t's as *signed* int32's (using _mm_add_epi32). But
-// that's ok since the histogram values are less than 1<<28 (max picture size).
-static void HistogramAdd_SSE2(const VP8LHistogram* const a,
- const VP8LHistogram* const b,
- VP8LHistogram* const out) {
- int i;
- const int literal_size = VP8LHistogramNumCodes(a->palette_code_bits_);
- assert(a->palette_code_bits_ == b->palette_code_bits_);
- if (b != out) {
- AddVector_SSE2(a->literal_, b->literal_, out->literal_, NUM_LITERAL_CODES);
- AddVector_SSE2(a->red_, b->red_, out->red_, NUM_LITERAL_CODES);
- AddVector_SSE2(a->blue_, b->blue_, out->blue_, NUM_LITERAL_CODES);
- AddVector_SSE2(a->alpha_, b->alpha_, out->alpha_, NUM_LITERAL_CODES);
- } else {
- AddVectorEq_SSE2(a->literal_, out->literal_, NUM_LITERAL_CODES);
- AddVectorEq_SSE2(a->red_, out->red_, NUM_LITERAL_CODES);
- AddVectorEq_SSE2(a->blue_, out->blue_, NUM_LITERAL_CODES);
- AddVectorEq_SSE2(a->alpha_, out->alpha_, NUM_LITERAL_CODES);
- }
- for (i = NUM_LITERAL_CODES; i < literal_size; ++i) {
- out->literal_[i] = a->literal_[i] + b->literal_[i];
- }
- for (i = 0; i < NUM_DISTANCE_CODES; ++i) {
- out->distance_[i] = a->distance_[i] + b->distance_[i];
+ for (; i < size; ++i) {
+ out[i] += a[i];
}
}
+#undef LINE_SIZE
//------------------------------------------------------------------------------
// Entropy
@@ -675,7 +654,8 @@ WEBP_TSAN_IGNORE_FUNCTION void VP8LEncDspInitSSE2(void) {
VP8LTransformColor = TransformColor_SSE2;
VP8LCollectColorBlueTransforms = CollectColorBlueTransforms_SSE2;
VP8LCollectColorRedTransforms = CollectColorRedTransforms_SSE2;
- VP8LHistogramAdd = HistogramAdd_SSE2;
+ VP8LAddVector = AddVector_SSE2;
+ VP8LAddVectorEq = AddVectorEq_SSE2;
VP8LCombinedShannonEntropy = CombinedShannonEntropy_SSE2;
VP8LVectorMismatch = VectorMismatch_SSE2;
VP8LBundleColorMap = BundleColorMap_SSE2;
diff --git a/thirdparty/libwebp/src/dsp/msa_macro.h b/thirdparty/libwebp/src/dsp/msa_macro.h
index dfacda6ccd..de026a1d9e 100644
--- a/thirdparty/libwebp/src/dsp/msa_macro.h
+++ b/thirdparty/libwebp/src/dsp/msa_macro.h
@@ -1389,4 +1389,4 @@ static WEBP_INLINE uint32_t func_hadd_uh_u32(v8u16 in) {
} while (0)
#define AVER_UB2_UB(...) AVER_UB2(v16u8, __VA_ARGS__)
-#endif /* WEBP_DSP_MSA_MACRO_H_ */
+#endif // WEBP_DSP_MSA_MACRO_H_
diff --git a/thirdparty/libwebp/src/dsp/rescaler.c b/thirdparty/libwebp/src/dsp/rescaler.c
index f307d35056..753f84fcf4 100644
--- a/thirdparty/libwebp/src/dsp/rescaler.c
+++ b/thirdparty/libwebp/src/dsp/rescaler.c
@@ -21,6 +21,7 @@
#define ROUNDER (WEBP_RESCALER_ONE >> 1)
#define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
//------------------------------------------------------------------------------
// Row import
@@ -138,7 +139,7 @@ void WebPRescalerExportRowShrink_C(WebPRescaler* const wrk) {
if (yscale) {
for (x_out = 0; x_out < x_out_max; ++x_out) {
const uint32_t frac = (uint32_t)MULT_FIX(frow[x_out], yscale);
- const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR(irow[x_out] - frac, wrk->fxy_scale);
assert(v >= 0 && v <= 255);
dst[x_out] = v;
irow[x_out] = frac; // new fractional start
@@ -153,6 +154,7 @@ void WebPRescalerExportRowShrink_C(WebPRescaler* const wrk) {
}
}
+#undef MULT_FIX_FLOOR
#undef MULT_FIX
#undef ROUNDER
diff --git a/thirdparty/libwebp/src/dsp/rescaler_mips32.c b/thirdparty/libwebp/src/dsp/rescaler_mips32.c
index 542f7e5970..61f63c616c 100644
--- a/thirdparty/libwebp/src/dsp/rescaler_mips32.c
+++ b/thirdparty/libwebp/src/dsp/rescaler_mips32.c
@@ -209,6 +209,7 @@ static void ExportRowExpand_MIPS32(WebPRescaler* const wrk) {
}
}
+#if 0 // disabled for now. TODO(skal): make match the C-code
static void ExportRowShrink_MIPS32(WebPRescaler* const wrk) {
const int x_out_max = wrk->dst_width * wrk->num_channels;
uint8_t* dst = wrk->dst;
@@ -273,6 +274,7 @@ static void ExportRowShrink_MIPS32(WebPRescaler* const wrk) {
);
}
}
+#endif // 0
//------------------------------------------------------------------------------
// Entry point
@@ -283,7 +285,7 @@ WEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInitMIPS32(void) {
WebPRescalerImportRowExpand = ImportRowExpand_MIPS32;
WebPRescalerImportRowShrink = ImportRowShrink_MIPS32;
WebPRescalerExportRowExpand = ExportRowExpand_MIPS32;
- WebPRescalerExportRowShrink = ExportRowShrink_MIPS32;
+// WebPRescalerExportRowShrink = ExportRowShrink_MIPS32;
}
#else // !WEBP_USE_MIPS32
diff --git a/thirdparty/libwebp/src/dsp/rescaler_mips_dsp_r2.c b/thirdparty/libwebp/src/dsp/rescaler_mips_dsp_r2.c
index b78aac15e6..ce9e64862e 100644
--- a/thirdparty/libwebp/src/dsp/rescaler_mips_dsp_r2.c
+++ b/thirdparty/libwebp/src/dsp/rescaler_mips_dsp_r2.c
@@ -20,10 +20,12 @@
#define ROUNDER (WEBP_RESCALER_ONE >> 1)
#define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
//------------------------------------------------------------------------------
// Row export
+#if 0 // disabled for now. TODO(skal): make match the C-code
static void ExportRowShrink_MIPSdspR2(WebPRescaler* const wrk) {
int i;
const int x_out_max = wrk->dst_width * wrk->num_channels;
@@ -106,7 +108,7 @@ static void ExportRowShrink_MIPSdspR2(WebPRescaler* const wrk) {
}
for (i = 0; i < (x_out_max & 0x3); ++i) {
const uint32_t frac = (uint32_t)MULT_FIX(*frow++, yscale);
- const int v = (int)MULT_FIX(*irow - frac, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR(*irow - frac, wrk->fxy_scale);
assert(v >= 0 && v <= 255);
*dst++ = v;
*irow++ = frac; // new fractional start
@@ -154,13 +156,14 @@ static void ExportRowShrink_MIPSdspR2(WebPRescaler* const wrk) {
);
}
for (i = 0; i < (x_out_max & 0x3); ++i) {
- const int v = (int)MULT_FIX(*irow, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR(*irow, wrk->fxy_scale);
assert(v >= 0 && v <= 255);
*dst++ = v;
*irow++ = 0;
}
}
}
+#endif // 0
static void ExportRowExpand_MIPSdspR2(WebPRescaler* const wrk) {
int i;
@@ -294,6 +297,7 @@ static void ExportRowExpand_MIPSdspR2(WebPRescaler* const wrk) {
}
}
+#undef MULT_FIX_FLOOR
#undef MULT_FIX
#undef ROUNDER
@@ -304,7 +308,7 @@ extern void WebPRescalerDspInitMIPSdspR2(void);
WEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInitMIPSdspR2(void) {
WebPRescalerExportRowExpand = ExportRowExpand_MIPSdspR2;
- WebPRescalerExportRowShrink = ExportRowShrink_MIPSdspR2;
+// WebPRescalerExportRowShrink = ExportRowShrink_MIPSdspR2;
}
#else // !WEBP_USE_MIPS_DSP_R2
diff --git a/thirdparty/libwebp/src/dsp/rescaler_msa.c b/thirdparty/libwebp/src/dsp/rescaler_msa.c
index f3bc99f1cd..c559254836 100644
--- a/thirdparty/libwebp/src/dsp/rescaler_msa.c
+++ b/thirdparty/libwebp/src/dsp/rescaler_msa.c
@@ -22,6 +22,7 @@
#define ROUNDER (WEBP_RESCALER_ONE >> 1)
#define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
#define CALC_MULT_FIX_16(in0, in1, in2, in3, scale, shift, dst) do { \
v4u32 tmp0, tmp1, tmp2, tmp3; \
@@ -262,6 +263,7 @@ static void RescalerExportRowExpand_MIPSdspR2(WebPRescaler* const wrk) {
}
}
+#if 0 // disabled for now. TODO(skal): make match the C-code
static WEBP_INLINE void ExportRowShrink_0(const uint32_t* frow, uint32_t* irow,
uint8_t* dst, int length,
const uint32_t yscale,
@@ -341,7 +343,7 @@ static WEBP_INLINE void ExportRowShrink_0(const uint32_t* frow, uint32_t* irow,
}
for (x_out = 0; x_out < length; ++x_out) {
const uint32_t frac = (uint32_t)MULT_FIX(frow[x_out], yscale);
- const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR(irow[x_out] - frac, wrk->fxy_scale);
assert(v >= 0 && v <= 255);
dst[x_out] = v;
irow[x_out] = frac;
@@ -426,6 +428,7 @@ static void RescalerExportRowShrink_MIPSdspR2(WebPRescaler* const wrk) {
ExportRowShrink_1(irow, dst, x_out_max, wrk);
}
}
+#endif // 0
//------------------------------------------------------------------------------
// Entry point
@@ -434,7 +437,7 @@ extern void WebPRescalerDspInitMSA(void);
WEBP_TSAN_IGNORE_FUNCTION void WebPRescalerDspInitMSA(void) {
WebPRescalerExportRowExpand = RescalerExportRowExpand_MIPSdspR2;
- WebPRescalerExportRowShrink = RescalerExportRowShrink_MIPSdspR2;
+// WebPRescalerExportRowShrink = RescalerExportRowShrink_MIPSdspR2;
}
#else // !WEBP_USE_MSA
diff --git a/thirdparty/libwebp/src/dsp/rescaler_neon.c b/thirdparty/libwebp/src/dsp/rescaler_neon.c
index 3eff9fbaf4..a553f06f79 100644
--- a/thirdparty/libwebp/src/dsp/rescaler_neon.c
+++ b/thirdparty/libwebp/src/dsp/rescaler_neon.c
@@ -22,6 +22,7 @@
#define ROUNDER (WEBP_RESCALER_ONE >> 1)
#define MULT_FIX_C(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR_C(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
#define LOAD_32x4(SRC, DST) const uint32x4_t DST = vld1q_u32((SRC))
#define LOAD_32x8(SRC, DST0, DST1) \
@@ -35,8 +36,11 @@
#if (WEBP_RESCALER_RFIX == 32)
#define MAKE_HALF_CST(C) vdupq_n_s32((int32_t)((C) >> 1))
-#define MULT_FIX(A, B) /* note: B is actualy scale>>1. See MAKE_HALF_CST */ \
+// note: B is actualy scale>>1. See MAKE_HALF_CST
+#define MULT_FIX(A, B) \
vreinterpretq_u32_s32(vqrdmulhq_s32(vreinterpretq_s32_u32((A)), (B)))
+#define MULT_FIX_FLOOR(A, B) \
+ vreinterpretq_u32_s32(vqdmulhq_s32(vreinterpretq_s32_u32((A)), (B)))
#else
#error "MULT_FIX/WEBP_RESCALER_RFIX need some more work"
#endif
@@ -135,8 +139,8 @@ static void RescalerExportRowShrink_NEON(WebPRescaler* const wrk) {
const uint32x4_t A1 = MULT_FIX(in1, yscale_half);
const uint32x4_t B0 = vqsubq_u32(in2, A0);
const uint32x4_t B1 = vqsubq_u32(in3, A1);
- const uint32x4_t C0 = MULT_FIX(B0, fxy_scale_half);
- const uint32x4_t C1 = MULT_FIX(B1, fxy_scale_half);
+ const uint32x4_t C0 = MULT_FIX_FLOOR(B0, fxy_scale_half);
+ const uint32x4_t C1 = MULT_FIX_FLOOR(B1, fxy_scale_half);
const uint16x4_t D0 = vmovn_u32(C0);
const uint16x4_t D1 = vmovn_u32(C1);
const uint8x8_t E = vmovn_u16(vcombine_u16(D0, D1));
@@ -145,7 +149,7 @@ static void RescalerExportRowShrink_NEON(WebPRescaler* const wrk) {
}
for (; x_out < x_out_max; ++x_out) {
const uint32_t frac = (uint32_t)MULT_FIX_C(frow[x_out], yscale);
- const int v = (int)MULT_FIX_C(irow[x_out] - frac, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR_C(irow[x_out] - frac, fxy_scale);
assert(v >= 0 && v <= 255);
dst[x_out] = v;
irow[x_out] = frac; // new fractional start
@@ -170,6 +174,12 @@ static void RescalerExportRowShrink_NEON(WebPRescaler* const wrk) {
}
}
+#undef MULT_FIX_FLOOR_C
+#undef MULT_FIX_C
+#undef MULT_FIX_FLOOR
+#undef MULT_FIX
+#undef ROUNDER
+
//------------------------------------------------------------------------------
extern void WebPRescalerDspInitNEON(void);
diff --git a/thirdparty/libwebp/src/dsp/rescaler_sse2.c b/thirdparty/libwebp/src/dsp/rescaler_sse2.c
index 64c50deab5..f7461a452c 100644
--- a/thirdparty/libwebp/src/dsp/rescaler_sse2.c
+++ b/thirdparty/libwebp/src/dsp/rescaler_sse2.c
@@ -25,6 +25,7 @@
#define ROUNDER (WEBP_RESCALER_ONE >> 1)
#define MULT_FIX(x, y) (((uint64_t)(x) * (y) + ROUNDER) >> WEBP_RESCALER_RFIX)
+#define MULT_FIX_FLOOR(x, y) (((uint64_t)(x) * (y)) >> WEBP_RESCALER_RFIX)
// input: 8 bytes ABCDEFGH -> output: A0E0B0F0C0G0D0H0
static void LoadTwoPixels_SSE2(const uint8_t* const src, __m128i* out) {
@@ -224,6 +225,35 @@ static WEBP_INLINE void ProcessRow_SSE2(const __m128i* const A0,
_mm_storel_epi64((__m128i*)dst, G);
}
+static WEBP_INLINE void ProcessRow_Floor_SSE2(const __m128i* const A0,
+ const __m128i* const A1,
+ const __m128i* const A2,
+ const __m128i* const A3,
+ const __m128i* const mult,
+ uint8_t* const dst) {
+ const __m128i mask = _mm_set_epi32(0xffffffffu, 0, 0xffffffffu, 0);
+ const __m128i B0 = _mm_mul_epu32(*A0, *mult);
+ const __m128i B1 = _mm_mul_epu32(*A1, *mult);
+ const __m128i B2 = _mm_mul_epu32(*A2, *mult);
+ const __m128i B3 = _mm_mul_epu32(*A3, *mult);
+ const __m128i D0 = _mm_srli_epi64(B0, WEBP_RESCALER_RFIX);
+ const __m128i D1 = _mm_srli_epi64(B1, WEBP_RESCALER_RFIX);
+#if (WEBP_RESCALER_RFIX < 32)
+ const __m128i D2 =
+ _mm_and_si128(_mm_slli_epi64(B2, 32 - WEBP_RESCALER_RFIX), mask);
+ const __m128i D3 =
+ _mm_and_si128(_mm_slli_epi64(B3, 32 - WEBP_RESCALER_RFIX), mask);
+#else
+ const __m128i D2 = _mm_and_si128(B2, mask);
+ const __m128i D3 = _mm_and_si128(B3, mask);
+#endif
+ const __m128i E0 = _mm_or_si128(D0, D2);
+ const __m128i E1 = _mm_or_si128(D1, D3);
+ const __m128i F = _mm_packs_epi32(E0, E1);
+ const __m128i G = _mm_packus_epi16(F, F);
+ _mm_storel_epi64((__m128i*)dst, G);
+}
+
static void RescalerExportRowExpand_SSE2(WebPRescaler* const wrk) {
int x_out;
uint8_t* const dst = wrk->dst;
@@ -322,12 +352,12 @@ static void RescalerExportRowShrink_SSE2(WebPRescaler* const wrk) {
const __m128i G1 = _mm_or_si128(D1, F3);
_mm_storeu_si128((__m128i*)(irow + x_out + 0), G0);
_mm_storeu_si128((__m128i*)(irow + x_out + 4), G1);
- ProcessRow_SSE2(&E0, &E1, &E2, &E3, &mult_xy, dst + x_out);
+ ProcessRow_Floor_SSE2(&E0, &E1, &E2, &E3, &mult_xy, dst + x_out);
}
}
for (; x_out < x_out_max; ++x_out) {
const uint32_t frac = (int)MULT_FIX(frow[x_out], yscale);
- const int v = (int)MULT_FIX(irow[x_out] - frac, wrk->fxy_scale);
+ const int v = (int)MULT_FIX_FLOOR(irow[x_out] - frac, wrk->fxy_scale);
assert(v >= 0 && v <= 255);
dst[x_out] = v;
irow[x_out] = frac; // new fractional start
@@ -352,6 +382,7 @@ static void RescalerExportRowShrink_SSE2(WebPRescaler* const wrk) {
}
}
+#undef MULT_FIX_FLOOR
#undef MULT_FIX
#undef ROUNDER
diff --git a/thirdparty/libwebp/src/dsp/yuv.h b/thirdparty/libwebp/src/dsp/yuv.h
index eb787270d2..c12be1d094 100644
--- a/thirdparty/libwebp/src/dsp/yuv.h
+++ b/thirdparty/libwebp/src/dsp/yuv.h
@@ -207,4 +207,4 @@ static WEBP_INLINE int VP8RGBToV(int r, int g, int b, int rounding) {
} // extern "C"
#endif
-#endif /* WEBP_DSP_YUV_H_ */
+#endif // WEBP_DSP_YUV_H_
diff --git a/thirdparty/libwebp/src/enc/analysis_enc.c b/thirdparty/libwebp/src/enc/analysis_enc.c
index a47ff7d4e8..687757ae03 100644
--- a/thirdparty/libwebp/src/enc/analysis_enc.c
+++ b/thirdparty/libwebp/src/enc/analysis_enc.c
@@ -458,7 +458,7 @@ static void MergeJobs(const SegmentJob* const src, SegmentJob* const dst) {
dst->uv_alpha += src->uv_alpha;
}
-// initialize the job struct with some TODOs
+// initialize the job struct with some tasks to perform
static void InitSegmentJob(VP8Encoder* const enc, SegmentJob* const job,
int start_row, int end_row) {
WebPGetWorkerInterface()->Init(&job->worker);
diff --git a/thirdparty/libwebp/src/enc/backward_references_cost_enc.c b/thirdparty/libwebp/src/enc/backward_references_cost_enc.c
index 7175496c7f..516abd73eb 100644
--- a/thirdparty/libwebp/src/enc/backward_references_cost_enc.c
+++ b/thirdparty/libwebp/src/enc/backward_references_cost_enc.c
@@ -67,7 +67,7 @@ static int CostModelBuild(CostModel* const m, int xsize, int cache_bits,
// The following code is similar to VP8LHistogramCreate but converts the
// distance to plane code.
- VP8LHistogramInit(histo, cache_bits);
+ VP8LHistogramInit(histo, cache_bits, /*init_arrays=*/ 1);
while (VP8LRefsCursorOk(&c)) {
VP8LHistogramAddSinglePixOrCopy(histo, c.cur_pos, VP8LDistanceToPlaneCode,
xsize);
diff --git a/thirdparty/libwebp/src/enc/backward_references_enc.c b/thirdparty/libwebp/src/enc/backward_references_enc.c
index 39230188b9..3ab7b0ac7d 100644
--- a/thirdparty/libwebp/src/enc/backward_references_enc.c
+++ b/thirdparty/libwebp/src/enc/backward_references_enc.c
@@ -715,6 +715,7 @@ static int CalculateBestCacheSize(const uint32_t* argb, int quality,
for (i = 0; i <= cache_bits_max; ++i) {
histos[i] = VP8LAllocateHistogram(i);
if (histos[i] == NULL) goto Error;
+ VP8LHistogramInit(histos[i], i, /*init_arrays=*/ 1);
if (i == 0) continue;
cc_init[i] = VP8LColorCacheInit(&hashers[i], i);
if (!cc_init[i]) goto Error;
diff --git a/thirdparty/libwebp/src/enc/cost_enc.h b/thirdparty/libwebp/src/enc/cost_enc.h
index bdce1e6a3b..a4b177b342 100644
--- a/thirdparty/libwebp/src/enc/cost_enc.h
+++ b/thirdparty/libwebp/src/enc/cost_enc.h
@@ -79,4 +79,4 @@ extern const uint16_t VP8FixedCostsI4[NUM_BMODES][NUM_BMODES][NUM_BMODES];
} // extern "C"
#endif
-#endif /* WEBP_ENC_COST_ENC_H_ */
+#endif // WEBP_ENC_COST_ENC_H_
diff --git a/thirdparty/libwebp/src/enc/delta_palettization_enc.c b/thirdparty/libwebp/src/enc/delta_palettization_enc.c
deleted file mode 100644
index a61c8e6c93..0000000000
--- a/thirdparty/libwebp/src/enc/delta_palettization_enc.c
+++ /dev/null
@@ -1,455 +0,0 @@
-// Copyright 2015 Google Inc. All Rights Reserved.
-//
-// Use of this source code is governed by a BSD-style license
-// that can be found in the COPYING file in the root of the source
-// tree. An additional intellectual property rights grant can be found
-// in the file PATENTS. All contributing project authors may
-// be found in the AUTHORS file in the root of the source tree.
-// -----------------------------------------------------------------------------
-//
-// Author: Mislav Bradac (mislavm@google.com)
-//
-
-#include "src/enc/delta_palettization_enc.h"
-
-#ifdef WEBP_EXPERIMENTAL_FEATURES
-#include "src/webp/types.h"
-#include "src/dsp/lossless.h"
-
-#define MK_COL(r, g, b) (((r) << 16) + ((g) << 8) + (b))
-
-// Format allows palette up to 256 entries, but more palette entries produce
-// bigger entropy. In the future it will probably be useful to add more entries
-// that are far from the origin of the palette or choose remaining entries
-// dynamically.
-#define DELTA_PALETTE_SIZE 226
-
-// Palette used for delta_palettization. Entries are roughly sorted by distance
-// of their signed equivalents from the origin.
-static const uint32_t kDeltaPalette[DELTA_PALETTE_SIZE] = {
- MK_COL(0u, 0u, 0u),
- MK_COL(255u, 255u, 255u),
- MK_COL(1u, 1u, 1u),
- MK_COL(254u, 254u, 254u),
- MK_COL(2u, 2u, 2u),
- MK_COL(4u, 4u, 4u),
- MK_COL(252u, 252u, 252u),
- MK_COL(250u, 0u, 0u),
- MK_COL(0u, 250u, 0u),
- MK_COL(0u, 0u, 250u),
- MK_COL(6u, 0u, 0u),
- MK_COL(0u, 6u, 0u),
- MK_COL(0u, 0u, 6u),
- MK_COL(0u, 0u, 248u),
- MK_COL(0u, 0u, 8u),
- MK_COL(0u, 248u, 0u),
- MK_COL(0u, 248u, 248u),
- MK_COL(0u, 248u, 8u),
- MK_COL(0u, 8u, 0u),
- MK_COL(0u, 8u, 248u),
- MK_COL(0u, 8u, 8u),
- MK_COL(8u, 8u, 8u),
- MK_COL(248u, 0u, 0u),
- MK_COL(248u, 0u, 248u),
- MK_COL(248u, 0u, 8u),
- MK_COL(248u, 248u, 0u),
- MK_COL(248u, 8u, 0u),
- MK_COL(8u, 0u, 0u),
- MK_COL(8u, 0u, 248u),
- MK_COL(8u, 0u, 8u),
- MK_COL(8u, 248u, 0u),
- MK_COL(8u, 8u, 0u),
- MK_COL(23u, 23u, 23u),
- MK_COL(13u, 13u, 13u),
- MK_COL(232u, 232u, 232u),
- MK_COL(244u, 244u, 244u),
- MK_COL(245u, 245u, 250u),
- MK_COL(50u, 50u, 50u),
- MK_COL(204u, 204u, 204u),
- MK_COL(236u, 236u, 236u),
- MK_COL(16u, 16u, 16u),
- MK_COL(240u, 16u, 16u),
- MK_COL(16u, 240u, 16u),
- MK_COL(240u, 240u, 16u),
- MK_COL(16u, 16u, 240u),
- MK_COL(240u, 16u, 240u),
- MK_COL(16u, 240u, 240u),
- MK_COL(240u, 240u, 240u),
- MK_COL(0u, 0u, 232u),
- MK_COL(0u, 232u, 0u),
- MK_COL(232u, 0u, 0u),
- MK_COL(0u, 0u, 24u),
- MK_COL(0u, 24u, 0u),
- MK_COL(24u, 0u, 0u),
- MK_COL(32u, 32u, 32u),
- MK_COL(224u, 32u, 32u),
- MK_COL(32u, 224u, 32u),
- MK_COL(224u, 224u, 32u),
- MK_COL(32u, 32u, 224u),
- MK_COL(224u, 32u, 224u),
- MK_COL(32u, 224u, 224u),
- MK_COL(224u, 224u, 224u),
- MK_COL(0u, 0u, 176u),
- MK_COL(0u, 0u, 80u),
- MK_COL(0u, 176u, 0u),
- MK_COL(0u, 176u, 176u),
- MK_COL(0u, 176u, 80u),
- MK_COL(0u, 80u, 0u),
- MK_COL(0u, 80u, 176u),
- MK_COL(0u, 80u, 80u),
- MK_COL(176u, 0u, 0u),
- MK_COL(176u, 0u, 176u),
- MK_COL(176u, 0u, 80u),
- MK_COL(176u, 176u, 0u),
- MK_COL(176u, 80u, 0u),
- MK_COL(80u, 0u, 0u),
- MK_COL(80u, 0u, 176u),
- MK_COL(80u, 0u, 80u),
- MK_COL(80u, 176u, 0u),
- MK_COL(80u, 80u, 0u),
- MK_COL(0u, 0u, 152u),
- MK_COL(0u, 0u, 104u),
- MK_COL(0u, 152u, 0u),
- MK_COL(0u, 152u, 152u),
- MK_COL(0u, 152u, 104u),
- MK_COL(0u, 104u, 0u),
- MK_COL(0u, 104u, 152u),
- MK_COL(0u, 104u, 104u),
- MK_COL(152u, 0u, 0u),
- MK_COL(152u, 0u, 152u),
- MK_COL(152u, 0u, 104u),
- MK_COL(152u, 152u, 0u),
- MK_COL(152u, 104u, 0u),
- MK_COL(104u, 0u, 0u),
- MK_COL(104u, 0u, 152u),
- MK_COL(104u, 0u, 104u),
- MK_COL(104u, 152u, 0u),
- MK_COL(104u, 104u, 0u),
- MK_COL(216u, 216u, 216u),
- MK_COL(216u, 216u, 40u),
- MK_COL(216u, 216u, 176u),
- MK_COL(216u, 216u, 80u),
- MK_COL(216u, 40u, 216u),
- MK_COL(216u, 40u, 40u),
- MK_COL(216u, 40u, 176u),
- MK_COL(216u, 40u, 80u),
- MK_COL(216u, 176u, 216u),
- MK_COL(216u, 176u, 40u),
- MK_COL(216u, 176u, 176u),
- MK_COL(216u, 176u, 80u),
- MK_COL(216u, 80u, 216u),
- MK_COL(216u, 80u, 40u),
- MK_COL(216u, 80u, 176u),
- MK_COL(216u, 80u, 80u),
- MK_COL(40u, 216u, 216u),
- MK_COL(40u, 216u, 40u),
- MK_COL(40u, 216u, 176u),
- MK_COL(40u, 216u, 80u),
- MK_COL(40u, 40u, 216u),
- MK_COL(40u, 40u, 40u),
- MK_COL(40u, 40u, 176u),
- MK_COL(40u, 40u, 80u),
- MK_COL(40u, 176u, 216u),
- MK_COL(40u, 176u, 40u),
- MK_COL(40u, 176u, 176u),
- MK_COL(40u, 176u, 80u),
- MK_COL(40u, 80u, 216u),
- MK_COL(40u, 80u, 40u),
- MK_COL(40u, 80u, 176u),
- MK_COL(40u, 80u, 80u),
- MK_COL(80u, 216u, 216u),
- MK_COL(80u, 216u, 40u),
- MK_COL(80u, 216u, 176u),
- MK_COL(80u, 216u, 80u),
- MK_COL(80u, 40u, 216u),
- MK_COL(80u, 40u, 40u),
- MK_COL(80u, 40u, 176u),
- MK_COL(80u, 40u, 80u),
- MK_COL(80u, 176u, 216u),
- MK_COL(80u, 176u, 40u),
- MK_COL(80u, 176u, 176u),
- MK_COL(80u, 176u, 80u),
- MK_COL(80u, 80u, 216u),
- MK_COL(80u, 80u, 40u),
- MK_COL(80u, 80u, 176u),
- MK_COL(80u, 80u, 80u),
- MK_COL(0u, 0u, 192u),
- MK_COL(0u, 0u, 64u),
- MK_COL(0u, 0u, 128u),
- MK_COL(0u, 192u, 0u),
- MK_COL(0u, 192u, 192u),
- MK_COL(0u, 192u, 64u),
- MK_COL(0u, 192u, 128u),
- MK_COL(0u, 64u, 0u),
- MK_COL(0u, 64u, 192u),
- MK_COL(0u, 64u, 64u),
- MK_COL(0u, 64u, 128u),
- MK_COL(0u, 128u, 0u),
- MK_COL(0u, 128u, 192u),
- MK_COL(0u, 128u, 64u),
- MK_COL(0u, 128u, 128u),
- MK_COL(176u, 216u, 216u),
- MK_COL(176u, 216u, 40u),
- MK_COL(176u, 216u, 176u),
- MK_COL(176u, 216u, 80u),
- MK_COL(176u, 40u, 216u),
- MK_COL(176u, 40u, 40u),
- MK_COL(176u, 40u, 176u),
- MK_COL(176u, 40u, 80u),
- MK_COL(176u, 176u, 216u),
- MK_COL(176u, 176u, 40u),
- MK_COL(176u, 176u, 176u),
- MK_COL(176u, 176u, 80u),
- MK_COL(176u, 80u, 216u),
- MK_COL(176u, 80u, 40u),
- MK_COL(176u, 80u, 176u),
- MK_COL(176u, 80u, 80u),
- MK_COL(192u, 0u, 0u),
- MK_COL(192u, 0u, 192u),
- MK_COL(192u, 0u, 64u),
- MK_COL(192u, 0u, 128u),
- MK_COL(192u, 192u, 0u),
- MK_COL(192u, 192u, 192u),
- MK_COL(192u, 192u, 64u),
- MK_COL(192u, 192u, 128u),
- MK_COL(192u, 64u, 0u),
- MK_COL(192u, 64u, 192u),
- MK_COL(192u, 64u, 64u),
- MK_COL(192u, 64u, 128u),
- MK_COL(192u, 128u, 0u),
- MK_COL(192u, 128u, 192u),
- MK_COL(192u, 128u, 64u),
- MK_COL(192u, 128u, 128u),
- MK_COL(64u, 0u, 0u),
- MK_COL(64u, 0u, 192u),
- MK_COL(64u, 0u, 64u),
- MK_COL(64u, 0u, 128u),
- MK_COL(64u, 192u, 0u),
- MK_COL(64u, 192u, 192u),
- MK_COL(64u, 192u, 64u),
- MK_COL(64u, 192u, 128u),
- MK_COL(64u, 64u, 0u),
- MK_COL(64u, 64u, 192u),
- MK_COL(64u, 64u, 64u),
- MK_COL(64u, 64u, 128u),
- MK_COL(64u, 128u, 0u),
- MK_COL(64u, 128u, 192u),
- MK_COL(64u, 128u, 64u),
- MK_COL(64u, 128u, 128u),
- MK_COL(128u, 0u, 0u),
- MK_COL(128u, 0u, 192u),
- MK_COL(128u, 0u, 64u),
- MK_COL(128u, 0u, 128u),
- MK_COL(128u, 192u, 0u),
- MK_COL(128u, 192u, 192u),
- MK_COL(128u, 192u, 64u),
- MK_COL(128u, 192u, 128u),
- MK_COL(128u, 64u, 0u),
- MK_COL(128u, 64u, 192u),
- MK_COL(128u, 64u, 64u),
- MK_COL(128u, 64u, 128u),
- MK_COL(128u, 128u, 0u),
- MK_COL(128u, 128u, 192u),
- MK_COL(128u, 128u, 64u),
- MK_COL(128u, 128u, 128u),
-};
-
-#undef MK_COL
-
-//------------------------------------------------------------------------------
-// TODO(skal): move the functions to dsp/lossless.c when the correct
-// granularity is found. For now, we'll just copy-paste some useful bits
-// here instead.
-
-// In-place sum of each component with mod 256.
-static WEBP_INLINE void AddPixelsEq(uint32_t* a, uint32_t b) {
- const uint32_t alpha_and_green = (*a & 0xff00ff00u) + (b & 0xff00ff00u);
- const uint32_t red_and_blue = (*a & 0x00ff00ffu) + (b & 0x00ff00ffu);
- *a = (alpha_and_green & 0xff00ff00u) | (red_and_blue & 0x00ff00ffu);
-}
-
-static WEBP_INLINE uint32_t Clip255(uint32_t a) {
- if (a < 256) {
- return a;
- }
- // return 0, when a is a negative integer.
- // return 255, when a is positive.
- return ~a >> 24;
-}
-
-// Delta palettization functions.
-static WEBP_INLINE int Square(int x) {
- return x * x;
-}
-
-static WEBP_INLINE uint32_t Intensity(uint32_t a) {
- return
- 30 * ((a >> 16) & 0xff) +
- 59 * ((a >> 8) & 0xff) +
- 11 * ((a >> 0) & 0xff);
-}
-
-static uint32_t CalcDist(uint32_t predicted_value, uint32_t actual_value,
- uint32_t palette_entry) {
- int i;
- uint32_t distance = 0;
- AddPixelsEq(&predicted_value, palette_entry);
- for (i = 0; i < 32; i += 8) {
- const int32_t av = (actual_value >> i) & 0xff;
- const int32_t pv = (predicted_value >> i) & 0xff;
- distance += Square(pv - av);
- }
- // We sum square of intensity difference with factor 10, but because Intensity
- // returns 100 times real intensity we need to multiply differences of colors
- // by 1000.
- distance *= 1000u;
- distance += Square(Intensity(predicted_value)
- - Intensity(actual_value));
- return distance;
-}
-
-static uint32_t Predict(int x, int y, uint32_t* image) {
- const uint32_t t = (y == 0) ? ARGB_BLACK : image[x];
- const uint32_t l = (x == 0) ? ARGB_BLACK : image[x - 1];
- const uint32_t p =
- (((((t >> 24) & 0xff) + ((l >> 24) & 0xff)) / 2) << 24) +
- (((((t >> 16) & 0xff) + ((l >> 16) & 0xff)) / 2) << 16) +
- (((((t >> 8) & 0xff) + ((l >> 8) & 0xff)) / 2) << 8) +
- (((((t >> 0) & 0xff) + ((l >> 0) & 0xff)) / 2) << 0);
- if (x == 0 && y == 0) return ARGB_BLACK;
- if (x == 0) return t;
- if (y == 0) return l;
- return p;
-}
-
-static WEBP_INLINE int AddSubtractComponentFullWithCoefficient(
- int a, int b, int c) {
- return Clip255(a + ((b - c) >> 2));
-}
-
-static WEBP_INLINE uint32_t ClampedAddSubtractFullWithCoefficient(
- uint32_t c0, uint32_t c1, uint32_t c2) {
- const int a = AddSubtractComponentFullWithCoefficient(
- c0 >> 24, c1 >> 24, c2 >> 24);
- const int r = AddSubtractComponentFullWithCoefficient((c0 >> 16) & 0xff,
- (c1 >> 16) & 0xff,
- (c2 >> 16) & 0xff);
- const int g = AddSubtractComponentFullWithCoefficient((c0 >> 8) & 0xff,
- (c1 >> 8) & 0xff,
- (c2 >> 8) & 0xff);
- const int b = AddSubtractComponentFullWithCoefficient(
- c0 & 0xff, c1 & 0xff, c2 & 0xff);
- return ((uint32_t)a << 24) | (r << 16) | (g << 8) | b;
-}
-
-//------------------------------------------------------------------------------
-
-// Find palette entry with minimum error from difference of actual pixel value
-// and predicted pixel value. Propagate error of pixel to its top and left pixel
-// in src array. Write predicted_value + palette_entry to new_image. Return
-// index of best palette entry.
-static int FindBestPaletteEntry(uint32_t src, uint32_t predicted_value,
- const uint32_t palette[], int palette_size) {
- int i;
- int idx = 0;
- uint32_t best_distance = CalcDist(predicted_value, src, palette[0]);
- for (i = 1; i < palette_size; ++i) {
- const uint32_t distance = CalcDist(predicted_value, src, palette[i]);
- if (distance < best_distance) {
- best_distance = distance;
- idx = i;
- }
- }
- return idx;
-}
-
-static void ApplyBestPaletteEntry(int x, int y,
- uint32_t new_value, uint32_t palette_value,
- uint32_t* src, int src_stride,
- uint32_t* new_image) {
- AddPixelsEq(&new_value, palette_value);
- if (x > 0) {
- src[x - 1] = ClampedAddSubtractFullWithCoefficient(src[x - 1],
- new_value, src[x]);
- }
- if (y > 0) {
- src[x - src_stride] =
- ClampedAddSubtractFullWithCoefficient(src[x - src_stride],
- new_value, src[x]);
- }
- new_image[x] = new_value;
-}
-
-//------------------------------------------------------------------------------
-// Main entry point
-
-static WebPEncodingError ApplyDeltaPalette(uint32_t* src, uint32_t* dst,
- uint32_t src_stride,
- uint32_t dst_stride,
- const uint32_t* palette,
- int palette_size,
- int width, int height,
- int num_passes) {
- int x, y;
- WebPEncodingError err = VP8_ENC_OK;
- uint32_t* new_image = (uint32_t*)WebPSafeMalloc(width, sizeof(*new_image));
- uint8_t* const tmp_row = (uint8_t*)WebPSafeMalloc(width, sizeof(*tmp_row));
- if (new_image == NULL || tmp_row == NULL) {
- err = VP8_ENC_ERROR_OUT_OF_MEMORY;
- goto Error;
- }
-
- while (num_passes--) {
- uint32_t* cur_src = src;
- uint32_t* cur_dst = dst;
- for (y = 0; y < height; ++y) {
- for (x = 0; x < width; ++x) {
- const uint32_t predicted_value = Predict(x, y, new_image);
- tmp_row[x] = FindBestPaletteEntry(cur_src[x], predicted_value,
- palette, palette_size);
- ApplyBestPaletteEntry(x, y, predicted_value, palette[tmp_row[x]],
- cur_src, src_stride, new_image);
- }
- for (x = 0; x < width; ++x) {
- cur_dst[x] = palette[tmp_row[x]];
- }
- cur_src += src_stride;
- cur_dst += dst_stride;
- }
- }
- Error:
- WebPSafeFree(new_image);
- WebPSafeFree(tmp_row);
- return err;
-}
-
-// replaces enc->argb_ by a palettizable approximation of it,
-// and generates optimal enc->palette_[]
-WebPEncodingError WebPSearchOptimalDeltaPalette(VP8LEncoder* const enc) {
- const WebPPicture* const pic = enc->pic_;
- uint32_t* src = pic->argb;
- uint32_t* dst = enc->argb_;
- const int width = pic->width;
- const int height = pic->height;
-
- WebPEncodingError err = VP8_ENC_OK;
- memcpy(enc->palette_, kDeltaPalette, sizeof(kDeltaPalette));
- enc->palette_[DELTA_PALETTE_SIZE - 1] = src[0] - 0xff000000u;
- enc->palette_size_ = DELTA_PALETTE_SIZE;
- err = ApplyDeltaPalette(src, dst, pic->argb_stride, enc->current_width_,
- enc->palette_, enc->palette_size_,
- width, height, 2);
- if (err != VP8_ENC_OK) goto Error;
-
- Error:
- return err;
-}
-
-#else // !WEBP_EXPERIMENTAL_FEATURES
-
-WebPEncodingError WebPSearchOptimalDeltaPalette(VP8LEncoder* const enc) {
- (void)enc;
- return VP8_ENC_ERROR_INVALID_CONFIGURATION;
-}
-
-#endif // WEBP_EXPERIMENTAL_FEATURES
diff --git a/thirdparty/libwebp/src/enc/delta_palettization_enc.h b/thirdparty/libwebp/src/enc/delta_palettization_enc.h
deleted file mode 100644
index b15e2cd487..0000000000
--- a/thirdparty/libwebp/src/enc/delta_palettization_enc.h
+++ /dev/null
@@ -1,25 +0,0 @@
-// Copyright 2015 Google Inc. All Rights Reserved.
-//
-// Use of this source code is governed by a BSD-style license
-// that can be found in the COPYING file in the root of the source
-// tree. An additional intellectual property rights grant can be found
-// in the file PATENTS. All contributing project authors may
-// be found in the AUTHORS file in the root of the source tree.
-// -----------------------------------------------------------------------------
-//
-// Author: Mislav Bradac (mislavm@google.com)
-//
-
-#ifndef WEBP_ENC_DELTA_PALETTIZATION_ENC_H_
-#define WEBP_ENC_DELTA_PALETTIZATION_ENC_H_
-
-#include "src/webp/encode.h"
-#include "src/enc/vp8li_enc.h"
-
-// Replaces enc->argb_[] input by a palettizable approximation of it,
-// and generates optimal enc->palette_[].
-// This function can revert enc->use_palette_ / enc->use_predict_ flag
-// if delta-palettization is not producing expected saving.
-WebPEncodingError WebPSearchOptimalDeltaPalette(VP8LEncoder* const enc);
-
-#endif // WEBP_ENC_DELTA_PALETTIZATION_ENC_H_
diff --git a/thirdparty/libwebp/src/enc/histogram_enc.c b/thirdparty/libwebp/src/enc/histogram_enc.c
index 9fdbc627a1..4e49e0a201 100644
--- a/thirdparty/libwebp/src/enc/histogram_enc.c
+++ b/thirdparty/libwebp/src/enc/histogram_enc.c
@@ -51,10 +51,12 @@ static void HistogramCopy(const VP8LHistogram* const src,
VP8LHistogram* const dst) {
uint32_t* const dst_literal = dst->literal_;
const int dst_cache_bits = dst->palette_code_bits_;
+ const int literal_size = VP8LHistogramNumCodes(dst_cache_bits);
const int histo_size = VP8LGetHistogramSize(dst_cache_bits);
assert(src->palette_code_bits_ == dst_cache_bits);
memcpy(dst, src, histo_size);
dst->literal_ = dst_literal;
+ memcpy(dst->literal_, src->literal_, literal_size * sizeof(*dst->literal_));
}
int VP8LGetHistogramSize(int cache_bits) {
@@ -91,9 +93,19 @@ void VP8LHistogramCreate(VP8LHistogram* const p,
VP8LHistogramStoreRefs(refs, p);
}
-void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits) {
+void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits,
+ int init_arrays) {
p->palette_code_bits_ = palette_code_bits;
- HistogramClear(p);
+ if (init_arrays) {
+ HistogramClear(p);
+ } else {
+ p->trivial_symbol_ = 0;
+ p->bit_cost_ = 0.;
+ p->literal_cost_ = 0.;
+ p->red_cost_ = 0.;
+ p->blue_cost_ = 0.;
+ memset(p->is_used_, 0, sizeof(p->is_used_));
+ }
}
VP8LHistogram* VP8LAllocateHistogram(int cache_bits) {
@@ -104,37 +116,70 @@ VP8LHistogram* VP8LAllocateHistogram(int cache_bits) {
histo = (VP8LHistogram*)memory;
// literal_ won't necessary be aligned.
histo->literal_ = (uint32_t*)(memory + sizeof(VP8LHistogram));
- VP8LHistogramInit(histo, cache_bits);
+ VP8LHistogramInit(histo, cache_bits, /*init_arrays=*/ 0);
return histo;
}
+// Resets the pointers of the histograms to point to the bit buffer in the set.
+static void HistogramSetResetPointers(VP8LHistogramSet* const set,
+ int cache_bits) {
+ int i;
+ const int histo_size = VP8LGetHistogramSize(cache_bits);
+ uint8_t* memory = (uint8_t*) (set->histograms);
+ memory += set->max_size * sizeof(*set->histograms);
+ for (i = 0; i < set->max_size; ++i) {
+ memory = (uint8_t*) WEBP_ALIGN(memory);
+ set->histograms[i] = (VP8LHistogram*) memory;
+ // literal_ won't necessary be aligned.
+ set->histograms[i]->literal_ = (uint32_t*)(memory + sizeof(VP8LHistogram));
+ memory += histo_size;
+ }
+}
+
+// Returns the total size of the VP8LHistogramSet.
+static size_t HistogramSetTotalSize(int size, int cache_bits) {
+ const int histo_size = VP8LGetHistogramSize(cache_bits);
+ return (sizeof(VP8LHistogramSet) + size * (sizeof(VP8LHistogram*) +
+ histo_size + WEBP_ALIGN_CST));
+}
+
VP8LHistogramSet* VP8LAllocateHistogramSet(int size, int cache_bits) {
int i;
VP8LHistogramSet* set;
- const int histo_size = VP8LGetHistogramSize(cache_bits);
- const size_t total_size =
- sizeof(*set) + size * (sizeof(*set->histograms) +
- histo_size + WEBP_ALIGN_CST);
+ const size_t total_size = HistogramSetTotalSize(size, cache_bits);
uint8_t* memory = (uint8_t*)WebPSafeMalloc(total_size, sizeof(*memory));
if (memory == NULL) return NULL;
set = (VP8LHistogramSet*)memory;
memory += sizeof(*set);
set->histograms = (VP8LHistogram**)memory;
- memory += size * sizeof(*set->histograms);
set->max_size = size;
set->size = size;
+ HistogramSetResetPointers(set, cache_bits);
for (i = 0; i < size; ++i) {
- memory = (uint8_t*)WEBP_ALIGN(memory);
- set->histograms[i] = (VP8LHistogram*)memory;
- // literal_ won't necessary be aligned.
- set->histograms[i]->literal_ = (uint32_t*)(memory + sizeof(VP8LHistogram));
- VP8LHistogramInit(set->histograms[i], cache_bits);
- memory += histo_size;
+ VP8LHistogramInit(set->histograms[i], cache_bits, /*init_arrays=*/ 0);
}
return set;
}
+void VP8LHistogramSetClear(VP8LHistogramSet* const set) {
+ int i;
+ const int cache_bits = set->histograms[0]->palette_code_bits_;
+ const int size = set->size;
+ const size_t total_size = HistogramSetTotalSize(size, cache_bits);
+ uint8_t* memory = (uint8_t*)set;
+
+ memset(memory, 0, total_size);
+ memory += sizeof(*set);
+ set->histograms = (VP8LHistogram**)memory;
+ set->max_size = size;
+ set->size = size;
+ HistogramSetResetPointers(set, cache_bits);
+ for (i = 0; i < size; ++i) {
+ set->histograms[i]->palette_code_bits_ = cache_bits;
+ }
+}
+
// -----------------------------------------------------------------------------
void VP8LHistogramAddSinglePixOrCopy(VP8LHistogram* const histo,
@@ -237,7 +282,8 @@ static double FinalHuffmanCost(const VP8LStreaks* const stats) {
// Get the symbol entropy for the distribution 'population'.
// Set 'trivial_sym', if there's only one symbol present in the distribution.
static double PopulationCost(const uint32_t* const population, int length,
- uint32_t* const trivial_sym) {
+ uint32_t* const trivial_sym,
+ uint8_t* const is_used) {
VP8LBitEntropy bit_entropy;
VP8LStreaks stats;
VP8LGetEntropyUnrefined(population, length, &bit_entropy, &stats);
@@ -245,6 +291,8 @@ static double PopulationCost(const uint32_t* const population, int length,
*trivial_sym = (bit_entropy.nonzeros == 1) ? bit_entropy.nonzero_code
: VP8L_NON_TRIVIAL_SYM;
}
+ // The histogram is used if there is at least one non-zero streak.
+ *is_used = (stats.streaks[1][0] != 0 || stats.streaks[1][1] != 0);
return BitsEntropyRefine(&bit_entropy) + FinalHuffmanCost(&stats);
}
@@ -253,7 +301,9 @@ static double PopulationCost(const uint32_t* const population, int length,
// non-zero: both the zero-th one, or both the last one.
static WEBP_INLINE double GetCombinedEntropy(const uint32_t* const X,
const uint32_t* const Y,
- int length, int trivial_at_end) {
+ int length, int is_X_used,
+ int is_Y_used,
+ int trivial_at_end) {
VP8LStreaks stats;
if (trivial_at_end) {
// This configuration is due to palettization that transforms an indexed
@@ -262,28 +312,43 @@ static WEBP_INLINE double GetCombinedEntropy(const uint32_t* const X,
// Only FinalHuffmanCost needs to be evaluated.
memset(&stats, 0, sizeof(stats));
// Deal with the non-zero value at index 0 or length-1.
- stats.streaks[1][0] += 1;
+ stats.streaks[1][0] = 1;
// Deal with the following/previous zero streak.
- stats.counts[0] += 1;
- stats.streaks[0][1] += length - 1;
+ stats.counts[0] = 1;
+ stats.streaks[0][1] = length - 1;
return FinalHuffmanCost(&stats);
} else {
VP8LBitEntropy bit_entropy;
- VP8LGetCombinedEntropyUnrefined(X, Y, length, &bit_entropy, &stats);
+ if (is_X_used) {
+ if (is_Y_used) {
+ VP8LGetCombinedEntropyUnrefined(X, Y, length, &bit_entropy, &stats);
+ } else {
+ VP8LGetEntropyUnrefined(X, length, &bit_entropy, &stats);
+ }
+ } else {
+ if (is_Y_used) {
+ VP8LGetEntropyUnrefined(Y, length, &bit_entropy, &stats);
+ } else {
+ memset(&stats, 0, sizeof(stats));
+ stats.counts[0] = 1;
+ stats.streaks[0][length > 3] = length;
+ VP8LBitEntropyInit(&bit_entropy);
+ }
+ }
return BitsEntropyRefine(&bit_entropy) + FinalHuffmanCost(&stats);
}
}
// Estimates the Entropy + Huffman + other block overhead size cost.
-double VP8LHistogramEstimateBits(const VP8LHistogram* const p) {
+double VP8LHistogramEstimateBits(VP8LHistogram* const p) {
return
- PopulationCost(
- p->literal_, VP8LHistogramNumCodes(p->palette_code_bits_), NULL)
- + PopulationCost(p->red_, NUM_LITERAL_CODES, NULL)
- + PopulationCost(p->blue_, NUM_LITERAL_CODES, NULL)
- + PopulationCost(p->alpha_, NUM_LITERAL_CODES, NULL)
- + PopulationCost(p->distance_, NUM_DISTANCE_CODES, NULL)
+ PopulationCost(p->literal_, VP8LHistogramNumCodes(p->palette_code_bits_),
+ NULL, &p->is_used_[0])
+ + PopulationCost(p->red_, NUM_LITERAL_CODES, NULL, &p->is_used_[1])
+ + PopulationCost(p->blue_, NUM_LITERAL_CODES, NULL, &p->is_used_[2])
+ + PopulationCost(p->alpha_, NUM_LITERAL_CODES, NULL, &p->is_used_[3])
+ + PopulationCost(p->distance_, NUM_DISTANCE_CODES, NULL, &p->is_used_[4])
+ VP8LExtraCost(p->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES)
+ VP8LExtraCost(p->distance_, NUM_DISTANCE_CODES);
}
@@ -299,7 +364,8 @@ static int GetCombinedHistogramEntropy(const VP8LHistogram* const a,
int trivial_at_end = 0;
assert(a->palette_code_bits_ == b->palette_code_bits_);
*cost += GetCombinedEntropy(a->literal_, b->literal_,
- VP8LHistogramNumCodes(palette_code_bits), 0);
+ VP8LHistogramNumCodes(palette_code_bits),
+ a->is_used_[0], b->is_used_[0], 0);
*cost += VP8LExtraCostCombined(a->literal_ + NUM_LITERAL_CODES,
b->literal_ + NUM_LITERAL_CODES,
NUM_LENGTH_CODES);
@@ -319,19 +385,23 @@ static int GetCombinedHistogramEntropy(const VP8LHistogram* const a,
}
*cost +=
- GetCombinedEntropy(a->red_, b->red_, NUM_LITERAL_CODES, trivial_at_end);
+ GetCombinedEntropy(a->red_, b->red_, NUM_LITERAL_CODES, a->is_used_[1],
+ b->is_used_[1], trivial_at_end);
if (*cost > cost_threshold) return 0;
*cost +=
- GetCombinedEntropy(a->blue_, b->blue_, NUM_LITERAL_CODES, trivial_at_end);
+ GetCombinedEntropy(a->blue_, b->blue_, NUM_LITERAL_CODES, a->is_used_[2],
+ b->is_used_[2], trivial_at_end);
if (*cost > cost_threshold) return 0;
- *cost += GetCombinedEntropy(a->alpha_, b->alpha_, NUM_LITERAL_CODES,
- trivial_at_end);
+ *cost +=
+ GetCombinedEntropy(a->alpha_, b->alpha_, NUM_LITERAL_CODES,
+ a->is_used_[3], b->is_used_[3], trivial_at_end);
if (*cost > cost_threshold) return 0;
*cost +=
- GetCombinedEntropy(a->distance_, b->distance_, NUM_DISTANCE_CODES, 0);
+ GetCombinedEntropy(a->distance_, b->distance_, NUM_DISTANCE_CODES,
+ a->is_used_[4], b->is_used_[4], 0);
*cost +=
VP8LExtraCostCombined(a->distance_, b->distance_, NUM_DISTANCE_CODES);
if (*cost > cost_threshold) return 0;
@@ -419,16 +489,19 @@ static void UpdateDominantCostRange(
static void UpdateHistogramCost(VP8LHistogram* const h) {
uint32_t alpha_sym, red_sym, blue_sym;
const double alpha_cost =
- PopulationCost(h->alpha_, NUM_LITERAL_CODES, &alpha_sym);
+ PopulationCost(h->alpha_, NUM_LITERAL_CODES, &alpha_sym,
+ &h->is_used_[3]);
const double distance_cost =
- PopulationCost(h->distance_, NUM_DISTANCE_CODES, NULL) +
+ PopulationCost(h->distance_, NUM_DISTANCE_CODES, NULL, &h->is_used_[4]) +
VP8LExtraCost(h->distance_, NUM_DISTANCE_CODES);
const int num_codes = VP8LHistogramNumCodes(h->palette_code_bits_);
- h->literal_cost_ = PopulationCost(h->literal_, num_codes, NULL) +
- VP8LExtraCost(h->literal_ + NUM_LITERAL_CODES,
- NUM_LENGTH_CODES);
- h->red_cost_ = PopulationCost(h->red_, NUM_LITERAL_CODES, &red_sym);
- h->blue_cost_ = PopulationCost(h->blue_, NUM_LITERAL_CODES, &blue_sym);
+ h->literal_cost_ =
+ PopulationCost(h->literal_, num_codes, NULL, &h->is_used_[0]) +
+ VP8LExtraCost(h->literal_ + NUM_LITERAL_CODES, NUM_LENGTH_CODES);
+ h->red_cost_ =
+ PopulationCost(h->red_, NUM_LITERAL_CODES, &red_sym, &h->is_used_[1]);
+ h->blue_cost_ =
+ PopulationCost(h->blue_, NUM_LITERAL_CODES, &blue_sym, &h->is_used_[2]);
h->bit_cost_ = h->literal_cost_ + h->red_cost_ + h->blue_cost_ +
alpha_cost + distance_cost;
if ((alpha_sym | red_sym | blue_sym) == VP8L_NON_TRIVIAL_SYM) {
@@ -473,6 +546,7 @@ static void HistogramBuild(
VP8LHistogram** const histograms = image_histo->histograms;
VP8LRefsCursor c = VP8LRefsCursorInit(backward_refs);
assert(histo_bits > 0);
+ VP8LHistogramSetClear(image_histo);
while (VP8LRefsCursorOk(&c)) {
const PixOrCopy* const v = c.cur_pos;
const int ix = (y >> histo_bits) * histo_xsize + (x >> histo_bits);
@@ -493,11 +567,19 @@ static void HistogramCopyAndAnalyze(
const int histo_size = orig_histo->size;
VP8LHistogram** const orig_histograms = orig_histo->histograms;
VP8LHistogram** const histograms = image_histo->histograms;
+ image_histo->size = 0;
for (i = 0; i < histo_size; ++i) {
VP8LHistogram* const histo = orig_histograms[i];
UpdateHistogramCost(histo);
+
+ // Skip the histogram if it is completely empty, which can happen for tiles
+ // with no information (when they are skipped because of LZ77).
+ if (!histo->is_used_[0] && !histo->is_used_[1] && !histo->is_used_[2]
+ && !histo->is_used_[3] && !histo->is_used_[4]) {
+ continue;
+ }
// Copy histograms from orig_histo[] to image_histo[].
- HistogramCopy(histo, histograms[i]);
+ HistogramCopy(histo, histograms[image_histo->size++]);
}
}
@@ -674,6 +756,18 @@ static void HistoQueueUpdateHead(HistoQueue* const histo_queue,
}
}
+// Update the cost diff and combo of a pair of histograms. This needs to be
+// called when the the histograms have been merged with a third one.
+static void HistoQueueUpdatePair(const VP8LHistogram* const h1,
+ const VP8LHistogram* const h2,
+ double threshold,
+ HistogramPair* const pair) {
+ const double sum_cost = h1->bit_cost_ + h2->bit_cost_;
+ pair->cost_combo = 0.;
+ GetCombinedHistogramEntropy(h1, h2, sum_cost + threshold, &pair->cost_combo);
+ pair->cost_diff = pair->cost_combo - sum_cost;
+}
+
// Create a pair from indices "idx1" and "idx2" provided its cost
// is inferior to "threshold", a negative entropy.
// It returns the cost of the pair, or 0. if it superior to threshold.
@@ -683,7 +777,6 @@ static double HistoQueuePush(HistoQueue* const histo_queue,
const VP8LHistogram* h1;
const VP8LHistogram* h2;
HistogramPair pair;
- double sum_cost;
assert(threshold <= 0.);
if (idx1 > idx2) {
@@ -695,10 +788,8 @@ static double HistoQueuePush(HistoQueue* const histo_queue,
pair.idx2 = idx2;
h1 = histograms[idx1];
h2 = histograms[idx2];
- sum_cost = h1->bit_cost_ + h2->bit_cost_;
- pair.cost_combo = 0.;
- GetCombinedHistogramEntropy(h1, h2, sum_cost + threshold, &pair.cost_combo);
- pair.cost_diff = pair.cost_combo - sum_cost;
+
+ HistoQueueUpdatePair(h1, h2, threshold, &pair);
// Do not even consider the pair if it does not improve the entropy.
if (pair.cost_diff >= threshold) return 0.;
@@ -891,8 +982,7 @@ static int HistogramCombineStochastic(VP8LHistogramSet* const image_histo,
}
if (do_eval) {
// Re-evaluate the cost of an updated pair.
- GetCombinedHistogramEntropy(histograms[p->idx1], histograms[p->idx2], 0,
- &p->cost_diff);
+ HistoQueueUpdatePair(histograms[p->idx1], histograms[p->idx2], 0., p);
if (p->cost_diff >= 0.) {
HistoQueuePopPair(&histo_queue, p);
continue;
@@ -987,8 +1077,7 @@ int VP8LGetHistoImageSymbols(int xsize, int ysize,
// histograms of small sizes (as bin_map will be very sparse) and
// maximum quality q==100 (to preserve the compression gains at that level).
const int entropy_combine_num_bins = low_effort ? NUM_PARTITIONS : BIN_SIZE;
- const int entropy_combine =
- (orig_histo->size > entropy_combine_num_bins * 2) && (quality < 100);
+ int entropy_combine;
if (orig_histo == NULL) goto Error;
@@ -996,15 +1085,16 @@ int VP8LGetHistoImageSymbols(int xsize, int ysize,
HistogramBuild(xsize, histo_bits, refs, orig_histo);
// Copies the histograms and computes its bit_cost.
HistogramCopyAndAnalyze(orig_histo, image_histo);
-
+ entropy_combine =
+ (image_histo->size > entropy_combine_num_bins * 2) && (quality < 100);
if (entropy_combine) {
- const int bin_map_size = orig_histo->size;
+ const int bin_map_size = image_histo->size;
// Reuse histogram_symbols storage. By definition, it's guaranteed to be ok.
uint16_t* const bin_map = histogram_symbols;
const double combine_cost_factor =
GetCombineCostFactor(image_histo_raw_size, quality);
- HistogramAnalyzeEntropyBin(orig_histo, bin_map, low_effort);
+ HistogramAnalyzeEntropyBin(image_histo, bin_map, low_effort);
// Collapse histograms with similar entropy.
HistogramCombineEntropyBin(image_histo, tmp_histo, bin_map, bin_map_size,
entropy_combine_num_bins, combine_cost_factor,
diff --git a/thirdparty/libwebp/src/enc/histogram_enc.h b/thirdparty/libwebp/src/enc/histogram_enc.h
index e8c4c83f6f..54c2d21783 100644
--- a/thirdparty/libwebp/src/enc/histogram_enc.h
+++ b/thirdparty/libwebp/src/enc/histogram_enc.h
@@ -44,6 +44,7 @@ typedef struct {
double literal_cost_; // Cached values of dominant entropy costs:
double red_cost_; // literal, red & blue.
double blue_cost_;
+ uint8_t is_used_[5]; // 5 for literal, red, blue, alpha, distance
} VP8LHistogram;
// Collection of histograms with fixed capacity, allocated as one
@@ -67,7 +68,9 @@ void VP8LHistogramCreate(VP8LHistogram* const p,
int VP8LGetHistogramSize(int palette_code_bits);
// Set the palette_code_bits and reset the stats.
-void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits);
+// If init_arrays is true, the arrays are also filled with 0's.
+void VP8LHistogramInit(VP8LHistogram* const p, int palette_code_bits,
+ int init_arrays);
// Collect all the references into a histogram (without reset)
void VP8LHistogramStoreRefs(const VP8LBackwardRefs* const refs,
@@ -83,6 +86,9 @@ void VP8LFreeHistogramSet(VP8LHistogramSet* const histo);
// using 'cache_bits'. Return NULL in case of memory error.
VP8LHistogramSet* VP8LAllocateHistogramSet(int size, int cache_bits);
+// Set the histograms in set to 0.
+void VP8LHistogramSetClear(VP8LHistogramSet* const set);
+
// Allocate and initialize histogram object with specified 'cache_bits'.
// Returns NULL in case of memory error.
// Special case of VP8LAllocateHistogramSet, with size equals 1.
@@ -113,7 +119,7 @@ double VP8LBitsEntropy(const uint32_t* const array, int n);
// Estimate how many bits the combined entropy of literals and distance
// approximately maps to.
-double VP8LHistogramEstimateBits(const VP8LHistogram* const p);
+double VP8LHistogramEstimateBits(VP8LHistogram* const p);
#ifdef __cplusplus
}
diff --git a/thirdparty/libwebp/src/enc/iterator_enc.c b/thirdparty/libwebp/src/enc/iterator_enc.c
index 7c47d51272..29f91d8315 100644
--- a/thirdparty/libwebp/src/enc/iterator_enc.c
+++ b/thirdparty/libwebp/src/enc/iterator_enc.c
@@ -128,7 +128,7 @@ static void ImportLine(const uint8_t* src, int src_stride,
for (; i < total_len; ++i) dst[i] = dst[len - 1];
}
-void VP8IteratorImport(VP8EncIterator* const it, uint8_t* tmp_32) {
+void VP8IteratorImport(VP8EncIterator* const it, uint8_t* const tmp_32) {
const VP8Encoder* const enc = it->enc_;
const int x = it->x_, y = it->y_;
const WebPPicture* const pic = enc->pic_;
diff --git a/thirdparty/libwebp/src/enc/picture_tools_enc.c b/thirdparty/libwebp/src/enc/picture_tools_enc.c
index be292d4391..d0e8a495da 100644
--- a/thirdparty/libwebp/src/enc/picture_tools_enc.c
+++ b/thirdparty/libwebp/src/enc/picture_tools_enc.c
@@ -16,10 +16,6 @@
#include "src/enc/vp8i_enc.h"
#include "src/dsp/yuv.h"
-static WEBP_INLINE uint32_t MakeARGB32(int r, int g, int b) {
- return (0xff000000u | (r << 16) | (g << 8) | b);
-}
-
//------------------------------------------------------------------------------
// Helper: clean up fully transparent area to help compressibility.
@@ -195,6 +191,10 @@ void WebPCleanupTransparentAreaLossless(WebPPicture* const pic) {
#define BLEND_10BIT(V0, V1, ALPHA) \
((((V0) * (1020 - (ALPHA)) + (V1) * (ALPHA)) * 0x101 + 1024) >> 18)
+static WEBP_INLINE uint32_t MakeARGB32(int r, int g, int b) {
+ return (0xff000000u | (r << 16) | (g << 8) | b);
+}
+
void WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb) {
const int red = (background_rgb >> 16) & 0xff;
const int green = (background_rgb >> 8) & 0xff;
@@ -208,39 +208,44 @@ void WebPBlendAlpha(WebPPicture* pic, uint32_t background_rgb) {
const int U0 = VP8RGBToU(4 * red, 4 * green, 4 * blue, 4 * YUV_HALF);
const int V0 = VP8RGBToV(4 * red, 4 * green, 4 * blue, 4 * YUV_HALF);
const int has_alpha = pic->colorspace & WEBP_CSP_ALPHA_BIT;
- if (!has_alpha || pic->a == NULL) return; // nothing to do
+ uint8_t* y_ptr = pic->y;
+ uint8_t* u_ptr = pic->u;
+ uint8_t* v_ptr = pic->v;
+ uint8_t* a_ptr = pic->a;
+ if (!has_alpha || a_ptr == NULL) return; // nothing to do
for (y = 0; y < pic->height; ++y) {
// Luma blending
- uint8_t* const y_ptr = pic->y + y * pic->y_stride;
- uint8_t* const a_ptr = pic->a + y * pic->a_stride;
for (x = 0; x < pic->width; ++x) {
- const int alpha = a_ptr[x];
+ const uint8_t alpha = a_ptr[x];
if (alpha < 0xff) {
- y_ptr[x] = BLEND(Y0, y_ptr[x], a_ptr[x]);
+ y_ptr[x] = BLEND(Y0, y_ptr[x], alpha);
}
}
// Chroma blending every even line
if ((y & 1) == 0) {
- uint8_t* const u = pic->u + (y >> 1) * pic->uv_stride;
- uint8_t* const v = pic->v + (y >> 1) * pic->uv_stride;
uint8_t* const a_ptr2 =
(y + 1 == pic->height) ? a_ptr : a_ptr + pic->a_stride;
for (x = 0; x < uv_width; ++x) {
// Average four alpha values into a single blending weight.
// TODO(skal): might lead to visible contouring. Can we do better?
- const int alpha =
+ const uint32_t alpha =
a_ptr[2 * x + 0] + a_ptr[2 * x + 1] +
a_ptr2[2 * x + 0] + a_ptr2[2 * x + 1];
- u[x] = BLEND_10BIT(U0, u[x], alpha);
- v[x] = BLEND_10BIT(V0, v[x], alpha);
+ u_ptr[x] = BLEND_10BIT(U0, u_ptr[x], alpha);
+ v_ptr[x] = BLEND_10BIT(V0, v_ptr[x], alpha);
}
if (pic->width & 1) { // rightmost pixel
- const int alpha = 2 * (a_ptr[2 * x + 0] + a_ptr2[2 * x + 0]);
- u[x] = BLEND_10BIT(U0, u[x], alpha);
- v[x] = BLEND_10BIT(V0, v[x], alpha);
+ const uint32_t alpha = 2 * (a_ptr[2 * x + 0] + a_ptr2[2 * x + 0]);
+ u_ptr[x] = BLEND_10BIT(U0, u_ptr[x], alpha);
+ v_ptr[x] = BLEND_10BIT(V0, v_ptr[x], alpha);
}
+ } else {
+ u_ptr += pic->uv_stride;
+ v_ptr += pic->uv_stride;
}
- memset(a_ptr, 0xff, pic->width);
+ memset(a_ptr, 0xff, pic->width); // reset alpha value to opaque
+ a_ptr += pic->a_stride;
+ y_ptr += pic->y_stride;
}
} else {
uint32_t* argb = pic->argb;
diff --git a/thirdparty/libwebp/src/enc/vp8i_enc.h b/thirdparty/libwebp/src/enc/vp8i_enc.h
index 624e8f8e66..92439febb8 100644
--- a/thirdparty/libwebp/src/enc/vp8i_enc.h
+++ b/thirdparty/libwebp/src/enc/vp8i_enc.h
@@ -32,7 +32,7 @@ extern "C" {
// version numbers
#define ENC_MAJ_VERSION 1
#define ENC_MIN_VERSION 0
-#define ENC_REV_VERSION 0
+#define ENC_REV_VERSION 1
enum { MAX_LF_LEVELS = 64, // Maximum loop filter level
MAX_VARIABLE_LEVEL = 67, // last (inclusive) level with variable cost
@@ -278,7 +278,7 @@ int VP8IteratorIsDone(const VP8EncIterator* const it);
// Import uncompressed samples from source.
// If tmp_32 is not NULL, import boundary samples too.
// tmp_32 is a 32-bytes scratch buffer that must be aligned in memory.
-void VP8IteratorImport(VP8EncIterator* const it, uint8_t* tmp_32);
+void VP8IteratorImport(VP8EncIterator* const it, uint8_t* const tmp_32);
// export decimated samples
void VP8IteratorExport(const VP8EncIterator* const it);
// go to next macroblock. Returns false if not finished.
@@ -515,4 +515,4 @@ void WebPCleanupTransparentAreaLossless(WebPPicture* const pic);
} // extern "C"
#endif
-#endif /* WEBP_ENC_VP8I_ENC_H_ */
+#endif // WEBP_ENC_VP8I_ENC_H_
diff --git a/thirdparty/libwebp/src/enc/vp8l_enc.c b/thirdparty/libwebp/src/enc/vp8l_enc.c
index a89184eb08..2713edcd95 100644
--- a/thirdparty/libwebp/src/enc/vp8l_enc.c
+++ b/thirdparty/libwebp/src/enc/vp8l_enc.c
@@ -809,6 +809,7 @@ static WebPEncodingError EncodeImageNoHuffman(VP8LBitWriter* const bw,
err = VP8_ENC_ERROR_OUT_OF_MEMORY;
goto Error;
}
+ VP8LHistogramSetClear(histogram_image);
// Build histogram image and symbols from backward references.
VP8LHistogramStoreRefs(refs, histogram_image->histograms[0]);
@@ -1248,14 +1249,20 @@ static WebPEncodingError MakeInputImageCopy(VP8LEncoder* const enc) {
const WebPPicture* const picture = enc->pic_;
const int width = picture->width;
const int height = picture->height;
- int y;
+
err = AllocateTransformBuffer(enc, width, height);
if (err != VP8_ENC_OK) return err;
if (enc->argb_content_ == kEncoderARGB) return VP8_ENC_OK;
- for (y = 0; y < height; ++y) {
- memcpy(enc->argb_ + y * width,
- picture->argb + y * picture->argb_stride,
- width * sizeof(*enc->argb_));
+
+ {
+ uint32_t* dst = enc->argb_;
+ const uint32_t* src = picture->argb;
+ int y;
+ for (y = 0; y < height; ++y) {
+ memcpy(dst, src, width * sizeof(*dst));
+ dst += width;
+ src += picture->argb_stride;
+ }
}
enc->argb_content_ = kEncoderARGB;
assert(enc->current_width_ == width);
diff --git a/thirdparty/libwebp/src/enc/vp8li_enc.h b/thirdparty/libwebp/src/enc/vp8li_enc.h
index 298a4a0014..d2d0fc509c 100644
--- a/thirdparty/libwebp/src/enc/vp8li_enc.h
+++ b/thirdparty/libwebp/src/enc/vp8li_enc.h
@@ -115,4 +115,4 @@ void VP8LColorSpaceTransform(int width, int height, int bits, int quality,
} // extern "C"
#endif
-#endif /* WEBP_ENC_VP8LI_ENC_H_ */
+#endif // WEBP_ENC_VP8LI_ENC_H_
diff --git a/thirdparty/libwebp/src/mux/animi.h b/thirdparty/libwebp/src/mux/animi.h
index 88899532aa..34c45ba4da 100644
--- a/thirdparty/libwebp/src/mux/animi.h
+++ b/thirdparty/libwebp/src/mux/animi.h
@@ -40,4 +40,4 @@ int WebPAnimEncoderRefineRect(
} // extern "C"
#endif
-#endif /* WEBP_MUX_ANIMI_H_ */
+#endif // WEBP_MUX_ANIMI_H_
diff --git a/thirdparty/libwebp/src/mux/muxedit.c b/thirdparty/libwebp/src/mux/muxedit.c
index 7a027b3cb4..ccf14b2a0c 100644
--- a/thirdparty/libwebp/src/mux/muxedit.c
+++ b/thirdparty/libwebp/src/mux/muxedit.c
@@ -69,12 +69,12 @@ void WebPMuxDelete(WebPMux* mux) {
if (idx == (INDEX)) { \
err = ChunkAssignData(&chunk, data, copy_data, tag); \
if (err == WEBP_MUX_OK) { \
- err = ChunkSetNth(&chunk, (LIST), nth); \
+ err = ChunkSetHead(&chunk, (LIST)); \
} \
return err; \
}
-static WebPMuxError MuxSet(WebPMux* const mux, uint32_t tag, uint32_t nth,
+static WebPMuxError MuxSet(WebPMux* const mux, uint32_t tag,
const WebPData* const data, int copy_data) {
WebPChunk chunk;
WebPMuxError err = WEBP_MUX_NOT_FOUND;
@@ -190,7 +190,7 @@ WebPMuxError WebPMuxSetChunk(WebPMux* mux, const char fourcc[4],
if (err != WEBP_MUX_OK && err != WEBP_MUX_NOT_FOUND) return err;
// Add the given chunk.
- return MuxSet(mux, tag, 1, chunk_data, copy_data);
+ return MuxSet(mux, tag, chunk_data, copy_data);
}
// Creates a chunk from given 'data' and sets it as 1st chunk in 'chunk_list'.
@@ -202,7 +202,7 @@ static WebPMuxError AddDataToChunkList(
ChunkInit(&chunk);
err = ChunkAssignData(&chunk, data, copy_data, tag);
if (err != WEBP_MUX_OK) goto Err;
- err = ChunkSetNth(&chunk, chunk_list, 1);
+ err = ChunkSetHead(&chunk, chunk_list);
if (err != WEBP_MUX_OK) goto Err;
return WEBP_MUX_OK;
Err:
@@ -266,14 +266,14 @@ WebPMuxError WebPMuxPushFrame(WebPMux* mux, const WebPMuxFrameInfo* info,
int copy_data) {
WebPMuxImage wpi;
WebPMuxError err;
- const WebPData* const bitstream = &info->bitstream;
// Sanity checks.
if (mux == NULL || info == NULL) return WEBP_MUX_INVALID_ARGUMENT;
if (info->id != WEBP_CHUNK_ANMF) return WEBP_MUX_INVALID_ARGUMENT;
- if (bitstream->bytes == NULL || bitstream->size > MAX_CHUNK_PAYLOAD) {
+ if (info->bitstream.bytes == NULL ||
+ info->bitstream.size > MAX_CHUNK_PAYLOAD) {
return WEBP_MUX_INVALID_ARGUMENT;
}
@@ -287,7 +287,7 @@ WebPMuxError WebPMuxPushFrame(WebPMux* mux, const WebPMuxFrameInfo* info,
}
MuxImageInit(&wpi);
- err = SetAlphaAndImageChunks(bitstream, copy_data, &wpi);
+ err = SetAlphaAndImageChunks(&info->bitstream, copy_data, &wpi);
if (err != WEBP_MUX_OK) goto Err;
assert(wpi.img_ != NULL); // As SetAlphaAndImageChunks() was successful.
@@ -342,7 +342,7 @@ WebPMuxError WebPMuxSetAnimationParams(WebPMux* mux,
// Set the animation parameters.
PutLE32(data, params->bgcolor);
PutLE16(data + 4, params->loop_count);
- return MuxSet(mux, kChunks[IDX_ANIM].tag, 1, &anim, 1);
+ return MuxSet(mux, kChunks[IDX_ANIM].tag, &anim, 1);
}
WebPMuxError WebPMuxSetCanvasSize(WebPMux* mux,
@@ -540,7 +540,7 @@ static WebPMuxError CreateVP8XChunk(WebPMux* const mux) {
PutLE24(data + 4, width - 1); // canvas width.
PutLE24(data + 7, height - 1); // canvas height.
- return MuxSet(mux, kChunks[IDX_VP8X].tag, 1, &vp8x, 1);
+ return MuxSet(mux, kChunks[IDX_VP8X].tag, &vp8x, 1);
}
// Cleans up 'mux' by removing any unnecessary chunks.
diff --git a/thirdparty/libwebp/src/mux/muxi.h b/thirdparty/libwebp/src/mux/muxi.h
index 6b57eea30f..df9f74c63c 100644
--- a/thirdparty/libwebp/src/mux/muxi.h
+++ b/thirdparty/libwebp/src/mux/muxi.h
@@ -14,6 +14,7 @@
#ifndef WEBP_MUX_MUXI_H_
#define WEBP_MUX_MUXI_H_
+#include <assert.h>
#include <stdlib.h>
#include "src/dec/vp8i_dec.h"
#include "src/dec/vp8li_dec.h"
@@ -28,7 +29,7 @@ extern "C" {
#define MUX_MAJ_VERSION 1
#define MUX_MIN_VERSION 0
-#define MUX_REV_VERSION 0
+#define MUX_REV_VERSION 1
// Chunk object.
typedef struct WebPChunk WebPChunk;
@@ -126,11 +127,14 @@ WebPChunk* ChunkSearchList(WebPChunk* first, uint32_t nth, uint32_t tag);
WebPMuxError ChunkAssignData(WebPChunk* chunk, const WebPData* const data,
int copy_data, uint32_t tag);
-// Sets 'chunk' at nth position in the 'chunk_list'.
-// nth = 0 has the special meaning "last of the list".
+// Sets 'chunk' as the only element in 'chunk_list' if it is empty.
// On success ownership is transferred from 'chunk' to the 'chunk_list'.
-WebPMuxError ChunkSetNth(WebPChunk* chunk, WebPChunk** chunk_list,
- uint32_t nth);
+WebPMuxError ChunkSetHead(WebPChunk* const chunk, WebPChunk** const chunk_list);
+// Sets 'chunk' at last position in the 'chunk_list'.
+// On success ownership is transferred from 'chunk' to the 'chunk_list'.
+// *chunk_list also points towards the last valid element of the initial
+// *chunk_list.
+WebPMuxError ChunkAppend(WebPChunk* const chunk, WebPChunk*** const chunk_list);
// Releases chunk and returns chunk->next_.
WebPChunk* ChunkRelease(WebPChunk* const chunk);
@@ -143,13 +147,13 @@ void ChunkListDelete(WebPChunk** const chunk_list);
// Returns size of the chunk including chunk header and padding byte (if any).
static WEBP_INLINE size_t SizeWithPadding(size_t chunk_size) {
+ assert(chunk_size <= MAX_CHUNK_PAYLOAD);
return CHUNK_HEADER_SIZE + ((chunk_size + 1) & ~1U);
}
// Size of a chunk including header and padding.
static WEBP_INLINE size_t ChunkDiskSize(const WebPChunk* chunk) {
const size_t data_size = chunk->data_.size;
- assert(data_size < MAX_CHUNK_PAYLOAD);
return SizeWithPadding(data_size);
}
@@ -227,4 +231,4 @@ WebPMuxError MuxValidate(const WebPMux* const mux);
} // extern "C"
#endif
-#endif /* WEBP_MUX_MUXI_H_ */
+#endif // WEBP_MUX_MUXI_H_
diff --git a/thirdparty/libwebp/src/mux/muxinternal.c b/thirdparty/libwebp/src/mux/muxinternal.c
index 1473f100e5..b9ee6717d3 100644
--- a/thirdparty/libwebp/src/mux/muxinternal.c
+++ b/thirdparty/libwebp/src/mux/muxinternal.c
@@ -111,27 +111,6 @@ WebPChunk* ChunkSearchList(WebPChunk* first, uint32_t nth, uint32_t tag) {
return ((nth > 0) && (iter > 0)) ? NULL : first;
}
-// Outputs a pointer to 'prev_chunk->next_',
-// where 'prev_chunk' is the pointer to the chunk at position (nth - 1).
-// Returns true if nth chunk was found.
-static int ChunkSearchListToSet(WebPChunk** chunk_list, uint32_t nth,
- WebPChunk*** const location) {
- uint32_t count = 0;
- assert(chunk_list != NULL);
- *location = chunk_list;
-
- while (*chunk_list != NULL) {
- WebPChunk* const cur_chunk = *chunk_list;
- ++count;
- if (count == nth) return 1; // Found.
- chunk_list = &cur_chunk->next_;
- *location = chunk_list;
- }
-
- // *chunk_list is ok to be NULL if adding at last location.
- return (nth == 0 || (count == nth - 1)) ? 1 : 0;
-}
-
//------------------------------------------------------------------------------
// Chunk writer methods.
@@ -156,11 +135,12 @@ WebPMuxError ChunkAssignData(WebPChunk* chunk, const WebPData* const data,
return WEBP_MUX_OK;
}
-WebPMuxError ChunkSetNth(WebPChunk* chunk, WebPChunk** chunk_list,
- uint32_t nth) {
+WebPMuxError ChunkSetHead(WebPChunk* const chunk,
+ WebPChunk** const chunk_list) {
WebPChunk* new_chunk;
- if (!ChunkSearchListToSet(chunk_list, nth, &chunk_list)) {
+ assert(chunk_list != NULL);
+ if (*chunk_list != NULL) {
return WEBP_MUX_NOT_FOUND;
}
@@ -168,11 +148,26 @@ WebPMuxError ChunkSetNth(WebPChunk* chunk, WebPChunk** chunk_list,
if (new_chunk == NULL) return WEBP_MUX_MEMORY_ERROR;
*new_chunk = *chunk;
chunk->owner_ = 0;
- new_chunk->next_ = *chunk_list;
+ new_chunk->next_ = NULL;
*chunk_list = new_chunk;
return WEBP_MUX_OK;
}
+WebPMuxError ChunkAppend(WebPChunk* const chunk,
+ WebPChunk*** const chunk_list) {
+ assert(chunk_list != NULL && *chunk_list != NULL);
+
+ if (**chunk_list == NULL) {
+ ChunkSetHead(chunk, *chunk_list);
+ } else {
+ WebPChunk* last_chunk = **chunk_list;
+ while (last_chunk->next_ != NULL) last_chunk = last_chunk->next_;
+ ChunkSetHead(chunk, &last_chunk->next_);
+ *chunk_list = &last_chunk->next_;
+ }
+ return WEBP_MUX_OK;
+}
+
//------------------------------------------------------------------------------
// Chunk deletion method(s).
@@ -232,9 +227,11 @@ void MuxImageInit(WebPMuxImage* const wpi) {
WebPMuxImage* MuxImageRelease(WebPMuxImage* const wpi) {
WebPMuxImage* next;
if (wpi == NULL) return NULL;
- ChunkDelete(wpi->header_);
- ChunkDelete(wpi->alpha_);
- ChunkDelete(wpi->img_);
+ // There should be at most one chunk of header_, alpha_, img_ but we call
+ // ChunkListDelete to be safe
+ ChunkListDelete(&wpi->header_);
+ ChunkListDelete(&wpi->alpha_);
+ ChunkListDelete(&wpi->img_);
ChunkListDelete(&wpi->unknown_);
next = wpi->next_;
diff --git a/thirdparty/libwebp/src/mux/muxread.c b/thirdparty/libwebp/src/mux/muxread.c
index 0b55286862..268f6acb53 100644
--- a/thirdparty/libwebp/src/mux/muxread.c
+++ b/thirdparty/libwebp/src/mux/muxread.c
@@ -59,6 +59,7 @@ static WebPMuxError ChunkVerifyAndAssign(WebPChunk* chunk,
// Sanity checks.
if (data_size < CHUNK_HEADER_SIZE) return WEBP_MUX_NOT_ENOUGH_DATA;
chunk_size = GetLE32(data + TAG_SIZE);
+ if (chunk_size > MAX_CHUNK_PAYLOAD) return WEBP_MUX_BAD_DATA;
{
const size_t chunk_disk_size = SizeWithPadding(chunk_size);
@@ -102,6 +103,7 @@ static int MuxImageParse(const WebPChunk* const chunk, int copy_data,
const uint8_t* const last = bytes + size;
WebPChunk subchunk;
size_t subchunk_size;
+ WebPChunk** unknown_chunk_list = &wpi->unknown_;
ChunkInit(&subchunk);
assert(chunk->tag_ == kChunks[IDX_ANMF].tag);
@@ -116,7 +118,7 @@ static int MuxImageParse(const WebPChunk* const chunk, int copy_data,
if (size < hdr_size) goto Fail;
ChunkAssignData(&subchunk, &temp, copy_data, chunk->tag_);
}
- ChunkSetNth(&subchunk, &wpi->header_, 1);
+ ChunkSetHead(&subchunk, &wpi->header_);
wpi->is_partial_ = 1; // Waiting for ALPH and/or VP8/VP8L chunks.
// Rest of the chunks.
@@ -133,18 +135,23 @@ static int MuxImageParse(const WebPChunk* const chunk, int copy_data,
switch (ChunkGetIdFromTag(subchunk.tag_)) {
case WEBP_CHUNK_ALPHA:
if (wpi->alpha_ != NULL) goto Fail; // Consecutive ALPH chunks.
- if (ChunkSetNth(&subchunk, &wpi->alpha_, 1) != WEBP_MUX_OK) goto Fail;
+ if (ChunkSetHead(&subchunk, &wpi->alpha_) != WEBP_MUX_OK) goto Fail;
wpi->is_partial_ = 1; // Waiting for a VP8 chunk.
break;
case WEBP_CHUNK_IMAGE:
- if (ChunkSetNth(&subchunk, &wpi->img_, 1) != WEBP_MUX_OK) goto Fail;
+ if (wpi->img_ != NULL) goto Fail; // Only 1 image chunk allowed.
+ if (ChunkSetHead(&subchunk, &wpi->img_) != WEBP_MUX_OK) goto Fail;
if (!MuxImageFinalize(wpi)) goto Fail;
wpi->is_partial_ = 0; // wpi is completely filled.
break;
case WEBP_CHUNK_UNKNOWN:
- if (wpi->is_partial_) goto Fail; // Encountered an unknown chunk
- // before some image chunks.
- if (ChunkSetNth(&subchunk, &wpi->unknown_, 0) != WEBP_MUX_OK) goto Fail;
+ if (wpi->is_partial_) {
+ goto Fail; // Encountered an unknown chunk
+ // before some image chunks.
+ }
+ if (ChunkAppend(&subchunk, &unknown_chunk_list) != WEBP_MUX_OK) {
+ goto Fail;
+ }
break;
default:
goto Fail;
@@ -175,6 +182,9 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
const uint8_t* data;
size_t size;
WebPChunk chunk;
+ // Stores the end of the chunk lists so that it is faster to append data to
+ // their ends.
+ WebPChunk** chunk_list_ends[WEBP_CHUNK_NIL + 1] = { NULL };
ChunkInit(&chunk);
// Sanity checks.
@@ -187,7 +197,7 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
size = bitstream->size;
if (data == NULL) return NULL;
- if (size < RIFF_HEADER_SIZE) return NULL;
+ if (size < RIFF_HEADER_SIZE + CHUNK_HEADER_SIZE) return NULL;
if (GetLE32(data + 0) != MKFOURCC('R', 'I', 'F', 'F') ||
GetLE32(data + CHUNK_HEADER_SIZE) != MKFOURCC('W', 'E', 'B', 'P')) {
return NULL;
@@ -196,8 +206,6 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
mux = WebPMuxNew();
if (mux == NULL) return NULL;
- if (size < RIFF_HEADER_SIZE + TAG_SIZE) goto Err;
-
tag = GetLE32(data + RIFF_HEADER_SIZE);
if (tag != kChunks[IDX_VP8].tag &&
tag != kChunks[IDX_VP8L].tag &&
@@ -205,13 +213,17 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
goto Err; // First chunk should be VP8, VP8L or VP8X.
}
- riff_size = SizeWithPadding(GetLE32(data + TAG_SIZE));
- if (riff_size > MAX_CHUNK_PAYLOAD || riff_size > size) {
- goto Err;
- } else {
- if (riff_size < size) { // Redundant data after last chunk.
- size = riff_size; // To make sure we don't read any data beyond mux_size.
- }
+ riff_size = GetLE32(data + TAG_SIZE);
+ if (riff_size > MAX_CHUNK_PAYLOAD) goto Err;
+
+ // Note this padding is historical and differs from demux.c which does not
+ // pad the file size.
+ riff_size = SizeWithPadding(riff_size);
+ if (riff_size < CHUNK_HEADER_SIZE) goto Err;
+ if (riff_size > size) goto Err;
+ // There's no point in reading past the end of the RIFF chunk.
+ if (size > riff_size + CHUNK_HEADER_SIZE) {
+ size = riff_size + CHUNK_HEADER_SIZE;
}
end = data + size;
@@ -226,7 +238,6 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
while (data != end) {
size_t data_size;
WebPChunkId id;
- WebPChunk** chunk_list;
if (ChunkVerifyAndAssign(&chunk, data, size, riff_size,
copy_data) != WEBP_MUX_OK) {
goto Err;
@@ -236,11 +247,11 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
switch (id) {
case WEBP_CHUNK_ALPHA:
if (wpi->alpha_ != NULL) goto Err; // Consecutive ALPH chunks.
- if (ChunkSetNth(&chunk, &wpi->alpha_, 1) != WEBP_MUX_OK) goto Err;
+ if (ChunkSetHead(&chunk, &wpi->alpha_) != WEBP_MUX_OK) goto Err;
wpi->is_partial_ = 1; // Waiting for a VP8 chunk.
break;
case WEBP_CHUNK_IMAGE:
- if (ChunkSetNth(&chunk, &wpi->img_, 1) != WEBP_MUX_OK) goto Err;
+ if (ChunkSetHead(&chunk, &wpi->img_) != WEBP_MUX_OK) goto Err;
if (!MuxImageFinalize(wpi)) goto Err;
wpi->is_partial_ = 0; // wpi is completely filled.
PushImage:
@@ -257,9 +268,13 @@ WebPMux* WebPMuxCreateInternal(const WebPData* bitstream, int copy_data,
default: // A non-image chunk.
if (wpi->is_partial_) goto Err; // Encountered a non-image chunk before
// getting all chunks of an image.
- chunk_list = MuxGetChunkListFromId(mux, id); // List to add this chunk.
- if (ChunkSetNth(&chunk, chunk_list, 0) != WEBP_MUX_OK) goto Err;
+ if (chunk_list_ends[id] == NULL) {
+ chunk_list_ends[id] =
+ MuxGetChunkListFromId(mux, id); // List to add this chunk.
+ }
+ if (ChunkAppend(&chunk, &chunk_list_ends[id]) != WEBP_MUX_OK) goto Err;
if (id == WEBP_CHUNK_VP8X) { // grab global specs
+ if (data_size < CHUNK_HEADER_SIZE + VP8X_CHUNK_SIZE) goto Err;
mux->canvas_width_ = GetLE24(data + 12) + 1;
mux->canvas_height_ = GetLE24(data + 15) + 1;
}
@@ -385,6 +400,10 @@ static WebPMuxError SynthesizeBitstream(const WebPMuxImage* const wpi,
uint8_t* const data = (uint8_t*)WebPSafeMalloc(1ULL, size);
if (data == NULL) return WEBP_MUX_MEMORY_ERROR;
+ // There should be at most one alpha_ chunk and exactly one img_ chunk.
+ assert(wpi->alpha_ == NULL || wpi->alpha_->next_ == NULL);
+ assert(wpi->img_ != NULL && wpi->img_->next_ == NULL);
+
// Main RIFF header.
dst = MuxEmitRiffHeader(data, size);
diff --git a/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h b/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h
index 2ccc6ed326..7e607f370a 100644
--- a/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h
+++ b/thirdparty/libwebp/src/utils/bit_reader_inl_utils.h
@@ -187,4 +187,4 @@ static WEBP_INLINE int VP8GetBitAlt(VP8BitReader* const br, int prob) {
} // extern "C"
#endif
-#endif // WEBP_UTILS_BIT_READER_INL_UTILS_H_
+#endif // WEBP_UTILS_BIT_READER_INL_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/bit_reader_utils.h b/thirdparty/libwebp/src/utils/bit_reader_utils.h
index 04f9804409..de810d402a 100644
--- a/thirdparty/libwebp/src/utils/bit_reader_utils.h
+++ b/thirdparty/libwebp/src/utils/bit_reader_utils.h
@@ -182,4 +182,4 @@ static WEBP_INLINE void VP8LFillBitWindow(VP8LBitReader* const br) {
} // extern "C"
#endif
-#endif /* WEBP_UTILS_BIT_READER_UTILS_H_ */
+#endif // WEBP_UTILS_BIT_READER_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/bit_writer_utils.h b/thirdparty/libwebp/src/utils/bit_writer_utils.h
index 2cf5976fe3..b9d5102a5a 100644
--- a/thirdparty/libwebp/src/utils/bit_writer_utils.h
+++ b/thirdparty/libwebp/src/utils/bit_writer_utils.h
@@ -151,4 +151,4 @@ static WEBP_INLINE void VP8LPutBits(VP8LBitWriter* const bw,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_BIT_WRITER_UTILS_H_ */
+#endif // WEBP_UTILS_BIT_WRITER_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/filters_utils.h b/thirdparty/libwebp/src/utils/filters_utils.h
index 410f2fcdf2..61da66e212 100644
--- a/thirdparty/libwebp/src/utils/filters_utils.h
+++ b/thirdparty/libwebp/src/utils/filters_utils.h
@@ -29,4 +29,4 @@ WEBP_FILTER_TYPE WebPEstimateBestFilter(const uint8_t* data,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_FILTERS_UTILS_H_ */
+#endif // WEBP_UTILS_FILTERS_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/quant_levels_dec_utils.c b/thirdparty/libwebp/src/utils/quant_levels_dec_utils.c
index 3818a78b93..f65b6cdbb6 100644
--- a/thirdparty/libwebp/src/utils/quant_levels_dec_utils.c
+++ b/thirdparty/libwebp/src/utils/quant_levels_dec_utils.c
@@ -261,9 +261,15 @@ static void CleanupParams(SmoothParams* const p) {
int WebPDequantizeLevels(uint8_t* const data, int width, int height, int stride,
int strength) {
- const int radius = 4 * strength / 100;
+ int radius = 4 * strength / 100;
+
if (strength < 0 || strength > 100) return 0;
if (data == NULL || width <= 0 || height <= 0) return 0; // bad params
+
+ // limit the filter size to not exceed the image dimensions
+ if (2 * radius + 1 > width) radius = (width - 1) >> 1;
+ if (2 * radius + 1 > height) radius = (height - 1) >> 1;
+
if (radius > 0) {
SmoothParams p;
memset(&p, 0, sizeof(p));
diff --git a/thirdparty/libwebp/src/utils/quant_levels_dec_utils.h b/thirdparty/libwebp/src/utils/quant_levels_dec_utils.h
index f822107a72..327f19f336 100644
--- a/thirdparty/libwebp/src/utils/quant_levels_dec_utils.h
+++ b/thirdparty/libwebp/src/utils/quant_levels_dec_utils.h
@@ -32,4 +32,4 @@ int WebPDequantizeLevels(uint8_t* const data, int width, int height, int stride,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_QUANT_LEVELS_DEC_UTILS_H_ */
+#endif // WEBP_UTILS_QUANT_LEVELS_DEC_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/quant_levels_utils.h b/thirdparty/libwebp/src/utils/quant_levels_utils.h
index 75df2ba6a4..9ee3ea0075 100644
--- a/thirdparty/libwebp/src/utils/quant_levels_utils.h
+++ b/thirdparty/libwebp/src/utils/quant_levels_utils.h
@@ -33,4 +33,4 @@ int QuantizeLevels(uint8_t* const data, int width, int height, int num_levels,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_QUANT_LEVELS_UTILS_H_ */
+#endif // WEBP_UTILS_QUANT_LEVELS_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/random_utils.h b/thirdparty/libwebp/src/utils/random_utils.h
index 6d36c667e7..a5006f84f7 100644
--- a/thirdparty/libwebp/src/utils/random_utils.h
+++ b/thirdparty/libwebp/src/utils/random_utils.h
@@ -60,4 +60,4 @@ static WEBP_INLINE int VP8RandomBits(VP8Random* const rg, int num_bits) {
} // extern "C"
#endif
-#endif /* WEBP_UTILS_RANDOM_UTILS_H_ */
+#endif // WEBP_UTILS_RANDOM_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/rescaler_utils.h b/thirdparty/libwebp/src/utils/rescaler_utils.h
index 8890e6fa13..ca41e42c4a 100644
--- a/thirdparty/libwebp/src/utils/rescaler_utils.h
+++ b/thirdparty/libwebp/src/utils/rescaler_utils.h
@@ -98,4 +98,4 @@ int WebPRescalerHasPendingOutput(const WebPRescaler* const rescaler) {
} // extern "C"
#endif
-#endif /* WEBP_UTILS_RESCALER_UTILS_H_ */
+#endif // WEBP_UTILS_RESCALER_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/thread_utils.h b/thirdparty/libwebp/src/utils/thread_utils.h
index c8ae6c9033..29ad49f74b 100644
--- a/thirdparty/libwebp/src/utils/thread_utils.h
+++ b/thirdparty/libwebp/src/utils/thread_utils.h
@@ -87,4 +87,4 @@ WEBP_EXTERN const WebPWorkerInterface* WebPGetWorkerInterface(void);
} // extern "C"
#endif
-#endif /* WEBP_UTILS_THREAD_UTILS_H_ */
+#endif // WEBP_UTILS_THREAD_UTILS_H_
diff --git a/thirdparty/libwebp/src/utils/utils.h b/thirdparty/libwebp/src/utils/utils.h
index 52921bf24e..da97b5d38f 100644
--- a/thirdparty/libwebp/src/utils/utils.h
+++ b/thirdparty/libwebp/src/utils/utils.h
@@ -175,4 +175,4 @@ WEBP_EXTERN int WebPGetColorPalette(const struct WebPPicture* const pic,
} // extern "C"
#endif
-#endif /* WEBP_UTILS_UTILS_H_ */
+#endif // WEBP_UTILS_UTILS_H_
diff --git a/thirdparty/libwebp/src/webp/decode.h b/thirdparty/libwebp/src/webp/decode.h
index 2165e96c95..95d31e7619 100644
--- a/thirdparty/libwebp/src/webp/decode.h
+++ b/thirdparty/libwebp/src/webp/decode.h
@@ -491,4 +491,4 @@ WEBP_EXTERN VP8StatusCode WebPDecode(const uint8_t* data, size_t data_size,
} // extern "C"
#endif
-#endif /* WEBP_WEBP_DECODE_H_ */
+#endif // WEBP_WEBP_DECODE_H_
diff --git a/thirdparty/libwebp/src/webp/demux.h b/thirdparty/libwebp/src/webp/demux.h
index 555d641338..846eeb15a9 100644
--- a/thirdparty/libwebp/src/webp/demux.h
+++ b/thirdparty/libwebp/src/webp/demux.h
@@ -360,4 +360,4 @@ WEBP_EXTERN void WebPAnimDecoderDelete(WebPAnimDecoder* dec);
} // extern "C"
#endif
-#endif /* WEBP_WEBP_DEMUX_H_ */
+#endif // WEBP_WEBP_DEMUX_H_
diff --git a/thirdparty/libwebp/src/webp/encode.h b/thirdparty/libwebp/src/webp/encode.h
index 7ec3543dc2..549cf07730 100644
--- a/thirdparty/libwebp/src/webp/encode.h
+++ b/thirdparty/libwebp/src/webp/encode.h
@@ -542,4 +542,4 @@ WEBP_EXTERN int WebPEncode(const WebPConfig* config, WebPPicture* picture);
} // extern "C"
#endif
-#endif /* WEBP_WEBP_ENCODE_H_ */
+#endif // WEBP_WEBP_ENCODE_H_
diff --git a/thirdparty/libwebp/src/webp/format_constants.h b/thirdparty/libwebp/src/webp/format_constants.h
index 329fc8a3b0..eca6981a47 100644
--- a/thirdparty/libwebp/src/webp/format_constants.h
+++ b/thirdparty/libwebp/src/webp/format_constants.h
@@ -84,4 +84,4 @@ typedef enum {
// overflow a uint32_t.
#define MAX_CHUNK_PAYLOAD (~0U - CHUNK_HEADER_SIZE - 1)
-#endif /* WEBP_WEBP_FORMAT_CONSTANTS_H_ */
+#endif // WEBP_WEBP_FORMAT_CONSTANTS_H_
diff --git a/thirdparty/libwebp/src/webp/mux.h b/thirdparty/libwebp/src/webp/mux.h
index 28bb4a41c9..66096a92e0 100644
--- a/thirdparty/libwebp/src/webp/mux.h
+++ b/thirdparty/libwebp/src/webp/mux.h
@@ -527,4 +527,4 @@ WEBP_EXTERN void WebPAnimEncoderDelete(WebPAnimEncoder* enc);
} // extern "C"
#endif
-#endif /* WEBP_WEBP_MUX_H_ */
+#endif // WEBP_WEBP_MUX_H_
diff --git a/thirdparty/libwebp/src/webp/mux_types.h b/thirdparty/libwebp/src/webp/mux_types.h
index b37e2c67aa..ceea77dfc6 100644
--- a/thirdparty/libwebp/src/webp/mux_types.h
+++ b/thirdparty/libwebp/src/webp/mux_types.h
@@ -95,4 +95,4 @@ static WEBP_INLINE int WebPDataCopy(const WebPData* src, WebPData* dst) {
} // extern "C"
#endif
-#endif /* WEBP_WEBP_MUX_TYPES_H_ */
+#endif // WEBP_WEBP_MUX_TYPES_H_
diff --git a/thirdparty/libwebp/src/webp/types.h b/thirdparty/libwebp/src/webp/types.h
index 989a763f0d..0ce2622e41 100644
--- a/thirdparty/libwebp/src/webp/types.h
+++ b/thirdparty/libwebp/src/webp/types.h
@@ -49,4 +49,4 @@ typedef long long int int64_t;
// Macro to check ABI compatibility (same major revision number)
#define WEBP_ABI_IS_INCOMPATIBLE(a, b) (((a) >> 8) != ((b) >> 8))
-#endif /* WEBP_WEBP_TYPES_H_ */
+#endif // WEBP_WEBP_TYPES_H_
diff --git a/thirdparty/tinyexr/tinyexr.h b/thirdparty/tinyexr/tinyexr.h
index 990c8ee142..b3a7ee00c2 100644
--- a/thirdparty/tinyexr/tinyexr.h
+++ b/thirdparty/tinyexr/tinyexr.h
@@ -116,6 +116,8 @@ extern "C" {
#define TINYEXR_ERROR_UNSUPPORTED_FORMAT (-7)
#define TINYEXR_ERROR_INVALID_HEADER (-8)
#define TINYEXR_ERROR_UNSUPPORTED_FEATURE (-9)
+#define TINYEXR_ERROR_CANT_WRITE_FILE (-10)
+#define TINYEXR_ERROR_SERIALZATION_FAILED (-11)
// @note { OpenEXR file format: http://www.openexr.com/openexrfilelayout.pdf }
@@ -279,9 +281,12 @@ extern int LoadEXR(float **out_rgba, int *width, int *height,
// Save image as fp16(HALF) format when `save_as_fp16` is positive non-zero
// value.
// Save image as fp32(FLOAT) format when `save_as_fp16` is 0.
+// Use ZIP compression by default.
+// Returns negative value and may set error string in `err` when there's an
+// error
extern int SaveEXR(const float *data, const int width, const int height,
const int components, const int save_as_fp16,
- const char *filename);
+ const char *filename, const char **err);
// Initialize EXRHeader struct
extern void InitEXRHeader(EXRHeader *exr_header);
@@ -400,9 +405,9 @@ extern int SaveEXRImageToFile(const EXRImage *image,
// Saves multi-channel, single-frame OpenEXR image to a memory.
// Image is compressed using EXRImage.compression value.
-// Return the number of bytes if succes.
-// Returns negative value and may set error string in `err` when there's an
-// error
+// Return the number of bytes if success.
+// Return zero and will set error string in `err` when there's an
+// error.
// When there was an error message, Application must free `err` with
// FreeEXRErrorMessage()
extern size_t SaveEXRImageToMemory(const EXRImage *image,
@@ -524,15 +529,23 @@ namespace miniz {
#if __has_warning("-Wcomma")
#pragma clang diagnostic ignored "-Wcomma"
#endif
+
#if __has_warning("-Wmacro-redefined")
#pragma clang diagnostic ignored "-Wmacro-redefined"
#endif
+
#if __has_warning("-Wcast-qual")
#pragma clang diagnostic ignored "-Wcast-qual"
#endif
+
#if __has_warning("-Wzero-as-null-pointer-constant")
#pragma clang diagnostic ignored "-Wzero-as-null-pointer-constant"
#endif
+
+#if __has_warning("-Wtautological-constant-compare")
+#pragma clang diagnostic ignored "-Wtautological-constant-compare"
+#endif
+
#endif
/* miniz.c v1.15 - public domain deflate/inflate, zlib-subset, ZIP
@@ -2518,10 +2531,10 @@ tinfl_status tinfl_decompress(tinfl_decompressor *r,
tinfl_status status = TINFL_STATUS_FAILED;
mz_uint32 num_bits, dist, counter, num_extra;
tinfl_bit_buf_t bit_buf;
- const mz_uint8 *pIn_buf_cur = pIn_buf_next, *const pIn_buf_end =
- pIn_buf_next + *pIn_buf_size;
- mz_uint8 *pOut_buf_cur = pOut_buf_next, *const pOut_buf_end =
- pOut_buf_next + *pOut_buf_size;
+ const mz_uint8 *pIn_buf_cur = pIn_buf_next,
+ *const pIn_buf_end = pIn_buf_next + *pIn_buf_size;
+ mz_uint8 *pOut_buf_cur = pOut_buf_next,
+ *const pOut_buf_end = pOut_buf_next + *pOut_buf_size;
size_t out_buf_size_mask =
(decomp_flags & TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)
? (size_t)-1
@@ -2938,9 +2951,8 @@ void *tinfl_decompress_mem_to_heap(const void *pSrc_buf, size_t src_buf_len,
tinfl_status status = tinfl_decompress(
&decomp, (const mz_uint8 *)pSrc_buf + src_buf_ofs, &src_buf_size,
(mz_uint8 *)pBuf, pBuf ? (mz_uint8 *)pBuf + *pOut_len : NULL,
- &dst_buf_size,
- (flags & ~TINFL_FLAG_HAS_MORE_INPUT) |
- TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
+ &dst_buf_size, (flags & ~TINFL_FLAG_HAS_MORE_INPUT) |
+ TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF);
if ((status < 0) || (status == TINFL_STATUS_NEEDS_MORE_INPUT)) {
MZ_FREE(pBuf);
*pOut_len = 0;
@@ -2993,8 +3005,9 @@ int tinfl_decompress_mem_to_callback(const void *pIn_buf, size_t *pIn_buf_size,
tinfl_status status =
tinfl_decompress(&decomp, (const mz_uint8 *)pIn_buf + in_buf_ofs,
&in_buf_size, pDict, pDict + dict_ofs, &dst_buf_size,
- (flags & ~(TINFL_FLAG_HAS_MORE_INPUT |
- TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)));
+ (flags &
+ ~(TINFL_FLAG_HAS_MORE_INPUT |
+ TINFL_FLAG_USING_NON_WRAPPING_OUTPUT_BUF)));
in_buf_ofs += in_buf_size;
if ((dst_buf_size) &&
(!(*pPut_buf_func)(pDict + dict_ofs, (int)dst_buf_size, pPut_buf_user)))
@@ -3119,9 +3132,7 @@ static const mz_uint8 s_tdefl_large_dist_extra[128] = {
// Radix sorts tdefl_sym_freq[] array by 16-bit key m_key. Returns ptr to sorted
// values.
-typedef struct {
- mz_uint16 m_key, m_sym_index;
-} tdefl_sym_freq;
+typedef struct { mz_uint16 m_key, m_sym_index; } tdefl_sym_freq;
static tdefl_sym_freq *tdefl_radix_sort_syms(mz_uint num_syms,
tdefl_sym_freq *pSyms0,
tdefl_sym_freq *pSyms1) {
@@ -5265,10 +5276,9 @@ mz_bool mz_zip_reader_file_stat(mz_zip_archive *pZip, mz_uint file_index,
n = MZ_READ_LE16(p + MZ_ZIP_CDH_COMMENT_LEN_OFS);
n = MZ_MIN(n, MZ_ZIP_MAX_ARCHIVE_FILE_COMMENT_SIZE - 1);
pStat->m_comment_size = n;
- memcpy(pStat->m_comment,
- p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +
- MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) +
- MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS),
+ memcpy(pStat->m_comment, p + MZ_ZIP_CENTRAL_DIR_HEADER_SIZE +
+ MZ_READ_LE16(p + MZ_ZIP_CDH_FILENAME_LEN_OFS) +
+ MZ_READ_LE16(p + MZ_ZIP_CDH_EXTRA_LEN_OFS),
n);
pStat->m_comment[n] = '\0';
@@ -10087,9 +10097,10 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
unsigned short *outLine =
reinterpret_cast<unsigned short *>(out_images[c]);
if (line_order == 0) {
- outLine += (y + v) * x_stride;
+ outLine += (size_t(y) + v) * size_t(x_stride);
} else {
- outLine += (height - 1 - (y + v)) * x_stride;
+ outLine +=
+ (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride);
}
for (int u = 0; u < width; u++) {
@@ -10105,9 +10116,10 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
} else if (requested_pixel_types[c] == TINYEXR_PIXELTYPE_FLOAT) {
float *outLine = reinterpret_cast<float *>(out_images[c]);
if (line_order == 0) {
- outLine += (y + v) * x_stride;
+ outLine += (size_t(y) + v) * size_t(x_stride);
} else {
- outLine += (height - 1 - (y + v)) * x_stride;
+ outLine +=
+ (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride);
}
if (reinterpret_cast<const unsigned char *>(line_ptr + width) >
@@ -10140,9 +10152,10 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
float *outLine = reinterpret_cast<float *>(out_images[c]);
if (line_order == 0) {
- outLine += (y + v) * x_stride;
+ outLine += (size_t(y) + v) * size_t(x_stride);
} else {
- outLine += (height - 1 - (y + v)) * x_stride;
+ outLine +=
+ (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride);
}
if (reinterpret_cast<const unsigned char *>(line_ptr + width) >
@@ -10167,9 +10180,10 @@ static bool DecodePixelData(/* out */ unsigned char **out_images,
unsigned int *outLine =
reinterpret_cast<unsigned int *>(out_images[c]);
if (line_order == 0) {
- outLine += (y + v) * x_stride;
+ outLine += (size_t(y) + v) * size_t(x_stride);
} else {
- outLine += (height - 1 - (y + v)) * x_stride;
+ outLine +=
+ (size_t(height) - 1 - (size_t(y) + v)) * size_t(x_stride);
}
for (int u = 0; u < width; u++) {
@@ -11133,21 +11147,53 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
}
}
- if ((idxA == 0) && (idxR == -1) && (idxG == -1) && (idxB == -1)) {
- // Alpha channel only.
+ if (exr_header.num_channels == 1) {
+ // Grayscale channel only.
- if (exr_header.tiled) {
- // todo.implement this
- }
(*out_rgba) = reinterpret_cast<float *>(
malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) *
static_cast<size_t>(exr_image.height)));
- for (int i = 0; i < exr_image.width * exr_image.height; i++) {
- const float val = reinterpret_cast<float **>(exr_image.images)[0][i];
- (*out_rgba)[4 * i + 0] = val;
- (*out_rgba)[4 * i + 1] = val;
- (*out_rgba)[4 * i + 2] = val;
- (*out_rgba)[4 * i + 3] = val;
+
+ if (exr_header.tiled) {
+ // todo.implement this
+
+ for (int it = 0; it < exr_image.num_tiles; it++) {
+ for (int j = 0; j < exr_header.tile_size_y; j++) {
+ for (int i = 0; i < exr_header.tile_size_x; i++) {
+ const int ii =
+ exr_image.tiles[it].offset_x * exr_header.tile_size_x + i;
+ const int jj =
+ exr_image.tiles[it].offset_y * exr_header.tile_size_y + j;
+ const int idx = ii + jj * exr_image.width;
+
+ // out of region check.
+ if (ii >= exr_image.width) {
+ continue;
+ }
+ if (jj >= exr_image.height) {
+ continue;
+ }
+ const int srcIdx = i + j * exr_header.tile_size_x;
+ unsigned char **src = exr_image.tiles[it].images;
+ (*out_rgba)[4 * idx + 0] =
+ reinterpret_cast<float **>(src)[0][srcIdx];
+ (*out_rgba)[4 * idx + 1] =
+ reinterpret_cast<float **>(src)[0][srcIdx];
+ (*out_rgba)[4 * idx + 2] =
+ reinterpret_cast<float **>(src)[0][srcIdx];
+ (*out_rgba)[4 * idx + 3] =
+ reinterpret_cast<float **>(src)[0][srcIdx];
+ }
+ }
+ }
+ } else {
+ for (int i = 0; i < exr_image.width * exr_image.height; i++) {
+ const float val = reinterpret_cast<float **>(exr_image.images)[0][i];
+ (*out_rgba)[4 * i + 0] = val;
+ (*out_rgba)[4 * i + 1] = val;
+ (*out_rgba)[4 * i + 2] = val;
+ (*out_rgba)[4 * i + 3] = val;
+ }
}
} else {
// Assume RGB(A)
@@ -11179,7 +11225,7 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
static_cast<size_t>(exr_image.height)));
if (exr_header.tiled) {
for (int it = 0; it < exr_image.num_tiles; it++) {
- for (int j = 0; j < exr_header.tile_size_y; j++)
+ for (int j = 0; j < exr_header.tile_size_y; j++) {
for (int i = 0; i < exr_header.tile_size_x; i++) {
const int ii =
exr_image.tiles[it].offset_x * exr_header.tile_size_x + i;
@@ -11209,6 +11255,7 @@ int LoadEXR(float **out_rgba, int *width, int *height, const char *filename,
(*out_rgba)[4 * idx + 3] = 1.0;
}
}
+ }
}
} else {
for (int i = 0; i < exr_image.width * exr_image.height; i++) {
@@ -11356,18 +11403,53 @@ int LoadEXRFromMemory(float **out_rgba, int *width, int *height,
malloc(4 * sizeof(float) * static_cast<size_t>(exr_image.width) *
static_cast<size_t>(exr_image.height)));
- for (int i = 0; i < exr_image.width * exr_image.height; i++) {
- (*out_rgba)[4 * i + 0] =
- reinterpret_cast<float **>(exr_image.images)[idxR][i];
- (*out_rgba)[4 * i + 1] =
- reinterpret_cast<float **>(exr_image.images)[idxG][i];
- (*out_rgba)[4 * i + 2] =
- reinterpret_cast<float **>(exr_image.images)[idxB][i];
- if (idxA != -1) {
- (*out_rgba)[4 * i + 3] =
- reinterpret_cast<float **>(exr_image.images)[idxA][i];
- } else {
- (*out_rgba)[4 * i + 3] = 1.0;
+ if (exr_header.tiled) {
+ for (int it = 0; it < exr_image.num_tiles; it++) {
+ for (int j = 0; j < exr_header.tile_size_y; j++)
+ for (int i = 0; i < exr_header.tile_size_x; i++) {
+ const int ii =
+ exr_image.tiles[it].offset_x * exr_header.tile_size_x + i;
+ const int jj =
+ exr_image.tiles[it].offset_y * exr_header.tile_size_y + j;
+ const int idx = ii + jj * exr_image.width;
+
+ // out of region check.
+ if (ii >= exr_image.width) {
+ continue;
+ }
+ if (jj >= exr_image.height) {
+ continue;
+ }
+ const int srcIdx = i + j * exr_header.tile_size_x;
+ unsigned char **src = exr_image.tiles[it].images;
+ (*out_rgba)[4 * idx + 0] =
+ reinterpret_cast<float **>(src)[idxR][srcIdx];
+ (*out_rgba)[4 * idx + 1] =
+ reinterpret_cast<float **>(src)[idxG][srcIdx];
+ (*out_rgba)[4 * idx + 2] =
+ reinterpret_cast<float **>(src)[idxB][srcIdx];
+ if (idxA != -1) {
+ (*out_rgba)[4 * idx + 3] =
+ reinterpret_cast<float **>(src)[idxA][srcIdx];
+ } else {
+ (*out_rgba)[4 * idx + 3] = 1.0;
+ }
+ }
+ }
+ } else {
+ for (int i = 0; i < exr_image.width * exr_image.height; i++) {
+ (*out_rgba)[4 * i + 0] =
+ reinterpret_cast<float **>(exr_image.images)[idxR][i];
+ (*out_rgba)[4 * i + 1] =
+ reinterpret_cast<float **>(exr_image.images)[idxG][i];
+ (*out_rgba)[4 * i + 2] =
+ reinterpret_cast<float **>(exr_image.images)[idxB][i];
+ if (idxA != -1) {
+ (*out_rgba)[4 * i + 3] =
+ reinterpret_cast<float **>(exr_image.images)[idxA][i];
+ } else {
+ (*out_rgba)[4 * i + 3] = 1.0;
+ }
}
}
@@ -11452,7 +11534,7 @@ size_t SaveEXRImageToMemory(const EXRImage *exr_image,
if (exr_image == NULL || memory_out == NULL ||
exr_header->compression_type < 0) {
tinyexr::SetErrorMessage("Invalid argument for SaveEXRImageToMemory", err);
- return 0; // @fixme
+ return 0;
}
#if !TINYEXR_USE_PIZ
@@ -11623,8 +11705,6 @@ size_t SaveEXRImageToMemory(const EXRImage *exr_image,
sizeof(
tinyexr::tinyexr_int64); // sizeof(header) + sizeof(offsetTable)
- std::vector<unsigned char> data;
-
std::vector<std::vector<unsigned char> > data_list(
static_cast<size_t>(num_blocks));
std::vector<size_t> channel_offset_list(
@@ -11863,9 +11943,9 @@ size_t SaveEXRImageToMemory(const EXRImage *exr_image,
} else if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) {
#if TINYEXR_USE_PIZ
unsigned int bufLen =
- 1024 + static_cast<unsigned int>(
- 1.2 * static_cast<unsigned int>(
- buf.size())); // @fixme { compute good bound. }
+ 8192 + static_cast<unsigned int>(
+ 2 * static_cast<unsigned int>(
+ buf.size())); // @fixme { compute good bound. }
std::vector<unsigned char> block(bufLen);
unsigned int outSize = static_cast<unsigned int>(block.size());
@@ -11924,13 +12004,12 @@ size_t SaveEXRImageToMemory(const EXRImage *exr_image,
} // omp parallel
for (size_t i = 0; i < static_cast<size_t>(num_blocks); i++) {
- data.insert(data.end(), data_list[i].begin(), data_list[i].end());
-
offsets[i] = offset;
tinyexr::swap8(reinterpret_cast<tinyexr::tinyexr_uint64 *>(&offsets[i]));
offset += data_list[i].size();
}
+ size_t totalSize = static_cast<size_t>(offset);
{
memory.insert(
memory.end(), reinterpret_cast<unsigned char *>(&offsets.at(0)),
@@ -11938,14 +12017,21 @@ size_t SaveEXRImageToMemory(const EXRImage *exr_image,
sizeof(tinyexr::tinyexr_uint64) * static_cast<size_t>(num_blocks));
}
- { memory.insert(memory.end(), data.begin(), data.end()); }
-
- assert(memory.size() > 0);
+ if ( memory.size() == 0 ) {
+ tinyexr::SetErrorMessage("Output memory size is zero", err);
+ return 0;
+ }
- (*memory_out) = static_cast<unsigned char *>(malloc(memory.size()));
+ (*memory_out) = static_cast<unsigned char *>(malloc(totalSize));
memcpy((*memory_out), &memory.at(0), memory.size());
+ unsigned char *memory_ptr = *memory_out + memory.size();
- return memory.size(); // OK
+ for (size_t i = 0; i < static_cast<size_t>(num_blocks); i++) {
+ memcpy(memory_ptr, &data_list[i].at(0), data_list[i].size());
+ memory_ptr += data_list[i].size();
+ }
+
+ return totalSize; // OK
}
int SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header,
@@ -11960,7 +12046,7 @@ int SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header,
if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_PIZ) {
tinyexr::SetErrorMessage("PIZ compression is not supported in this build",
err);
- return 0;
+ return TINYEXR_ERROR_UNSUPPORTED_FEATURE;
}
#endif
@@ -11968,7 +12054,7 @@ int SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header,
if (exr_header->compression_type == TINYEXR_COMPRESSIONTYPE_ZFP) {
tinyexr::SetErrorMessage("ZFP compression is not supported in this build",
err);
- return 0;
+ return TINYEXR_ERROR_UNSUPPORTED_FEATURE;
}
#endif
@@ -11980,19 +12066,28 @@ int SaveEXRImageToFile(const EXRImage *exr_image, const EXRHeader *exr_header,
#endif
if (!fp) {
tinyexr::SetErrorMessage("Cannot write a file", err);
- return TINYEXR_ERROR_CANT_OPEN_FILE;
+ return TINYEXR_ERROR_CANT_WRITE_FILE;
}
unsigned char *mem = NULL;
size_t mem_size = SaveEXRImageToMemory(exr_image, exr_header, &mem, err);
+ if (mem_size == 0) {
+ return TINYEXR_ERROR_SERIALZATION_FAILED;
+ }
+ size_t written_size = 0;
if ((mem_size > 0) && mem) {
- fwrite(mem, 1, mem_size, fp);
+ written_size = fwrite(mem, 1, mem_size, fp);
}
free(mem);
fclose(fp);
+ if (written_size != mem_size) {
+ tinyexr::SetErrorMessage("Cannot write a file", err);
+ return TINYEXR_ERROR_CANT_WRITE_FILE;
+ }
+
return TINYEXR_SUCCESS;
}
@@ -12861,20 +12956,27 @@ int LoadEXRMultipartImageFromFile(EXRImage *exr_images,
}
int SaveEXR(const float *data, int width, int height, int components,
- const int save_as_fp16, const char *outfilename) {
+ const int save_as_fp16, const char *outfilename, const char **err) {
if ((components == 1) || components == 3 || components == 4) {
// OK
} else {
+ std::stringstream ss;
+ ss << "Unsupported component value : " << components << std::endl;
+
+ tinyexr::SetErrorMessage(ss.str(), err);
return TINYEXR_ERROR_INVALID_ARGUMENT;
}
- // Assume at least 16x16 pixels.
- if (width < 16) return TINYEXR_ERROR_INVALID_ARGUMENT;
- if (height < 16) return TINYEXR_ERROR_INVALID_ARGUMENT;
-
EXRHeader header;
InitEXRHeader(&header);
+ if ((width < 16) && (height < 16)) {
+ // No compression for small image.
+ header.compression_type = TINYEXR_COMPRESSIONTYPE_NONE;
+ } else {
+ header.compression_type = TINYEXR_COMPRESSIONTYPE_ZIP;
+ }
+
EXRImage image;
InitEXRImage(&image);
@@ -12980,8 +13082,7 @@ int SaveEXR(const float *data, int width, int height, int components,
}
}
- const char *err;
- int ret = SaveEXRImageToFile(&image, &header, outfilename, &err);
+ int ret = SaveEXRImageToFile(&image, &header, outfilename, err);
if (ret != TINYEXR_SUCCESS) {
return ret;
}